⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL言语学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与规划,对状况机FSM进行剖析与建模。 文章和代码已归档至【Github仓库:hardware-tutorial】,需求的朋友们自取。或许关注公众号【AIShareLab】,回复 FPGA 也可获取。

状况编码

在运用Verilog HDL描绘状况机时,通常用参数界说句子parameter指定状况编码。状况编码计划一般有三种:自然二进制编码、格雷(Gray)编码和独热码(one-hot编码)。对应于图所示的状况图的各种编码计划如表所示。

有限状况机的编码计划

状态机设计中的关键技术

状况机编码对状况机速度和面积联系严重

常用编码

  • 二进制码(binary)
  • 格雷码(Gray)
  • 独热码(one-hot)

二进制码与格雷码是压缩状况编码,运用最少的状况位进行编码。

二进制编码的长处是运用的状况向量最少,但从一个状况转化到相邻状况时,或许有多个比特位发生改变,瞬变次数多,易发生毛刺。

格雷码

特色是当时状况改动时,状况向量中仅一位发生改变,因而当体系的状况改变是基于异步的输入信号时,格雷编码能够防止进入过错的状况。

格雷码既能够消除状况转化时多状况信号传输延迟发生的毛刺,又可下降功耗。

独热码(one-hot编码)

N个状况运用N个触发器(FF)

  • 减少了状况寄存器之间的组合逻辑级数,因而进步了运转速度 ;
  • 触发器(FF)数量增加,组合逻辑电路减少;
  • 任何状况都能够直接增加/删除等修正而不会影响状况机的其余部分;
  • 由于译码简单,可进步速度,且易于修正。

独热码(one-hot编码)的特色是:状况数等于触发器(FF)的数目,冗余的触发器带来的好处是译码电路的简单化,因而它的速度非常快,此外由于FPGA器材内部触发器的数量是固定的且比较丰富,所以one-hot编码非常适合于FPGA规划。

独热码的缺点

  • 改变的状况位越多,组合输出安稳前所需的时刻就越长,发生的毛刺就越多 ;
  • 多个寄存器或许受异步输入的影响,使得亚稳态发生的概率有所增加 ;

状况机杂乱状况跳转的分支很多时,要合理的分配状况编码,保证每个状况跳转都仅有1位发生改变,这是很困难的作业。

不论运用哪种编码,状况机中的各个状况都应该运用符号常量,而不应该直接运用编码数值,赋予各状况有意义的名字对于规划的验证和代码的可读性都是有益的。

编码办法 面积 速度 状况数量
Binary (次序二进制) 较好 较差 Log2(state N)
One-hot 较差 较好 States Number
Gray 较好 较差 Log2(state N)

如何消除输出端发生的毛刺

前面介绍的一般状况机由组合逻辑电路决议电路的输出.当组合逻辑较大时,若状况触发器的值发生改变或许输入信号发生改变,由于各信号在组合逻辑内部通过的途径不一样,就简单在输出端发生毛刺。

下面介绍两种常用消除毛刺的办法:

1.具有流水线输出的Mealy状况机

为了消除毛刺,能够在一般Mealy的输出逻辑后加一组输出寄存器,将寄存器的输出值作为输出向量,这种Mealy状况机的等效方框如图所示。

状态机设计中的关键技术

2.在状况位里编码输出的Moore状况机

这种办法的指导思想是将状况寄存器和输出向量统一进行编码,行将状况位自身作为输出信号,其等效状况框图如下所示。

状态机设计中的关键技术

下面以图所示的状况图说明在状况位里编码输出的办法。图中,状况机共有三个状况:IDLE,START和WAIT,输入信号为:input_1,input_2,input_3,input_4。这些输入信号的不同逻辑组合就构成了状况之间跳转的条件。

状态机设计中的关键技术

该状况机需求操控两个输出信号:output_1和output_2。能够选用4bits的状况编码,其中高两位表明当时的状况,结尾两位操控output_1和output_2的输出。IDLE状况编码为4’b0000,START状况编码为4’b0101,WAIT状况编码为 4’b1011。

参考程序如下所示:

module  FSM1 (nRST, CP, input_1, input_2, input_3, input_4, output_1, output_2) ;
	input input_1, input_2, input_3, input_4; //界说输入变量
	input nRST, CP;
            output output_1, output_2 ; //界说输出变量
	wire output_1, output_2; 
	reg [ 3 : 0 ] Current_state, Next_state;
	//状况参量的界说,根据前面所述的全译码状况编码
