利用有限状态机进行复杂时序逻辑的设计:
目的:掌握利用有限状态机实现复杂时序逻辑的方法。
在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在Verilog HDL硬件描述语言中,这种设计方法得到进一步的发展。通过Verilog HDL提供的语句,我们可以直观地设计出适合更为复杂的时序逻辑的电路。关于有限状态机的设计方法在教材中已经作了较为详细的阐述,在此就不赘述了。
下例是一个简单的状态机设计,功能是检测一个5位二进制序列"10010"。考虑到序列重叠的可能,有限状态机共提供8个状态(包括初始状态IDLE)。
状态机设计确实是一个很实用的工具,可以加快设计的进展。当然在进行状态机原理图的会之前设计者心里要清楚各个状态间如何进行转换。
用状态机设计后生成的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