对于三到八译码器而言,用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 ;