同步复位、异步复位和异步复位同步释放

复位的基本目的是使器件进入到可以稳定工作的确定状态,避免器件在上电后进入随机状态。

同步复位

同步复位就是在是在时钟上升沿到来时,复位信号有效。
下面是一个简单的同步复位的D触发器,代码如下:

module Sync_rst (
    input              clk,
    input              rst,        // Synchronous reset
    input      [7:0]   d,
    output reg [7:0]   q
);

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

同步复位的优点:
1、抗干扰性高,可以剔除复位信号中周期短于时钟周期的毛刺。
2、电路稳定性强。

同步复位的缺点:
1、大多数逻辑器件的目标库内的DFF都只有异步复位端口,适用同步复位时,综合器就会在寄存器的数据输入端插入组合逻辑,占用更多的逻辑资源。
2、同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。
3、对复位信号的脉冲宽度有要求,必须大于指定的时钟周期,由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度,且很难保证复位信号到达各个寄存器的时序。

异步复位

异步复位是指无论时钟沿是否到来,只要复位信号有效沿到来,就进行复位。
下面是一个简单的同步复位的D触发器,代码如下:

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

异步复位的优点:
1、无需额外的逻辑资源,实现简单。
2、复位信号不依赖于时钟。

异步复位缺点:
1、复位信号容易受到外界的干扰,如毛刺等影响;
2、复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态,如下图所示:在这里插入图片描述
在这里多加一段对于亚稳态的介绍以及其处理办法:
(1)建立时间与保持时间的概念?
建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时 间。在这里插入图片描述
保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。
在这里插入图片描述
(2)为什么触发器要满足建立时间和保持时间?
因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。

处理亚稳态的经典办法——双触发
设计中使用的任何寄存器都会指定一个建立和保持时间,在时钟上升沿前后的这个时间内输入数据被禁止发生任何变动。所有器件中的寄存器都要指定这个精确参数,就是为了防止数据信号两次变化发生的时间间隔太过靠近,从而导致其输出陷入亚稳态。
最常见的同步器就是使用两级寄存器,即使用寄存器打两拍的方式进行同步。所谓的同步器就是采样一个异步信号,采样输出能够同步到本地或采样时钟的模块。
FPGA中的亚稳态
亚稳态问题

异步复位同步释放

推荐的复位电路设计方式是异步复位、同步释放。这种方式,可以有效地继承
异步复位设计简单的优势,并克服异步复位的上述风险与缺陷。
异步复位,同步释放本质就是引入两个触发器,其电路图和时序处理如下图所示:
在这里插入图片描述在这里插入图片描述
观察上述电路图和时序图就知道,其实异步复位同步释放和两级打拍的跨时钟域信号处理很相似,本质上都是对信号进行同步处理。上述电路的代码如下:

module Rst_gen (
    input      clk,
    input      rst_async_n,//异步复位信号
    output reg rst_sync_n  //同步释放信号
);

reg rst_s1;

always @(posedge clk or negedge rst_async_n) 
begin
   if(!rst_async_n) 
   begin
       rst_s1     <= 1'b0;//复位信号有效时拉低
       rst_sync_n <= 1'b0;
   end
   else 
   begin
       rst_s1     <= 1'b1;
       rst_sync_n <= rst_s1;// 复位信号无效后,通过两级打拍,实现释放同步
   end
end

endmodule

得到的电路图如下:在这里插入图片描述
1、异步复位,同步释放的含义

异步复位:就是复位信号可以直接不受时钟信号影响,在任意时刻只要是低电平就能复位,即复位信号不需要和时钟同步。上图中,当rst_async_n有效时,第一个D触发器的输出是低电平,第二个D触发器的输出rst_sync_n也是低电平,第二个方框中的异步复位端口有效,输出被复位。

同步释放:让复位信号取消的时候,必须跟时钟信号同步,即刚好跟时钟同沿。上图中,假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件(有的时候会打三拍)。但是加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1可能输出高电平“1”,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻更新输出,第二级触发器输出值为前一级触发器Q1的输出状态。显然Q1之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,才随着变为高电平。即实现同步释放。
第二种异步复位同步释放方法(此方法笔者也只理解部分)

always @ (posedge clk)
reset reg <= rst//将异步复位信号用同步时钟打一拍
always @ (posedge clk or negedge reset reg)
if (!reset reg)
begin
........
end
else
begin
........
end
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值