异步复位对通用逻辑结构也会产生影响。由于所有
的赛灵思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 所示。