FPGA设计中,经常会出现由于设计不合理产生的布线问题,较为突出的一点就是门控时钟和多扇出问题。
门控时钟指的是不用FPGA内部的全局时钟资源BUFG来控制触发器的时钟沿输入端而是采用组合逻辑和其它时序逻辑(如分频器)产生的信号作为触发器的时钟沿输入端。门控时钟容易带来时钟漂移、毛刺等,使得触发器误动作,通常,对于驱动的触发器数量较少的门控时钟,编译器可以自动将分布时钟缓冲器将其布线优化,但是对于驱动触发器较多的门控时钟,将会使布线不稳定,重者造成设计混乱。门控时钟较多,也会使得整个设计的最大工作速度下降,降低产品的性能。
对于门控时钟问题,通常的解决办法是将分频器做成与系统时钟宽度一个周期宽度的脉冲信号,所谓系统时钟就是用全局时钟资源BUFG驱动的高扇出、零漂移、零畸变的时钟资源,在FPGA内部的布线结构是树形结构。
将分频器的输出送入触发器的ce端,当系统时钟到来时,检测ce信号的有效性,当ce信号有效时,将触发器的输出改变,和分频器的作用完全一样,而且这样处理也使得布线更加优化。(使能时钟)
对于多扇出问题,通常是指用一个节点驱动多个下级逻辑器件,对于门控时钟驱动较多的触发器,也可以归为此类问题,此问题会严重影响FPGA布线的稳定性,设计的时候要多加注意,此时采用的是复制寄存器策略:
CLK为系统时钟,M1为1MHz方波信号,由于M1信号驱动的模块较多,所以M1的扇出较多(假定扇出数为140),为了减少扇出,用系统时钟采样,将M1信号驱动7个D触发器,然后将7个D触发器的输出端分给7个模块,这样每个复制点(DUP0~DUP6)平均扇出变为20, M1的信号扇出变为7,这样就减少了每个信号的扇出,优化了逻辑,也提高了设计的整体性能。
上述模块的VHDL语言描述为:
library ieee;
use ieee.std_logic_1164.all;
entity RegDup is
port(
clk:in std_logic;
Dup:out std_logic_vector(6 downto 0);
M1:in std_logic);
end RegDup;
architecture rtl of RegDup is
begin
process(Clk)
begin
if Clk'event and Clk='1'then --系统时钟采样
Dup(0)<=M1; --复制M1信号
Dup(1)<=M1;
Dup(2)<=M1;
Dup(3)<=M1;
Dup(4)<=M1;
Dup(5)<=M1;
Dup(6)<=M1;
end if;
end process;
end rtl;