复位的基本目的是使器件进入到可以稳定工作的确定状态,避免器件在上电后进入随机状态。
同步复位
同步复位就是在是在时钟上升沿到来时,复位信号有效。
下面是一个简单的同步复位的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也是低电平,第二个方框中的异步复位端口有效,输出被复位。文章来源:https://www.toymoban.com/news/detail-802717.html
同步释放:让复位信号取消的时候,必须跟时钟信号同步,即刚好跟时钟同沿。上图中,假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件(有的时候会打三拍)。但是加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1可能输出高电平“1”,也可能输出亚稳态,也可能输出低电平。但此时第二级触发器不会立刻更新输出,第二级触发器输出值为前一级触发器Q1的输出状态。显然Q1之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,才随着变为高电平。即实现同步释放。
第二种异步复位同步释放方法(此方法笔者也只理解部分)文章来源地址https://www.toymoban.com/news/detail-802717.html
always @ (posedge clk)
reset reg <= rst//将异步复位信号用同步时钟打一拍
always @ (posedge clk or negedge reset reg)
if (!reset reg)
begin
........
end
else
begin
........
end
到了这里,关于同步复位、异步复位和异步复位同步释放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!