赞
踩
转载于:深入理解复位---同步复位,异步复位,异步复位同步释放(含多时钟域)—— 小火子Velsuked
目录
电路的任何一个寄存器、存储器结构和其他时序单元都必须附加复位逻辑电路,以保证电路能够从错误状态中恢复、可靠地工作。对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。复位在数字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
得到的电路图如下:
同步复位的优点:
同步复位缺点:
先看一个简单的异步复位的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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。