Verilog状态机的分类和编码实现(含编码范例)

目录

一、状态机组成

二、状态机分类

三、状态编码方式

四、状态机的描述方式

五、范例(参考vivado-Language Template)

一、状态机组成

        状态机可对具有逻辑顺序的事件进行描述,使得编码的逻辑更加清晰易懂。状态机一般包括“组合逻辑”和“时序逻辑”两部分。

组合逻辑:用于状态译码和产生输出信号;

时序逻辑:用于存储状态信息。

二、状态机分类

        根据输出信号产生的方式不同,状态机一般分为两种,分别是Moore型和Mealy型。

Moore : 输出仅与当前状态有关;

Mealy :  输出不仅与当前状态有关,还与输入信号有关。

三、状态编码方式

        对于状态机状态的分配方式可分为以下三种,分别为二进制编码、格雷编码和独热编码。

二进制编码

优点:使用的状态向量最少;

缺点:但状态转换时变化比特位多,易产生毛刺。

范例:parameter  IDLE_WAIT   = 4‘d01;

            parameter  DATA_TRAN = 4‘d02;

            parameter  DATA_CONT = 4‘d03;

            parameter  INFO_TRAN  = 4‘d04;

格雷编码

优点:状态转换时只有1比特变化,减少了毛刺

缺点:不适用于有很多跳转状态的情况

范例:parameter  IDLE_WAIT   = 4‘b0001;

            parameter  DATA_TRAN = 4‘b0011;

            parameter  DATA_CONT = 4‘b0010;

            parameter  INFO_TRAN   = 4‘b0110;

独热编码

优点:状态向量中只有1位为1,其余位都是0;状态机的速度与状态的数量无关,速度快

缺点:有多少状态就有少位的位宽,占用更多的寄存器。

范例:parameter  IDLE_WAIT   = 4‘b0001;

            parameter  DATA_TRAN = 4‘b0010;

            parameter  DATA_CONT = 4‘b0100;

            parameter  INFO_TRAN   = 4‘b1000;

        总结:由于独热编码可以节省和简化组合逻辑,且设计简单,修改灵活,易于综合和调试,故对于寄存器数量多而门逻辑相对较少的FPGA器件,可以使用独热编码方式对状态机的状态进行编码。

四、状态机的描述方式

        状态机根据always块的数量,可分为一段式状态机、两段式状态机和三段式状态机。

一段式状态机

        把组合逻辑和时序逻辑用同一个时序always块描述。

优点:其输出的是寄存器输出,无毛刺;

缺点:但这种方式会产生多余的寄存器,代码不容易修改和调试,应该尽量避免使用。

两段式状态机

        大多数用于描述Mealy状态机和组合输出的Moore状态机,时序always块描述当前状态逻辑,组合逻辑always块描述次态逻辑并给输出赋值。

优点:结构清晰,综合后面积和时间性能好;

缺点:组合逻辑输出容易出现毛刺。

三段式状态机

        多数用于同步Mealy状态机,两个时序always块分别用来描述现态逻辑和对输出赋值,组合always块用于产生下一状态。

优点:寄存器输出,输出无毛刺;代码较单always块清晰易懂;

缺点:占用面积较大。

五、范例(参考vivado-Language Template)

1. Moore型

   parameter <state1> = 4'b0001;
   parameter <state2> = 4'b0010;
   parameter <state3> = 4'b0100;
   parameter <state4> = 4'b1000;

   reg [3:0] <state> = <state1>;

   always @(posedge <clock>)
      if (<reset>) begin
         <state> <= <state1>;
         <outputs> <= <initial_values>;
      end
      else
         case (state)
            <state1> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
               <outputs> <= <values>;
            end
            <state2> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
               <outputs> <= <values>;
            end
            <state3> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
               <outputs> <= <values>;
            end
            <state4> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
               <outputs> <= <values>;
            end
            default: begin  // Fault Recovery
               <state> <= <state1>;
               <outputs> <= <values>;
	    end
         endcase

2. Mealy型

   parameter <state1> = 4'b0001;
   parameter <state2> = 4'b0010;
   parameter <state3> = 4'b0100;
   parameter <state4> = 4'b1000;

   reg [3:0] <state> = <state1>;

   always @(posedge <clock>)
      if (<reset>)
         <state> <= <state1>;
      else
         case (state)
            <state1> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
            end
            <state2> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
            end
            <state3> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
            end
            <state4> : begin
               if (<condition>)
                  <state> <= <next_state>;
               else if (<condition>)
                  <state> <= <next_state>;
               else
                  <state> <= <next_state>;
            end
         endcase

   assign <output1> = <logic_equation_based_on_states_and_inputs>;
   assign <output2> = <logic_equation_based_on_states_and_inputs>;

参考:《无线通信FPGA设计》 田耕 徐文波 张延伟等.

             vivado-Language Template

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值