同步复位、异步复位
同步复位:复位信号只有在时钟上升沿到来时才能有效。
优点:(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,可用作芯片内部的异步复位源信号。