parameter [ 3 : 0 ] IDLE = 4'b0000,  START = 4'b0101, WAIT = 4'b1011;
//The first always block, sequential state transition
always @(posedge CP or negedge nRST) 
    if (!nRST)        //当体系复位时,状况寄存器置为IDLE状况
        Current_state <= IDLE;  //设置初态(IDLE)
    else  //状况寄存器进行状况存储,将下一状况存储到状况寄存器成为当时状况
        Current_state <= Next_state;   
// The second always block, combinational condition judgment
always @(Current_state or input_1 or input_2 or input_3 or input_4)	
  case(Current_state) //根据当时状况和状况转化条件进行译码
     IDLE:
          if(input_1 && input_2)  Next_state = START;
          else  Next_state = IDLE;
     START:
          if(input_3)  Next_state = WAIT;
          else  Next_state = START;  
     WAIT:  
           if(input_4)  Next_state = IDLE;
           else Next_state = WAIT; 
     default:  Next_state = IDLE;
   endcase
//状况机的输出逻辑
assign  output_1 = Current_state[1]; 
assign  output_2 = Current_state[0];
endmodule

如何运用One-hot编码计划规划状况机

对状况机的各个状况赋予一组特定的二进制数称为状况编码。比较常用的有自然二进制码、格雷码和One-hot编码。自然二进制码和格雷码的编码计划运用的触发器较少,其编码功率较高,但担任根据当时状况和状况转化条件进行译码的组合电路会比较杂乱,其逻辑规划也较大,使得次态逻辑在传输过程中需求通过多级逻辑,从而影响电路的作业速度。

One-hot编码计划运用n位状况触发器表明具有n个状况的状况机,每个状况与一个独立的触发器相对应,并且在任何时刻其中只要一个触发器有效(其值为1)。虽然这种计划会运用较多的触发器,但它的编码方法非常简单,可有效地简化组合电路,并换得作业可靠性和作业速度的进步。在大规划可编程逻辑器材如FPGA中,触发器数量较多而门逻辑相对较少,One-hot编码计划有时反而更有利于进步器材资源的利用率。

界说当时状况向量state为一个5-bits向量,结尾的两位表明状况机输出,state[2]为1表明状况IDLE,state[3]为1表明状况START,state[4]为1表明状况WAIT。

下面是基于One-Hot编码方法的状况机完成代码:

module  FSM2 (nRST, CP, input_1, input_2, input_3, input_4, output_1, output_2) ;
	input input_1, input_2, input_3, input_4; //界说输入变量
	input nRST, CP;
            output output_1, output_2 ; //界说输出变量
	wire output_1, output_2; 
	reg [ 4 : 0 ] state, Next_state;
    parameter [ 4 : 0 ] IDLE  = 5’b001_00, //状况参量,结尾两位表明对应的输出
         START = 5’b010_01,
         WAIT   = 5’b100_11;
 //状况对应在state中的表明位置,One-hot
parameter [2:0] IDLE_POS    = 3'd2,  // IDLE POSition
                            START_POS = 3'd3,  // START POSition
                            WAIT_POS   = 3'd4;  // WAIT POSition
always @(posedge CP or negedge nRST)     //状况存储
     if (!nRST)  state <= IDLE;
     else             state <= Next_state; 
always @(input_1 or input_2 or input_3 or input_4)//状况搬运逻辑
    begin
        Next_state  =  IDLE; //设置初态
        case(1’b1)                   //One-Hot编码完成状况搬运时,
           //每次取state的一位与1比较
        state[IDLE_POS]:
               if(input_1 && input_2)
                          Next_state = START;
               else     Next_state = IDLE;
        state[START_POS]:
               if(input_3)
                          Next_state = WAIT;
               else     Next_state = START;  
        state[WAIT_POS]:  
               if(input_4)
                        Next_state = IDLE;
              else    Next_state = WAIT; 
        default:   Next_state = IDLE;
     endcase
end
//状况机的输出逻辑
assign  output_1 = state[1];
assign  output_2 = state[0];
endmodule

One-hot编码特色:指定各个状况在状况编码中的表明位,选用参量界说方法指定One-hot状况编码;运用always句子描绘状况寄存器的状况存储;运用敏感表和case句子描绘状况转化逻辑,在case句子中只选用一位寄存器比较方法;运用assign句子描绘状况编码操控的状况机输出。

参考文献:

  1. Verilog HDL与FPGA数字体系规划,罗杰,机械工业出版社,2015年04月
  2. Verilog HDL与CPLD/FPGA项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月
  3. Verilog HDL数字规划与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月
  4. Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月

欢迎关注公众号【AIShareLab】,一起交流更多相关常识,前沿算法,Paper解读,项目源码,面经总结。