找回密码
 注册
关于网站域名变更的通知
查看: 325|回复: 1
打印 上一主题 下一主题

转——FPGA状态机又有新办法啦,四段式状态机!

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-3-29 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 Ferrya 于 2019-3-29 09:28 编辑 ( @0 T* m) W. ]7 D
    ( G" a& Q0 }( s/ g2 F$ I+ R1 `
    转——FPGA状态机又有新办法啦,四段式状态机!
    , ], v0 z+ e( ]' n5 }0 M* e
    ! n) N: q% t+ @, V# u! Z
    FPGA中,相信有FPGA学习经验的都能了解,现在流行的状态机设计,一般可分为一段式、两段式和三段式,如果不了解的,可以自行百度。
    上面的三种设计法虽然很流行,但设计时仍然要考虑很多因素,导致总是要反反复复调试才能设计成功。这不符合明德扬一次考虑一个因素、一次性设计正确的设计理念。为此,明德扬特推出四段式状态机的写法。
    四段式不是指三个always代码,而是四段程序。使用四段式的写法,可参照明德扬GVIM特色指令Ztj产生的状态机模板。
    第一段,同步时序的always模块,格式化描述次态迁移到现态寄存器。
    1
      
    2
      
    3
      
    4
      
    5
      
    6
      
    7
      
    8
    always@(posedge clk or negedge  rst_n)begin
      
         if(!rst_n)begin
      
            state_c <= IDLE;
      
         end
      
         else begin
      
            state_c <= state_n;
      
         end
      
    end
    第二段,组合逻辑的always模块,描述状态转移条件判断。注意转移条件用信号来表示,信号名要按明德扬规则来命名。
    1
      
    2
      
    3
      
    4
      
    5
      
    6
      
    7
      
    8
      
    9
      
    10
      
    11
      
    12
      
    13
      
    14
      
    15
      
    16
      
    17
      
    18
      
    19
      
    20
      
    21
      
    22
      
    23
      
    24
      
    25
      
    26
      
    27
      
    28
      
    29
      
    30
      
    31
      
    32
      
    33
      
    34
      
    35
    always@(*)begin
      
         case(state_c)
      
            IDLE:begin
      
                if(idle2s1_start)begin
      
                    state_n = S1;
      
                end
      
                else begin
      
                    state_n = state_c;
      
                end
      
            end
      
            S1:begin
      
                if(s12s2_start)begin
      
                    state_n = S2;
      
                end
      
                else begin
      
                    state_n = state_c;
      
                end
      
            end
      
            S2:begin
      
                if(s22idl)begin
      
                    state_n = IDLE;
      
                end
      
                else begin
      
                    state_n = state_c;
      
                end
      
            end
      
            default:begin
      
                state_n = IDLE;
      
            end
      
         endcase
      
    end
      
    $ m% r" v! j% L5 O. O9 m
      
    assign idle2s1_start = state_c==IDLE  && ;
      
    assign s12s2_start  = state_c==S1   && ;
      
    assign s22idl_start  = state_c==S2   && ;
    第三段,用assign定义转移条件。注意条件一定要加上现态。
    1
      
    2
      
    3
    assign idle2s1_start = state_c==IDLE  && ;
      
    assign s12s2_start  = state_c==S1   && ;
      
    assign s22idl_start  = state_c==S2   && ;
    第四段,设计输出信号。明德扬规范要求一个always设计一个信号,因此有多少个输出信号,就有多少个always
    1
      
    2
      
    3
      
    4
      
    5
      
    6
      
    7
      
    8
      
    9
      
    10
      
    11
    always  @(posedge clk or negedge rst_n)begin
      
         if(!rst_n)begin
      
            out1 <=1'b0   
      
         end
      
         else if(state_c==S1)begin
      
            out1 <= 1'b1;
      
         end
      
         else begin
      
            out1 <= 1'b0;
      
         end
      
    end
    明德扬四段式状态机符合一次只考虑一个因素的设计理念。第一段代码,照抄格式,完全不用想其他的。第二段代码,只考虑状态之间的跳转,也就是说各个状态机之间跳转关系。第三段代码,只考虑跳转条件。第三段,每个信号逐个设计。
    明德扬为了保证一次设计正确,还制定了一些规范。例如第二段的跳转条件,只准用信号名代替,并且制定了跳转条件的命名规范,1是解决了命名困难的问题,2是对转移条件一目了然,如idl2s1_start,就可以看出是IDLE跳到S1状态的条件。还有,明德扬规定转移条件的格式,一定是当前状态&&具体条件,以防想不到的情况出现。有了这些规范的保证,无论多复杂的场合,任何设计都能有条理、有步骤地一次性设计正确。

    2 Y7 a( E2 `: _0 _! e3 w$ e2 T; a) c# k0 U
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-29 03:32 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表