zoukankan      html  css  js  c++  java
  • 三段式状态机设计

    1、三段式状态机与两段式状态机的区别

       两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。

    2、三段式状态机的基本格式  

      第一个always语句实现同步状态跳转;

      第二个always语句实现组合逻辑;

      第三个always语句实现同步输出。

    3、实例程序讲解

      

     1  //本例主要采用三段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE
     2   //状态,q_sig4被复位,一旦sig1或者sig2有效,状态机进入WAIT状态,如果sig1和sig2同时有效,那么
     3  //状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。
     4  
     5  module three_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4);
     6  //数据声明部分
     7  input clk,reset,sig1,sig2,sig3;
     8 
     9 output reg       q_sig4;
    10 
    11  reg [1:0]    current_state, next_state;
    12 
    13 //参数声明
    14  parameter  IDLE       = 2'b00;
    15  parameter  WAIT       = 2'b01;
    16  parameter  DONE       = 2'b10;
    17 
    18  //状态跳转程序设计
    19 always @(posedge clk or posedge reset)
    20  if(reset)
    21       current_state <= IDLE;
    22   else
    23       current_state <= next_state;
    24       
    25  //状态跳转输出
    26  always @(current_state or sig1 or sig2 or sig3)
    27    begin
    28        case(current_state)
    29        IDLE: begin
    30                               if(sig1 || sig2)
    31                                    begin
    32                                        next_state = WAIT;                                      
    33                                    end
    34                                   else
    35                                       begin
    36                                           next_state = IDLE;                                         
    37                                     end
    38                            end
    39                    WAIT: begin
    40                              if(sig2 && sig3)
    41                                 begin
    42                                      next_state = DONE;                                    
    43                               end
    44                            else
    45                                 begin
    46                                      next_state = WAIT;                                    
    47                                end
    48                           end       
    49                                      
    50                    DONE:begin
    51                             if(sig3)
    52                                 begin
    53                                     next_state = IDLE;                                   
    54                                 end
    55                             else
    56                                 begin
    57                                     next_state = DONE;                                   
    58                                 end
    59                            end
    60                     
    61                  default: begin
    62                               next_state = IDLE;                             
    63                             end
    64            endcase       
    65    end
    66    
    67    //逻辑输出
    68    always @(posedge clk or posedge reset)
    69      if(reset)
    70          q_sig4 <= 1'b0;
    71      else
    72          begin
    73              case(next_state)
    74                  IDLE,
    75                  WAIT: q_sig4 <= 1'b0;
    76                  DONE: q_sig4 <= 1'b1;
    77                  default: q_sig4 <= 1'b0;
    78            endcase
    79          end
    80          
    81  endmodule     
  • 相关阅读:
    关于vue无法侦听数组及对象属性的变化的解决方案
    web js导出csv 文件(使用a标签)
    微信小程序-获取用户信息和openid,session_key,
    H5适配 iponex
    项目使用iconfont图标
    锚点链接,组件库中锚点实现
    前端的调试工具和node调试工具
    前端模块化 CommonJS AMD CMD ES6
    支付宝小程序
    个人创用 UA 列表
  • 原文地址:https://www.cnblogs.com/qidaiymm/p/4908724.html
Copyright © 2011-2022 走看看