使用全局时钟寄存器
http://toolbox.xilinx.com/docsan/xilinx4/data/docs/sim/vtex5.html
对含有全局时钟的设计,使用全局时钟寄存器可为目标器件的专用的全局寄存器树带来low-skew(低斜坡),高驱动能力。不管是一个输入信号驱动一个时钟信号,还是一个内部时钟信号达到了特定的扇出数,你的综合工具都会自动加入一个时钟寄存器。Xilinx实现工具可自动选择与你的设计架构相应的时钟寄存器。
一些综合工具也会限制全局时钟的插入,以便与器件上可用的寄存器相匹配。这可参考你所使用的综合工具的说明文档。
如果你的设计需要一个特别的architecture-specific的寄存器,或者说,你想规定多少时钟寄存器资料可用时,你可以对时钟寄存器实例化。
表5-1总结了Virtex, Virex-E, Virtex-II, Virtex-II Pro和Spartan-II 器件中的全局时钟寄存器(BUFG)资源。
Table 5-1 Global 寄存器 Resources |
||||
寄存器 Type |
Virtex |
Virtex-E |
Virtex-II/II Pro |
Spartan-II |
BUFG |
4 |
4 |
N/A |
4 |
BUFGMUX |
N/A |
N/A |
16 |
N/A |
Virtex/E/II/II Pro和Spartan-II器件包括两层的全局布线资源,称为初级全局和次级局部时钟布线资源。
注:在Virtex-II/II Pro中,BUFG可被元件例化,但得由BUFGMUX来实现。
·初级全局布线资源是专用的全局网络,具有专用的输入引脚,该引脚被设计成在minimal-skew下分配时钟信号。每个全局时钟网络可以驱动所有的CLB,IOB和Block SelectRAM+clock引脚。初级时钟网络仅由全局寄存器驱动,各有各的全局网络。在Virtex/E 和Spartan-II中有4个初次全局网络。在Virtex-II/II Pro中有16个。
·次级局部时钟布线资源由bakebone线或longline组成。这些次级资源比初级资源相比要更为灵活,因为它们都不是仅由routing clock信号限制。这些backbone线在访问Virtex/E/Spartan-II 和 Virtex-II/II Pro时有如下不同:
○在Virtex/E和Spartan-II的设备中,有12根长线(longline)横跨过芯片的顶部,另12根横跨底部。从这些线中,每列最多可达12个独立的信号可经由该列中的12根长线进行分配。若要使用该功能,必须在UCF文件中定义USELOWSKEWLINES。关于USELOWSKEWLINES限制语法的更多的信息,请参阅“Constraints Guide”。
○在Virtex-II中,长线资源是多余的。还有更多的方法使用具low skew特性的资源样式对次级时钟或高扇出数信号进行布线。Xilinx的实现工具将自动根据你的设计不同限制使用这些资源。再者,USELOWSKEWLINES限制也可用来对这些布线资源进行访问。
插入时钟寄存器
许多综合工具在输入端口驱动一寄存器时钟引脚或在一个内部时钟信号到达一特定的扇出数时,会自动插入一个全局时钟寄存器(BUFG)。在外部时钟时插入BUFGP(一种IBUFG-BUFG的连接),因此,内部时钟时插入BUFG。如果需要的BUFG比芯片可提供的还多的话,大多数综合工具也允许你手工控制BUFG的插入。
FPGA Express可为纯时钟网络自动分配最多四个时钟寄存器。FPGA Express不会为仅驱动一个寄存器的时钟分配BUFG。用户也可以例化时钟寄存器或通过Express Constraints Editor对它们赋值。
注:对所有的Virtex/E/II/II Pro和Spartan-II 设计,当前的综合工具会插入简单的时钟寄存器,BUFG。对Virtex-II/II Pro,一些工具提供将BUFGMUX作为一enabled时钟寄存器的属性。在Virtex-II/II Pro,将BUFGMUX当作一实时时钟倍频器时,必须将其例化。
当BUFG资源可用时,LeonardoSpectrum将强制时钟信号为全局寄存器。控制多余的BUFG的最好的办法就是关闭全局寄存器的插入,然后使用buffer_sig属性将BUFG压入需要的信号。通过这样的方法,用户就不用非得例化任意的BUFG组件了。只要“chip”选项被用于优化IBUF,它们将被自动插入输入端口。
下面是一个buffer_sig 属性的语法例子:
set_attribute -port clk1 -name buffer_sig -value BUFG
set_attribute -port clk2 -name buffer_sig -value BUFG
Synplify将为任何直接驱动时钟的信号赋BUFG。全局寄存器的最大值定义为4。在内部时钟的扇出阈值为16时,自动插入BUFG。为了关闭该项功能,使用syn_noclockbuf属性。该属性可被应用于实体模块/结构或者说某个特定的信号。为了更改插入全局寄存器的最大值,用户或以在.sdc文件中做如下的改动。
define_global_attribute xc_global buffers (8)
XST会给任何直接驱动时钟的信号赋BUFG。Virtex, Virex-E, Virtex-II, Virtex-II Pro和Spartan-II器件中,全局寄存器的预设值为4。从4.1版的软件开始,Virtex-II, Virtex-II Pro的为8。BUFG的数目可通过修改XST的bufg选项来更改,既可以在HDL中插入,也可通过命令行切换。为了在一个时黑箱中定义时钟端口,‘sig_isclock’属性可通过HDL或XST限制文件进行定义。
更多的综合信息请参阅你所使用的综合工具的说明文档。
例化全局时钟寄存器
用户可按照下面所描述的代码对全局时钟寄存器进行配置。
例化由端口驱动的寄存器
用户可在代码中而不是在综合工具的脚本中例化全局寄存器并将它们接到高扇出数的端口。如果用户确定要例化全局寄存器,得验证Pad参数并未指定寄存器。
Virtex/E/II 和Spartan-II的设计中,综合工具为可对专门的时钟引脚进行访问的时钟信号插入BUFGP。为了让通常的输入引脚连到时钟寄存器上,用户必须使用IBUF-BUFG进行连接。这个可通过在关闭全局时钟插入后例化BUFG完成。
例化由内部逻辑驱动的寄存器
一些综合工具需要用户在他自己的代码中例化全局寄存器,如果一个高扇出的信号是由内部的寄存器或逻辑(例如时钟源或时钟倍频器)中得到的或者该时钟是由一个未指定I/O驱动的,用户可使用指定的布线资源完成。下面的VHDL和Verilog代码例程是对一个内部的倍频电路进行BUFG例化的。
注:Synplify将为那些多于16个扇出数的信号赋予全局寄存器。
l VHDL Example
-----------------------------------------------
-- CLOCK_MUX_BUFG.VHD Version 1.10--
-- This is an example of an instantiation of --
-- global buffer (BUFG) from an internally --
-- driven signal, a multiplexed clock. --
-- March 2001 --
-----------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
entity clock_mux is
port (DATA, SEL: in STD_LOGIC;
SLOW_CLOCK, FAST_CLOCK: in STD_LOGIC;
DOUT: out STD_LOGIC);
end clock_mux;
architecture XILINX of clock_mux is
signal CLOCK: STD_LOGIC;
signal CLOCK_GBUF: STD_LOGIC;
component BUFG
port (I: in STD_LOGIC;
O: out STD_LOGIC);
end component;
begin
Clock_MUX: process (SEL, FAST_CLOCK, SLOW_CLOCK)
begin
if (SEL = '1') then
CLOCK <= FAST_CLOCK;
else
CLOCK <= SLOW_CLOCK;
end if;
end process;
GBUF_FOR_MUX_CLOCK: BUFG
port map (I => CLOCK,
O => CLOCK_GBUF);
Data_Path: process (CLOCK_GBUF)
begin
if (CLOCK_GBUF'event and CLOCK_GBUF='1')then
DOUT <= DATA;
end if;
end process;
end XILINX;
l Verilog Example
// CLOCK_MUX_BUFG.V Version 1.1
// This is an example of an instantiation of
// global buffer (BUFG) from an internally
// driven signal, a multiplied clock.
// March 2001
module clock_mux(DATA,SEL,SLOW_CLOCK,FAST_CLOCK,
DOUT);
input DATA, SEL;
input SLOW_CLOCK, FAST_CLOCK;
output DOUT;
reg CLOCK;
wire CLOCK_GBUF;
reg DOUT;
always @ (SEL or FAST_CLOCK or SLOW_CLOCK)
begin
if (SEL == 1'b1)
CLOCK <= FAST_CLOCK;
else
CLOCK <= SLOW_CLOCK;
end
BUFG GBUF_FOR_MUX_CLOCK (.O(CLOCK_GBUF),
.I(CLOCK));
always @ (posedge CLOCK_GBUF)
DOUT = DATA;
endmodule