可编程逻辑
FPGA设计中几乎不可避免地会用到复位信号,无论是同步复位还是异步复位。我们需要清楚的是复位信号对时序收敛、资源利用率以及布线拥塞都有很大的影响。除此之外,多时钟系统还面临着更为复杂的复位问题。为此,FPGA设计中使用复位信号应遵循如下原则:
(1)避免不必要的复位
什么是不必要的复位呢?最明显的例子就是上电复位。此类复位的目的是希望FPGA在上电之后所有的触发器都能达到一个稳定且已知的状态。通常这类复位信号具有很高的扇出且要传输到不同的时钟域,故通常采用异步复位。高扇出容易导致布线拥塞,跨时钟域则增加了设计的复杂度。而事实上,对于XilinxFPGA,一旦上电,所有触发器都将进入初始值,这个初始值可以由用户在HDL代码里设定(不必担心,无论是Vivado还是第三方综合工具都支持),也可以是默认值。另一种情形是伴随有效标记信号的数据总线不需要复位信号,流水线(FF->组合逻辑->FF->组合逻辑->FF)或延迟链(移位寄存器,等效于级联的触发器)只需要对起始位置的触发器进行复位,而中间和末级触发器无需复位,因为旧的数据总会被新的数据“冲走”。
(2)理解需要复位的场景
状态寄存器:特定事件发生时需要进行复位。
计数器和状态机需要复位信号回到初始状态(实际上,计数器就是一个简单的状态机)。
反馈路径上的触发器需要通过复位信号回到复位状态。
(3)复位极性尽可能保持一致
复位极性(高电平有效还是低电平有效)最好和器件结构保持一致。例如:7系列FPGA中的触发器只支持高有效复位,而UltraScale和UltraScale+中的触发器其复位极性是可编程的,即既支持高电平有效,又支持低电平有效。我们注意到AXI相关的IP其复位都是低有效(这是由其自身规格决定的),如果设计中使用了很多的这类IP,可以将复位信号统一为低电平有效。
异步复位使用策略
所谓异步复位是指复位信号与使用该复位信号的时钟之间没有明确的相位关系。从RTL代码的角度而言,异步复位信号将出现在进程的敏感变量列表中(Verilog中的always,VHDL中的process)。异步复位的弊端在于无论是激活(assertion)还是释放(de-assertion)均是异步。如下图所示,图中标记①为激活事件,标记②为释放事件。复位信号为高电平有效。首先需要明确的是异步复位信号需要满足RecoveryTime(对应图中的Trec)和Removal Time(对应图中的Trem)的要求,前者类似于Setup Time,后者类似于Hold Time。就激活事件而言,即使发生RecoveryTime或Removal Time的违例,只要复位信号持续时间足够(至少一个时钟周期)就可以保证触发器达到一个稳定的逻辑0状态。但如果释放事件发生Recovery Time那么会有怎样的后果呢?
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !