门控时钟与多扇出问题解决方案
0赞转:http://blog.sina.com.cn/s/blog_4e00cfd30100a1wk.html
FPGA设计中,经常会出现由于设计不合理产生的布线问题,较为突出的一点就是门控时钟和多扇出问题。
门控时钟指的是不用FPGA内部的全局时钟资源BUFG来 控制触发器的时钟沿输入端而是采用组合逻辑和其它时序逻辑(如分频器)产生的信号作为触发器的时钟沿输入端。门控时钟容易带来时钟漂移、毛刺等,使得触发 器误动作,通常,对于驱动的触发器数量较少的门控时钟,编译器可以自动将分布时钟缓冲器将其布线优化,但是对于驱动触发器较多的门控时钟,将会使布线不稳 定,重者造成设计混乱。门控时中较多,也会使得整个设计的最大工作速度下降,降低产品的性能。
对于门控时钟问题,通常的解决办法是将分频器做成与系统时钟宽度一个周期宽度的脉冲信号,所谓系统时钟就是用全局时钟资源BUFG驱动的高扇出、零漂移、零畸变的时钟资源,在FPGA内部的布线结构是树形结构。
将分频器的输出送入触发器的ce端,当系统时钟到来时,检测ce信号的有效性,当ce信号有效时,将触发器的输出改变,和分频器的作用完全一样,而且这样处理也使得布线更加优化。
多(假定扇出数为140),为了减少扇出,用系统时钟采样,将M1信号驱动7个D触发器,
然后将7个D触发器的输出端分给7个模块,这样每个复制点(DUP0~DUP6)平均扇出变为20,
M1的信号扇出变为7,这样就减少了每个信号的扇出,优化了逻辑,也提高了设计的整体
性能。
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;