tag 标签: mealy

相关博文
  • 热度 24
    2014-9-1 23:37
    9573 次阅读|
    1 个评论
    什么是状态机? 简单来说,就是通过不同的状态迁移来完成一些特定的顺序逻辑。硬件的并行性决定了用 Verilog 描述的硬件实现(譬如不同的 always 语句)都是并行执行的,那么如果希望分多个时间完成一个任务,怎么办?也许可以用多个使能信号来衔接多个不同的模块,但这样做显得有些繁琐。状态机的提出大大简化这一工作。 硬件设计很讲究并行设计思想, 虽然用 Verilog 描述的电路大都是并行实现,但是对于实际工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这就是要用到状态机的思想 。(以上摘自特权同学的《深入浅出玩转 FPGA 》一书)   有限状态机 FSM ( Finite State Machine )是数字电路设计中的常用模块。 组成元素:输入、状态、状态转移条件、输出 分类: Mealy 状态机 :时序逻辑的输出不仅取决于当前状态,还与输入有关; Moore 状态机 :时序逻辑的输出只与当前状态有关; 描述方式: 1. 状态转移图:设计分析时使用,工具自动翻译的代码效率不高,适合规模小的设计;对于大规模设计, HDL 更好;                     2. 状态转移表;                     3. HDL 描述; 设计步骤: 1. 逻辑抽象,得到状态转移图:确定输入、输出、状态变量、画状态转移图;                     2. 状态简化,得到最简的状态转移图:合并等价状态;                     3. 状态编码: binary 、 gray 、 one-hot 编码方式;                     4. 用 HDL 描述; 写法:一般有三种写法,他们在速度、面积、代码可维护性等各个方面互有优劣。       一段式 :   只有一个 always block ,把所有的逻辑(输入、输出、状态)都在一个 always block 中实现;这种写法看起来很简洁,但是不利于维护。如果状态复杂一些就很容易出错。不推荐这种方法,但是在简单的状态机可以使用。        二段式 :  有两个 always block ,把时序逻辑和组合逻辑分隔开来。时序逻辑里进行当前状态和下一状态的切换,组合逻辑实现各个输入、输出以及状态判断。这种写法不仅便于阅读、理解、维护,而且利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在两段式描述中,当前状态的输出用组合逻辑实现,可能存在竞争和冒险,产生毛刺。则要求对状态机的输出用寄存器打一拍,但很多情况不允许插入寄存器节拍,此时使用三段式描述。其优势在于能够根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而不需要额外插入时钟节拍。         三段式 : 有三个 always block ,一个时序逻辑采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件、描述状态转移规律,第三个模块使用同步时序的方式描述每个状态的输出。代码容易维护,时序逻辑的输出解决了两段式组合逻辑的毛刺问题,但是从资源消耗的角度上看,三段式的资源消耗多一些,且输出比另外两种会延时一个时钟周期。 应用:接口控制,协议转换和处理,以及处理器设计等等。 我们以 1101 序列检测器为例: 1101 序列检测器 Mealy 状态机状态转移图 1101 序列检测器 Moore 状态机状态转移图 我们以 Mealy 状态机为例 一段式状态机 (部分核心代码) : 两段式状态机 (部分核心代码) : 三段式状态机(部分核心代码): 三种方式的状态机的写法,使用 Quartus II 的 State Machine Viewer 观察状态转移图都是: Testbench : module ex3_tb; reg    clk; reg    rst_n; reg    in; wire   out; ex3 i_ex3(             .clk        (clk  ) ,             .rst_n      (rst_n) ,             .in         (in   ) ,             .out        (out  )           );                   initial begin      clk = 1;      forever  #10 clk = ~clk; end initial begin      rst_n = 0;      in = 0;      #1000;      rst_n = 1;      in = 1;      #20;      in = 1;      #20;      in = 1;      #20;      in = 0;      #20;      in = 1;      #20;      in = 1;      #20;      in = 0;      #20;      in = 1;      #20;      in = 0;      #20;      in = 1;      #1000;      $stop; end endmodule Modelsim 仿真结果: 有什么不对的地方欢迎大家批评指正!!!
  • 热度 22
    2013-11-30 07:44
    1247 次阅读|
    0 个评论
    设计这个FSM应该轻车熟路咯。直接上图: STT: 输出表: 进行FSM编码,这里用二进制编码,注意这里由于只有5个状态,而我们至少要用3bit(最多可以代表8个状态)来表达。所以剩下的几个就是用来化简表达式的: ​ 写出优化后的STT布尔表达式: 输出表达式: 最后画实现: 好了,这个part就当作是复习咯,下一个part进入Mealy机的设计。  
  • 热度 19
    2013-11-28 02:06
    1205 次阅读|
    0 个评论
     看过上几篇文章的那个例子,其实在学术上被分类Moore(摩尔,)形FSM。还有一种就叫做Mealy形FSM。如果对计算机理论感兴趣的话两类FSM的数学定义请参照Wiki这里就不拿出来了~ 大家可以看到,上一个路灯的例子中,输出仅仅依赖于当前状态。这也就是Moore机的特征而所谓Mealy形FSM就是输出不仅仅依赖于当前状态,还依赖于当前的输入。(为此Mealy机也被用作密码机)具体什么意思呢,看例子。   需求:   我们想设计一个特征字符识别的机器。要求是识别特征字符串 1101 。也就是说如果在一大串字符中连续 从左至右 出现1101的话就输出1,如果没有的话就输出0.为了方便,理想的规定,每个时钟周期,该机器检测1个bit。   实现:   我们用Moore和Mealy两种方式来实现。首先我们来看我们熟悉的Moore吧。   1.这里 “状态” 大家会感觉到有些抽象,是的。不过其实状态的定义和上一个例子是一样的。 我们的1101就相当于上个例子里的交通灯感应器。输入1进入某个状态,输入0进入下一个状态。。。等等。输出当然就是0或1咯。这里直接给出状态图:   。看着有点懵?别怕,首先要试着用已经学过的知识去解释它。如果实在不行的话看我的分析。(提醒:看分析的人能学到这部分的知识,但是不看分析经过自己努力的人会培养自己举一反三的能力和附带的知识,而不看分析一下就明白的人就是智商比较高的。大家属于哪一类~)     ==================================================================================================================(天才分割线)============================================================================================================ 分析: 这里我们用了5个状态。而1101这个字符串就像上面说的,和路灯感应器一样,把FSM放入下一个状态。首先我们Reset也就是输出为0(圆圈中的数字代表输出)。之后我们可能碰到0或1两种字符。如果当前检测到1,则FSM从S0进入S1状态。如果是0的话返回S0.为神马返回S0而不是定义一个新的S2状态?因为Reset状态根本就不可能检测到完整的1101字符串也就是下一个无论输入什么字符都不会进入检测1101的状态(例如 当前是0,下一个字符可能是0或1,也就是00或01,而这两种组合都不是1101的开头字符,注意需求中的字符顺序!)。同理,继续分析下去,当机器幸运的运行到S4状态的时候输出为1也就是机器找到了一个1101字符串,而机器继续运行下去我们下一个字符当然是1或0,若是0的话自然返回Reset的S0状态,周而复始。那么当输入为1的时候为什么跳入S2?-----和刚刚说过的一样,进入S4状态之前的输入必须为1,而进入S4状态之后的输入如果为1的话,不就正好是1101的前两个bit么(11)。而如果进入S2状态之后,下一个输入为0的话我们就有了连续的前三位110,而输入一次1的话我们有111,两次1的话我们有1111,n次就有n个1,但是我们总取后两个1(换句话说总取第n-1和第n位的1),我们总处在检测到1101的前两位的状态也就是一直处于S2状态。 剩下的自己做练习吧~。   2.下一个part我们来设计这个Moore机 ​