高级FPGA设计——第五章:复位电路
0赞复位极端重要,但是却常常容易被忽略。在这一章,我们就来聊聊复位的事。
1,同步复位和异步复位
众所周知,复位操作包括同步复位和异步复位。我们先来了解下两者存在的问题。
1.1 完全异步复位的问题
完全异步复位在确定和释放触发器时都是异步的,与时钟无关。
异步复位代码如下:
该方法存在一个问题,示意图如下:
复位恢复时间指的是复位释放沿与时钟沿之间需要保持的最小时间间隔。
复位情况1中,复位释放后,离时钟沿有足够的时间,系统将正常工程。
但对于复位情况2,复位释放沿与时钟沿离得太近,这会导致触发器输出亚稳态,导致系统工作异常。
1.2 完全同步复位
异步复位有问题,那改成同步复位呢?自然,采用同步复位的话,就完全满足复位恢复时间的要求了。但同步复位又有新的问题。
同步复位代码如下:
该方法对高频率时钟是没问题的,但若时钟频率很低,甚至是非周期的使能时钟。由于复位必须在时钟沿有效才能确立复位,这就很有可能导致复位信号可能不能被捕获,造成复位丢失。
1.3 异步确立同步释放
针对以上2种方法的问题,我们将两种方法结合,来避免之前的问题。异步复位优点在于确立阶段,同步复位的优点在于释放阶段,因此我们可以采用异步确立同步释放的复位办法。
代码如下,orstn即为处理后的复位信号,利用该信号进行复位,可以避免以上提到的问题。
2,混合复位类型
2.1 不可复位触发器
比较下面两段代码:
实现1:
实现2:
模块本意是dout触发器不需要复位的,但是采用1中代码,dout就需要更大的时序元件和额外的布线资源。
而实现2的结构就会简单些:
2.2 内部产生复位
在一些情况中,存在内部事件引起复位,比如看门狗。
若复位逻辑是由组合逻辑产生的话,容易有毛刺产生:
设 rstn = a&b || !a&c
这时若采用异步复位,容易产生误操作。虽然根据数字电路知识,冒险可以避免掉,但是这意味着消耗更多的资源。因此内部复位建议使用完全同步复位。