Menu Close

FPGA中 同步复位(sync)和异步复位(async)的使用

在学习和使用fpga 过程中, 我们会经常使用复位信号,复位信号可以帮助fpga的相关逻辑回到一个初始状态,我们经常会看到代码中有同步复位和异步复位的情况,本节我们对这个问题做一些研究。

同步复位(sync) 异步复位(async)
使用方式 通常情况下在时钟的上升沿时发生 无论时钟处于哪种情况,甚至没有时钟的情况下,都能发生
verilog 语法 always @ (posedge clk)
if(reset)…..oralways @ (posedge clk)
if(!rst_n) ………
always @ (posedge clk or posedge reset)
if(reset) …….or    always @ (posedge clk or negedge rst_n)
if(!rst_n) …….
优点 1)只有在时钟边沿时(通常时上升沿)才有效
2)可以帮助滤掉一些高于时钟频率的毛刺
3)综合的时候,有利于提高时序收敛,比如,camera 的输入时钟,在配置时,camera 可能没有时钟
1) 在任何时候都可以有效
2)可以连接到fpga 芯片的全局复位信号线上
3)有写情况下,系统可能没有时钟,但逻辑依然需要复位
缺点 1)需要reset (复位信号和当前的时钟同步)如果reset 信号和当前的时钟不是同步的信号需要额外增加逻辑,先将reset 信号同步后,使用,否则综合器依然按照异步的时钟域,进行时序分析
2)在没有时钟时,复位也不能被执行了
1)复位信号,容易收到干扰,一个不希望的毛刺,也有可能使得逻辑复位
2) 时序分析位异步时钟域, 综合器会进行收敛,有时会报告无法满足时序要求, 或者额外增加一些时序约束,通知综合器,这个信号不用和当前的时钟进行时序约束,控制需要小心

 

 

在一些简单的fpga 中,使用sync 和 async 的区别不是很大。只要保证reset 信号 或者 rst_n 信号是稳定的,不会产生毛刺输出, 同时reset, rst_n 等信号的持续时间远远大于clk 的时钟周期即可。

作为单独的模块,使用可能没有什么问题,如果在一个大系统中, 就需要仔细观察,哪一种情况才符合要求。在fpga 设计中, 我们需要尽量使用同步逻辑(但不是绝对),这样可以使得整个工程处于同步逻辑当中, 有利于系统综合。同步逻辑也不会在release 期间(reset 的下降沿, rst_n 的上升沿)和clk 同时发生,产生亚稳态等不确定的情况。但是事情往往不会这样圆满,比如一个系统中我们有cpu的接口 (100m 时钟) ,以太网的接口(125M时钟),usb phy 接口(60M 时钟)等, 这些时钟的频率是不能修改的,所以在fpga 内部逻辑中会有各种时钟的频率出现,同时,这些时钟域下的数据会相互传递,不同的模块,一般都有自己的reset 逻辑。因此,也会有大量的异步reset 被使用。

我们这里以xilinx fpga 为例:

一个同步时钟复位逻辑可以写成:

reg a = 0;

always @ (posedge clk)

if(reset) a <= 0; // reset 需要和clk 同步, 否则综合器依然可以发现这个reset 信号的时钟域不同,从而增加了时钟约束条件,使得综合效果不理想

else a <= ~a;

所对应的原语为:

wire a;

FDRE #(
    .INIT(1'b0)   // Initial value of register (1'b0 or 1'b1)
) FDSE_inst (
    .Q   (a),     // 1-bit Data output
    .C   (clk),   // 1-bit Clock input
    .CE  (1),     // 1-bit Clock enable input
    .R   (reset), // 1-bit Synchronous set input
    .D   (~a)     // 1-bit Data input
);

 

一个异步reset 逻辑为:

reg a = 0;

always @ (posedge clk or posedge reset)

if(reset) a<= 0;  // reset 可以和clk 时钟域无关, 但注意,如果有毛刺信号进入的时候,也会产生复位效果。即使在没有时钟时,也可以复位。

else a <= ~a;

 

所对应的原语为:

FDCE #(
    .INIT(1'b0)    // Initial value of register (1'b0 or 1'b1)
) FDCE_inst (
    .Q    (a),     // 1-bit Data output
    .C    (clk),   // 1-bit Clock input
    .CE   (1),     // 1-bit Clock enable input
    .CLR  (reset), // 1-bit Asynchronous clear input
    .D    (~a)     // 1-bit Data input
);

 

在仿真软件中:

同步reset 仿真的时间优于 异步复位,在小的工程中,仿真时间几乎没有差别,但是在大的项目中,时间会有很大的不同, 同步reset仿真时间 明显小于异步reset 的仿真时间。

Posted in FPGA, FPGA, IP开发, Verilog, Verilog, 开发语言, 教材与教案, 文章

发表评论

相关链接