追风者

Verilog HDL代码描述对状态机综合的研究

0
阅读(1907)

1 引言
Verilog HDL作为当今国际主流的HDL语言,在芯片的前端设计中有着广泛的应用。它的语法丰富,成功地应用于设计的各个阶段:建模、仿真、验证和综合等。可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表,因此代码的描述必须符合一定的规则。大部分数字系统都可以分为控制单元和数据单元两个部分,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号,因而状态机性能的好坏对系统性能有很大的影响。
有许多可综合状态机的Verilog代码描述风格,不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。优秀的代码描述应当易于修改、易于编写和理解,有助于仿真和调试,并能生成高效的综合结果。

2 有限状态机
有限状态机(Finite State Machine,FSM)在数字系统设计中应用十分广泛。根据状态机的输出是否与输入有关,可将状态机分为两大类:摩尔(Moore)型状态机和米莉(Mealy)型状态机。Moore型状态机的输出仅与现态有关;Mealy型状态机的输出不仅与现态有关,而且和输入也有关。图1是有限状态机的一般结构图,它主要包括三个部分,其中组合逻辑部分包括状态译码器和输出译码器,状态译码器确定状态机的下一个状态,输出译码器确定状态机的输出,状态寄存器属于时序逻辑部分,用来存储状态机的内部状态。

图1 状态机的结构框图
2.1 好的状态机标准
好的状态机的标准很多,最重要的几个方面如下:
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义。其一要求该FSM的综合实现结果无毛刺等异常扰动,其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
第二,状态机的设计要满足设计的面积和速度的要求。
第三,状态机的设计要清晰易懂、易维护。
需要说明的是,以上各项标准,不是割裂的,它们有着直接紧密的内在联系。在芯片设计中,对综合结果评判的两个基本标准为:面积和速度。“面积”是指设计所占用的逻辑资源数量;“速度”指设计在芯片上稳定运行所能够达到的最高频率。两者是对立统一的矛盾体,要求一个设计同时具备设计面积最小,运行频率最高,这是不现实的。科学的设计目标应该是:在满足设计时序要求(包含对设计最高频率的要求)的前提下,占用最小的芯片面积,或者在所规定的面积下,使设计的时序余量更大,频率更高。另外,如果要求FSM安全,则很多时候需要使用“full case”的编码方式,即将状态转移变量的所有向量组合情况都在FSM 中有相应的处理,这经常势必意味着要多花更多的设计资源,有时也会影响FSM的频率所以,上述的标准要综合考虑,根据设计的要求进行权衡。

2.2 状态机描述方法
状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:
第一,整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
第二,用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
第三,在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态的输出(可以用组合电路输出,也可以时序电路输出)。
一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。

2.3 状态机的编码
二进制编码(Binary)、格雷码(Gray-code)编码使用最少的触发器,较多的组合逻辑,而独热码(One-hot)编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了比较逻辑,减少了毛刺产生的概率。由于CPLD更多地提供组合逻辑资源,而FPGA更多地提供触发器资源,所以CPLD多使用二进制编码或格雷码,而FPGA多使用独热码编码。另一方面,对于小型设计使用二进制和格雷码编码更有效,而大型状态机使用独热码更高效。

三段式状态机

时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客7H-h0mFI o9KB'x

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客?RMdmBt

"c~5DAw~]`0
状态机采用VerilogHDL语言编码,建议分为三个always段完成。

'^x&F8a#U*E0 中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客g g6A X q Am\m

{tG:Yn"`8W0

三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客*]"A.Ou%QpC(K&@7B

~,M!AS:e0 三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客j(NGO?8aZ0L2?n

/D |4wL;E Wu\0

示列如下:

*z&p8eq;G}:B9_7X0

