Intel® Quartus® Prime Pro Edition用户指南: 设计建议

ID 683082
日期 9/28/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

2.3.1.1. 使用同步复位

同步复位可确保电路完全同步。通过使用 Intel® Quartus® Prime Timing Analyzer,可以很容易地计时电路。

由于彼此同步的时钟启动并锁存复位信号,因此可以轻松确定数据到达时间和所需数据时间,以进行适当的slack分析。同步复位更易于与基于周期的仿真器一起使用。

复位信号可以通过两种方法到达寄存器:通过输入数据进行门输入(being gated in),或者通过LAB范围内的控制信号(synclr) 。如果使用第一种方法,那么可能会给电路增加额外的门控延迟来支持复位信号,这会导致增加的数据到达时间,并对setup slack产生负面影响。第二种方法依赖于LAB中到每个寄存器的专用布线,但这比异步复位到同一寄存器的速度慢。

图 14. 同步复位(Synchronous Reset)
图 15. LAB范围的控制信号(LAB-Wide Control Signals)

在检查同步复位的时序分析时,请考虑两种类型的同步复位:外部同步复位和内部同步复位。外部同步复位与FPGA外部的时钟域同步,这种情况并不常见。上电异步复位在系统时钟外部双列同步的,然后进入到FPGA中。在FPGA内部,使用输入到寄存器的数据来门控此复位,以实现同步复位。

图 16. 外部同步复位(Externally Synchronized Reset)

以下示例显示了原理图的等效Verilog HDL。使用同步复位时,复位信号不会放入灵敏度列表中。

以下示例显示了对外部同步复位进行的必要修改。

外部同步复位的Verilog HDL代码


module sync_reset_ext (
         input   clock,
         input   reset_n,
         input   data_a,
         input   data_b,
         output  out_a,
         output  out_b
         );
reg      reg1, reg2
assign   out_a  = reg1;
assign   out_b  = reg2;
always @ (posedge clock)
begin
     if (!reset_n)
     begin
         reg1     <= 1’b0;
         reg2     <= 1’b0;
    end
    else
    begin
         reg1     <= data_a;
         reg2     <= data_b;
    end
end
endmodule     //  sync_reset_ext

以下示例显示了外部同步复位的约束。由于外部复位是同步的,您只需要通过-max-minset_input_delay约束对reset_n信号作为一个正常输入信号进行约束。

外部同步复位的SDC约束


# Input clock - 100 MHz
create_clock [get_ports {clock}] \
        -name {clock} \
        -period 10.0 \
        -waveform {0.0 5.0}
# Input constraints on low-active reset
# and data
set_input_delay 7.0 \
        -max \
        -clock [get_clocks {clock}] \
        [get_ports {reset_n data_a data_b}]
set_input_delay 1.0 \
        -min \
        -clock [get_clocks {clock}] \
        [get_ports {reset_n data_a data_b}]

更常见的是,进入器件的复位是异步的,并且必须在内部同步后才能发送到寄存器。

图 17. 内部同步复位(Internally Synchronized Reset)

以下示例显示了原理图的等效Verilog HDL。只有时钟沿在灵敏度列表中,用于同步复位。

内部同步复位的Verilog HDL代码


module sync_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)
begin
	if (!rst_n)
	begin
		reg1 <= 1’bo;
		reg2 <= 1’b0;
	end
	else
	begin
		reg1 <= data_a;
		reg2 <= data_b;
	end
end

always @ (posedge clock)
begin
	reg3 <= reset_n;
	reg4 <= reg3;
end
endmodule // sync_reset

SDC约束与外部同步复位相似,不同之处在于输入复位是异步的,因此无法对其进行约束。使用set_false_path语句剪切输入路径,以避免将这些路径被视为不受约束的路径。

内部同步复位的SDC约束


# Input clock - 100 MHz
create_clock [get_ports {clock}] \
        -name {clock} \
        -period 10.0 \
        -waveform {0.0 5.0}
# Input constraints on data
set_input_delay 7.0 \
        -max \
        -clock [get_clocks {clock}] \
        [get_ports {data_a data_b}]
set_input_delay 1.0 \
        -min \
        -clock [get_clocks {clock}] \
        [get_ports {data_a data_b}]
# Cut the asynchronous reset input
set_false_path \
        -from [get_ports {reset_n}] \
        -to [all_registers]

同步复位的一个问题是它们相对于同步器触发器的异步输入上的短脉冲(小于一个周期)的行为。这可能是不利的,因为异步复位需要至少一个周期宽的脉冲宽度以保证被第一触发器捕获。但是,这也可以看作是一个优点,因为该电路提高了抗噪能力。异步输入上的杂散脉冲被第一个触发器捕获的机会较小,因此这些脉冲不会触发同步复位。在某些情况下,您可能希望进一步提高抗噪能力,并拒绝宽度小于n个周期的任何异步输入复位,以消除异步输入复位的抖动。

图 18. 使用Pulse Extender的内部同步复位

连接点指示阶段数。您可以使用更多的触发器来获得跨越更多时钟周期的更宽脉冲。

很多设计都有一个以上的时钟信号。在这些情况下,对设计中的每个时钟域使用单独的复位同步电路。当对PLL输出时钟创建synchronizer时,只有锁定PLL并且PLL输出时钟稳定后,这些时钟域才会复位。如果对PLL使用复位,那么此复位不必与PLL的输入时钟同步。您可以为此使用异步复位。使用内部同步复位时,对PLL使用复位会进一步延迟对PLL输出时钟域的同步复位的置位。