利用有限状态机进行复杂时序逻辑的设计:
目的:掌握利用有限状态机实现复杂时序逻辑的方法。
在数字电路中我们已经学习过通过建立有限状态机来进行数字逻辑的设计,而在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
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3学习整理】使用 LPUART 的loopback 模式实现核间通讯被打赏¥28元 | |
| arduinounoq原生zephyr环境搭建被打赏¥31元 | |
| 树莓派3+Klipper,MPU6050共振补偿被打赏¥41元 | |
| GroveCreatorKit套件+摇杆测评被打赏¥18元 | |
| 设备功耗web监控界面(ESP32C5)被打赏¥28元 | |
| OrangePiZero2W系统被打赏¥33元 | |
| Linux环境下以模拟方式快速实现出入管理功能测试被打赏¥24元 | |
| 树莓派3+Klipper,老3D打印机满血升级被打赏¥33元 | |
| OK1126B-S开发板下串口屏及其应用被打赏¥21元 | |
| 低功耗超声波液位测距仪(ESP32S3)被打赏¥27元 | |
我要赚赏金
