三、基于FPGA的高频时钟的分频和分配设计
1 引言
随着应用系统向高速度、低功耗和低电压方向的发展,对电路设计的要求越来越高?传统集成电路设计技术已无法满足性能日益提高的整机系统的要求。同时,由于IC设计与工艺技术水平的提高,集成电路规模越来越大,复杂程度越来越高。目前已经可以将整个系统集成在一个芯片上,即片上系统(System on a Chip?缩写为SOC),这种芯片以具有系统级性能的复杂可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)为主要代表。与主要实现组合逻辑功能的CPLD相比,FPGA主要用于实现时序逻辑功能。对于ASIC设计来说,采用FPGA在实现小型化、集成化和高可靠性系统的同时,还可以减少风险、降低成本、缩短开发周期。
2 系统硬件组成
本文介绍的时钟板主要由于为PET(正电子发射断层扫描仪)的前端电子学模块提供32路系统时钟(62.5MHz)和32路同步时钟(4MHz)。时钟信号之间的偏差要求在2ns之内。为了消除各路时钟信号之间的偏差,文中介绍利用FPGA来实现主时钟的分频、零延时输出和分配,同时利用LVDS技术实现多路时钟的传输的实现方法。图1所示是其硬件设计示意图。
由图1可知,该时钟电路的具体工作原理是:首先由精密晶体振荡器产生62.5MHz的时钟信号,然后经时钟驱动芯片CY2305输入FPGA芯片的时钟引脚GCLK以作为时钟源。该时钟在FPGA芯片内部经DLL(延迟锁定环)模块分别生成62.5MHz的系统时钟和4MHz的同步时钟?LVTTL电平信号?,然后由内部的IOB(输入输出功能模块)分配到64个输出引脚(32路62.5MHz系统时钟和32路4MHz同步时钟),这64路LVTTL电平信号两两进入32块LVDS(两路)驱动转换芯片后,即可转换为LVDS信号并通过差分双绞线传输给前端电子学模块的32块数字电路板。
2.1 FPGA的结构
单元型FPGA主要由三部分组成:可配置逻辑模块CLB(Configurable Logic Block),输入、输出模块I/OB和可编程连线PI(Programmable Interconnect)。对于不同规格的芯片,可分别包含8×8、20×20、44×44甚至92×92个CLB阵列,同时配有64、160、352、甚至448个I/OB以及为实现可编程连线所必需的其它部件。图2所示是本设计中使用的XC2S30芯片的内部结构。
2.2 Xinlinx公司的SpartanII系列FPGA
Xinlinx公司目前生产的FPGA有两类代表性产品?一类是XC40003/Spartan系列?另一类是Vir-tex/SpartanII系列。这两类产品除具有FPGA的三种基本资源(可编程I/O、可编程逻辑功能模块CLB和可编程布线等)外?还具有片内RAM资源。但两种产品也有所不同。其中XC4000E可以用于实现片内分布RAM,同时专门为实现可编程片上系统开发的Virtex系列,其片内分布RAM和块RAM都可以实现,并可实现片上系统所要求的其他性能,如时钟分配和多种电平接口等特性。SpartanII系列与Virtex系列产品相比,除了块RAM数量少于Virtex系列产品外,其余有关性能(如典型门范围、线宽、金属层、芯内电压、芯片输入输出引脚电压、系统频率和所含DLL个数等)都基本相同,它的一个突出优点(也是本设计选用该系列芯片的主要原因)是:该系列产品是专门为取代掩膜门阵列的低价位FPGA,在达到门阵列数量时,其价格可与门阵列相比。因此,本文介绍的时钟电路的设计选用SpartanII系列FP-GA中的XC2S30-5PQ208芯片来实现。
3 用FPGA实现时钟分频和分配
如图2所示?SpartanII系列芯片内部含有四个全数字延时锁定环(DLL),每一个DLL可驱动两个全局时钟分布网络。通过控制DLL输出时钟的一个采样?可以补偿由于布线网络带来的时钟延时,从而有效消除从外部输入端口到器件内部各个时钟负载的延时。DLL除提供对用户输入时钟的零延时之外,还具有时钟倍频和分频功能。它可以对时钟源进行两倍频和1.5、2、3、4、5、8或16分频。本设计就是利用DLL的零延时和分频功能来实现对62.5MHz时钟的输出和16分频后4MHz(约)时钟的输出。
3.1 数字延时锁定环(DLL)的结构原理
图3是一个DLL的内部原理框图,它由各类时钟延时线和控制逻辑组成。延时线主要用于对时钟输入端CLKIN产生一个延时。通过器件内部的时钟分布网络可将该输入时钟分配给所有的内部寄存器和时钟反馈端CLKFB。控制逻辑则主要用于采样输入时钟和反馈时钟以调整延时线。这里所说的延时线由压控延时或衰减延时组件构成,SpartanII系列芯片选用了后者。DLL可在输入时钟和反馈时钟之间不停地插入延时,直到两个时钟的上升沿同步为止。当两时钟同步时,DLL锁定。在DLL锁定后,只要输入时钟没有变化,两时钟就不会出现可识别偏差。因此,DLL输出时钟就补偿了时钟分布网络带来的输入时钟延时,从而消除了源时钟和负载之间的延时。
3.2 DLL功能的实现
SpartanII系列芯片内含专门实现DLL功能的宏单元模块BUFGDLL,其结构简图如图4所示。该模块由IBUFG、CLKDLL和BUFG三个库元件组成?其原理框图如图5所示。图5中,CLKDLL库元件用于实现DLL的主要功能?包括完成时钟的零延时输出、时钟的倍频以及分频和镜像操作。而IBUFG和BUFG则分别实现外部时钟的输入以及将输出时钟分配到芯片引脚。本设计的时钟分频就是将62.5MHz的时钟由IBUFG输入?经CLKDLL分频后再由CLKDV端传给BUFG?然后经片内IOBUF分配到芯片的普通I/O输出引脚。
4 软件实现
在设计的总体构思和器件选择完成后,必须进行的工作是建立设计输入文件,该文件主要用于描述所设计电路的逻辑功能。这里使用的是XILINX公司提供的开发工具FOUNDATION 4.1。本设计采用硬件描述语言VHDL来设计,其部分程序如下:
entity lvds is
port (
pclk: in STD LOGIC;
pclk_62: out std_logic_vector(31 downto 0);?
pclk_4: out std_logic_vector(31 downto 0));
end lvds;
architecture lvds_arch of lvds is
component clkdll
port( clkin: in std_logic;
clkfb : in std_logic;
rst: in std_logic;
clk0: out std_logic;
clk90 : out std_logic;
clk180: out std_logic;
clk270: out std_logic;
clk2x : out std_logic;
clkdv: out std_logic;
locked: out std_logic);
end component;
begin
reset n<=‘0' ;
uibuf : ibufg port map (
i => pclk,
o => clk);
udll: clkdll port map( clkin => clk,
rst => reset_n,
clkfb => clkfb,
clk0 => clk0,
clk90 => open,
clk180 => open,
clk270 => open,
clk2x => clk2x,
clkdv => clkdv,
locked => locked
);
bufg_clk0: bufg port map ( i => clk0,
o=>clk_int2;
);
clkfb<=clk_int2;
process(clk2x);
begin
if clk2x′event and clk2x=′1′ then
clk_int <=clk int2;
clk_int3<= clkdv;
pclk_62(0)<=clk_int;
pclk_62(1)<=clk_int;
…
…
pclk_62(31)<=clk_int;
pclk_4(0)<=clk_int3;
pclk_4(1)<=clk_int3;
…
…
pclk_4(31)<=clk_int3;
end if;
end process;
end lvds_arch; |