目录
一、“复位”概述
1.1 什么是复位
1.2 复位的目的
1.3 复位的分类
二、“高复位”or“低复位”
三、几种实现方法
3.1 同步/异步复位
3.1.1 同步复位
3.1.2 异步复位
3.2 异/同步复位优缺点
3.2.1 同步复位的优点:
3.2.2 同步复位的缺点:
3.2.3 异步复位优点(与同步复位缺点相对应来看):
3.2.4 异步复位缺点(同上,与同步复位优点相对应来看):
3.3 异步复位-同步释放
四、补充说明
复位可以将FPGA芯片上所有“时序器件”恢复初始态(一般认为复位后器件输出是0)。且复位只针对时序器件存在,LUT就不存在复位。
目前接触的3GPP-PHY层通信链路设计中,复位大致用于两处:
1)上电复位:让器件进入一个稳定的可工作状态,防止器件上电后以一个非期望初值运行,而导致功能异常(跑飞了)。
2)异常复位:纠正链路功能异常。
同步复位、异步复位、异步复位-同步释放
针对Xilinx的FPGA芯片,Xilinx官网手册推荐使用“高复位”(控制信号也推荐高有效),究其原因是因为Xilinx的触发器复位管脚都是高电平有效的,所以如果使用低电平复位反而会引入反相器进行处理。
也可通过下面实验的综合后结果看出,低电平复位会多消耗一个LUT:
a.高电平复位
b.低电平复位
所谓的“同步” “异步”,指复位的执行与时钟(CLK)是否同步,可通过敏感列表中是否包含复位信号判断。
同步复位:复位信号和时钟同步,当时钟上升沿检测到复位信号,执行复位操作。
always@(posedge clk)
异步复位:不受时钟影响,只要复位信号有效,就会进行复位。
always@(posedge clk or posedge rst)
Verilog HDL描述为:
module test_rst( input i_clk, input i_rst, input i_din, output reg o_dout ); always@(posedge i_clk) begin if(i_rst) o_dout <= 1'b0; else o_dout <= i_din; end endmodule
综合后的RTL视图:
:
Verilog HDL描述为:
module test_async_rst( input i_clk, input i_rst, input i_din, output reg o_dout ); always@(posedge i_clk or posedge i_rst) begin if(i_rst) o_dout <= 1'b0; else o_dout <= i_din; end endmodule
综合后的RTL视图:
1)可过滤掉高于时钟频率的rst信号毛刺
2)有效防止rst信号不满足“Trecovery (recovery time,恢复时间)” or “Tremoval (removal time,消除时间)”而产生的亚稳态。
结合同/异步复位各自的优点,一般设计中采用“异步复位-同步释放”方式,即:
1)复位信号的到来是随机的,不与时钟信号的同步
2)而复位信号释放的时候受到时钟信号的同步
Verilog HDL描述为:
module test_rst( input i_clk, input i_rst, output reg o_rst ); reg s_rst_mid; reg s_rst_out; always@(posedge i_clk or posedge i_rst) begin if(i_rst) begin s_rst_mid <= 1'b0; s_rst_out <= 1'b0; end else begin s_rst_mid <= 1'b1; s_rst_out <= s_rst_mid; end end always@(posedge i_clk) begin o_rst <= s_rst_out; end endmodule
综合后的RTL视图:
事实上针对不同厂家、不同器件需要的复位策略应该是不一样的。
这里主要对Xilinx器件的复位做一个小结。
参考文献:
1. WP272, Get Smart About Reset: Think Local, Not Global;
2. WP275, Get your Priorities Right - Make your Design Up to 50% Smaller.
Xilinx复位:
1. 不需要全局复位信号;
2. 高电平复位;
3. 同步复位或异步复位,同步释放;
4. 不需要复位的bit就不要复位。
详细说明:
1. Xilinx不推荐使用全局复位,并且要尽可能的避免全局复位。首先全局复位扇出很大,并且一般一个设计中都有多个时钟域,全局复位不能与它们同步。再者,Xilinx器件在配置或重配置的过程中已经完成了initialize,不需要再进行加载序列去清除memory。如果确实需要全局复位,需小心使用,并在每个时钟域同步一个local reset.
2. Xilinx寄存器上的控制端口是高电平有效的,如果使用低电平复位则需要额外的反相逻辑,可能会消耗更多的LUT资源。所以在设计中推荐使用高电平复位信号,控制信号也一样推荐高电平。
3. Xilinx的寄存器复位端口同时支持同步复位或异步复位,所以网上很多说的同步复位会消耗更多的资源在这里不适用。至于为什么推荐同步复位我也没有看的很懂…………
4. 复位信号会消耗很多的资源,布线资源、逻辑资源等,所以如果确定不需要复位的信号就不要加复位。一般没有feedback的流水信号完全不需要加复位,有feedback的信号加复位时要小心,可能会导致系统跑飞。
复位消耗的资源:
1. 消耗布线资源,降低其他连接的布线自由度,增加布线时间,可能导致系统性能下降;
2. 消耗逻辑资源,设计不好可能消耗更多的LUT,增加布局布线时间;
3. 因为SRL16E不支持复位端口,所以不能很好的利用SRL16E资源,极大的增加资源消耗。