lcytms 发表于 2017-7-24 09:31:56

表示方法之二

我们还可以用另一个 Verilog HDL模型来表示同一个有限状态,
见下例。(用可综合的Verilog模块设计用独热码表示状态的状态机)

modulefsm (Clock, Reset, A,K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg state ; 
parameter    Idle   =4’b1000,
             Start    =4’b0100,
             Stop   =4’b0010,
             Clear    =4’b0001;

lcytms 发表于 2017-7-24 09:33:35

表示方法之二(续)

always @(posedge clock)
   if (!Reset)
   begin
       state <= Idle;K2<=0; K1<=0;
   end
   else
    case (state)
      Idle:if (A)begin
                         state <= Start;
                               K1<=0;
                     end
               else   state <= Idle;

lcytms 发表于 2017-7-24 09:34:56

表示方法之二(续)

    Start:if (!A)state <= Stop;
               elsestate <= Start;
   Stop:if (A) begin
                     state <= Clear;
                         K2<= 1;
                  end
            elsestate <= Stop;
   Clear:if (!A)begin
                        state <=Idle;
                        K2<=0;K1<=1;
                      end
               else   state <= Clear;

lcytms 发表于 2017-7-24 09:36:28

表示方法之二(续)

          default:state <= Idle;
   endcase
endmodule
 
[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。

lcytms 发表于 2017-7-24 09:39:07

表示方法之三

在比较复杂的状态机设计过程中,我们往往把状态的变化与输出开关的控制分成两部分来考虑。
就象前面讲过的Mealy状态机输出部分的组合逻辑。为了调试方便,还常常把每一个输出开关写成一个个独立的always组合块。
在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。
建议同学们在设计复杂的多输出状态机时采用下面的风格举例,说明如下:
总结:
        1、第一个always块描述状态随时钟转换
                【state<=nextstate】 <仅与时钟有关>
        2、第二个always块描述状态转换路径即下一个状态变为什么状态【nextstate<=??】<与当前状态、控制信号有关>
        3、剩余的对各个输出进行单独描述,因为描述的是一个变化的过程,因此需要<当前状态和控制信号,可加入RESET,因为复位也会产生输出>

lcytms 发表于 2017-7-24 09:43:23

表示方法之三(续)

modulefsm (Clock, Reset, A,K2, K1);
input Clock, Reset, A;
output K2, K1;
reg K2, K1;
reg state, nextstate ;
 
parameter   
Idle   =2'b00,
Start    =2'b01,
Stop   =2'b10,
Clear    =2'b11;

lcytms 发表于 2017-7-24 09:45:02

表示方法之三(续)

//-------- 每一个时钟沿产生一次可能的状态变化-----------
always @(posedge Clock)
begin
   if (!Reset)
            state <= Idle;
    else
      state <= nextstate;
end
//-------------------------------------------------------

lcytms 发表于 2017-7-24 09:47:02

表示方法之三(续)

//------ 产生下一状态的组合逻辑 -------------------------      
always @(state or A)
   case (state)
      Idle:if (A)   
               nextstate = Start;      
                elsenextstate = Idle;
       Start:if (!A)nextstate = Stop;
                  else   nextstate = Start;
       Stop:if (A)nextstate = Clear;
                elsenextstate = Stop;
       Clear:if (!A)   nextstate = Idle;
                else   nextstate = Clear;
      default:nextstate =2'bxx;
endcase

lcytms 发表于 2017-7-24 09:48:18

表示方法之三(续)

//---- 产生输出K1的组合逻辑 --------------
always @(state or Reset or A)
if (!Reset) K1=0;
    else
       if (state == Clear && !A)//从Clear转向 Idle
               K1=1;
      else   K1= 0;
      
//--- 产生输出K2的组合逻辑 ---------------
always @(state or Reset or A )
   if (!Reset) K2 = 0;
else
      if (state == Stop && A)// 从Stop转向 Clear
               K2 = 1;
                else K2 = 0;
//------------------------------------------
endmodule
 

lcytms 发表于 2017-7-24 09:51:14

表示方法之四
用输出指定的码表示状态的状态机

方法四采用了另一种方法:直接把状态码定义为输出。
也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。
这种设计方法常用在高速状态机中。
建议同学们在设计高速状态机时采用方法四的风格。
例中state 和state分别表示前面两个例子中的输出K2和K1。
页: 1 2 3 4 5 [6] 7 8 9 10 11
查看完整版本: Verilog HDL 夏宇闻--数字系统设计的核心知识