你的FPGA复位用对了吗?

本文转载自:FPGA入门到精通

FPGA开发中,全局网络对FPGA的综合布线、资源消耗等影响巨大,全局网络中,除了时钟网络外,还有经常被我们忽视的复位网络,如果复位没有处理好,会出现FPGA资源消耗增多、时序满足难、综合布线时间增加、降低系统稳定性等问题,也可能出现一些意想不到错误。

今天我们就聊一聊FPGA复位应该如何用?看看哪些信号需要复位?哪些信号不需要复位?

一、Xilinx FPGA设计中的复位准则

1、尽量少使用复位,能不用复位就不用

在设计中,应尽量避免使用复位,只要是复位,对资源消耗和时序收敛都有影响,特别是全局复位。如果必须使用复位,应尽量采用局部复位,这样可以减少对全局资源的影响。

(1)全局复位

虽然全局复位信号通常被认为是非时序关键的,但在高时钟频率下,全局复位信号的释放可能成为时序关键事件。

因此,设计时应考虑复位信号的时序要求,特别是在包含反馈路径的电路中。

全局复位信号可能会占用大量的布线和逻辑资源,影响设计的性能和尺寸。

在设计时,应尽量减少复位信号的使用,以优化资源利用率。

如果确实需要全局复位,可以考虑全局网络资源BUFG。

(2)局部复位

对于需要局部复位的触发器,可以设计一个局部的高性能复位网络。

这种网络可以在配置FPGA或异步复位信号期间,通过移位寄存器链实现异步复位和同步释放,从而避免亚稳态问题。

2、同步复位与异步复位,优先考虑同步复位,如果需要异步复位,推荐使用异步复位同步释放。

如果需要使用复位,建议优先考虑同步复位。同步复位可以直接映射到FPGA设备架构中的更多资源元素,而异步复位可能会增加时序复杂性。

如果必须使用异步复位,推荐使用异步复位同步释放。

3、复位电平选择,Xilinx推荐高电平复位。

Xilinx推荐使用高电平复位(Active-High),因为FPGA内部的复位信号通常是高电平有效的。使用低电平复位可能需要额外的逻辑门来实现,这会增加设计复杂性和资源消耗。

对于Altera的FPGA而言,因为里面的flip-flop只支持低有效的异步复位,所以推荐使用低有效的异步复位。

二、哪些情况下需要使用复位信号?哪些情况下不需要使用复位信号?

上电配置与全局复位有相同的复位效果,另外,上电配置还会初始化所有RAM单元。

1、控制逻辑需要复位,数据逻辑不需要复位。

控制逻辑,就是包含反馈路径的电路,比如状态机、计数、地址计算、状态标志位等信号逻辑。

数据逻辑,就是没有反馈的电路,实际上根本不需要复位,比如流水线逻辑。

2、仅用于仿真时不出现“X”,需要赋初值的情况,不用复位。

为避免功能仿真时,没有初始值,触发器输出会显示“X”,影响仿真调试效果,可以在声明触发器时,直接赋初值,例如:

reg test = 1'b0;

3、xilinx 原语SRL16、SRL32、LUTRAM 不需要复位。

这些都是利用LUT资源实现的,没有复位接口,不需要复位。

4、DSP48E1或BRAM等资源,推荐同步复位。

使用同步复位方式,综合时可以利用DSP48E1或BRAM等资源内部的寄存器,不需要消耗额外的FPGA资源,可以节省FPGA资源的消耗。

三、同步复位、异步复位与同步释放

1、同步复位(Synchronous Reset)

(1)定义

同步复位是指复位信号只在时钟边沿有效时才会影响触发器的状态。

always @(posedge clk) begin
if (reset) begin
...
end else begin
...
end
end

(2)优点

. 有利于仿真器的仿真;
. 可以使得设计的系统成为100%的同步时序电路,有利于时序分析,并
. 可以综合出较高的Fmax;
. 由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。

(3)缺点

. 复位信号的有效时长必须大于时钟周期,才能被系统识别并完成复位任务;
. 由于大多数逻辑器件的目标库内的DFF都只有异步复位端口,所以采用同步复位时,综合器会在寄存器的数据输入端口插入组合逻辑,这可能会增加FPGA内部的逻辑资源和组合逻辑门时延。

2、异步复位(Asynchronous Reset)

(1)定义

异步复位不依赖于时钟信号,可以在任何时间点发生。一旦复位信号被激活,无论当前时钟状态如何,触发器都会立即进入复位状态。

always @(posedge clk or posedge reset) begin
if (reset) begin
...
end else begin
...
end
end

(2)优点

. 大多数目标器件库的DFF都有异步复位端口,可以节省资源;
. 设计相对简单;
. 异步复位信号识别方便。

(3)缺点

. 复位信号释放时可能出现亚稳态问题;
可能因为噪声或毛刺造成虚假复位信号;
静态定时分析比较困难;
. 对于DFT (Design For Test可测性设计)设计,如果复位信号不是直接来自于I/O引脚,在DFT扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。

3、异步复位同步释放

异步复位同步释放是一种常见的数字电路设计技术,它结合了异步复位和同步释放的优点。可以提供快速响应的复位功能,同时减少由于异步信号释放而可能导致的亚稳态问题。

(1)定义

异步复位允许复位信号在任何时间点发生,无论时钟信号的状态如何。当复位信号被激活时,电路会立即进入复位状态。

同步释放,简单理解,就是复位信号进入模块后先用本地时钟打两拍,这里需要注意在多个时钟域的时候注意是本地时钟,不是全局时钟。

(2)优点

. 结合了异步复位的速度和同步释放的稳定性。
. 可以减少亚稳态的风险。

(3)缺点

需要额外的同步逻辑,可能会增加电路的复杂性和延迟。

(4)Verilog代码示例

module async_reset_sync_release (
input clk, // 时钟信号
input rst, // 高电平有效的异步复位信号
input data, // 数据输入
output reg q // 数据输出
);
// 异步复位同步释放逻辑
reg sync_rst_d1, sync_rst_d2;
always @(posedge clk) begin
sync_rst_d1 <= rst;
sync_rst_d2 <= sync_rst_d1;
end
// 数据寄存器逻辑
always @(posedge clk or posedge sync_rst_d2) begin
if (sync_rst_d2) begin
q <= 1'b0; // 同步复位信号激活时,将输出置为0
end else begin
q <= data; // 同步复位信号释放时,跟随数据输入
end
end
endmodule

推荐阅读Xilinx手册:wp272、wp275

https://docs.xilinx.com/v/u/en-US/wp272
https://docs.xilinx.com/v/u/en-US/wp275

最新文章

最新文章