tag 标签: 状态机

相关帖子
相关博文
  • 热度 12
    2023-6-7 10:18
    1027 次阅读|
    0 个评论
    引言 测试是软件开发中的一个关键过程。为了确保软件产品的质量和功能,拥有结构良好且有效的测试过程是很重要的。在这种情况下, TPT 中的 状态机( T estlet ) 已被证明是一种简化测试过程的有用方法。 什么是 状态机? 状态机 是 TPT 中 封装了相关测试内容的容器。 它 可能是 —— 一个测试步骤, 一组步骤, 一个更全面的测试场景。 状态机 能帮助用户 通过将整个测试过程分解为更小、更易于管理的部分来 改进测试用例的组织 , 简化测试过程。 举 个例子 如果您想测试 ECU 及其软件,有几个步骤和程序是必要的。首先, ECU 必须通电,以便为操作做好准备。这些操作与启动和登录 PC 类似 。为了达到这些前提条件的状态,必须描述各个测试步骤。但是由于这种情况在 ECU 的不同测试用例中一次又一次地发生,所以简单地描述一次是有意义的。在 TPT 中,这可以通过使用 状态机 ,然后在其他测试用例中重用它来完成。 其他测试用例使用 状态机 作为一种引用,然后再返回到该引用。在实践中,这个测试集可以被称为 “ 无错误初始化 ECU” ,并插入到各种测试用例中。 状态机 的优点 至关重要的是, 状态机 提供了一种单一 数据源的 方法。这意味着,如果测试过程由于需求和 / 或代码的变化而必须被调整,那么只有相应的 状态机 必须被更改。因此, 一些测试用例 不需要 进行 调整,这意味着维护方面的工作显著减少 ( 将测试工作减少到最低限度的 5 个秘密技巧 文章链接) 。 此外, 状态机 有助于更好地阅读和组织测试用例。通过将测试内容封装在逻辑容器中, 状态机 简化了测试过程,使其更容易理解和遵循。 由于 对测试的特定方面有明确的职责,团队协作 会 变得更加有效,因为它们可以很容易地分配和审查。 局限性及其解决方案 然而,在使用 状态机 时,重要的是要仔细管理所使用的 状态机 的数量,以免使整个测试过程复杂化。 此外,如果始终适当地定义 状态机 ,则可以避免测试过程中可能出现的冗余或不一致。如果 状态机 能够很好地适应软件产品的特定测试需求,那么测试就会成功。这样做的先决条件是对软件需求和测试目标的详细理解,以及对测试过程的清晰理解。 结论 状态机 是一种强大的工具,可以简化测试过程并提高整体软件质量。它们可以有效地与其他测试程序结合使用。 状态机 可以确保软件开发中的高产品质量和功能,同时减少测试所需的时间和精力。
  • 热度 32
    2016-5-12 20:11
    1722 次阅读|
    0 个评论
             了解一下状态机中"状态"的各种编码,我们都知道每一个状态需要一个二进制表示,但是状态之间的关系如何,到底该选用"原码""Gray码""独热码"还是好多好多别的码呢.....^^          下面是我自己搜集一些相关信息结合资料书整理的,想深入了解的可以查资料...恩推荐用(需要VPN)Google,维基百科,当然可以百度,Bing...虽然最近度娘口碑差点,仔细找找还是有好多好资料的 先来熟悉一下各种码(至于实际实现效果,自己找个例程验证一下就行了)   原码:最简单的码,就是对每个状态依照二进制按照顺序依次编码(00,01,10,11.............)         顺序二进制编码,即将状态依次编码为顺序的二进制数。顺序二进制编码是最紧密的编码,优点在于它使用的状态向量位数最少,节约了逻辑资源   Gray码:我么都应该知道的哦(数电中卡诺图的化简...不了解的回去翻书),两个顺序状态之间的差别只有一位不同(00.01,11.10..............)          Gray码在发生状态跳转时,状态向量只有一位发生变化。理论上说 Gray状态机在状态跳转时不会有任何毛刺,但Gray码状态机设计中最大的问题是,在状态机很复杂状态跳转的分支很多时,要合理的分配状态编码保证每个状态跳转都仅有 1 位发生变化,你的数电功底一定要好............   独热码:每个状态只有一个比特是高电平"1"(0001,0010,0100,1000..........)了解?!         因为独热码的特性会多用了触发器,但所用组合电路可省一些,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。同时独热码在状态跃迁时仅需要改变状态变量的某一位,在一定程度上简化了比较逻辑,从而减少了毛刺产生的概率   总结         原码和格雷码是压缩状态编码。 若使用格雷编码,则相邻状态转换时只有一个状态位发生翻转,这样不仅能消除状态转换时由多条状态信号线的传输延迟所造成的毛刺,又可以降低功耗。二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。         独热码编码的最大优势在于状态比较时仅仅需要比较一个位,一定程度上简化了比较逻辑,减少了毛刺产生的概率.当然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。还有由于独热码的状态译码简单,可减少组合逻辑且速度较快, 这种编码方式还易于修改,增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。           恩...看着独热码介绍篇幅最多,那么一定在状态设计中就是用独热码吗?实际上,相对于实际设计中,大型设计(状态要几十+吧...就这么定义,虽然很少见)独热码更有效,而一些小型设计中(我们常用的工程中)使用原码和格雷码更有效! 而相对于原码,就面积与速度的折中考虑来说Gray码是最好的选择,至于撒都不考虑了,图方便还是原码好用~~~         最后,我感觉自己说了一大堆没营养的话==不过像我这样比较懒的搜索的人,希望能有所帮助
  • 热度 28
    2016-4-28 17:23
    3046 次阅读|
    1 个评论
    状态机和时序图   第一部分:状态机 关于状态机笔记,详情查看博主的 http://bbs.ednchina.com/BLOG_ARTICLE_3033677.HTM 我与FPGA的恋爱之状态机的设计 这里是原文表述 1、认识状态机 对象:静态属性( Property )和动态行为( Event )(怎么感觉有点像程序里面面向对象的概念)。 状态:是指在 对象 的生命周期中满足某些条件、执行某些活动或等待某些事件的条件( condition )或状况( situation )。 状态机 图 通过对类 对象的生存周期建立模型 来描述 对象随时间变化的动态行为 ,也可以用来描述用例、协作和方法的动态行为,它是展示 状态 与 状态转换 的图。 状态机 是一个对象所有可能生命历程的 模型。 描述对象的一种方式。 状态的一大特性就是 转换 ,状态不是孤立的,换句话说,状态是变化的,是会互相转化的。 状态转换 是指两个状态之间、两个活动之间或者一个活动和一个状态之间的关系。 两个状态转换的原则: (1)转换本身的 逻辑性 ---并非所有的状态之间都可以任意转换 (2)转换的外界因素---转换时需要一个外因 举例:小人跑动(move)、小人站立静止(stand)、小人在空中坠落(falling) 第二部分:时序图 时序图 反映了模块的 输入输出信号随  时间变化  的情况。可以帮助理解模块的功能,直接反映信号的变化 及相互关系。 时序图的“先天缺陷”: 1、要将模块的所有功能描述出来,时序图要把输入信号和输出信号的所有可能状态都反映出来,这样需要时序图的周期个数尽可能多些,输入信号的变化尽可能多些。 2、时序图一般 辅助 理解模块的功能,模块一般需要文字性或状态机的功能描述( 看来只是一张时序图还是不够的 )。 3、时序图不便于HDL的实现 so 状态机( Medium ) HDL 第三部分:关系(转换) 时序图 到状态机,一般要求时序图反映了所有输入和输出随时间变化的情况。     从上面两张时序图中可以分析出,静态RAM的读写时序都分成三个部分:Setup、Strobe、Hold。 读写接口信号:EM_CS、EM_A、EM_D、EM_OE、EM_WE、EM_RW,随时间也有不同的变化。 这样可以把读写时序分成 5 个状态:Setup、Read、Write、Hold 、Idle。 Idle状态:不读也不写,EM_CS为无效。 Setup状态:EM_CS有效,EM_RW分别为读、写,EM_WE和EM_OE无效。 Read状态:EM_OE有效,EM_WE无效。 Write状态:EM_WE有效,EM_OE无效。 Hold状态:EM_WE和EM_OE均为无效。 确定状态转移条件,这里用到 计数器 ,Setup和Hold均为2个clk,而Read和Write均为3个clk,从Idle到Setup,需要使EM_CS有效。 经以上分析,静态RAM的读写时序状态机如下: 关于转载状态机和时序图笔记,博主正在做IIC的时序,参考用状态机 读时序,,,,因为个人读时序能力太差,折腾了4天了,还是没能者却读取出来结果,目前正在折腾ing.......调试好了会及时更新笔记!   Augus是一只有梦想的汪~Augus是一只努力奋斗的汪~  转载来源http://www.cnblogs.com/spongebob123/p/3615656.html
  • 热度 22
    2016-2-5 15:00
    5524 次阅读|
    0 个评论
    序列检测器 实验目的: 用状态机设计一个序列检测器,实现对序列 10010 的检测。 状态转换图如下: 图 1 序列检测器的状态转换图   对于以上状态图作出如下说明: ( 1 )各箭头上方的数字表示状态跳转条件及相应的输出结果。如: S0—S1 上的 1/0 表示当输入的数据为 1 时,由状态 S0 跳转到状态 S1 ,并且输出为 0 ,表示还未检测到(或未检测完)数据流 10010 。同理,当完整地检测到 10010 时就输出 1 。 ( 2 )从 S0~S5 共有六种状态,在设计程序的时候,通常是采用 3bit 数据类型表示即可,但是,为了适应高速数字电路的应用需求,扩大数据信号的时间窗(时间窗由建立时间和保持时间构成),避免出现不稳定的中间态,故此六种状态采用 6bit 的数据类型表示。 ( 3 )下面描述一下状态跳转的过程: S0 为起始状态(或默认状态),当第一个 bit 到来的时候,判断其是否为 1 ,若为 1 则跳转到 S1 状态,并输出 0 作为标志信号,表示序列检测尚未完成;若为 0 则保持当前状态不变,同时输出标志信号 0 。 若当前状态为 S1 ,当前输入的 bit 为 0 ,则状态机跳转到 S2 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则保持当前状态不变。 若当前状态为 S2 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S3 ,当前输入的 bit 为 1 ,则状态机跳转到 S4 状态,并输出标志信号 0 ;若当前输入的 bit 为 0 ,则状态机跳转到 S0 状态,并输出标志信号 0 。 若当前状态为 S4 ,当前输入的 bit 为 0 ,则状态机跳转到 S5 状态,并输出标志信号 1 ,检测到一个完整的“ 10010 ”序列; 若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 若当前状态为 S5 ,当前输入的 bit 为 0 ,则状态机跳转到 S3 状态,并输出标志信号 0 ;若当前输入的 bit 为 1 ,则状态机跳转到 S1 状态,并输出标志信号 0 。 除上述跳转过程外,各状态均需加上一条复位跳转路径,即:当复位信号 rst_n 当来的时候,任何状态都跳转到 S0 状态,输出 0 作为标志信号。 按照上面的状态跳转图写状态机,控制状态跳转和信号输出,程序代码如下截图所示: 接下来是写 testbench ,代码如下: 以上 testbench 的目的: ( 1 )产生频率为 50MHz 的时钟信号和复位信号; ( 2 )产生测试需要的比特流序列,该序列为 11100011010010100101100100100010 ,将它们送给序列检测器予以检测。 Quartus 综合所得的状态转换图如下图所示: 图 2 Quartus 综合所得的状态转换图 对比图 2 和图 1 可知,综合后所得的状态转换图与设计要求中的状态转换图一致,转换条件相同。下面,可以直接看仿真结果,仿真结果如图 3 所示: 图 3 仿真结果截图 由图 3 可知, in_data 是我们产生的比特流,它们是 111000110 10010 10010 1 100 10 010 0010 ,与期望的值是一致的。同时,在对比特流进行序列检测的过程中, flag 信号共出现了 4 次高电平,分别是在 i 为 18 与 17 之间、 13 与 12 之间、 7 与 6 之间以及 4 与 3 之间,这与序列 10010 在比特流中的位置是一致的(左起是第 31 位,右起是第 0 位)。故由此可知,序列检测器的检测功能正常。
  • 热度 26
    2011-4-22 13:39
    5485 次阅读|
    11 个评论
      最近折腾状态机,发现一个小任务对于两段式状态机写法是不可能完成的。这个小任务很简单,先看用一段式状态机实现的代码: module test(             clk,rst_n,             din,dout         );   input clk; input rst_n;    input din; output dout;     parameter IDLE  = 3'd0; parameter STA1  = 3'd1;   //一段式写法 reg cstate; reg cnt;   always @(posedge clk or negedge rst_n)     if(!rst_n) cstate = IDLE;     else begin         case(cstate)             IDLE: begin                     cnt = 4'd0;                     if(din) cstate = STA1;                     else cstate = IDLE;                        end             STA1: begin                     cnt = cnt+1'b1;                     if(cnt == 4'd10) cstate = IDLE;                     else cstate = STA1;                 end             default: cstate = IDLE;         endcase     end   assign dout = cnt;   endmodule   同样的,用三段式状态机也能够实现这个功能: //三段式写法 reg cstate,nstate; reg cnt;   always @(posedge clk or negedge rst_n)     if(!rst_n) cstate = IDLE;     else cstate = nstate;   always @(cstate or din or cnt) begin     case(cstate)         IDLE:   if(din) nstate = STA1;                 else nstate = IDLE;             STA1:   if(cnt == 4'd10) nstate = IDLE;                 else nstate = STA1;         default: nstate = IDLE;     endcase end   always @(posedge clk or negedge rst_n)     if(!rst_n) cnt = 4'd0;     else begin         case(nstate)             IDLE:   cnt = 4'd0;             STA1:   cnt = cnt+1'b1;             default: ;         endcase     end   严格来看,上面的三段式状态机相比于一段式会滞后一个时钟周期。但是我们的重点不在这里,大家大可以不必钻这个牛角尖。另外,这个实例实现的功能本身也没有什么意义,当然也是可以用别的更简单(不需要状态机)的方式实现,但是你可以想象成这是实际应用中状态机各种复杂输出的一部分。     而如果大家希望用两段式状态机实现这个功能,或许会这么写: //两段式写法 reg cstate,nstate; reg cnt;   always @(posedge clk or negedge rst_n)     if(!rst_n) cstate = IDLE;     else cstate = nstate;   always @(cstate or din or cnt) begin     case(cstate)         IDLE: begin                 cnt = 4'd0;                 if(din) nstate = STA1;                 else nstate = IDLE;                 end         STA1: begin                 cnt = cnt+1'b1;                 if(cnt == 4'd10) nstate = IDLE;                 else nstate = STA1;             end         default: nstate = IDLE;     endcase end   如果大家有兴趣对三中代码方式都做一下仿真,会发现一些有意思的问题,尤其两段式状态机最终根本无法退出STA1,计数器cnt也会死在那里。究其根本原因,可大有学问。在编译工程后,出现了数条类似下面的warning: Warning: Found combinational loop of 2 nodes     Warning: Node "Add0~2"     Warning: Node "cnt~9"     何为combinational loop?让handbook来解释吧,看不懂英文的可别怪我~_~ Combinational loops are among the most common causes of instability and unreliability in digital designs. They should be avoided whenever possible. In a synchronous design, feedback loops should include registers. Combinational loops generally violate synchronous design principles by establishing a direct feedback loop that contains no registers. For example, a combinational loop occurs when the left-hand side of an arithmetic expression also appears on the right-hand side in HDL code. A combinational loop also occurs when you feed back the output of a register to an asynchronous pin of the same register through combinational logic, as shown in Figure 5–1.     没有寄存器打一拍的这种combinational loop(组合环)是一种不推荐的设计方式,就如两段式状态机所实现的效果,甚至最终无法实现功能要求。同样的功能,一段式和三段式状态机之所以能够解决这个问题,就是避免了在纯组合逻辑中涉及这个反馈逻辑。在初学verilog时,我们常提的latch(锁存器),其实也是combinational loop的一个特例。
相关资源