我是靠谱客的博主 光亮白云,最近开发中收集的这篇文章主要介绍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

最后

以上就是光亮白云为你收集整理的Verilog状态机的分类和编码实现(含编码范例)的全部内容,希望文章能够帮你解决Verilog状态机的分类和编码实现(含编码范例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部