zoukankan      html  css  js  c++  java
  • Verilog笔记.3.有限状态机

    有限状态机
    有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,其状态(即由寄存器组的1和0的组合状态
    所构成的有限个状态)只可能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态,究竟转向
    哪一状态还是留在原状态不但取决于各个输入值,还取决于当前所在状态。(这里指的是米里Mealy型有限状态
    机,而莫尔Moore型有限状态机究竟转向哪一状态只决于当前状态。)

    采用独热码实现的有限状态机。采用了独热编码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。

     1 module fsm (Clock, Reset, A, F, G);
     2 input Clock, Reset, A;
     3 output F,G;
     4 reg F,G;
     5 reg [3:0] state ;
     6 parameter Idle = 4’b1000,
     7 Start = 4’b0100,
     8 Stop = 4’b0010,
     9 Clear = 4’b0001;
    10 always @(posedge clock)
    11     if (!Reset)
    12     begin
    13         state <= Idle; F<=0; G<=0;
    14     end
    15     else
    16     case (state)
    17         Idle: begin
    18             if (A) begin
    19                 state <= Start;
    20                 G<=0;    
    21             end
    22             else state <= Idle;
    23         end
    24         Start: if (!A) state <= Stop;
    25             else state <= Start;
    26         Stop: begin
    27             if (A) begin
    28                 state <= Clear;
    29                 F <= 1;
    30             end
    31             else state <= Stop;
    32         end
    33         Clear: begin
    34             if (!A) begin
    35             state <=Idle;
    36             F<=0; G<=1;
    37             end
    38             else state <= Clear;
    39         end
    40         default: state <=Idle;
    41     endcase
    42 endmodule                                        

    用always语句和连续赋值语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。

     1 module fsm (Clock, Reset, A, F, G);
     2 input Clock, Reset, A;
     3 output F,G;
     4 
     5 reg [1:0] state ;
     6 wire [1:0] Nextstate;
     7 parameter     Idle = 2’b00, 
     8             Start = 2’b01,
     9             Stop = 2’b10, 
    10             Clear = 2’b11;
    11 
    12 always @(posedge Clock)
    13 begin
    14     if (!Reset)
    15     begin
    16     state <= Idle;
    17     end
    18     else
    19     state <= Nextstate;
    20 end
    21 
    22 assign Nextstate =     ( state == Idle ) ? ( A ? Start : Idle ) :
    23                     ( state==Start ) ? ( !A ? Stop : Start ) :
    24                     ( state== Stop ) ? ( A ? Clear : Stop ) :
    25                     ( state== Clear) ? ( !A ? Idle : Clear) : 
    26                     Idle;
    27 assign F = (( state == Stop) && A );
    28 assign G = (( state == Clear) && (!A || !Reset));
    29 
    30 endmodule

    用沿触发的always语句和电平敏感的always语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。

     1 module fsm (Clock, Reset, A, F, G);
     2 input Clock, Reset, A;
     3 output F,G;
     4 
     5 reg [1:0] state, Nextstate;
     6 parameter     Idle = 2’b00, 
     7             Start = 2’b01,
     8             Stop = 2’b10, 
     9             Clear = 2’b11;
    10 
    11 always @(posedge Clock)
    12 begin
    13     if (!Reset)
    14     begin
    15         state <= Idle;
    16     end
    17     else
    18         state <= Nextstate;
    19 end
    20 
    21 always @( state or A )
    22 begin
    23     F=0;
    24     G=0;
    25     if (state == Idle)
    26     begin
    27         if (A)
    28             Nextstate = Start;
    29         else
    30             Nextstate = Idle;
    31         G=1;
    32     end
    33     else
    34         if (state == Start)
    35             if (!A)
    36                 Nextstate = Stop;
    37             else
    38                 Nextstate = Start;
    39         else
    40             if (state == Stop)
    41                 if (A)
    42                     Nextstate = Clear;
    43                 else
    44                     Nextstate = Stop;
    45             else
    46                 if (state == Clear)
    47                 begin
    48                     if (!A)
    49                         Nextstate = Idle;
    50                     else
    51                         Nextstate = Clear;
    52                     F=1;
    53                 end
    54                 else
    55                     Nextstate= Idle;
    56     end
    57 end 
    58 endmodule
    View Code

    状态必须明确赋值,通常使用参数(parameters)或宏定义(define)语句加上赋值语句来实现。

    原则 1:时序电路建模时,用非阻塞赋值。
    原则 2:锁存器电路建模时,用非阻塞赋值。
    原则 3:用always 块写组合逻辑时,采用阻塞赋值。
    原则 4:在同一个always 块中同时建立时序和组合逻辑电路时,用非阻塞赋值。
    原则 5:在同一个always 块中不要同时使用非阻塞赋值和阻塞赋值。
    原则 6:不要在多个always 块中为同一个变量赋值。

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/protogenoi/p/8931128.html
Copyright © 2011-2022 走看看