同步复位、异步复位、亚稳态、建立时间、保持时间、恢复时间、清除时间

同步、异步复位的概念是重要的基础内容,需对其有较清晰的认识,才能在复位电路的设计时得心应手,本文基于前辈分享,结合自己的理解,浅谈亚稳态、复位电路等相关内容。

首先需要明确的是,同步、异步名词背后的两个对象是谁,谁和谁同,谁和谁异。复位的目标是将寄存器、RAM等单元恢复初始状态,重点应该在于这些单元的输出变成初始状态,所以同步、异步实际上说的是输出信号和时钟之间的关系
不要理解为:复位信号和时钟之间的关系。

同步复位

代码层面理解:always块的敏感列表中只有时钟信号sys_clk,所以想要触发复位的前提是sys_clk信号高电平有效,基于此前提,复位后的输出信号一定是和sys_clk信号同步的。
RTL代码:

module Sync_rst (
    input              sys_clk,
    input              sys_rst,        // Synchronous reset
    input      [7:0]   d,
    output reg [7:0]   q
);
always@(posedge sys_clk) begin
   if (!sys_rst) q <= 8'b0;
   else q <= d;
end
endmodule

tb文件:

module tb_sync_rst();
reg            sys_clk  ;
reg           sys_rst   ;
reg    [7:0]         d  ;
wire [7:0]           q  ;

Sync_rst Sync_rst_init(
    .sys_clk    (sys_clk),       
    .sys_rst    (sys_rst),               // Synchronous reset
    .d          (d),
    .q          (q)
);

always #10 sys_clk = ~sys_clk;

initial begin
    sys_clk = 1'b0;
    sys_rst = 1'b1;
    d = 'd1;
    #45
    sys_rst = 1'b0;
    #50
    sys_rst = 1'b1;
end

endmodule

综合后电路理解
使用Vivado综合电路如下所示,它看起来很像异步复位,这是因为图中展示的RTL_REG_SYNC是带有同步复位引脚的触发器,标志是RST口。
在这里插入图片描述
在这里插入图片描述
图中,q从1变到0的边沿和sys_clk是对齐的,即为“同步”。

同步复位的优点:

  1. 复位信号的毛刺不会影响时序,抗干扰能力强。
  2. 有利于仿真器仿真
  3. 有利于时序分析

同步复位缺点:

  1. 只有在时钟沿到来时复位信号才起作用,复位信号持续的时间应该超过一个时钟周期才能确保系统复位,同时还要考虑组合逻辑路径延时,复位延时等因素。
  2. 如果逻辑器件没有同步复位端口,则会因为插入组合逻辑耗费较多的逻辑资源。

异步复位

代码层面理解:always块的敏感列表中既有时钟信号sys_clk还有sys_rst信号。
RTL代码:

module Async_rst (
    input              clk,
    input              rst_n,        // asynchronous reset
    input      [7:0]   d,
    output reg [7:0]   q
);

always@(posedge clk or negedge rst_n) begin
   if (!rst_n) q <= 8'b0;
   else        q <= d;
end
endmodule

tb文件:

`timescale 1ns / 1ps
module tb_sync_rst();
reg            sys_clk  ;
reg           sys_rst   ;
reg    [7:0]         d  ;
wire [7:0]           q  ;

Async_rst Async_rst_init(
    .clk    (sys_clk),       
    .rst_n    (sys_rst),               // Synchronous reset
    .d          (d),
    .q          (q)
);

always #10 sys_clk = ~sys_clk;

initial begin
    sys_clk = 1'b0;
    sys_rst = 1'b1;
    d = 'd1;
    #45
    sys_rst = 1'b0;
    #50
    sys_rst = 1'b1;
end

endmodule

综合电路理解:
典型的异步复位电路,区别于上面同步复位的电路图,它是CLR口。
在这里插入图片描述
在这里插入图片描述
上图中q从1变为0的边沿和时钟信号的边沿是异步的。
异步复位的优点:

  1. 无需额外的逻辑资源,实现简单。
  2. 复位信号不依赖于时钟。

异步复位缺点:
3. 复位信号容易受到外界的干扰,如毛刺等影响。
4. 复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态。

建立时间、保持时间、恢复时间、去除时间

同步系统中会涉及到前两个时间,因为无论是控制信号还是数据信号,都需要提前保持稳定,等待CLK触发,再继续保持稳定,触发器的输出才是稳定的。
建立时间:setup time,是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间。在时钟信号上升沿到来之前,数据需要提前稳定住自己,为写入触发器做准备,这段提前准备的时间就是建立时间。

保持时间:hold time,是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间。在时钟信号上升沿到来之后,数据需要继续稳定住自己,保证能够写入触发器,这段继续稳定的时间就是保持时间。

无论是数据还是控制信号,在输入触发器时,只有同时满足建立时间和保持时间,才能保证触发器的输出是稳定的。

异步系统中会涉及到后两个时间,因为某一个时钟上升沿到底能否有效驱动工作,取决于时钟信号和复位信号之间是否满足恢复时间或者去除时间。
恢复时间:recovery time,原本有效的复位信号释放后,与紧跟其后的第一个时钟上升沿之间的最小时间。复位信号释放后,至少经过恢复时间这么长时间后,系统才能在下一个时钟信号上升沿开始工作,如果复位信号释放和下一个时钟上升沿离得太近,系统就不能从复位状态中恢复过来。

去除时间:removal time,是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。

换句话来说,如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。

CSDN链接: 恢复和去除时间(Recovery and Removal Time)

亚稳态

产生的原因:在FPGA系统中,如果数据传输中不满足触发器的Tsu(建立时间)和Th(保持时间)不满足,或者复位过程中的去除时间、复位信号的释放相对于有效时钟沿的恢复时间(recovery time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值

发生场合:只要系统中有异步元件,亚稳态就是无法避免的,亚稳态主要发生在异步信号检测、跨时钟域信号传输以及复位电路等常用设计中。

链接: FPGA中亚稳态【Tsu建立时间setup】【Th保持时间hold】【Tmet决断时间】【recovery恢复时间】【removal移除时间】【复位】

链接: 不得不读的 FPGA 设计白皮书——Xilinx FPGA 复位策略白皮书翻译(WP272)【FPGA探索者】

异步复位,同步释放

异步复位、同步释放是指复位信号产生时不受时钟信号的控制,但是释放的时候受到时钟信号的同步。主要目的是防止复位信号释放时候产生亚稳态。

异步复位:当复位信号拉低时,直接进入复位状态。

同步释放:当复位信号释放时,加入两级同步缓存器,电路不会立即释放,而是同步到时钟有效时再进行释放。

链接: 异步复位,同步释放

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
异步复位同步释放的 Verilog 代码示例如下: ``` module reset_sync ( input clk, // 时钟信号 input rst_n, // 异步复位信号 output reg out // 输出信号 ); reg sync_rst_n; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin sync_rst_n <= 0; // 同步复位信号置 0 out <= 0; // 输出信号置 0 end else begin sync_rst_n <= 1; // 同步复位信号置 1 out <= 1; // 输出信号置 1 end end endmodule ``` 这个代码中,异步复位信号 `rst_n` 在时钟上升沿时被同步到 `sync_rst_n` 寄存器中,同步复位信号 `sync_rst_n` 用于控制输出信号 `out` 的状态。当异步复位信号 `rst_n` 为低电平时,同步复位信号 `sync_rst_n` 置为 0,输出信号 `out` 置为 0;当异步复位信号 `rst_n` 回到高电平时,同步复位信号 `sync_rst_n` 置为 1,输出信号 `out` 置为 1。 在设计时需要注意,异步复位信号的下降沿和上升沿都可能导致亚稳态,因此需要在异步复位信号的下降沿和上升沿添加一个同步延迟元件,来消除亚稳态同步延迟元件可以是两级锁存器,也可以是其他同步元件。例如,下面是添加了同步延迟元件的代码示例: ``` module reset_sync ( input clk, // 时钟信号 input rst_n, // 异步复位信号 output reg out // 输出信号 ); reg sync_rst_n; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin sync_rst_n <= 0; // 同步复位信号置 0 out <= 0; // 输出信号置 0 end else begin sync_rst_n <= 1; // 同步复位信号置 1 out <= 1; // 输出信号置 1 #1 sync_rst_n <= 0; // 同步延迟元件 end end endmodule ``` 在这个代码中,加入了一个同步延迟元件 `#1`,延迟一个时钟周期,来避免异步复位信号的下降沿和上升沿导致的亚稳态

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值