异步复位同步释放(verilog代码|Testbench|仿真结果|综合电路)

请在此添加图片描述



数字IC经典电路设计

经典电路设计是数字IC设计里基础中的基础,盖大房子的第一部是打造结实可靠的地基,每一篇笔者都会分门别类给出设计原理、设计方法、verilog代码、Testbench、仿真波形。然而实际的数字IC设计过程中考虑的问题远多于此,通过本系列希望大家对数字IC中一些经典电路的设计有初步入门了解。能力有限,纰漏难免,欢迎大家交流指正。快速导航链接如下:

个人主页链接

1.数字分频器设计

2.序列检测器设计

3.序列发生器设计

4.序列模三检测器设计

5.奇偶校验器设计

6.自然二进制数与格雷码转换

7.线性反馈移位寄存器LFSR

8.四类九种移位寄存器总结

9.串并转换

10.七种常见计数器总结



一、前言

电路的任何一个寄存器、存储器结构和其他时序单元都必须附加复位逻辑电路,以保证电路能够从错误状态中恢复、可靠地工作。对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。复位在数字IC设计中是不可缺少的一部分,故一定要清楚掌握深入理解复位的作用。

复位信号可以分为同步复位和异步复位两大类。

同步复位指的是当复位信号发生变化时,并不立即生效,而是等到有效时钟沿采集到复位信号的变化后,才会对寄存器进行复位操作;
而异步复位则不依赖于系统时钟,一旦信号发生变化,就会立即对寄存器进行复位操作。

由于在现有的大多数逻辑器件库中,触发器DFF都是只包含有异步复位端口,所以同步复位的使用会造成冗余组合逻辑的使用,浪费资源。因此,大多数数字设计中都采用的是异步复位信号。虽然异步复位信号更加方便使用,但是_因为复位信号与系统时钟异步的关系,很容易出现复位信号释放位置恰恰出现在时钟有效沿附近,导致亚稳态的出现_。

对于异步复位,有类似于寄存器建立时间和保持时间的说法,分别是recovery time 和temoval time。如下面两张图所示:

  • recovery time是异步复位的恢复时间,指的是复位释放与下一个时钟有效边沿之间需要间隔的最小时间。

请在此添加图片描述

  • removal time是异步复位的去除时间,指的是复位释放与上一个时钟有效边沿之间需要间隔的最小时间。

请在此添加图片描述

如果异步复位的释放时间不满足以上这两个条件,寄存器很可能进入亚稳态,导致电路运行失常。为了保证解决这个问题,可以采用异步复位同步释放的复位信号设计方法。顾名思义,异步复位同步释放就是对复位信号的释放过程做同步处理,使得释放的过程能够与系统时钟同步

异步复位,同步释放本质就是引入两个触发器,其电路图和时序处理如下图所示:

请在此添加图片描述

观察上述电路图和时序图就知道,其实异步复位同步释放和两级打拍的跨时钟域信号处理很相似,本质上都是对信号进行同步处理。

以下是对同步复位、异步复位、异步复位同步释放的详细介绍:

二、同步复位

同步复位是指复位信号在时钟有效边沿到来时有效。如果没有时钟,无论复位信号怎样变化,电路也不执行复位操作。

同步复位的典型代码描述如下:

module sync_reset(
    input       rst_n,  //同步复位信号
    input       clk,   //时钟
    input       din,   //输入数据
    output reg  dout   //输出数据
    );
   
always @(posedge clk) begin   //复位信号不要加入到敏感列表中
	if(!rst_n) begin
		dout <= 1'b0 ;//rstn 信号与时钟 clk 同步
	end 
	else begin
		dout <= din ;
	end
end
   
endmodule

该描述代码常常会被综合成如下电路:

请在此添加图片描述

同步复位的优点:

  1. 信号间是同步的,能滤除复位信号中的毛刺,有利于时序分析。
  2. 电路稳定,一般能够确保电路是百分之百同步的。

同步复位的缺点:

  1. 大多数触发器单元是没有同步复位端的,采用同步复位会多消耗部分逻辑资源(适用同步复位时,综合器就会在寄存器的数据输入端插入组合逻辑)。
  2. 且复位信号的宽度必须大于一个时钟周期,否则可能会漏掉复位信号。
  3. 同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位

三、异步复位

异步复位是指无论时钟到来与否,只要复位信号有效,电路就会执行复位操作。

异步复位的典型代码描述如下:

module async_reset(
    input       rst_n,  //异步复位信号
    input       clk,   //时钟
    input       din,   //输入数据
    output reg  dout   //输出数据
    );
   
always @(posedge clk or negedge rst_n) begin   //复位信号不要加入到敏感列表中
	if(!rst_n) begin
		dout <= 1'b0 ; //rstn 信号与时钟 clk 异步
	end
	else begin
		dout <= din ;
	end
end

endmodule

该代码常常会被综合成如下电路:

请在此添加图片描述

异步复位的优点:

  1. 大多数触发器单元有异步复位端,不会占用额外的逻辑资源。
  2. 且异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。
  3. 复位信号不依赖于时钟。

异步复位的缺点:

  1. 复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上 removal 和 recovery 的不满足。复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态。
  2. 且异步复位容易受到毛刺的干扰,产生意外的复位操作。

四、异步复位同步释放

