-
2020-07-31 22:15:45
同步复位、异步复位、异步复位同步释放笔记
一般来说,竞争-冒险是由于组合电路竞争冒险产生毛刺,从而影响整个逻辑电路。其实时序电路中也是存在竞争-冒险的,而这一特性主要是由D触发器输入端信号之间的竟争产生的。存在以下两种竞争-冒险。
1)clk上升沿与rstn下降沿同时到达
实际上对于D触发器而言,rstn信号的优先级高于clk信号,这样在rstn到来时,实现的是复位操作。因此,D触发器属于异步复位器件。
2)clk上升沿与rst n上升沿同时到达
当 rstn上升沿达到时,D触发器在理论上完成复位了,但是此时如果ck恰好在rstn 信号释放的周围,系统听谁的?此时在电路运行中,将会出现短暂的竞争一冒险问题,系统不稳定。
设计FPGA 电路时,由于rstn的优先级别比较高,所以电路通过全局时钟引脚输入。rstn信号与全局时钟elk称为异步时钟。异步时钟也有很多种类,以下是项目中经常遇到的几种∶
(1)系统异步复位信号;
(2)由其他处理器输入的时钟;
(3)内部组合逻辑产生的时钟。
为了解决这一问题,我们需要处理好异步复位信号的优先级,同时又要保证时钟信号的同步性。最简单的同步方案可以使用主时钟去打一拍,实现信号的同步。下面根据异步复位与同步复位的优缺点,分析外部复位信号,解决异步复位信号的同步化问题。1.异步复位
always @ (posedge Clk or negedge Reset)
begin
if ( ~Reset)
Q <= 1’b0 ;
else
Q <= Data ;
end
综合后的电路如下图:
这样的设计,没有对外部复位信号进行处理,设计上比较简单,无论时钟沿是否有效,都会立即对目标(如寄存器、RAM等)复位。异步复位的应用要点如下:
●指定异步复位时,只需在 always的敏感表中加入复位信号的有效沿即可,当复位信号有效沿到达时,无论时钟沿是否有效,复位都会立即发挥其功能。异步复位的优点如下∶
●由于多数目标器件(如 FPGA和CPLD)和ASIC库的触发器都包含异步复位端口,异步复位会节约逻辑资源
●异步复位设计简单
● 对于大多数 FPGA,都有专用的全局异步复位/置位资源(GSR,Global Set Reset),使用GSR资源,异步复位到达所有寄存器的偏斜(skew)最小尽管我们简化了电路,精简了设计,但由于外部复位信号与时钟信号存在一定程度的竞争,所以还是存在一些不预知的问题,如下所示。
(1)在复位信号释放(Release)时容易出现问题。具体来说,倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致不稳定。
何为亚稳态?亚稳态就是数据处于最不稳定,将变未变的时刻。如图所示,当一个小球处于抛物面顶端时,它可能往左掉,也可能往右掉。这就好像一个信号在clk上升沿与 rstn下降沿同时到达时,2个改变的条件同时满足,会不知所措,这个问题会严重影响系统的稳定性。
亚稳态示意图
(2)复位信号容易受到毛刺的影响。这是由于时钟抖动或按键触发时的硬件原因造成的。复位信号如果抖动,上图中的这个小球将不断在顶部的一个区域内徘徊,这时系统处于极不稳定的状态,因此,这也是我们需要考虑的一个问题。2.同步复位
为了解决异步复位的竞争冒险问题,将复位信号作为外部信号去采样,而非时钟信号;
always @ (posedge Clk )
begin
if ( ~Reset)
Q <= 1’b0 ;
else
Q <= Data ;
end
综合后电路图如下所示:
在上述代码中,复位信号作为一个使能信号进行采样,不再作为D触发器的复位端口,这样设计电路不存在竞争-冒险问题,因为Reset由全局时钟clk采样,整个设计中不存在优先级问题,全都是clk 说了算,它是一个具有权力与威望的"CEO"。
所谓同步复位是指当复位信号发生变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对所有寄存器复位。同步复位的应用要点如下:
●指定同步复位时,always的敏感表中仅有时钟沿信号,仅仅当时钟沿采到同步复位的有效电平时,才会在时钟沿到达时刻进行复位操作。如果目标器件或可用库中的触发器本身包含同步复位端口,则在实现同步复位电路时可以直接调用同步复位端,然而很多目标器件(如PLD)和ASIC库的触发器本身并不包含同步复位端口,这样复位信号与输入信号组成某种组合逻辑(比如复位低电平有效,只需复位与输入信号两者相与即可),然后将其输入到寄存器的输入端.为了提高复位电路的优先级,一般在电路描述时使用带有优先级的if.else结构、复位电路在第一个if下描述,其他电路在else或else.if分支中描述。同步复位电路的优点如下∶
(1)降低了亚稳态的出现概率;
(2)可以使所设计的系统成为100%的同步时序电路,这将大大有利于时序分析、而且综合出来的Fmax一般较高∶
(3)因为它只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。在D触发器中,本身就有一个时钟输入端与复位端口。rst_n作为使能时钟采样信号,而数据则通过一个选择器输入,即当rst_n=1时,D触发器输入a∶而当rst_n=0时,D 发器输入0,这样理论上已经解决了clk与rst_n竞争-冒险的问题,但是将rst_n作为使能信号来操作,额外地消耗了FPGA 组合电路的资源。而整个系统都采用这种方式实现同步时,FPGA 消耗的总组合逻辑资源可想而知。
因此,同步复位电路也不是完美的,它的缺点如下∶
(1)同步复位的最大问题在于必须保证复位信号的有效时间足够长,这样才能保证所有触发器都能有效地复位。由于同步复位仅当时钟沿采样到复位信号时才会进行复位操作,所以其信号的持续时间起码要大于设计的最长时钟周期,以保证所有时钟的有效沿都能采样到同步复位信号.事实上,仅仅保证同步复位信号的持续时间大于最慢的时钟周期还是不够的,设计中还要考虑到同步复位信号树通过所有相关组合逻辑路径时的延时,以及由于时钟布线产生的偏斜(skew)。这样,只有同步复位大于时钟最大周期,加上同步信号穿过的组合逻辑路径延时,再加上时钟偏斜时,才能保证同步复位可靠、彻底。如图 所示,假设同步复位逻辑树组合逻辑的延时为t1,复位信号传播路径的最大延时为t2,最慢时钟的周期为Period max,时钟的skew为clk2-clk1,则同步复位的周期 T_ rst 应该满足如下公式。
T_rst>Period max +(clk2-clk1)+ t1+ t2;
(2)由于大多数的逻辑器件的目标库内的DFF 都只有异步复位端口,所以倘若采用同步复位,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。3.异步复位、同步释放
综上所述,异步复位存在亚稳态问题,同步复位存占用资源问题,都不是理想的解决方案,都存在一定的弊端。
D触发器有支持异步复位专用的端口,采用异步复位的端口无须额外增加器件资源。为了解决这一问题,以避免资源的浪费,我们还是希望处理外部复位信号,以实现直接或间接地控制D触发器的复位端。这样充分利用了D触发器,同时也节约了组合电路的消耗。因此,可以在将复位信号作为使能时钟的基础上,人为地生成另一个同步化后的同步复位信号。这需要我们用D触发器打一拍,然后直接提供给剩下的时序电路使用。修改后的同步化复位设计如下所示∶
module no_block1 (Data, Clk, Reset, Q);
input Data, Clk, Reset;
output Q;reg Q;
reg rst_n;
always@(posedge Clk)
begin
if(~Reset)
rst_n<=1’b0;
else
rst_n<=Reset;
end
always @ (posedge Clk or negedge rst_n)
begin
if ( ~rst_n)
Q <= 1’b0 ;
else
Q <= Data ;
end
endmodule
综合后的RTL如下图所示:
首先,第一个D触发器将Reset打了1拍(通过DEF将Reset同步到clk上去),这一过程将Reset信号同步到了ck时钟域∶接着输出的 rst_n信号直接作为第二个D触发器的复位信号。这样设计电路的好处在于只用了1个D触发器实现了异步复位信号的同步,在功能上实现了异步复位信号的同步化,在资源上大大减少了组合逻辑的使用。
事实上,这种方式也是最常见的异步时钟的处理方法。对于"异步复位,同步释放"、理解如下。
(1)所谓"异步复位"是针对D触发器的复位端口,它是异步的,但是设计中已经同步了异步复位信号,所以这只是某种意义上的"异步复位"。
(2)所谓"同步释放",实际上是由于我们设计了同步逻辑电路,外部复位信号不会在出现释放时与clk 信号竞争,整个系统将与全局时钟clk 信号同步。更多相关内容 -
同步复位和异步复位有什么区别?
2020-08-04 13:44:46一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。 -
verilog中同步复位,异步复位,同步释放优缺点以及PLL配置复位设计.docx
2020-04-08 19:15:26verilog中同步复位,异步复位,同步释放优缺点以及PLL配置复位设计 -
异步复位D触发器设计实验报告.pdf
2021-10-04 05:51:33异步复位D触发器设计实验报告.pdf -
Verilog实现的异步复位同步释放模块
2019-09-20 21:58:30Verilog实现的异步复位同步释放模块, 复位信号高电平有效。 异步复位同步释放模块 -
FPGA设计一个带有异步复位控制端和时钟使能控制端的10进制计数器.rar
2021-06-22 21:01:50FPGA设计一个带有异步复位控制端和时钟使能控制端的10进制计数器。 端口设定如下: 输入端口:CLK:时钟,RST:复位端,EN:时钟使能端,LOAD:置位控制端, DIN:置位数据端; 输出端口:COUT:进位输出端,DOUT:... -
同步复位及异步复位设计
2020-11-17 15:32:52到底是采用同步复位还是异步复位,全局复位还是局部复位,是由多方面的因素决定的。但良好的复位设计既可以提高系统的可靠性,又可以节省大量的逻辑资源。在实际应用中,笔者也看到过很多因为复位电路设计问题而导致... -
VHDL之异步复位计数器
2019-09-05 09:55:28使用VHDL编写的,能够异步复位,上升沿计数的计数器。 -
对于选择同步化的异步复位的方案
2020-07-13 18:30:33外部的异步复位信号被二级寄存器同步化之后,复制不同的复位寄存器连到不同的模块来作为复位控制。如果单个模块的复位扇出太大的话,还可以在模块内部复制复位寄存器。强烈建议那些在datapath上不需要复位的寄存器... -
verilog同步复位PK异步复位
2020-08-18 06:57:21时钟和复位是FPGA中关键,下面是特权写的,复制以备找工作~~~ -
同步复位和异步复位的比较
2020-08-30 15:03:10无论同步还是异步复位,在对触发器时序进行分析的时候,都要考虑复位端与时钟的相位关系。 -
基础电子中的同步复位与异步复位-异步复位和同步复位区别-异步复位同步释放
2020-11-15 21:26:03一、同步复位与异步复位特点: 同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。 异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。 二、异步... -
FPGA同步复位、异步复位、异步复位同步释放
2021-08-12 12:06:201、复位的重要性 数字电路中寄存器和 RAM 在上电之后默认的状态和数据是不确定的,如果有复位,我们可以把寄存器 复位到初始状态 0,RAM 的数据可以通过复位来触发 RAM 初始化到全 0。那可能很多人会问为什么是全 0...1、复位的重要性
数字电路中寄存器和 RAM 在上电之后默认的状态和数据是不确定的,如果有复位,我们可以把寄存器 复位到初始状态 0,RAM 的数据可以通过复位来触发 RAM 初始化到全 0。那可能很多人会问为什么是全 0呢?其实一般逻辑起始都是从 0 开始变化的,这个是根据设计的需要设定的一个值,如果设计需要寄存器 上电复位为 1,也是可以的。还有一种情况是逻辑进入了错误的状态,通过复位可以把所有的逻辑状态恢复 到初始值,如果没有复位,那么逻辑可能永远运行在错误的状态。
因此复位功能是很重要的一个功能。数字电路的复位通常可分为:同步复位与异步复位。
2、同步复位
同步复位:同步复位指的是当时钟上升沿检测(有效沿)到复位信号,执行复位操作,有效的时钟沿是前提。
Verilog代码:
//*******************同步复位模块************************** //-----------端口定义------------------------------- module rst_test( input clk , //工作时钟 input rst_n , //复位,低电平有效 input in , //输入信号 output reg out //输出信号 ); //-----------输出模块------------------------------- always@(posedge clk )begin if(!rst_n) out <= 1'b0; //复位将输出置零 else out <= in; //其他时候将输入赋值给输出 end endmodule
使用Quartus II综合出的RTL如下:
可以看到,生成的触发器并没有复位置位端,而是生成了一个选择器,同步复位信号rst_n用作了选择器的使能,从而实现复位清零的作用。
用如下Testbench进行仿真(复位时间不足一个时钟周期、复位时间超过一个时钟周期、一个高频复位毛刺):
//------------------------------------------------ //--同步复位仿真 //------------------------------------------------ `timescale 1ns/1ns //时间单位/精度 //------------<模块及端口声明>---------------------------------------- module tb_rst_test(); reg clk ; reg rst_n ; reg in ; wire out ; //------------<例化被测试模块>---------------------------------------- rst_test rst_test_inst( .clk (clk) , .rst_n (rst_n) , .in (in) , .out (out) ); //------------<设置初始测试条件>---------------------------------------- initial begin clk = 1'b0; rst_n <= 1'b0; in <= 1'b1; #5 rst_n <= 1'b1; #6 rst_n <= 1'b0; #18 rst_n <= 1'b1; #39 rst_n <= 1'b0; #21 rst_n <= 1'b1; #25 rst_n <= 1'b0; #3 rst_n <= 1'b1; end //------------<设置时钟>---------------------------------------------- always #10 clk = ~clk; //系统时钟周期20ns endmodule
仿真结果如下:
从仿真结果可以看到:
- 第1个复位时间不足一个时钟周期,导致复位不成功
- 第2个复位时间超过一个时钟周期,复位成功
- 最后一个复位信号上的高频毛刺信号没有对系统造成误复位
- 输出信号在第一个时钟上升沿到来之前是未知状态
同步复位电路的优点:
- 有利于仿真器的仿真
- 基本上没有亚稳态问题
- 可以使所设计的系统成为 100%的同步时序电路,有利于时序分析
- 由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺
同步复位电路的缺点:
- 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑延时因素
- 大多数的FPGA的DFF都只有异步复位端口,采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样会耗费逻辑资源
3、异步复位
异步复位:异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。当时钟上升沿检测到复位信号,执行复位操作。
Verilog代码:
//*******************同步复位模块************************** //-----------端口定义------------------------------- module rst_test( input clk , //工作时钟 input rst_n , //复位,低电平有效 input in , //输入信号 output reg out //输出信号 ); //-----------输出模块------------------------------- always@(posedge clk or negedge rst_n)begin if(!rst_n) out <= 1'b0; //复位将输出置零 else out <= in; //其他时候将输入赋值给输出 end endmodule
使用Quartus II综合出的RTL如下:
可以看到,异步复位信号rst_n直接接入了触发器的异步复位端,从而实现复位清零的作用。
依然使用之前用的Testbench进行仿真,结果如下:
从仿真结果可以看到:
- 只要复位信号被置为低电平,就执行复位操作,与时钟无关
- 高频毛刺信号会对系统造成误复位
- 在不考虑亚稳态的前提下,复位时间没有要求
a、在复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
b、复位信号容易受到毛刺的影响异步复位电路的优点:
- 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源
- 设计相对简单,异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR
异步复位电路的缺点:
- 复位信号容易受到毛刺的影响
- 因为是异步逻辑,无法避免地存在亚稳态问题(FPGA基础知识之11----“打拍(寄存)”和“亚稳态” 到底是什么?)
关于异步复位还需要考虑:
恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
去除时间(Removal)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
换句话来说,如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“去除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的。
4、异步复位、同步释放
结合两种复位的优点,可以使用异步复位、同步释放设计,Verilog代码如下:
//*******************同步复位模块************************** //-----------端口定义------------------------------- module rst_test( input clk , //工作时钟 input rst_n , //复位,低电平有效 input in , //输入信号 output reg out //输出信号 ); //-----------reg定义------------------------------- reg arst_n_r; reg arst_n; //-----------复位信号同步模块------------------------------- always@(posedge clk or negedge rst_n)begin if(!rst_n)begin arst_n_r <= 1'b0 ; //复位将输出置零 arst_n <= 1'b0 ; //复位将输出置零 end else begin arst_n_r <= 1'b1 ; //跟接rst_n是一样的,都是逻辑1 arst_n <= arst_n_r ; end end //-----------输出模块------------------------------- always@(posedge clk or negedge arst_n)begin if(!arst_n) out <= 1'b0; //复位将输出置零 else out <= in; //其他时候将输入赋值给输出 end endmodule
综合出来的RTL视图:
实际的电路图如下:
复位信号 rst_sync_n 由高拉低时实现 y 寄存器的异步复位。同步释放,这个是关键,即当复位信号 rst_async_n 撤除时(由低拉高),由于双缓冲电路(双触发器)的作用,rst_sync_n 不会随着rst_async_n 的 撤除而撤除。假设 rst_async_n 撤除时发生在 clk 上升沿,如果不加此电路则可能发生亚稳态事件,但是加上此电路以后,假设第一级 D 触发器 clk 上升沿时 rst_async_n 正好撤除,(第一个 DFF 此时是处于亚稳态 的;假设此时识别到高电平;若是识别到低电平,则增加一个 Delay)则 DFF1 输出高电平,此时第二级触发器也会更新输出,但是输出值为前一级触发器 clk 来之前时的 Q1 输出状态,显然 Q1 之前为低电平,所以第二级触发器输出保持复位低电平,直到下一个 clk 来之后,才随着变为高电平,即同步释放。
使用如下Testbench进行仿真:
//------------------------------------------------ //--同步复位仿真 //------------------------------------------------ `timescale 1ns/1ns //时间单位/精度 //------------<模块及端口声明>---------------------------------------- module tb_rst_test(); reg clk ; reg rst_n ; reg in ; wire out ; //------------<例化被测试模块>---------------------------------------- rst_test rst_test_inst( .clk (clk) , .rst_n (rst_n) , .in (in) , .out (out) ); //------------<设置初始测试条件>---------------------------------------- initial begin clk = 1'b0; rst_n <= 1'b0; in <= 1'b1; #25 rst_n <= 1'b1; #6 rst_n <= 1'b1; #18 rst_n <= 1'b1; #39 rst_n <= 1'b0; #21 rst_n <= 1'b1; end //------------<设置时钟>---------------------------------------------- always #10 clk = ~clk; //系统时钟周期20ns endmodule
仿真结果如下:
可以看到:复位是异步进行的,一旦复位信号为低电平,则输出复位,而复位的撤除则被同步到了时钟域下。如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。
5、参考
正点原子逻辑设计指南--正点原子
-
异步复位,同步释放
2020-08-04 19:35:42为了保证信号的稳定性,对于复位信号应该同步化,这个思想在工程项目中应该注意。 -
ALTERA器件中复位电路实现之异步复位同步化
2020-07-25 07:49:07所谓异步复位同步化,就是我们通常说的异步复位同步撤除。 -
我与FPGA的恋爱之异步复位同步释放
2020-07-21 11:09:14针对数字系统的设计,我们经常会遇到复位电路的设计,对初学者来说不知道同步复位与异步复位的区别与联系,本次笔记对这个问题简要的阐述下. -
同步、异步复位、异步复位同步释放
2021-05-20 10:49:32同步、异步复位、异步复位同步释放 文章目录1、同步复位2、异步复位2.1、异步复位的隐患3、异步复位、同步释放 1、同步复位 同步复位,顾名思义是复位信号和时钟同步,当时钟上升沿检测到复位信号,执行复位...同步、异步复位、异步复位同步释放
1、同步复位
同步复位,顾名思义是复位信号和时钟同步,当时钟上升沿检测到复位信号,执行复位操作。同步复位没有用到寄存器的异步复位CLR端口,综合出来的实际电路只是把复位信号rst_n作为逻辑输入的使能信号。
同步复位代码:
//同步复位 module top ( input clk, input rst_n, input a, output reg b ); always@(posedge clk) begin if(!rst_n) b <= 1'b0; else b <= a; end endmodule
同步复位RTL视图:
同步复位增加了FPGA内部的资源消耗,同步复位在时钟信号clk的上升沿触发时进行系统是否复位判断,这降低了亚稳态出现概率(只是降低,不可能完全避免),它的缺点在于需要消耗更多的器件资源,无法充分利用专用的复位端口CLR。2、异步复位
异步复位,无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
异步复位代码://异步复位 module top ( input clk, input rst_n, input a, output reg b ); always@(posedge clk or negedge rst_n) begin if(!rst_n) b <= 1'b0; else b <= a; end endmodule
异步复位RTL视图:
FPGA的寄存器都有一个异步清零端(CLR),在这个端口一般接低电平有效的复位信号rst_n,即使设计中是高电平复位,实际综合后也会把异步复位信号反向后接到CLR端。
异步复位无需增加器件的额外资源,但是存在隐患,异步时钟域的亚稳态问题同样存在于异步复位信号和系统时钟 信号之间。2.1、异步复位的隐患
通过一下实例分析异步复位存在的隐患:
//异步复位存在的隐患实例 module top ( input clk, input rst_n, input a, output reg b, output reg c ); always@(posedge clk or negedge rst_n) begin if(!rst_n) b <= 1'b0; else b <= a; end always@(posedge clk or negedge rst_n) begin if(!rst_n) c <= 1'b0; else c <= b; end endmodule
正常情况下,在clk 的上升沿将c的值更新为b,b的值更新为a。一但进入复位,b,c都清零,但是并不能确定复位信号rst_n会在什么时候结束。
涉及到 建立时间和保持时间 参考博客:建立时间和保持时间
如果结束于b_reg和c_reg的{latch edge-setup,latch edge+hold time}时间之外,那么一切都会正常。如果出现在之内,复位信号的撤销(由低变高)出现在clk锁存数据的建立时间或者保持时间之内,此时clk检测到rst_n的状态就会是一个亚稳态(不确定是0还是1),就会导致输出数据的错误。
也有可能一个reg处于复位,另一个reg跳出了复位,均会影响系统的正常工作,如果更大的项目隐患就更大了。3、异步复位、同步释放
为了消除亚稳态的产生,利用两个同一时钟沿触发的层叠寄存器,将异步信号同步化:
//异步复位、同步释放 module top ( input clk, input rst_n, input a, output reg b ); reg rst_n_r; reg rst_n_rr; always@(posedge clk) begin {rst_n_rr,rst_n_r} <= {rst_n_r,rst_n}; end always@(posedge clk or negedge rst_n_rr) begin if(!rst_n_rr) b <= 1'b0; else b <= a; end endmodule
★★★如有错误,欢迎指导!!!
-
深入理解复位---同步复位,异步复位,异步复位同步释放(含多时钟域)
2021-12-22 11:28:04目录前言同步复位异步复位异步复位同步释放多时钟域下异步复位同步释放总结Reference 前言 电路的任何一个寄存器、存储器结构和其他时序单元都必须附加复位逻辑电路,以保证电路能够从错误状态中恢复、可靠地工作。...前言
电路的任何一个寄存器、存储器结构和其他时序单元都必须附加复位逻辑电路,以保证电路能够从错误状态中恢复、可靠地工作。对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。复位在数字IC设计中是不可缺少的一部分,故一定要清楚掌握深入理解复位的作用。
同步复位
先看一个简单的同步复位的D触发器,Verilog代码如下:
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
得到的电路图如下:
同步复位的优点:-
抗干扰性高,可以剔除复位信号中周期短于时钟周期的毛刺;
-
电路稳定性强。
同步复位缺点:
-
大多数逻辑器件的目标库内的DFF都只有异步复位端口,适用同步复位时,综合器就会在寄存器的数据输入端插入组合逻辑,占用更多的逻辑资源;
-
同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。
-
对复位信号的脉冲宽度有要求,必须大于指定的时钟周期,由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度,且很难保证复位信号到达各个寄存器的时序。
异步复位
先看一个简单的异步复位的D触发器,Verilog代码如下:
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
异步复位的优点:
-
无需额外的逻辑资源,实现简单;
-
复位信号不依赖于时钟。
异步复位缺点:
-
复位信号容易受到外界的干扰,如毛刺等影响;
-
复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态,如下图所示:
异步复位同步释放
先看一个异步复位同步释放的Verilog代码:
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之前为低电平,故第二级触发器输出保持复位低电平。直到下一个时钟有效沿到来之后,才随着变为高电平。即实现同步释放。
2、异步复位,同步释放的优点
- 避免复位信号释放的时候造成亚稳态问题
- 只要复位信号一有效,电路就处于复位状态,与时钟沿无关
- 有效捕捉复位,即使是短脉冲复位也不会丢失
- 有明确的复位撤销行为,复位的撤离是同步信号,因此有良好的的撤离时序和足够的恢复时间
- 用两级触发器打两拍的方法解决亚稳态的问题
3、为何代码中第一级触发器的数据端口是1’b1,而不是rst_async_n?
如果是rst_async_n,则生成的电路如图如下:
如果是1’b1,则生成的电路图如下:
显然第二种方法更好,因为本身复位是高扇出信号,第二种方法可以减小复位信号的扇出数,1’b1意思是直接接电源,节省资源,这样可以使电路性能更好。多时钟域下异步复位同步释放
因为异步复位,同步释放中复位释放需要与时钟同步,故不同的时钟域时,有两种办法解决这个问题:
1、非协调的复位撤销
使用每个时钟搭建自己的复位同步器即可,如下图所示:
Verilog代码如下:module CLOCK_RESET( input rst_n, input aclk, input bclk, input cclk, output reg arst_n, output reg brst_n, output reg crst_n ); reg arst_n0,arst_n1; reg brst_n0,brst_n1; reg crst_n0,crst_n1; always @(posedge aclk or negedge rst_n) if(rst_n==0) begin arst_n0<=1'b1; arst_n1<=1'b0; arst_n<=1'b0; end else begin arst_n<=arst_n1; arst_n1<=arst_n0; end always @(posedge bclk or negedge rst_n) if(rst_n==0) begin brst_n0<=1'b1; brst_n1<=1'b0; brst_n<=1'b0; end else begin brst_n<=brst_n1; brst_n1<=brst_n0; end always @(posedge cclk or negedge rst_n) if(rst_n==0) begin crst_n0<=1'b1; crst_n1<=1'b0; crst_n<=1'b0; end else begin crst_n<=crst_n1; crst_n1<=crst_n0; end endmodule
2、 顺序协调的复位撤销
当多个时钟域之间对复位释放的时间有顺序要求时,将复位同步器级联起来就可以构成多个时钟域按顺序的复位释放,如下图所示:
Verilog代码如下:module CLOCK_RESET( input rst_n, input aclk, input bclk, input cclk, output reg arst_n, output reg brst_n, output reg crst_n ); reg arst_n0,arst_n1; reg brst_n0,brst_n1; reg crst_n0,crst_n1; always @(posedge aclk or negedge rst_n) if(rst_n==0) begin arst_n0<=1'b1; arst_n1<=1'b0; arst_n<=1'b0; end else begin arst_n<=arst_n1; arst_n1<=arst_n0; end always @(posedge bclk or negedge rst_n) if(rst_n==0) begin brst_n1<=1'b0; brst_n<=1'b0; end else begin brst_n<=brst_n1; brst_n1<=arst_n; end always @(posedge cclk or negedge rst_n) if(rst_n==0) begin crst_n1<=1'b0; crst_n<=1'b0; end else begin crst_n<=crst_n1; crst_n1<=brst_n; end endmodule
总结
不同的复位方式有各自的优缺点,但是在工程中,一般都用异步复位的方法,最好是异步复位同步释放的方法。
Reference
https://blog.csdn.net/weixin_42300424/article/details/113411438.
https://cloud.tencent.com/developer/article/1830029. -
-
同步复位、异步复位、异步复位同步释放
2022-01-04 17:55:391、同步复位 同步复位,即如果复位信号有效,则只能在时钟上升沿让电路复位。 always @ (posedge clk) begin if (!rst_n) xxxx;...注意:在此always块中,敏感量...2、异步复位 复位信号不受时钟的控制,无论时钟.. -
同步复位与异步复位-异步复位和同步复位区别-异步复位同步释放.doc
2022-02-11 20:20:57同步复位与异步复位-异步复位和同步复位区别-异步复位同步释放.doc -
异步复位同步释放
2022-03-25 16:44:52异步复位同步释放 -
同步复位,异步复位,异步复位,同步释放
2021-08-05 10:27:36同步复位 同步复位:是指当复位信号发生变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对...异步复位: 无论时钟沿是否到来,只要复位信号有效,就对系统进行复位 always @(posedge cl... -
(46)FPGA同步复位与异步复位(异步复位)
2022-03-28 22:17:34(46)FPGA同步复位与异步复位(异步复位) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA同步复位与异步复位(异步复位) 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1... -
Xilinx FPGA异步复位同步释放——同步后的复位当作同步复位还是异步复位?【FPGA探索者】
2021-02-08 19:13:21目录一、异步复位同步释放二、Xilinx复位程序对比1.将同步化后的复位当作异步复位信号2.将同步化后的复位当作同步复位信号三、仿真结果四、Altera复位 Xilinx 复位准则: (1)尽量少使用复位,特别是少用全局复位,... -
亚稳态相关:三种复位方式详解---同步复位/异步复位/异步复位同步释放
2020-03-20 12:20:23对常见三种复位方式(同步复位、异步复位、异步复位同步释放)进行介绍与分析,详细介绍了各种复位方式的优缺点,并进一步分析了异步复位同步释放的工作机理与优势所在。 -
异步复位与同步复位
2022-03-18 10:13:05异步复位与同步复位的概念以及Verilog实现。 -
同步复位,异步复位,异步复位与同步释放
2020-09-19 21:33:51异步复位: 它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下 module rst( input clk, input rst_n, input data_in, output reg out ); always @ (posedge clk ... -
异步复位同步释放的理解
2022-02-19 22:44:02复位信号的removal time是指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。满足这个最短时间才能确保对寄存器进行正常的复位。Removal time check的波形图如下图所示。 Recovery timing check ... -
异步复位问题
2021-11-07 16:38:46复位中的同步复位和异步复位问题: 恢复时间是指异步复位信号释放和时钟上升沿的最小距离,在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制...