RTL设计(8)- 异步复位同步释放

同步复位、异步复位

同步复位:复位信号只有在时钟上升沿到来时才能有效。
优点:(1)因为只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺;(2)可以使所设计的系统成为100%的同步时序电路,有利于时序分析。
缺点:(1)复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素;(2)由于大多数的FPGA逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。

异步复位:无论时钟沿是否到来,只要复位信号有效,就进行复位。
优点:(1)响应快速;(2)设计相对简单;(3) 因为大多数目标器件库的DFF都有异步复位端口,因此采用异步复位可以节省资源。
缺点:(1)复位信号容易受到毛刺的影响。 (2)在复位信号释放(release)的时候容易出现问题。具体就是说:若复位释放刚好在时钟有效沿附近时,很容易使寄存器输出出现亚稳态,从而导致亚稳态。

异步复位同步释放

为了保留异步复位的快度响应的优点、并避免复位信号释放时产生亚稳态,由此产生了异步复位同步释放电路。
(可以使用门电路构成毛刺过滤器来减少毛刺干扰。)
在这里插入图片描述

resetSynchronizer.v

`timescale 1ns / 1ps

// Company: 
// Engineer: 
// 
// Create Date: 2020/12/17
// Author Name: Sniper
// Module Name: resetSynchronizer
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 


module resetSynchronizer(
    input clk,
	input extern_rst_n,
    output system_rst_n
);

reg buff1;
reg buff2;

always@(posedge clk or negedge extern_rst_n)
    if(!extern_rst_n)
		buff1 <= 1'b0;
    else
		buff1 <= 1'b1;

always@(posedge clk or negedge extern_rst_n)
    if(!extern_rst_n)
		buff2 <= 1'b0;
    else
		buff2 <= buff1;


assign system_rst_n = buff2;


endmodule

tb_resetSynchronizer.v

`timescale 1ns / 1ps

// Company:
// Engineer:
//
// Create Date: 2020/12/17
// Author Name: Sniper
// Module Name: tb_resetSynchronizer
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//


module tb_resetSynchronizer;

//input
reg clk;
reg extern_rst_n;


//output
wire system_rst_n;



initial
begin
    clk = 0;
    extern_rst_n = 0;

	#100;
    extern_rst_n = 1;

	#86;
    extern_rst_n = 0;
	#8;
    extern_rst_n = 1;

	#86;
    extern_rst_n = 0;
	#68;
    extern_rst_n = 1;

end

//clock
always #5 clk = ~clk;



//DUT
resetSynchronizer DUT
(
    .clk(clk),
    .extern_rst_n(extern_rst_n),
    .system_rst_n(system_rst_n)
);

initial
begin
    $dumpfile("tb_resetSynchronizer.vcd");
    $dumpvars(0,tb_resetSynchronizer);
end

initial #1000 $finish;

endmodule

仿真结果

vcs -R resetSynchronizer.v tb_resetSynchronizer.v

结果中可以发现,system_rst_n的释放同步于clk,可用作芯片内部的异步复位源信号。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/meng1506789/article/details/111324268
今日推荐