同步状态机——三段式状态机

三段式状态机

下图分别为时钟同步的Moore状态机(左)和时钟同步的Mearly状态机(右),二者都由产生下一状态的组合逻辑、当前状态寄存器和产生输出的组合逻辑三个部分组成。

三段式状态机正如其名字一样,每个部分采用一个always过程块进行描述,可以清晰地显示出状态机的结构。

在调试多输出状态机时,还可以根据输出的数量把产生输出的组合逻辑按输出写成彼此独立的always组合块,以方便调试,在设计复杂的多输出状态机时推荐采用这种风格。

别人的总结:

  1. 使用三段式状态机需要声明内部信号,一般需要定义state和nextstate;
  2. 三个always语句块分别代表:
    1. 当前状态转换到下一状态的时序逻辑;
    2. 在当前状态在当前输出下转换为下一状态的组合逻辑;
    3. 当前状态(和当前输入)产生当前输出的组合逻辑;

样例:

  下图为样例的状态转移图,并使用三段式状态机对其进行描述。由于该状态机包含两个输出G、F,所以代码中包含两个输出组合逻辑。

//  三段式状态机
module fsm_mult_out(
    output  reg          K2, K1,
    input                clk, Reset, A
);
            reg [1:0]   state, nextstate;parameter
        Idle    = 2‘b00,
        Start   = 2‘b01,
        Stop    = 2‘b10,
        Clear   = 2‘b11;//  -----------------当前状态寄存器-------------------------
    always @(posedge clk)                  //  为什么这里要用非阻塞赋值,后面用阻塞赋值?
        if(!Reset)
            state <= Idle;
        else
            state <= nextstate;
//  ----------------产生下一状态的组合逻辑--------------------
    always @(state, A)
        case(state)
            Idle:   if(A)   nextstate   = Start;
                    else    nextstate   = state;

            Start:  if(!A)  nextstate   = Stop;
                    else    nextstate   = state;

            Stop:   if(A)   nextstate   = Clear;
                    else    nextstate   = state;

            Clear:  if(!A)  nextstate   = Idle;
                    else    nextstate   = Clear;

            default:        nextstate   = 2‘bxx;
        endcase
//   --------------产生输出的组合逻辑--------------------------
//    assignment for K1
      always @(state, Reset, A)
        if(!Reset)                  K1 = 0;
        else
            if(state==Clear && !A)  K1 = 1;
            else                    K1 = 0;
//    assginment for K2
      always @(state, Reset, A)
        if(!Reset)                  K2 = 0;
        else
            if(state==Stop && A)    K2 = 1;
            else                    K2 = 0;
endmodule

相应的testbench

//   testbench
module t_fsm();
    reg         a;
    reg         clk, rst;
    wire        k1, k2;
//    reg [1:0]   state;

    fsm_mult_out m(.K2(k2), .K1(k1), .A(a), .clk(clk), .Reset(rst));
    initial
        begin
//                    state = 2‘b00;
                    a   = 0;
                    rst = 1;
                    clk = 0;
            #22     rst = 0;
            #133    rst = 1;
        end

    always #50 clk = ~clk;
    always @(posedge clk)
        begin
            #30     a   = {$random}%2;
            #(3*50 + 12);
        end

    initial
        begin
            #100000 $stop;
        end
endmodule

原文地址:https://www.cnblogs.com/lizhiqing/p/12008285.html

时间: 2024-08-29 07:19:58

同步状态机——三段式状态机的相关文章

三段式状态机设计

1.三段式状态机与两段式状态机的区别 两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出.这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率. 2.三段式状态机的基本格式 第一个always语句实现同步状态跳转: 第二个always语句实现组合逻辑: 第三个always语句实现同步输出. 3.实例程序讲解 1 //本例主要

FPGA三段式状态机的思维陷阱

用三段式描述状态机的好处,国内外各位大牛都已经说的很多了,大致可归为以下三点: 1.将组合逻辑和时序逻辑分开,利于综合器分析优化和程序维护; 2.更符合设计的思维习惯; 3.代码少,比一段式状态机更简洁. 对于第一点,我非常认可,后两点在Clifford E. Cummings著的(Synthesizable Finite State Machine Design Techniques Using theNew SystemVerilog 3.0 Enhancements和The Fundame

Verilog三段式状态机描述

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息. 状态机采用VerilogHDL语言编码,建议分为三个always段完成. 三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器, 然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件. 三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说

二段式提交和三段式提交

CAP定理 2000年7月加州大学伯克利分校 Eric Brewer教授提出CAP猜想,两年后被证明. CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C,Consistency),可用性(A,Availability)和分区容错性(P,Partition tolerance)三个基本要求,最多只能同时满足其中两个. 一致性:分布式系统中,能够做到针对一个数据的更新成功后,其他所有的用户都可以读取到[最新的值],那么这样子的系统就是强一致性的. 可用性:[有限时间内][返回结果] 分区容

新型三段式止水螺杆-施工特点

新型三段式止水螺杆在使用中的优势愈加明显中,在不断的施工总结中发现,首先从成本的核算来说,完全降低了施工成本,节约不少人工:从施工的角度来看操作起来比较简单,安装拆卸较很方便,提高了工作效率:光是这两点就足以证明新型三段式止水螺杆操作是很简单高效的. 新型三段式止水螺杆的相关施工特点 此款节能螺杆通过锥体螺母将内外杆连接起来,形成一段式结构,非常稳固好用,模板施工时不会向内拱,可不需要使用水泥支撑,目前有工地还在使用水泥支撑,另外成型后的剪力墙体均匀且平整,在施工前的好处.施工后等到剪力墙风干后

移动端 三段式布局 (flex方式)

分享一种平时用的三段式布局(flex) 主要思路是  上中下    header&footer 给高度  main 占其余部分 html 部分 <div class='wrap'> <div class='header'></div> <div class='main'></div> <div class='footer'></div> </div> css 部分 .wrap{ display: fle

【转】Linux下从TCP状态机,三次握手判断DDOS攻击

从TCP状态机判断DDOS攻击 一.TCP协议 TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态. 二. TCP握手和断开 这里不着重介绍三次握手和四次断开,只是附加一个图解,这部分详细内容大家自行脑补:参考链接:https://blog.csdn.net/qzcsu/article/details/72861891 2.1 握手协议: 2.2 断开过程 三.TCP的状态机 在协议建立和断开过程,tcp协议一直要维

三、状态机的设计指导原则

---恢复内容开始--- 1.状态机设计关键是什么? 如何才能把一个电路系统抽象为一个或者多个相互配合嵌套的状态机和组合系统模块?是关键. ---恢复内容结束--- 1.状态机设计关键是什么? 如何才能把一个电路系统抽象为一个或者多个相互配合嵌套的状态机和组合系统模块?是关键.

JAVA之线程同步的三种方法

最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchronized代码段.synchronized修饰方法/类.ThreadLocal本地线程变量. 我们通过一个例子来表现这三种方法:一张银行卡里面有300块钱,15个线程从这张银行卡中取钱,每个线程取一次且每次取20块钱:当当前余额不足100元时,则向账户中汇款20元.三种方法每种方法都有5个线程.我们预期