| |
本篇大部分内容参考了其他网友的内容,因为在设计中也遇到了复位问题,所以在这里总结记录。
复位的目的就是让电路在上电之后有一个确定的初始状态,而很多时候我们设计的复位电路没有能够达到这个效果。
1. 同步复位电路
同步复位信号在时钟有效沿到达时才能起作用,复位信号成为逻辑路径中的一部分,同时可以滤掉复位信号中的毛刺,使用起来比异步复位简单方便。 一般如果在同步电路内部产生异步的控制信号,这样容易产生毛刺。但同步复位信号的译码要比需要作用的时刻提前一个时钟周期。
当系统上电后,晶振还没有起振,或者锁相环还未稳定,这时候没有时钟,所以同步复位没有起作用,总线上就有可能发生冲突,产生短路,只有增加异步上电复位电路才能解决此问题;由于异步复位不需要时钟,对于系统的突发事件复位也要采用异步复位方式。
2. 异步复位电路
异步复位电路是指 复位信号连接在专用复位端,和时钟没有关联,可以再任何时候进行复位。
异步复位的优点:无需额外的逻辑资源,实现简单,而且CPLD有针对复位信号的全局专用不限资源,可以保证复位管脚到各个寄存器的clock skew最小(注意不是到各个寄存器的延迟最小);
异步复位缺点:
1). 复位信号容易受到外界的干扰,产生毛刺,导致进入不希望的复位;
2). 异步复位信号释放的随机性,可能导致亚稳态。对于状态机来说,不稳定的复位将导致进入不确定的状态。
上面说了那么多,问题出来了:1. 在VHDL代码中如何实现上述两种复位呢? 2. 有没有更可靠的复位形式呢?
3. VHDL 实现
同步复位和异步复位的区别就在于,复位信号和时钟 有没有关系。VHDL 代码实现的差异,就是是否将复位语句放入 时钟内。 下面以一个 10 循环计数器为例说明。
同步复位 VHDL 代码:
同步复位 RTL 视图:
异步复位 VHDL 代码:
异步复位 RTL 视图:
顺便提一下,signal 和 variable 的区别。可以理解为《 变量赋值语句生成组合电路,是不受时钟边沿控制的。信号赋值语句形成一个D触发器,受时钟边沿控制。另外 变量必须只能在进程内使用。》
4. 异步复位,同步释放
altera 推荐使用 异步复位电路,并给出 异步复位,同步释放 电路形式。()
时序图: