Verilog HDL 小练习(四)状态机

实践是最好的老师,通过项目实战才能把所学转化为实际的能力。——沃兹基

一.什么是状态机?

有限状态机Finite State Machine,简称FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.一般分为三种:分别是Moore型,Mealy型,以及混合型。这个练习主要讲Mealy型有限状态机。

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

图1状态转移图[1]

状态转移图的解释:上图中Input 输入是时钟clk,输入信号为A,Reset,Output  为F和G

module MEALY_FSM(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;
reg [1:0]state;//状态信号
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
     F<=0;//初始输出为0
    G<=0;//初始输出为0
    end
  else
    case(state)
           idle: begin
                   if(A)//由图所知,A/G=0
                           begin
                             state<=start;//根据图所示,idle箭头指向start
                            G<=0;
                           end
                        else
                        state<=idle;
                  end
           start:if(!A)
                    begin
                   state<=stop;//根据图所示,idle箭头指向stop
                    F<=1;//图中所示A/F=1
                   end
                     else
                       state<=start;// 
            stop: if(A)
                       begin
                          state<=clear;
                          G<=1; 
                     end
                      else 
                          state<=stop;
            
           clear:if(!A)// 
                       begin
                     state<=idle;
                          F<=0;
                          G<=1;
                     end
                      else
                         state<=clear;
   endcase

endmodule

另一种写法

module MEALY_FSM_II(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;
reg [3:0]state;//状态信号多用了两个寄存器,这叫独热编码,FPGA适合,上面的适合CPLD
/*定义四个状态的编码 1000,0100,0010,0001*/
parameter idle=4'b1000,start=4'b0100,
stop=4'b0010,clear=4'b0001;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
     F<=0;//初始输出为0
    G<=0;//初始输出为0
    end
  else
    case(state)
           idle: begin
                   if(A)//由图所知,A/G=0
                           begin
                             state<=start;//根据图所示,idle箭头指向start
                            G<=0;
                           end
                        else
                        state<=idle;
                  end
           start:if(!A)
                    begin
                   state<=stop;//根据图所示,idle箭头指向stop
                    F<=1;//图中所示A/F=1
                   end
                     else
                       state<=start;// 
            stop: if(A)
                       begin
                          state<=clear;
                          G<=1; 
                     end
                      else 
                          state<=stop;
            
           clear:if(!A)// 
                       begin
                     state<=idle;
                          F<=0;
                          G<=1;
                     end
                      else
                         state<=clear;
   endcase

endmodule

第三种写法

module MEALY_FSM_III(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg [1:0]state;//寄存器状态,相当于把触发器和组合逻辑分开描述
wire [1:0] nextstate;// 定义两个状态,当前和下一个 
wire F,G;
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
    end
  else
    state<=nextstate;//相当于把触发器和组合逻辑分开描述
     
     assign nextstate=(state==idle)?  (A?start:idle):
                      (state==start)? (!A?stop:start)://若为!A执行后面的,否则执行start
                     (state==stop)?  (A?clear:stop):
                      (state==clear)? (!A?idle:clear):idle;
     assign F =((state==stop)&&A);//根据逻辑状态得出来的                    
     assign G =((state==clear)&&(!A|!Reset));    //        
  

endmodule

第四种写法

module MEALY_FSM_IV(clk,A,Reset,F,G);
input clk,A,Reset;//输入信号
output F,G;       //输出信号
reg F,G;//这里必须声明数据类型,不声明的话,你试试。
reg [1:0]state,nextstate;// 定义两个状态,当前和下一个 
/*定义四个状态的编码 00,01,10,11*/
parameter idle=2'b00,start=2'b01,
stop=2'b10,clear=2'b11;
  always @(posedge clk) //总是在时钟上升沿触发
  if(!Reset)//没有触发复位,由图所示,多个箭头指向这个所以需要优先判断
    begin 
     state <=idle;//无阻塞赋值,且起始状态为start
    end
  else
    state<=nextstate;//相当于把触发器和组合逻辑分开描述
     
     always@(state or A)    //因为受输入和当前状态影响
      begin
        F<=0;
          G<=0;
         if(state==idle)//从idle开始描述
          begin
           if(A)//
            nextstate=start;  //开始为1
           else
            nextstate=idle;  //!A为isle
          G<=1;
          end
         else
          if(state==start)
             if(!A)
             nextstate<=stop;
             else
             nextstate<=start;
         else
            if(state==stop)
             if(A)
             nextstate<=clear;
             else
             nextstate<=stop;
         else
            if(state==clear)
             begin
               if(!A)
                 nextstate=idle;
               else
                 nextstate=clear; 
                  F<=1;
              end
        else
              nextstate=idle;//阻塞赋值
     end
endmodule

综合后的状态机视图如下所示

图二.综合后的状态机试图

总结mealy型状态机的写法流程如下

1.获得状态转移图,通过逻辑抽象。就是把给出的一个实际逻辑关系表示为时序逻辑函数,可以用状态转换表来描述,也可以用状态转换图来描述。

     a)分析给定的逻辑问题,确定输入变量、输出变量以及电路的状态数。通常是取原因(或条件)作为输入变量,取结果作为输出变量
    b) 定义输入、输出逻辑状态的含意,并将电路状态顺序编号                                              c)按照要求列出电路的状态转换表或画出状态转换图。

2.状态化简

   结果在状态转换图中出现这样两个状态,它们在相同的输入下转换到同一状态去,并得到一样的输出,则称它们为等价状态。显然等价状态是重复的,可以合并为一个。电路的状态数越少,存储电路也就越简单。状态化简的目的就在于将等价状态尽可能地合并,以得到最简的状态转换图。

3.状态分配

       状态分配很重要,在分配的时候意味着使用的触发器的多少,对于FPGA由于触发器多,可以使用独热编码也就是4‘b1000,4’b0100这种方式,对于CPLD可以使用其他编码。
 

4选定触发器的类型并求出状态方程、驱动方程和输出方程。
5) 按照方程得出逻辑图
     使用always块语句和case(if)等条件语句及赋值语句即可方便实现。具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。

读者朋友可以在留言区和我交流。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值