仅对英特尔可见 — GUID: mwh1409959566267
Ixiasoft
2.3.1.3. 使用同步的异步复位
为了避免与纯同步复位和纯异步复位相关的潜在问题,可以使用同步异步复位。同步的异步复位结合了同步复位和异步复位的优点。
这些复位被异步置位和同步置低,能够立即生效,并确保不包含速度的数据路径。而且,对于时序分析,此电路是同步的,并且抗噪声。
以下示例显示了一种用于实现同步的异步复位的方法。您应该以与同步复位类似的方式使用synchronizer寄存器。但是,异步复位输入直接选通(gated)到synchronizer寄存器的CLRN管脚,并立即置位所产生的复位。当复位置低时,逻辑“1”通过synchronizer进行同步来同步地置低所生成的复位。
图 22. 同步的异步复位原理图
同步的异步复位的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管脚,以维持同步的异步复位的异步置位。