对于三到八译码器而言,用a、b、c表示输入引脚,d0、d1、d2、d3、d4、d5、d6、d7 表示三到八译码器的输出引脚。对该设计项目进行编译后模拟仿真,这时非常容易从模拟仿真出来的波形上看到出现了毛刺。如采用同步时钟(引脚驱动)方式,就可以消除毛刺。要注意的一点是建立和保持时间(Setup/hold time )是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立时间Set up time。如不满足Setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。hold time不够,数据同样不能被打入触发器。我们选用a端的输入脉冲宽度是时钟脉冲的四倍,这样D 触发器就可以正常动作,输出结果是正确的,见图3、图4。如果我们一定要使输入脉冲等于输出脉冲的宽度,就要使输入脉冲的高电平与时钟脉冲的高电平错开,保证D触发器能工作。
subdesign modcount (clk,reset:input; q[2..0]utput; ) variable counter3:machine of bits(rr[2..0]) with states(r0=B"101", --换成r5的输出 r1=B"100", --换成r4的输出 r2=B"000", --换成r0的输出 r3=B"001", --换成r1的输出 r4=B"011", --换成r3的输出 r5=B"010", --换成r2的输出 r6=B"110", r7=B"111"); begin q[ ]=rr[ ]; counter3.reset=reset; counter3.clk=clk; CASE counter3 IS when r0=>counter3=r1; when r1=>counter3=r2; when r2=>counter3=r3; when r3=>counter3=r4; when r4=>counter3=r5; when r5=>counter3=r6; when r6=>counter3=r7; when r7=>counter3=r0; END CASE; End ;