FPGA/CPLD中常见模块设计精华集锦(一)
扫描二维码
随时随地手机看文章
一、智能全数字锁相环的设计
1 引言
数字锁相环路已在数字通信、无线电电子学及电力系统自动化等领域中得到了极为广泛的应用。随着集成电路技术的发展,不仅能够制成频率较高的单片集成锁相环路,而且可以把整个系统集成到一个芯片上去。在基于FPGA的通信电路中,可以把全数字锁相环路作为一个功能模块嵌入FPGA中,构成片内锁相环。
锁相环是一个相位误差控制系统。它比较输入信号和振荡器输出信号之间的相位差,从而产生误差控制信号来调整振荡器的频率,以达到与输入信号同频同相。所谓全数字锁相环路(DPLL)就是环路部件全部数字化,采用数字鉴相器(DPD)、数字环路滤波器(DLF)、数控振荡器(DCO)构成的锁相环路,其组成框图见图1示。
当锁相环中的鉴相器与数控振荡器选定后,锁相环的性能很大程度依赖于数字环路滤波器的参数设置。
2 K计数器的参数设置
74297中的环路滤波器采用了K计数器。其功能就是对相位误差序列计数即滤波,并输出相应的进位脉冲或是借位脉冲,来调整I/D数控振荡器输出信号的相位(或频率),从而实现相位控制和锁定。
K计数器中K值的选取需要由四根控制线来进行控制,模值是2的N次幂。在锁相环路同步的状态下,鉴相器既没有超前脉冲也没有滞后脉冲输出,所以K计数器通常是没有输出的;这就大大减少了由噪声引起的对锁相环路的误控作用。也就是说,K计数器作为滤波器,有效地滤除了噪声对环路的干扰作用。
显然,设计中适当选取K值是很重要的。K值取得大,对抑止噪声有利(因为K值大,计数器对少量的噪声干扰不可能计满,所以不会有进位或借位脉冲输出),但这样捕捉带变小,而且加大了环路进入锁定状态的时间。反之,K值取得小,可以加速环路的入锁,但K计数器会频繁地产生进位或借位脉冲,从而导致了相位抖动,相应地对噪声的抑制能力也随之降低。
为了平衡锁定时间与相位抖动之间的矛盾,理想的情况是当数字锁相环处于失步状态时,降低K计数器的设置,反之加大其设置。实现的前提是检测锁相环的工作状态。
3 工作状态检测电路
图2为锁相环状态检测电路,由触发器与单稳态振荡器构成,fin为输入的参考时钟,fout为锁相环振荡器输出的时钟移相900。fout对fin的抽样送入单稳态振荡器。
在锁定状态如图3,fout与fin具有稳定的相位关系, fout对fin抽样应全部为0或1,这样不会激发振荡器振荡,从而lock将输出低电平;而失锁状态时如图4,fout与fin出现相位之间的滑动,抽样时就不会出现长时间的0或1,单稳态振荡器振荡,使lock输出高电平。锁相环的锁定状态保持时间的认定,可以通过设置振荡器的性能。在FPGA设计中,要采用片外元件来进行单稳定时,是很麻烦的,而且也不利于集成和代码移植。单稳态振荡器的实现也可以在FPGA内实现,利用计数器的方法可以设计全数字化的上升、下降沿双向触发的可重触发单稳态振荡器。
4 智能锁相环的设计
智能全数字锁相环的设计如图5所示。锁相环与CPU接口电路,由寄存器来完成。对于CPU寄存器内容分为两部分:锁相环的工作状态(只读),k计数器的参数值(读/写)。CPU可以通过外部总线读写寄存器的内容。
图5 智能全数字锁相环框图
CPU根据锁相环状态就可以对锁相环K计数器进行最优设置。实际测试时设置K初始值为23,此时锁相环的捕捉带较大,在很短时间内就可以达到锁定状态,lock变为低电平。CPU检测到此信号后自动将K值加1,如lock仍然为低电平,CPU会继续增加K 值;直到锁相环失锁,记住其最佳设置值。设置K为初始值,锁定后,设置到最佳值,这样锁相会快速进入最佳的锁定状态。
关于CPU的选择有三种方案:①FPGA片内实现CPU。片上系统的发展使其成为可能。②与片外系统共用CPU。DPLL大多用于通信系统中,而大部分通信系统都有嵌入式CPU。③单独采用一个廉价单片机(如89C51),不仅可用于智能锁相环的控制,还可控制外部RAM实现FPGA的初始装载,一机多用,经济实惠。可以视具体情况而定。
5 结论
智能全数字锁相环,在单片FPGA中就可以实现,借助锁相环状态监测电路,通过CPU可以缩短锁相环锁定时间,并逐渐改进其输出频率的抖动特性。解决了锁定时间与相位抖动之间的矛盾,对信息的传输质量都有很大的提高。此锁相环已用于我校研发的数字通信产品中。
二、使用PLD内部锁相环解决系统设计难题
微电子技术的发展趋势是片上系统(SoC),也就是在一块芯片上实现整个系统,包括模拟部分和数字部分。作为IC产业中重要的一个分支,可编程逻辑器件(PLD)也在努力向这个方向发展。无论是Xilinx还是Altera,它们最新的PLD产品中都集成了诸如PCI接口、乘法器、MCU核以及DSP核等部件,有的甚至集成了完整的微处理器。例如,Xlinux的Vietex2-Pro系列就是集成了PowerPC微处理器。
锁相环技术是模拟集成电路设计中一个重要的研究方向。但是,现在中高档的可编程逻辑器件一般都集成有片内的锁相环(如Xilinx的Spartan2系列,Altera的Cyclone系列)。锁相环一端连接外部全局时钟或者全局控制信号,另一端连接可编程逻辑器件内部专门的布线网络,可以最大程度地减少全局时钟信号到片内各个部分的布线延迟,有效地消除了时钟偏移而带一的各种问题。同时,锁相环一般都提供了倍频、分频、相移三个功能。
1 应用背景介绍
本文用FPGA实现FIFO,连接PCI与TI的TMS320C6204的扩展总线,与DSP传输数据的时钟达到100MHz。由于DSP的接口对于时钟和信号的要求很苛刻,所以下面具体分析核心的DSP的XBUS时序。
DSP的扩展总线(XBUS)是一个32位宽的总线,支持与异步外设、异步/同步FIFO、PCI桥以及外部主控处理器等的接口。它同时提供一个灵活的总线仲裁机制,可以内部进行仲裁,也可以由外部逻辑完成。
本文中使用XBUS的同步FIFO接口。如果是要读取FIFO,首先FIFO要通过中断信号XINT0来通知XBUS数据已经准备好,然后XBUS响应XCE0、XRE、XOE有效,就开始读取FIFO中的数据,读FIFO的时序如图1所示;如果是要写FIFO,FIFO通过XINT1申请XBUS,然后XBUS响应XCE1、XWE有效,开始一个写FIFO的DMA传输过程,写FIFO的时序如图2所示。
通过分析XBUS读写FIFO的时序关系可以看出,在FIFO实现的过程中需要注意以下几个地方:
①XBUS工作时钟是100MHz,对于大部分的FPGA来说是一个比较高的频率。而且,由于读出的数据要求一定的建立时间(setup time)和保持时间(hold time),这就对内部逻辑的设计提出了较高的要求。
②读FIFO时,必须在使能信号有效之后的第二个时钟周期就把数据输出。对于FIFO内部的双端口RAM来说,这个实现起来不一定能满足要求(有很多RAM是在使能信号只有的3~5个时钟周期才输出数据的)。这样,通用FIFO中就要考虑产生预读逻辑来产生数据,以满足XBUS严格的时序要求。
③XBUS的使能信号XCE0/XCE1/XRE/XOE/XWE的变化时间范围是在时钟有效之后的1~7ns,考虑到FPGA内部的组合逻辑延时和布线延时,这样对有效信号的锁定可能是不稳定的。这就为逻辑设计带来了很大的难度。
2 锁相环的相移功能
系统时钟是100MHz,为了获得更好的布线效果和系统性能,时钟信号必须经过锁相环到达全局时钟布线网络。同时,锁相环还可以提供多个时钟相移的信号,同样可以连接到全局布线网络来驱动片的时钟信号。以Xilinx公司的SPARTAN2系列芯片为例(Altera的Cyclone或者更高级别的系列也提供了类似的锁相环),使用片内锁相环进行时钟相移。
相移以后的时钟对于系统设计有很大的用处。本文利用了相移以后的时钟解决了系统设计中的两个难点,取得了令人满意的效果:
①用PLL解决使能信号漂移的难题;
②使用PLL满足TI的TMS320C62XX系列DSP中XBUS的建立、保持时间要求。
3 使用PLL解决使能信号漂移的难题
由于DSP的XBUS响应FIFO的中断XINT0时,需要回复XRF、XCE0、XOE三个信号。只有三个同时有效时,才可以读FIFO,所以读使能信号RDEN=not(XCE0 or XRE or XOE);XBUS回复FIFO中断信号XINT1时,需要回复XWE和XCE1两个信号。只有两个信号时有效才可以写FIFO,所以WREN=not(XCE1 or XWE)。
RDEN或者WREN都是由FPGA内部组合逻辑产生的,在FPGA内部组合逻辑的物理延时(tc)为3~5ns。考虑到XBUS的使能信号本身相对于时钟上升沿(td)就有1~7ns,所以使能信号有效相对时钟上升沿来说可能的变化范围为4~12ns,如图4所示。
系统经过锁相环的相移,驱动FPGA内部逻辑的时钟。相对于XCLK来说,如果XBUS的回应信号的延时为1ns(图4中实线所示部分),则RDEN经过组合逻辑延迟,变为高有效的时候,可以在时钟的第一个上升沿采样到(图4中实线所示);如果XBUS的回应信号延时为7ns,则RDEN经过组合逻辑延迟以后,只能在第二个时钟的上升延才能采样到高有效信号。
显而易见,XBUS信号延迟的变化范围太大,造成了系统设计的不稳定性。要解决这个问题,通过逻辑优化是没有办法来进行的。因为产生使能信号的那一级组合逻辑本身的延迟是无法改变的。
本文灵活地运用了FPGA内部锁相环的移相功能,巧妙地解决了信号XCLK_Shift相对于XCLK的相移问题。而且,经过这个相移以后的时钟信号,无论XBUS使能信号怎么在1~7ns内发生变化,都可以保证在XCLK_Shift的第二个时钟周期采样到高有效信号。这样就确定了稳定的逻辑关系,为可靠稳定的设计奠定了基础。
4 使用PLL满足XBUS的建立、保持时间要求
如图1中所示,FIFO中数据输出时需要满足一定的建立和保持时间(图1中为时间5和时间6)。但是,时钟信号XCLK输入FPGA的时候需要首先经过IOB(输入输出模块),然后才能连接到锁相环部分进入全局时钟网络。采用同步输出的时候,输出数据也要经过IOB才可以输出。IOB本身的延时就很容易导致无法确保正确的建立和保持时间,满足不了XBUS的要求,如图5所示。
为了解决这个问题,同样可以采用锁相环进行时钟相位偏移来弥补通过IOB引起的时钟相位偏移。这样,数据端的输出只要相对于经过偏移的时钟信号满足建立保持时间,那么,就可以满足原始时钟信号的要求(如图5中虚线所示)。
5 结论
通过合理的使用FPGA内部的锁相环,本文在不改动原有逻辑设计和代码的情况下,巧妙地解决了高速DSP扩展总线XBUS与FIFO的接口问题。为系统和逻辑设计解决了可能遇到的几个难点,为进一步的研究和开发提供了一种解决问题的新方法和思路。
基于FPGA的高频时钟的分频和分配设计#e#
三、基于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;
四、基于FPGA的多种形式分频的设计与实现
分频器是数字系统设计中的基本电路,根据不同设计的需要,我们会遇到偶数分频、奇数分频、半整数分频等,有时要求等占空比,有时要求非等占空比。在同一个设计中有时要求多种形式的分频。通常由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频,实现较为简单。但对半整数分频及等占空比的奇数分频实现较为困难。本文利用VHDL硬件描述语言,通过QuartusⅡ3.0开发平台,使用Altera公司的FPGA,设计了一种能够满足上述各种要求的较为通用的分频器。
一、电路设计
采用FPGA实现半整数分频器,可以采用以下方法:设计一个模N的计数器,再设计一个脉冲扣除电路,每来两个脉冲扣除一个脉冲,即可实现分频系数为N-0.5的分频器。脉冲扣除电路由异或门和一个2分频器构成。本设计在半整数分频器原理的基础上,对异或门加一个使能控制信号,通过对异或门和计数器计数状态值的控制,实现同一个电路完成多种形式分频,如图1所示。
二、VHDL语言的实现
现通过设计一个可以实现8.5分频,等占空比的17分频,2、4、8、16、32分频,及占空比为1∶8和4∶5的9分频等多种形式分频的分频器,介绍该通用分频器的FPGA实现。
由图1所示的电路原理图可知,分频器由带使能端的异或门、模N计数器和一个2分频器组成,本设计用D触发器来完成2分频的功能,实现方法是:将触发器的Q反输出端反馈回输入端D,将计数器的一个计数输出端作为D触发器的时钟输入端。各功能模块的VHDL语言实现如下。
1.模N计数器的实现
一般设计中用到计数器时,我们可以调用lpm库中的计数器模块,也可以采用VHDL语言自己设计一个模N计数器。本设计采用VHDL语言设计一个最大模值为16的计数器。输入端口为:使能信号en,复位信号clr和时钟信号clk;输出端口为:qa、qb、qc、qd。其VHDL语言描述略。
2.带使能控制的异或门的实现
输入端为:xor_en:异或使能,a和b:异或输入;输出端为:c:异或输出。当xor_en为高电平时,c输出a和b的异或值。当xor_en为低电平时,c输出信号b。其VHDL语言略。
3.2分频(触发器)的实现
输入端为:时钟信号clk,输入信号d;输出端为:q:输出信号a,q1:输出信号a反。其VHDL语言略。
4.分频器的实现
本设计采用层次化的设计方法,首先设计实现分频器电路中各组成电路元件,然后通过元件例化的方法,调用各元件,实现整个分频器。其VHDL语言略。
三、仿真结果及硬件电路的测试
本设计的目的是通用性和简易性,只要对上述程序稍加改动即可实现多种形式的分频。
1.实现8.5分频和等占空比的17分频
只要将上述程序中,调用计数器模块时端口qa、qb、qc匹配为open状态,同时置xor_en为高电平即可。从编译报告看出总共占用8个逻辑单元(logic elements),其仿真波形如图2~4所示。
图二
图三
图四
由图中qxiao和clk的波形可以看出,每隔8.5个时钟周期,qxiao信号产生一个上升沿,从而实现分频系数是8.5的分频,同时在qzheng端得到等占空比的17分频。设clk为170MHz,则qxiao输出为20MHz,qzheng输出为10MHz。
2.实现占空比为1∶8和4∶5的9分频
只要上述程序的xor_en置低电平即可在qxiao输出占空比为1∶8的9分频信号;在qzheng2输出占空比为4∶5的9分频信号。同样仅占8个逻辑单元(logic elements)。仿真波形如下。
3.实现等占空比的2、4、8、16和32分频
只要将上述程序中的xor_en置为低电平,同时将计数器模块的计数最大值设为16即可。仿真波形如下。
由此可见,只要稍微改变计数器的计数状态值,对异或门进行选通控制,即可实现上述多种形式的分频。本设计在Altera公司的EP1K50QC208-3构成的测试平台上测试通过,性能良好。
结束语
我们在设计模拟雷达脉冲信号和用FPGA开发扩频芯片时就用到了上述多种形式得分频。本文旨在介绍一种进行FPGA开发时,所需多种分频的实现方法,如果设计中所需分频形式较多,可以直接利用本设计,通过对程序的稍微改动以满足自己设计的要求。如果设计中需要分频形式较少,可以利用本设计部分程序,以节省资源。