仅对英特尔可见 — GUID: mwh1409959566267
Ixiasoft
2.3.1.3. 使用同步的异步复位
为了避免与纯同步复位和纯异步复位相关的潜在问题,可以使用同步异步复位。同步的异步复位结合了同步复位和异步复位的优点。
这些复位被异步置位和同步置低,能够立即生效,并确保不包含速度的数据路径。而且,对于时序分析,此电路是同步的,并且抗噪声。
以下示例显示了一种用于实现同步的异步复位的方法。您应该以与同步复位类似的方式使用synchronizer寄存器。但是,异步复位输入直接选通(gated)到synchronizer寄存器的CLRN管脚,并立即置位所产生的复位。当复位置低时,逻辑“1”通过synchronizer进行同步来同步地置低所生成的复位。
图 20. 同步的异步复位原理图
同步的异步复位的Verilog HDL代码
module sync_async_reset (
input clock,
input reset_n,
input data_a,
input data_b,
output out_a,
output out_b
);
reg reg1, reg2;
reg reg3, reg4;
assign out_a = reg1;
assign out_b = reg2;
assign rst_n = reg4;
always @ (posedge clock, negedge reset_n)
begin
if (!reset_n)
begin
reg3 <= 1’b0;
reg4 <= 1’b0;
end
else
begin
reg3 <= 1’b1;
reg4 <= reg3;
end
end
always @ (posedge clock, negedge rst_n)
begin
if (!rst_n)
begin
reg1 <= 1’b0;
reg2 <= 1;b0;
end
else
begin
reg1 <= data_a;
reg2 <= data_b;
end
end
endmodule // sync_async_reset
为了最大程度地减少两个同步寄存器之间的亚稳效应,并增加MTBF,这些寄存器应该布局在器件中尽可能靠近的位置,以最小化布线延迟。如果可能,请将寄存器布局在同一逻辑阵列模块(LAB)中。必须使用set_false_path命令排除输入复位信号(reset_n):
set_false_path -from [get_ports {reset_n}] -to [all_registers]与指定约束一起使用的set_false_path命令排除了不必要的输入时序报告,否则在复位管脚上指定输入延迟可能会生成这些报告。
同步异步复位的瞬时置位容易受到噪声和欠幅脉冲的影响。如果可能,您应该对异步复位进行去抖(debounce),并在复位进入器件之前对其进行过滤。电路确保同步的异步复位的长度至少为一个完整的时钟周期。要将此时间扩大到n个时钟周期,则必须将synchronizer寄存器的数量增加到n + 1。您必须将异步输入复位(reset_n)连接到所有synchronizer 寄存器的CLRN管脚,以维持同步的异步复位的异步置位。