1.原理
一个寄存器可以实现延迟一拍的效果。
可以看出输出out和中间寄存器in_reg确实 和输入in相差一拍,也就是一个时钟周期。
而out和in_reg没有延迟一拍是因为使用的是阻塞赋值。右边发生变化,左边立刻变化。
使用非阻塞赋值。
可以看到中间变量In_reg延迟输入In一个时钟周期,然后输出out延迟in_reg一个时钟周期,延迟了输入信号两个时钟周期。为什么out延迟in_reg一个时钟周期,是因为用的是非阻塞赋值,当等号右边发生变化时,左边不会立刻变化而是等到下一个时钟周期再一起变化。
当想对一个信号打两拍时,可以使用阻塞赋值。
总结:1.编写时序逻辑要使用非阻塞赋值的方式。
- 使用always语句块编写组合逻辑时要使用阻塞赋值的方式,敏感列表使用电平触发的方式。
- 在用always语句块中不要既使用阻塞赋值,又使用非阻塞赋值。
- 锁存器是不推荐使用的,但若一定要使用,推荐非阻塞赋值的方式,因为非阻塞赋值实现时序逻辑,进而实现锁存器是最为安全的。
- 推荐一个always语句块只对一个变量赋值,方便后期的维护和修改。