在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提 供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述,在此就不赘述了。
下例是一个简 单的状态机设计,功能是检测一个5位二进制序列“10010”。 考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。
状态机设计确实是一个很实用的工具,可以加快设计的进 展。当然在进行状态机原理图的会之前设计者心里要清楚各个状态间如何进行转换。
这是状态机设计的原理图:
以下是用StateCAD的自带激励仿真进行的功能仿真,可能是对这个仿真工具还不太熟悉吧,感觉不是很好用。在输入 的码序列CODE_IN出现10010后CHECK立马出现一个高电平信号。
以下是用MODELSIM进行的仿真。也是在CODE_IN出现10010以后CHECK会有一个高电平。
用状态机设计后生成的VerilogHDL:
module untitled(CLK,CODE_IN,RESET,CHECK);
input CLK;
input CODE_IN,RESET;
output CHECK;
reg CHECK,next_CHECK;
reg A,next_A,B,next_B,C,next_C,D,next_D,E,next_E,IDLE,next_IDLE;
always @(posedge CLK)
begin
A = next_A;
B = next_B;
C = next_C;
D = next_D;
E = next_E;
IDLE = next_IDLE;
CHECK = next_CHECK;
end
always @ (A or B or C or CODE_IN or D or E or IDLE or RESET)
begin
if ( ~RESET & CODE_IN & A | ~RESET & CODE_IN & B | ~RESET & CODE_IN & D | ~RESET & CODE_IN & E | ~RESET & CODE_IN & IDLE ) next_A=1;
else next_A=0;
if ( ~RESET & ~CODE_IN & A ) next_B=1;
else next_B=0;
if ( ~RESET & ~CODE_IN & B | ~RESET & ~CODE_IN & E ) next_C=1;
else next_C=0;
if ( ~RESET & CODE_IN & C ) next_D=1;
else next_D=0;
if ( ~RESET & ~CODE_IN & D ) next_E=1;
else next_E=0;
if ( ~CODE_IN & C | ~CODE_IN & IDLE | RESET ) next_IDLE=1;
else next_IDLE=0;
if ( ~RESET & ~CODE_IN & D ) next_CHECK=1;
else next_CHECK=0;
end
endmodule