综合设计与资源等方面的考虑,一般数字系统设计时都会使用异步复位。为消除异步复位的缺陷,复位电路往往会采用“异步复位、同步释放”的设计方法。即复位信号到来时不受时钟信号的同步,复位信号释放时需要进行时钟信号的同步。

异步复位、同步释放的典型代码描述如下:

module areset_srelease(
    input       rst_n,  //异步复位信号
    input       clk,   //时钟
    input       din,   //输入数据
    output reg  dout   //输出数据
    );
     
reg   rst_n_r1;
reg   rst_n_r2;
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		rst_n_r1 <= 1'b0;     //异步复位
        rst_n_r2 <= 1'b0;  
	end
	else begin
		rst_n_r1 <= 1'b1;     //同步释放
		rst_n_r2 <= rst_n_r1;  //同步打拍,时序差可以多延迟几拍
    end
end
     
//使用 rstn_r2 做同步复位,复位信号可以加到敏感列表中
always @ (posedge clk or negedge rst_n_r2) begin
	if (!rst_n_r2) begin
		dout <= 1'b0; //同步复位
	end
	else begin
		dout <= din;
	end
end

endmodule

该代码常常会被综合成如下电路:

请在此添加图片描述

Testbench代码描述如下:

`timescale 1ns/1ps
module areset_srelease_tb();

reg       rst_n;  
reg       clk;   
reg       din; 
wire      dout;   
 
areset_srelease u_areset_srelease(
    .clk	(clk),
    .rst_n	(rst_n),
    .din	(din),
    .dout	(dout)
    );
 
always #5 clk = ~clk;

initial begin
    clk  = 0;
    #5 rst_n  = 1;
    #10 rst_n = 0;
    #10 rst_n  = 1;
    din = 1;
    #300;
    $finish;
end
 
 
endmodule

仿真结果如下:

请在此添加图片描述

可以看到,经过“异步复位同步释放”处理后,信号在复位信号后的第二个有效上升时钟沿进行了翻转,极大地消除异步复位信号的释放可能引起的亚稳态影响。

五、总结

同步复位的优点:

  1. 信号间是同步的,能滤除复位信号中的毛刺,有利于时序分析。
  2. 电路稳定,一般能够确保电路是百分之百同步的。

同步复位的缺点:

  1. 大多数触发器单元是没有同步复位端的,采用同步复位会多消耗部分逻辑资源(适用同步复位时,综合器就会在寄存器的数据输入端插入组合逻辑)。
  2. 且复位信号的宽度必须大于一个时钟周期,否则可能会漏掉复位信号。
  3. 同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位

异步复位的优点:

  1. 大多数触发器单元有异步复位端,不会占用额外的逻辑资源。
  2. 且异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。
  3. 复位信号不依赖于时钟。

异步复位的缺点:

  1. 复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上 removal 和 recovery 的不满足。复位信号释放的随机性,可能导致时序违规,倘若复位释放时恰恰在时钟有效沿附近,就很容易使电路处于亚稳态。
  2. 且异步复位容易受到毛刺的干扰,产生意外的复位操作。

异步复位和同步复位在设计的时候各有优缺点,那有没有综合两者的优点的复位方式呢?那就是异步复位同步释放,既保证了正常的异步复位不受时钟影响,又通过打两拍的方式消除了电路中的亚稳态(严格来讲是极大概率地消除亚稳态)。


更多可查看个人主页链接
软件版本:Modelsim 10.6c
不定期纠错补充,欢迎随时交流
最后修改日期:2023.6.2

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的异步复位同步释放电路以及它的testbench代码,使用Verilog语言实现: ```verilog module reset_sync( input clk, // 时钟信号 input rstn, // 异步复位信号,低电平有效 input enable, // 使能信号 output reg out // 输出信号 ); reg [1:0] state; // 状态寄存器 always @(posedge clk or negedge rstn) begin if(~rstn) begin // 异步复位 state <= 2'b00; out <= 1'b0; end else if(enable) begin // 正常工作模式 case(state) 2'b00: begin state <= 2'b01; out <= 1'b0; end 2'b01: begin state <= 2'b10; out <= 1'b1; end 2'b10: begin state <= 2'b01; out <= 1'b0; end endcase end end endmodule module reset_sync_tb(); reg clk; reg rstn; reg enable; wire out; reset_sync dut( .clk(clk), .rstn(rstn), .enable(enable), .out(out) ); initial begin clk = 0; forever #5 clk = ~clk; end initial begin rstn = 0; enable = 0; #10 rstn = 1; #10 enable = 1; #100 enable = 0; #100 enable = 1; #100 enable = 0; #100 enable = 1; #100 enable = 0; #100 enable = 1; #100 $finish; end always @(posedge clk) begin $display("out = %b", out); end endmodule ``` 这个电路包括一个状态寄存器,用来记录当前的状态。在异步复位信号rstn为低电平时,状态寄存器和输出信号都被重置为0。当rstn为高电平时,如果enable信号为1,则进入正常工作模式。状态寄存器按照顺序依次切换,对应不同的输出信号。输出信号out在状态寄存器改变时同步更新。 testbench代码包括一个时钟信号clk,一个异步复位信号rstn,一个使能信号enable和一个输出信号out。时钟信号clk通过一个无限循环来生成,异步复位信号rstn和使能信号enable通过initial块来定义,输出信号out通过always块来打印。在仿真过程中,使能信号enable以一定的时间间隔进行切换,可以测试异步复位同步释放的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值