您的位置:控制工程论坛网论坛 » 电机与运动控制 » SpartanIIE 内部锁相环(DLL)的使用

quester

quester   |   当前状态:在线

总积分:88  2024年可用积分:0

注册时间: 2005-11-26

最后登录时间: 2018-05-11

空间 发短消息加为好友

SpartanIIE 内部锁相环(DLL)的使用

quester  发表于 2005/11/27 17:03:30      1996 查看 1 回复  [上一主题]  [下一主题]

手机阅读

以下是一个实验,讲述如何使用器件内部锁相环(DLL),很有实际意义,所以拿出来,大家一起学习,一起进步! 实验 SpartanIIE 内部锁相环(DLL)的使用 一、实验目的 1. 进一步熟悉FPGA 软硬件开发环境; 2. 了解FPGA 的内部结构; 3. 初步掌握DLL 的使用。 二、设计任务 FPGA 中的DLL 是一种很好的资源,特别是较高频率的时候,应用较广。它可以对时钟进行倍频、锁相等操作。通过设计掌握DLL 的各种应用:倍频,分频,锁相,以及移相的操作,编程演示,通过示波器观察和比较波形。下面先对DLL 做一个简单的介绍。 1. 概述 XILINX 公司的Spartan-IIE 系列提供四个延迟锁相环(Delay-Locked Loop),分别位于芯片内部的四个脚。这些DLL 可以被用来实现一些电路以完善和简化系统级设计,比如提供零传播延迟,低时钟相位差和高级时钟区域控制等。随着FPGA 尺寸的增加,芯片上时钟的分布质量就变得越来越重要。时钟相位差和时钟延迟严重影响设备的性能,在大的设备中用传统的时钟网络控制时钟相位差和时钟延迟变得十分困难,XILINX 公司的Spartan-IIE 系列的四个延迟锁定环(Delay-Locked Loop)恰好解决了这个问题。每一个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 包括一个“variable delay line”和“control logic”. “variable delay line”产生一个输入信号CLKIN 延迟了的版本。时钟分布网络在所有内部寄存器时钟和CLKFB脚反馈时钟之间布线。“Control logic”.要检测输入时钟和反馈时钟好来调节延迟线。延迟线可以通过电压控制的延迟或一系列离散延迟成分建立。最适用于Virtex DLL 的性能的方法是使用一个离散的数字延迟线。一个DLL 的工作原理是:在输入时钟和反馈时钟中插入延迟,直到两个时钟上升沿相同,使得他们同步。在输入时钟和反馈时钟边沿在一条直线上后,DLL 锁存。电路直到DLL 锁存之后才开始初始,所 以两个时钟无区别。所以DLL 的输出时钟补偿了时钟信号在网络的分布延迟,有效的消除了源时钟和负载之间的延迟。 图4-1-2 所示是XILINX 公司一个简化了的DLL 宏符号,BUFGDLL 这个宏使用快速有效的方法在设备内部提供零传播延迟的系统时钟。 使用BUFGDLL 这个宏,是最简单的由外部时钟产生芯片上的零传播延迟时钟的方法。这个宏使用了IBUFG,CLKDLL,BUFG 来实现最基本的DLL 应用。I 脚提供用户源时钟,DLL 对这个时钟进行操作。对BUFGDLL 输入的源时钟必须在数据表的低频段。时钟输出O 提供已经进行了延迟补偿的时钟。这个输出时钟占空比为1:1,如需要其他占空比,可在属性中对其进行修改。需要注意的是,这个宏符号并不能用于时钟加倍或时钟分频,也不提供 RESET , LOCKED 管脚。如果需要这些功能,必须使用下面的CLKDLL.CLKDLL 提供了DLL 完整的功能。当要用DLL 进行复杂应用时,通常使用CLKDLL。 以下介绍各个管脚: •源时钟输入----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 的输出特性如下图所示: 注意: DLL 位置限制: 器件的每个脚有一个DLL,使用时要对它进行分配。位置限制LOC 语句控制有哪个DLL 来工作。 LOC 属性使用下面的形式: INST LOC = dll。这里 是0,1,2,3。 例: INST MY_DLL LOC = dll1。 3. DLL 使用的常见问题 输入时钟的最小频率是多少? 由实验知,最小频率取决于所使用的DLL。作为时钟分频,最小频率至少是15MHz,作为时钟倍频,最少为20MHz。 我们从DLL 可以生成什么? 由XILINX 公司的APPLICATION NOTE 可知,DLL 可提供分频或倍频,以及90°、180°、270°相移的时钟信号。 并不推荐级联使用DLL! 由于DLL 对最低输入时钟频率有限制,所以多次倍频会产生高频信号,很可能导致执行工具失败。 BUFG 是什么? BUFG 是与时钟分布网络相联的全局时钟缓冲器。 如果需要发送三个时钟信号, 出现: ERROR:“ Place:1727 - Xilinx requires using locate constraints to preplace such connected GCLK/GCLKIO/DLL components.” 这种情况,你的UCF 文件必须清晰必须标明他们的位置。例如: INST dll0 LOC = DLL0; INST bg0 LOC = GCLKBUF0; INST bg1 LOC = GCLKBUF1; INST bg2 LOC = GCLKBUF2; 其中dll0 时你的DLL 实例的名字,bg0,bg1,bg2 时你的BUFG 实例的名字。 IBUFG 是什么? IBUFG 是与时钟管脚相连的出入时钟缓冲器。 当DLL 锁存之后,为什么我们不能用DLLLOCK 信号RESET 系统? 因为DLL 锁存之后,DLL LOCK 信号并不能保证随时都能插入LOCK 信号。 DLL 还有其他的频率限制吗?这些频率限制 是怎样发现的? 这些限制是在仿真和硬件调试中发现的对时间仿真:i/p 频率〉=25 MHz. 对硬件调试: 时钟倍频i/p freq >= 20 MHz 时钟分频i/p freq >= 15 MHz 三、设计实现 DLL 可以实现倍频,分频,锁相,以及移相等操作,下面分别介绍这些操作的设计实现。 1. 锁相 DLL 的锁相用法就是DLL 的标准用法,其原理图如下所示: 【DLL 标准用法源程序】 dll_standard.v /********************************************** 模块名称 dll_standard() 模块功能 锁相 输入输出 CLKIN:输入时钟 RESET:复位信号 CLK0: 输出时钟 LOCKED:输出锁存信号 **********************************************/ module dll_standard (CLKIN, RESET, CLK0, LOCKED); input CLKIN, RESET; output CLK0, LOCKED; wire CLKIN_w, RESET_w, CLK0_dll, LOCKED_dll; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w)); IBUF rstpad (.I(RESET), .O(RESET_w)); CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(), .CLK2X(), .CLKDV(), .LOCKED(LOCKED_dll)); BUFG clkg (.I(CLK0_dll), .O(CLK0)); OBUF lckpad (.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"; INST dll LOC=DLL0; INST clkg LOC =GCLKBUF0; 2. 移相 移相用法的原理图与倍频用法的原理图很类似,只用把CLK2X 输出端的输出缓存移到CLK90、CLK180 或者CLK270 端即可。这里给出的例子中输出时钟是移相 90°。 【DLL 移相用法源程序】 dll_phaseshift.v /********************************************** 模块名称 dll_phaseshift() 模块功能 移相 输入输出 CLKIN:输入时钟 RESET:复位信号 CLK90: 输出时钟 LOCKED:输出锁存信号 **********************************************/ module dll_phaseshift(CLKIN, RESET, CLK0, CLK90, LOCKED); input CLKIN, RESET; output CLK0, CLK90, LOCKED; wire CLKIN_w, RESET_w, CLK0_dll, CLK90_dll, LOCKED_dll; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w)); IBUF rstpad (.I(RESET), .O(RESET_w)); CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(CLK90_dll), .CLK180(), .CLK270(), .CLK2X(), .CLKDV(), .LOCKED(LOCKED_dll)); BUFG clkg (.I(CLK0_dll), .O(CLK0)); BUFG clk90g (.I(CLK90_dll), .O(CLK90)); OBUF lckpad (.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"; INST dll LOC=DLL0; INST clkg LOC = GCLKBUF0; INST clk90g LOC = GCLKBUF1; 3. 倍频 通过使用DLL 可以使源信号为50M 工作在100M。这一技术可以简化设计板的设计,因为板子上的时钟路径不用考虑高频信号。时钟加倍也提供了时域相乘的另一选择,每个时钟周期使用同一电路两次,比画两个相同电路少占面积。二倍频电路原理图如下图所示: 【DLL 二倍频用法源程序】 dll_freq_mul.v /********************************************** 模块名称 dll_freq_mul() 模块功能 二倍频 输入输出 CLKIN:输入时钟 RESET:复位信号 CLK2X: 输出时钟 LOCKED:输出锁存信号 **********************************************/ module dll_standard (CLKIN, RESET, CLK0, CLK2X, LOCKED); input CLKIN, RESET; output CLK0, CLK2X, LOCKED; wire CLKIN_w, RESET_w, CLK0_dll, CLK2X_dll, LOCKED_dll; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w)); IBUF rstpad (.I(RESET), .O(RESET_w)); CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(), .CLK2X(CLK2X_dll), .CLKDV(), .LOCKED(LOCKED_dll)); BUFG clkg (.I(CLK0_dll), .O(CLK0)); BUFG clk2xg (.I(CLK2X_dll), .O(CLK2X)); OBUF lckpad (.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"; INST dll LOC=DLL0; INST clkg LOC = GCLKBUF0; INST clk2xg LOC = GCLKBUF1; 通过将两个时钟加倍的DLL 串联,可以得到四倍后的时钟。其原理图如下所示: 【DLL 四倍频用法源程序】 dll_freq4x.v /********************************************** 模块名称 dll_freq4x() 模块功能 四倍频 输入输出 CLKIN:输入时钟 RESET:复位信号 CLK2X: 二倍频时钟输出 CLK4X: 四倍频时钟输出 LOCKED: 输出锁存信号 **********************************************/ module dll_standard (CLKIN, RESET, CLK2X, CLK4X, LOCKED); input CLKIN, RESET; output CLK2X, CLK4X, LOCKED; wire CLKIN_w, RESET_w, CLK2X_dll, CLK4X_dll, LOCKED2X; wire LOCKED2X_delay, RESET4X; wire logic1; assign logic1 = 1'b1; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w)); IBUF rstpad (.I(RESET), .O(RESET_w)); CLKDLL dll2x (.CLKIN(CLKIN_w), .CLKFB(CLK2X), .RST(RESET_w), .CLK0(), .CLK90(), .CLK180(), .CLK270(), .CLK2X(CLK2X_dll), .CLKDV(), .LOCKED(LOCKED2X)); BUFG clk2xg (.I(CLK2X_dll), .O(CLK2X)); SRL16 rstsrl (.D(LOCKED2X), .CLK(CLK2X), .Q(LOCKED2X_delay), .A3(logic1), .A2(logic1), .A1(logic1), .A0(logic1)); assign RESET4X = !LOCKED2X_delay; CLKDLL dll4x (.CLKIN(CLK2X), .CLKFB(CLK4X), .RST(RESET4X), .CLK0(), .CLK90(), .CLK180(), .CLK270(), .CLK2X(CLK4X_dll), .CLKDV(), .LOCKED(LOCKED_dll)); BUFG clk4xg (.I(CLK4X_dll), .O(CLK4X)); OBUF lckpad (.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"; INST dll2X LOC = DLL0; INST dll4X LOC = 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:输出锁存信号 **********************************************/ module dll_freq_div(CLKIN, RESET, CLK0, CLKDV, LOCKED); input CLKIN, RESET; output CLK0, CLKDV, LOCKED; wire CLKIN_w, RESET_w, CLK0_dll, CLKDV_dll, LOCKED_dll; IBUFG clkpad (.I(CLKIN), .O(CLKIN_w)); IBUF rstpad (.I(RESET), .O(RESET_w)); CLKDLL dll (.CLKIN(CLKIN_w), .CLKFB(CLK0), .RST(RESET_w), .CLK0(CLK0_dll), .CLK90(), .CLK180(), .CLK270(), .CLK2X(), .CLKDV(CLKDV_dll), .LOCKED(LOCKED_dll)); BUFG clkg (.I(CLK0_dll), .O(CLK0)); BUFG clkdvg (.I(CLKDV_dll), .O(CLKDV)); OBUF lckpad (.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"; INST dll LOC=DLL0; INST clkg LOC = GCLKBUF0; INST clkdvg LOC = GCLKBUF1; 四、实验仪器及设备 1.EITS2003 实验平台 一块 2.并口DB25 线 一条 3.带WebPack+ModelSim 开发平台PC 机 一台 4.交流9V 电源 一只 5.双踪示波器 一台 五、实验内容及步骤 以DLL 的锁相使用为例: 1. 在Xilinx WebPack 平台下,建立项目DLL,写源程序dll_standard.v; 2. 进行逻辑综合验证; 3. 按源程序输入dll_standard.ucf,注意要与dll_standard 模块进行关联; 4. 执行Implement Design; 5. 执行Generate Programmming File; 6. 使用iMPACT 工具进行下载; 7. 观察结果。 六、使用示波器观察波形 1. 锁相 示波器测P80: FRE=50.06MHz PERIOD=20.05ns DUTY=51.2% RISETIME=4.9ns FALLTIME=5.2ns 示波器测P205: FRE=50.00MHz PERIOD=20.02ns DUTY=49.6% RISETIME=5.2ns FALLTIME=4.9ns 2. 倍频 二倍频: 示波器测P205,结果如下: FRE=101.0MHz PERIOD=9.900ns DUTY=50.5% RISETIME=2.950ns FALLTIME=3.000ns 四倍频: 示波器测P205,结果如下: FRE=200.0MHz PERIOD=5.000ns DUTY=47.5% RISETIME=1.000ns FALLTIME=1.450ns 七、练习与思考 1. 为什么CLKDLL 的输入输出都要加上缓存? 2. 试编写16 倍频时钟的源程序。 3. CLKDLL 用作分频时,CLKDV_DIVIDE 属性控制分频比,其默认值为2,即输出时钟是二分频。如何改变参数CLKDV_DIVIDE 的值,使得输出时钟获得不同的分频?
1楼 0 0 回复
总共 , 当前 /