XilinxSpartanIIE 内部锁相环DLL的使用.docx
- 文档编号:10283455
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:21
- 大小:591.58KB
XilinxSpartanIIE 内部锁相环DLL的使用.docx
《XilinxSpartanIIE 内部锁相环DLL的使用.docx》由会员分享,可在线阅读,更多相关《XilinxSpartanIIE 内部锁相环DLL的使用.docx(21页珍藏版)》请在冰点文库上搜索。
XilinxSpartanIIE内部锁相环DLL的使用
SpartanIIE内部锁相环(DLL)的使用
以下是一个实验,讲述如何使用器件内部锁相环(DLL),很有实际意义,所以拿出来,大家一起学习,一起进步!
实验SpartanIIE内部锁相环(DLL)的使用
一、实验目的
1.进一步熟悉FPGA软硬件开发环境;
2.了解FPGA的内部结构;
3.初步掌握DLL的使用。
二、设计任务
FPGA中的DLL是一种很好的资源,特别是较高频率的时候,应用较广。
它可以对时钟进行倍频、锁相等操作。
通过设计掌握DLL的各种应用:
倍频,分频,锁相,以及移相的操作,编程演示,通过示波器观察和比较波形。
下面先对DLL做一个简单的介绍。
1.概述
XILINX公司的Spartan-IIE系列提供四个延迟锁相环(Delay-LockedLoop),分别位于芯片内部的四个脚。
这些DLL可以被用来实现一些电路以完善和简化系统级设计,比如提供零传播延迟,低时钟相位差和高级时钟区域控制等。
随着FPGA尺寸的增加,芯片上时钟的分布质量就变得越来越重要。
时钟相位差和时钟延迟严重影响设备的性能,在大的设备中用传统的时钟网络控制时钟相位差和时钟延迟变得十分困难,XILINX公司的Spartan-IIE系列的四个延迟锁定环(Delay-LockedLoop)恰好解决了这个问题。
每一个DLL可以驱动两个全局时钟,全局时钟分布网络可以根据不同的负载,将时钟相位差最小化。
通过观察一个DLL输出时钟,它可以在网络中补偿延迟,有效的消除了设备内从外部输入端口到时钟装载的延迟。
除了根据用户的原时钟信号提供零延迟,DLL还可以提供原时钟信号的若干倍频段。
DLL可以使时钟加倍,二倍频或四倍频。
还可以对时钟信号进行分频,1.5,2,2.5,3,4,5,8,16分频。
DLL还可以提供固定相位差的时钟,如90°、180°、270°,另外,DLL可以被用作时钟镜像,通过驱动DLL芯片外的输出,然后反馈,DLL可以降低多个设备间的时钟相位差。
2.基本原理
如图4-1-1所示,一个最简单的DLL包括一个“variabledelayline”和“controllogic”.“variabledelayline”产生一个输入信号CLKIN延迟了的版本。
时钟分布网络在所有内部寄存器时钟和CLKFB脚反馈时钟之间布线。
“Controllogic”.要检测输入时钟和反馈时钟好来调节延迟线。
延迟线可以通过电压控制的延迟或一系列离散延迟成分建立。
最适用于VirtexDLL的性能的方法是使用一个离散的数字延迟线。
一个DLL的工作原理是:
在输入时钟和反馈时钟中插入延迟,直到两个时钟上升沿相同,使得他们同步。
在输入时钟和反馈时钟边沿在一条直线上后,DLL锁存。
电路直到DLL锁存之后才开始初始,所
以两个时钟无区别。
所以DLL的输出时钟补偿了时钟信号在网络的分布延迟,有效的消除了源时钟和负载之间的延迟。
图片附件:
1.jpg(2005-9-2522:
39,17.56K)
图4-1-2所示是XILINX公司一个简化了的DLL宏符号,BUFGDLL这个宏使用快速有效的方法在设备内部提供零传播延迟的系统时钟。
图片附件:
2.jpg(2005-9-2522:
39,27.83K)
使用BUFGDLL这个宏,是最简单的由外部时钟产生芯片上的零传播延迟时钟的方法。
这个宏使用了IBUFG,CLKDLL,BUFG来实现最基本的DLL应用。
I脚提供用户源时钟,DLL对这个时钟进行操作。
对BUFGDLL输入的源时钟必须在数据表的低频段。
时钟输出O提供已经进行了延迟补偿的时钟。
这个输出时钟占空比为1:
1,如需要其他占空比,可在属性中对其进行修改。
需要注意的是,这个宏符号并不能用于时钟加倍或时钟分频,也不提供RESET,LOCKED管脚。
如果需要这些功能,必须使用下面的CLKDLL.CLKDLL提供了DLL完整的功能。
当要用DLL进行复杂应用时,通常使用CLKDLL。
图片附件:
3.jpg(2005-9-2522:
40,15.08K)
以下介绍各个管脚:
•源时钟输入----CLKIN:
CLKIN提供用户源时钟,CLKIN的频率必须在数据表所列范围内。
•反馈时钟输入----CLKFB:
DLL需要一个参考信号或反馈信号来提供延迟补偿输出。
将DLL的输出CLK0或CLK2X连到反馈时钟输入CLKFB端,给DLL提供必要的反馈。
•RESET—RST:
当RST有效时,LOCKED信号是源时钟信号无效。
RST高电平有效,必须连在热键或直接接地。
•二倍频输出----CLK2X:
CLK2X自动提供占空比为1:
1的倍频信号。
分频输出----CLKDV:
分频信号提供源信号的低频输出。
CLKDV_DIVIDE属性控制分频比,可以为1.5,2,2.5,3,4,5,8和16。
•一倍信号输出—CLK[0|90|180|270]---CLK0提供已经进行了延迟补偿的时钟,同时提供三个相移信号输出。
•输出锁存----LOCKED:
为了完成锁存,DLL可能要检测上千个时钟周期。
当DLL完成锁存之后,LOCKED有效。
DLL的输出特性如下图所示:
图片附件:
4.jpg(2005-9-2522:
40,56.3K)
注意:
DLL位置限制:
器件的每个脚有一个DLL,使用时要对它进行分配。
位置限制LOC语句控制有哪个DLL来工作。
LOC属性使用下面的形式:
INST
这里
例:
INSTMY_DLLLOC=dll1。
3.DLL使用的常见问题
输入时钟的最小频率是多少?
由实验知,最小频率取决于所使用的DLL。
作为时钟分频,最小频率至少是15MHz,作为时钟倍频,最少为20MHz。
我们从DLL可以生成什么?
由XILINX公司的APPLICATIONNOTE可知,DLL可提供分频或倍频,以及90°、180°、270°相移的时钟信号。
并不推荐级联使用DLL!
由于DLL对最低输入时钟频率有限制,所以多次倍频会产生高频信号,很可能导致执行工具失败。
BUFG是什么?
BUFG是与时钟分布网络相联的全局时钟缓冲器。
如果需要发送三个时钟信号,出现:
ERROR:
“Place:
1727-Xilinxrequiresusing
locateconstraintstopreplacesuchconnected
GCLK/GCLKIO/DLLcomponents.”
这种情况,你的UCF文件必须清晰必须标明他们的位置。
例如:
INSTdll0LOC=DLL0;
INSTbg0LOC=GCLKBUF0;
INSTbg1LOC=GCLKBUF1;
INSTbg2LOC=GCLKBUF2;
其中dll0时你的DLL实例的名字,bg0,bg1,bg2时你的BUFG实例的名字。
IBUFG是什么?
IBUFG是与时钟管脚相连的出入时钟缓冲器。
当DLL锁存之后,为什么我们不能用DLLLOCK信号RESET系统?
因为DLL锁存之后,DLLLOCK信号并不能保证随时都能插入LOCK信号。
DLL还有其他的频率限制吗?
这些频率限制
是怎样发现的?
这些限制是在仿真和硬件调试中发现的对时间仿真:
i/p频率〉=25MHz.
对硬件调试:
时钟倍频i/pfreq>=20MHz
时钟分频i/pfreq>=15MHz
三、设计实现
DLL可以实现倍频,分频,锁相,以及移相等操作,下面分别介绍这些操作的设计实现。
1.锁相
DLL的锁相用法就是DLL的标准用法,其原理图如下所示:
图片附件:
5.jpg(2005-9-2522:
40,18.83K)
【DLL标准用法源程序】
dll_standard.v
/**********************************************
模块名称dll_standard()
模块功能锁相
输入输出
CLKIN:
输入时钟
RESET:
复位信号
CLK0:
输出时钟
LOCKED:
输出锁存信号
**********************************************/
moduledll_standard(CLKIN,RESET,CLK0,LOCKED);
inputCLKIN,RESET;
outputCLK0,LOCKED;
wireCLKIN_w,RESET_w,CLK0_dll,LOCKED_dll;
IBUFGclkpad(.I(CLKIN),.O(CLKIN_w));
IBUFrstpad(.I(RESET),.O(RESET_w));
CLKDLLdll(.CLKIN(CLKIN_w),.CLKFB(CLK0),.RST(RESET_w),
.CLK0(CLK0_dll),.CLK90(),.CLK180(),.CLK270(),
.CLK2X(),.CLKDV(),.LOCKED(LOCKED_dll));
BUFGclkg(.I(CLK0_dll),.O(CLK0));
OBUFlckpad(.I(LOCKED_dll),.O(LOCKED));
Endmodule
dll_standard.ucf
NET"CLKIN"LOC="p80";
NET"CLK0"LOC="p205";
NET"LOCKED"LOC="p147";
NET"RESET"LOC="P3";
INSTdllLOC=DLL0;
INSTclkgLOC=GCLKBUF0;
2.移相
移相用法的原理图与倍频用法的原理图很类似,只用把CLK2X输出端的输出缓存移到CLK90、CLK180或者CLK270端即可。
这里给出的例子中输出时钟是移相
90°。
【DLL移相用法源程序】
dll_phaseshift.v
/**********************************************
模块名称dll_phaseshift()
模块功能移相
输入输出
CLKIN:
输入时钟
RESET:
复位信号
CLK90:
输出时钟
LOCKED:
输出锁存信号
**********************************************/
moduledll_phaseshift(CLKIN,RESET,CLK0,CLK90,LOCKED);
inputCLKIN,RESET;
outputCLK0,CLK90,LOCKED;
wireCLKIN_w,RESET_w,CLK0_dll,CLK90_dll,LOCKED_dll;
IBUFGclkpad(.I(CLKIN),.O(CLKIN_w));
IBUFrstpad(.I(RESET),.O(RESET_w));
CLKDLLdll(.CLKIN(CLKIN_w),.CLKFB(CLK0),.RST(RESET_w),
.CLK0(CLK0_dll),.CLK90(CLK90_dll),.CLK180(),.CLK270(),
.CLK2X(),.CLKDV(),.LOCKED(LOCKED_dll));
BUFGclkg(.I(CLK0_dll),.O(CLK0));
BUFGclk90g(.I(CLK90_dll),.O(CLK90));
OBUFlckpad(.I(LOCKED_dll),.O(LOCKED));
endmodule
dll_phaseshift.ucf
NET"CLKIN"LOC="p80";
NET"CLK0"LOC="p201";
NET"CLK90"LOC="p205";
NET"LOCKED"LOC="p145";
NET"RESET"LOC="P3";
INSTdllLOC=DLL0;
INSTclkgLOC=GCLKBUF0;
INSTclk90gLOC=GCLKBUF1;
3.倍频
通过使用DLL可以使源信号为50M工作在100M。
这一技术可以简化设计板的设计,因为板子上的时钟路径不用考虑高频信号。
时钟加倍也提供了时域相乘的另一选择,每个时钟周期使用同一电路两次,比画两个相同电路少占面积。
二倍频电路原理图如下图所示:
图片附件:
6.jpg(2005-9-2522:
40,20.48K)
【DLL二倍频用法源程序】
dll_freq_mul.v
/**********************************************
模块名称dll_freq_mul()
模块功能二倍频
输入输出
CLKIN:
输入时钟
RESET:
复位信号
CLK2X:
输出时钟
LOCKED:
输出锁存信号
**********************************************/
moduledll_standard(CLKIN,RESET,CLK0,CLK2X,LOCKED);
inputCLKIN,RESET;
outputCLK0,CLK2X,LOCKED;
wireCLKIN_w,RESET_w,CLK0_dll,CLK2X_dll,LOCKED_dll;
IBUFGclkpad(.I(CLKIN),.O(CLKIN_w));
IBUFrstpad(.I(RESET),.O(RESET_w));
CLKDLLdll(.CLKIN(CLKIN_w),.CLKFB(CLK0),.RST(RESET_w),
.CLK0(CLK0_dll),.CLK90(),.CLK180(),.CLK270(),
.CLK2X(CLK2X_dll),.CLKDV(),.LOCKED(LOCKED_dll));
BUFGclkg(.I(CLK0_dll),.O(CLK0));
BUFGclk2xg(.I(CLK2X_dll),.O(CLK2X));
OBUFlckpad(.I(LOCKED_dll),.O(LOCKED));
endmodule
dll_freq_mul.ucf
NET"CLKIN"LOC="p80";
NET"CLK0"LOC="p201";
NET"CLK2X"LOC="p205";
NET"LOCKED"LOC="p145";
NET"RESET"LOC="P3";
INSTdllLOC=DLL0;
INSTclkgLOC=GCLKBUF0;
INSTclk2xgLOC=GCLKBUF1;
通过将两个时钟加倍的DLL串联,可以得到四倍后的时钟。
其原理图如下所示:
图片附件:
7.jpg(2005-9-2522:
41,45.37K)
【DLL四倍频用法源程序】
dll_freq4x.v
/**********************************************
模块名称dll_freq4x()
模块功能四倍频
输入输出
CLKIN:
输入时钟
RESET:
复位信号
CLK2X:
二倍频时钟输出
CLK4X:
四倍频时钟输出
LOCKED:
输出锁存信号
**********************************************/
moduledll_standard(CLKIN,RESET,CLK2X,CLK4X,LOCKED);
inputCLKIN,RESET;
outputCLK2X,CLK4X,LOCKED;
wireCLKIN_w,RESET_w,CLK2X_dll,CLK4X_dll,LOCKED2X;
wireLOCKED2X_delay,RESET4X;
wirelogic1;
assignlogic1=1'b1;
IBUFGclkpad(.I(CLKIN),.O(CLKIN_w));
IBUFrstpad(.I(RESET),.O(RESET_w));
CLKDLLdll2x(.CLKIN(CLKIN_w),.CLKFB(CLK2X),.RST(RESET_w),
.CLK0(),.CLK90(),.CLK180(),.CLK270(),
.CLK2X(CLK2X_dll),.CLKDV(),.LOCKED(LOCKED2X));
BUFGclk2xg(.I(CLK2X_dll),.O(CLK2X));
SRL16rstsrl(.D(LOCKED2X),.CLK(CLK2X),.Q(LOCKED2X_delay),
.A3(logic1),.A2(logic1),.A1(logic1),.A0(logic1));
assignRESET4X=!
LOCKED2X_delay;
CLKDLLdll4x(.CLKIN(CLK2X),.CLKFB(CLK4X),.RST(RESET4X),
.CLK0(),.CLK90(),.CLK180(),.CLK270(),
.CLK2X(CLK4X_dll),.CLKDV(),.LOCKED(LOCKED_dll));
BUFGclk4xg(.I(CLK4X_dll),.O(CLK4X));
OBUFlckpad(.I(LOCKED_dll),.O(LOCKED));
endmodule
dll_freq4x.ucf
NET"CLKIN"LOC="P80";
NET"CLK2X"LOC="P201";
NET"CLK4X"LOC="P205";
NET"LOCKED"LOC="P147";
NET"RESET"LOC="P3";
INSTdll2XLOC=DLL0;
INSTdll4XLOC=DLL1;
4.分频
移相用法的原理图与倍频用法的原理图很类似,只用把CLK2X输出端的输出缓存移到CLKDV端即可。
CLKDV_DIVIDE属性控制分频比,可以为1.5,2,2.5,3,4,5,8和16,其默认值是2。
【DLL分频用法源程序】
dll_freq_div.v
/**********************************************
模块名称dll_freq_div()
模块功能分频
输入输出
CLKIN:
输入时钟
RESET:
复位信号
CLK2X:
输出时钟
LOCKED:
输出锁存信号
**********************************************/
moduledll_freq_div(CLKIN,RESET,CLK0,CLKDV,LOCKED);
inputCLKIN,RESET;
outputCLK0,CLKDV,LOCKED;
wireCLKIN_w,RESET_w,CLK0_dll,CLKDV_dll,LOCKED_dll;
IBUFGclkpad(.I(CLKIN),.O(CLKIN_w));
IBUFrstpad(.I(RESET),.O(RESET_w));
CLKDLLdll(.CLKIN(CLKIN_w),.CLKFB(CLK0),.RST(RESET_w),
.CLK0(CLK0_dll),.CLK90(),.CLK180(),.CLK270(),
.CLK2X(),.CLKDV(CLKDV_dll),.LOCKED(LOCKED_dll));
BUFGclkg(.I(CLK0_dll),.O(CLK0));
BUFGclkdvg(.I(CLKDV_dll),.O(CLKDV));
OBUFlckpad(.I(LOCKED_dll),.O(LOCKED));
endmodule
dll_freq_div.ucf
NET"CLKIN"LOC="p80";
NET"CLK0"LOC="p201";
NET"CLKDV"LOC="p205";
NET"LOCKED"LOC="p145";
NET"RESET"LOC="P3";
INSTdllLOC=DLL0;
INSTclkgLOC=GCLKBUF0;
INSTclkdvgLOC=GCLKBUF1;
四、实验仪器及设备
1.EITS2003实验平台一块
2.并口DB25线一条
3.带WebPack+ModelSim开发平台PC机一台
4.交流9V电源一只
5.双踪示波器一台
五、实验内容及步骤
以DLL的锁相使用为例:
1.在XilinxWebPack平台下,建立项目DLL,写源程序dll_standard.v;
2.进行逻辑综合验证;
3.按源程序输入dll_standard.ucf,注意要与dll_standard模块进行关联;
4.执行ImplementDesign;
5.执行GenerateProgrammmingFile;
6.使用iMPACT工具进行下载;
7.观察结果。
图片附件:
8.jpg(2005-9-2522:
41,136.38K)
图片附件:
9.jpg(2005-9-2522:
42,167.2K)
图片附件:
10.jpg(2005-9-2522:
42,164.49K)
六、使用示波器观察波形
1.锁相
示波器测P80:
FRE=50.06MHzPERIOD=20.05nsDUTY=51.2%
RISETIME=4.9nsFALLTIME=5.2ns
示波器测P205:
FRE=50.00MHzPERIOD=20.02nsDUTY=49.6%
RISETIME=5.2nsFALLTIME=4.9ns
2.倍频
二倍频:
示波器测P205,结果如下:
FRE=101.0MHzPERIOD=9.900nsDUTY=50.5%
RISETIME=2.950nsFALLTIME=3.000ns
四倍频:
示波器测P205,结果如下:
FRE=200.0MHzPERIOD=5.000nsDUTY=47.5%
RISETIME=1.000nsFALLTIME=1.450ns
七、练习与思考
1.为什么CLKDLL的输入输出都要加上缓存?
2.试编写16倍频时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- XilinxSpartanIIE 内部锁相环DLL的使用 内部 锁相环 DLL 使用