异步复位对通用逻辑结构也会产生影响。由于所有 的赛灵思FPGA 通用寄存器都具有将复位/ 置位编程为异 步或同步的能力,因此设计人员可能认为使用异步复位没 什么不妥。但这种假设通常是错误的。如果没有使用异步 复位,那么置位/ 复位逻辑就可以被置为同步逻辑。这样 一来,就可释放额外的资源用于逻辑优化。 为了更好地理解异步复位如何影响优化结果,我们来 看看以下一些不够理想的代码例子:
VHDL 例子#1 process (CLK, RST) begin if (RST = '1') then Q <= '0'; elsif (CLK'event and CLK = '1') then Q <= A or (B and C and D and E); end if; end process; Verilog 例子#1 always @ (posedge CLK, posedge RST) if (RESET) Q <= 1'b0; else Q <= A | (B & C & D & E);
为实现这些代码,综合工具只能为数据路径选择两个 LUT,因为总共有5 个信号与实现上述逻辑功能相关。上 述代码的一种可能性的实现方案如图1 所示。 不过,如果采用同样的代码重新编写同步复位,则能 进一步减少面积、提高性能,获得如下修正过的代码。
VHDL 例子#2 process (CLK) begin if (CLK'event and CLK = '1') then if (RST = '1') then Q <= '0'; else Q <= A or (B and C and D and E); end if; end if; end process; Verilog 例子#2 always @ (posedge CLK) if (RESET) Q <= 1'b0; else Q <= A | (B&C&D&E); 如今的综合工具在实现这种功能时具有了更大的灵活 性。上述代码的一种可能性的实现方案如图2 所示。
|