(`k/egqXE'u0

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

R"_u\)m0

4J&c8jVF%M0

always @ (posedge clk or negedge rst_n) //异步复位中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客D Hd T8T@vl

if(!rst_n)

%iB0tT`3D0

current_state <= IDLE;

DS V9OdD,l0

else

;kC2A!A:t RA0~3P0

current_state <= next_state;//注意,使用的是非阻塞赋值

4}z A#k3`Fc0

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客n;s{pcEkD)I

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客J:sy#ym jQ*h

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客[+W!pjbi

ax s`M@bo0

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客@{ p^@-f/lv2Bh

//第二个进程,组合逻辑always模块,描述状态转移条件判断中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客 c8Q(oI1o!\ Lcu7Y

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客7Z9r9~6Hc$D5lRS2\c)F

*\{Vnhb(^0

always @ (current_state) //电平触发

|*_0b3v@6~ o#nD_%X0

begin中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客YW*oeos

next_state = x; //要初始化,使得系统复位后能进入正确的状态

#_Ym#Hg s,LNO0

case(current_state)

jn;lRhKq,t)ia0

S1: if(...)中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客kd hQ#N {_5K

next_state = S2; //阻塞赋值中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客%w+F%R&j1f6V

...

pv"F[LBdg0

endcase

!A2q,P[9O-w0

end 中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客|Hw evde|)k

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客'\,s:C1k:UwrN6G)U-bV

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客!PWT:d,Z#QG-]-@

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客.}b Q,[p\Z$\!M

!o,H'EnJWa!\z0

中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客o:f(cy~ {

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

Ym,G4LG(VPu0

always @ (posedge clk or negedge rst_n)

;U.g\%Q lbT#]0

...//初始化中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客bC LLM1X8H

case(next_state)中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客.z:h6sa)G@W:p

S1:中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客+@j{iE{!~\

out1 <= 1'b1; //注意是非阻塞逻辑

"jO7p-T5O:J/v+[0

S2:中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客f1\~([b$@

out2 <= 1'b1;

x(?$k$R'M'l!It0

default:... //default的作用是免除综合工具综合出锁存器。

;?3K;o2U,EH.O0

endcase中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客5z&\}WIld1t

end中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客8KT`%C2^zb {

三段式并不是一定要写为3个always块,如果状态机更复杂,就不止3段了。

b6X"Z6o u*eed.Z7`'I0

3 实例说明


下面通过实例来说明Verilog HDL代码描述对状态机综合结果的影响。
设计一个序列检测器,用于检测串行的二进制序列,每当连续输入三个或三个以上的1时,序列检测器的输出为1,其它情况下输出为0。
假设初始的状态为s0,输入一个1的状态记为s1,连续输入二个1后的状态记为s2,输入三个或以上1的状态记为s3,不论现态是何种状态一旦输入0的话,就返回到初始状态。根据题意,可画出状态图如图2所示。

图2 状态图
根据状态图以及前面状态机的介绍,可以采用一个always模块来描述,状态编码采用二进制编码,程序如下:
module fsm(clk,ina,out);
input clk,ina;
output out;
reg out;
parameter s0 = 3'bOO,s1 =3'b01,s2 =3'b10,s3=3'b11;
reg[0:1]state;
always @ (posedge clk)
begin
state<=s0;
out =0;
case(state)
s0:begin
state<=(ina)?s1:s0;out=0;
end
s1:begin
state<=(ina)?s2:s0;out=0;
end
s2:begin
state<=(ina)?s3:s0;out=0;
end
s3:begin
state<=(ina)?s3:s0;out=1;
end
endcase
end
endmodule
采用Synplify Pro工具在Altera EPF10K10系列器件上进行综合,其综合的结果如图3所示。

如果采用两个always来描述,程序的模块声明、端口定义和信号类型部分不变,只是改动逻辑功能描述部分,改动部分的程序如下:
alwys @ (posedge dk)
state fsm <=next_state;
always @ (state_fsm or ina)
begin
state<=s0;out =0;
case(state_fsm )
s0:begin
next_state=(ina)?s1:s0;out=0;
end
s1:begin
next state=(ina)?s2:s0;out=0:
end
s2:begin
next_state=(ina)?s3:s0;out=0;
end
s3:begin
next_state=(ina)?s3:s0;out=1;
end
endcase
end
endmodule
在相同的器件上其综合的结果如图4所示,比较图3与图4的综合结果,可以看出。两种综合结果都是采用了两个触发器来存储状态。其不同的地方是输出部分,采用一个always模块的输出结果是寄存器输出。采用两个always模块描述的是组合逻辑直接输出,这是因为代码中的输出赋值也放在了时钟的上升沿(always @ (posedge clk))。其综合的结果是寄存器,因此它比直接组合逻辑输出延迟一个时钟周期。

图4
如果采用一位hot编码,仅改动参数设置的两行程序。采用一个always模块描述,改动部分的程序如下:
parameter s0 = 3'b0001,s1 =3'b0010,s2 =3'b0100,s3=3'b1000;
reg[0:3] state;

图5
综合的结果如图5所示。将图5与图3相比,可以看出:
图5中状态寄存器采用了4个触发器来存储状态,而图3采用了两个触发器来存储状态,这是由于它们的状态编码的不同而得到的不同的综合结果,采用二进制编码综合得到的触发器要比采用独热码综合得到的触发器少。它们的共同之处都是采用了寄存器来输出的。

3 结束语
有多种可综合状态机的Verilog HDL代码描述风格。其综合的结果是不同的。其中广泛采用的是两个或三个always模块描述。组合逻辑输出型状态机不适合应用在高速复杂系统设计中,在高速系统中应当采用寄存器输出型状态机。寄存器类型信号不会产生毛刺,并且输出不含组合逻辑。会减少组合逻辑门延时。容易满足高速系统设计要求。总之,状态机的设计是数字系统设计中的关键部分,设计时做到心中有电路。充分考虑其综合的结果,才能编写出高质量的综合代码。进而提高设计水平。

Baidu
map