ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Vivado中PLL IP核配置全流程:差分时钟输入与上板验证实战

Vivado中PLL IP核配置全流程:差分时钟输入与上板验证实战 做FPGA开发PLL算是最常用也最容易被小瞧的资源。很多新手拿到一块带差分时钟输入的板子第一反应就是直接用结果在Vivado里建工程、配置Clocking Wizard IP核时各种报错和异常直接把人劝退——不是忘记了差分输入的缓冲处理就是locked信号拉不起来要么就是上板后频率完全不对。这篇文章就围绕Vivado 2020.2环境走一遍完整的PLL IP核配置流程从差分时钟输入的硬件理解说起到IP核参数配置、XDC约束编写最后上板用ILA实测验证把一路会踩的坑提前给你排掉。这个流程适合刚入门FPGA的新手也适合换了新板卡、准备用内部PLL做时钟方案的工程师参考。我会把每一步操作背后的原理和参数计算过程也讲清楚不只是给步骤而是让你知道为什么这么配。1. 先搞懂PLL在FPGA里到底扮演什么角色1.1 锁相环的基本作用与使用场景PLLPhase-Locked Loop锁相环的本质是一个闭环频率控制系统通过鉴相器比较输入时钟与反馈时钟的相位差再经过环路滤波器、压控振荡器VCO调整输出频率最终让输出时钟与输入时钟在频率和相位上保持严格关系。这个过程不需要改变输入的物理晶振就能在FPGA内部产生一个或多个高频、低抖动的时钟信号。我在实际项目中用PLL的场景主要有几类一是把板载的低频时钟比如50MHz倍频到高速接口需要的工作频率比如200MHz、250MHz二是把某些频率分开给不同模块比如逻辑主时钟跑100MHzDDR控制器或高速串行收发器需要独立的更高频率三是做一个简单的时钟相位调整或占空比修正配合SerDes或ADC采样时序使用。在Xilinx 7系列及以后的FPGA里负责这项工作的IP核叫Clocking Wizard底层资源分为PLL和MMCM两种。MMCM在PLL的基础上增加了相位动态调整、更细的相移能力而PLL的抖动和功耗表现往往更优。对于普通时钟生成需求直接在IP核界面里选PLL或者MMCM即可Vivado会自动帮你在原语层面做好搭配。1.2 差分时钟与单端时钟的区别很多开发板或高速采集板上的时钟源并非直接输出单端TTL电平而是输出差分时钟常见电平标准有LVDS、LVPECL、HCSL等。差分时钟由一对极性相反的信号P和N组成接收端关注的是两者的差值而非对地电平因此抗共模噪声能力强在长距离传输和高速工况下抖动表现远好于单端时钟。FPGA处理差分时钟时必须经过专用的IBUFDS或IBUFDS_DIFF_OUT原语将差分信号转换成内部单端逻辑可用的时钟。问题往往出现在这里很多新手以为在IP核界面里填一个输入频率就完事了却忽略了对差分引脚的约束和缓冲器的实例化结果上板后PLL的locked信号死活不拉高或者工作不稳定。好消息是Xilinx的Clocking Wizard在设计时已经考虑到了这一点IP核中直接提供了差分时钟输入的选项。你只要正确选择时钟源类型Vivado会自动在IP内部插入对应的差分缓冲原语。真正容易出错的地方是在XDC约束文件里对差分引脚的处理。1.3 一个完整的PLL使用链路长什么样从硬件顶层视角看一个典型的使用PLL的FPGA工程链路大致是这样的差分时钟源板载晶振或时钟芯片 - FPGA的时钟专用引脚CCClock Capable Pin - IBUFDS差分缓冲 - PLL/MMCM IP核 - 输出多路时钟 - 各功能模块或ILA调试逻辑这个过程中有四个关键点直接影响项目成败硬件原理图上时钟引脚的位置和电平标准IP核内部输入频率、输出频率和VCO范围的配置XDC约束里正确声明时钟和引脚位置上板时的实测验证确认锁定和频率都符合预期。我的建议是在动手打开Vivado之前先把这四件事在思维里过一遍。不然你会发现后面排错时所有问题都纠缠在一起很难定位。2. 配置PLL IP核之前的准备工作2.1 Vivado 2020.2工程创建要点Vivado 2020.2属于相对稳定且被广泛使用的版本很多学校、培训机构和企业项目仍在使用。它的安装过程本身对Windows用户相对友好下载安装包后解压按向导一步步走就行。但有几个细节值得注意。安装时如果勾选了“Vivado HL WebPACK”或“Vivado HL Design Edition”注意看清目标器件是否在支持范围内。比如7系列的Artix-7、Kintex-7、Virtex-7都支持但部分大容量器件可能需要Design Edition才包含。安装完成后建议第一时间在Vivado里添加License否则综合、实现、上板全部受限。新建工程时选择芯片型号要和生产批次完全对上比如XC7A35T-2CSG324I或XC7K325T-2FFG900I型号选错会导致引脚约束时报错甚至无法生成比特流。工程建好后语言建议直接选Verilog方便后续参考网上的代码示例和二进制的IP核自动例化模板。2.2 确认板卡上的时钟方案单端还是差分这块内容很容易被跳过但它恰恰是后面一切配置的基础。拿到一块板子你要先找到原理图里的时钟部分看清几个东西时钟芯片的型号、输出频率、输出电平标准以及连接到FPGA的哪两个引脚。举例来说常见的黑金或正点原子开发板板载有时钟芯片输出200MHz差分时钟到FPGA的MRCC引脚有的板子则会用50MHz有源晶振输出单端时钟。如果你不确认就去配置IP核填的频率和实际硬件对不上PLL就会因为输入频率不在锁定范围内而无法锁定或者锁定后输出频率偏差很大。我的习惯是先把原理图中时钟相关的部分截图保存到项目文件夹里然后在工程笔记里写下时钟芯片的型号、频率、引脚号、电平标准。这些信息在调试阶段会频繁用到不要依赖记忆。2.3 关于Reset引脚和locked信号的预备知识在配置Clocking Wizard时你会看到Reset和Locked两个信号。Reset通常为高电平有效用于复位PLL内部的状态机Locked信号在PLL完成锁定后输出高电平表示输出时钟稳定可用。一个常见的错误是直接把locked信号接到系统复位逻辑上或者将IP核的reset引脚直接拉高。前者可能导致系统反复复位后者则会让PLL永远无法锁定。正确做法是PLL的reset信号由外部逻辑或按键提供在系统上电后主动释放locked信号则送给复位管理模块作为内部逻辑复位的释放条件之一。关于复位和亚稳态的关系我在后面的常见问题部分还会详细展开。3. 核心实操Vivado 2020.2中配置PLL IP核全流程3.1 创建并打开Clocking Wizard IP核打开Vivado工程后在左侧Flow Navigator中找到IP Catalog在搜索框里输入“Clocking Wizard”会看到两条结果Clocking Wizard和Clocking Wizard for PCI Express。我们选前者。双击打开后会进入IP Configuration界面。这里面有几个需要仔细设置的地方。Component Name建议起一个有意义的名字比如pll_main或clk_gen。这个名字就是后续例化的模块名别用默认的clk_wiz_0等代码写多了以后根本分不清哪个是哪个。时钟源类型Clock Source选择“Differential clock capable pin”还是“Single ended clock capable pin”取决于你的板载时钟。这里要特别提醒一下如果你的板子输出的是差分时钟但你在IP核里选择了单端时钟源那么Vivado不会自动生成IBUFDS后面的时序约束和实际工作都会出现问题。反过来如果板载单端时钟却选差分同样会编译报错。3.2 输入时钟配置与差分缓冲处理在Input Clock选项卡里你需要填写输入时钟频率。比如板载差分时钟为200MHz那就填200.000。Vivado会根据你选择的IP核版本自动推算PLL的VCO频率范围并显示在左下角。这一步有一个容易忽略的知识点差分时钟输入时IBUFDS是自动插入的但你仍然需要在XDC里为两个差分引脚比如sys_clk_p和sys_clk_n做约束而且P和N必须同时约束不能只约束其中一个。具体约束方法我会在第四章细说。如果你使用的是非时钟专用引脚Non-CCVivado综合时大概率会报错提示该引脚不适合作为时钟输入或者生成的时钟质量很差、抖动大。这也是新手常犯的错误——在原理图上随便挑了两个IO引脚接晶振结果到了FPGA布线阶段根本没法收敛。所以买板子或自己画板时时钟信号一定要接到FPGA标注为CC/MRCC/SRCC的引脚上。3.3 输出时钟频率规划与参数计算Output Clocks选项卡是大多数人最关心的地方。系统会默认给你生成一个输出时钟你可以根据需要添加更多。每个输出时钟需要设置Output Freq输出频率Phase相位偏移可选0、90、180、270等Drive输出驱动强度一般默认即可假设我输入200MHz希望得到三路时钟100MHz给主逻辑200MHz给DDR或高速接口逻辑250MHz给一个需要更高频率的运算模块。那我在Output Clocks里分别填入100、200、250Vivado会自动计算分频比并显示实际的VCO频率。但要注意这里并不是填入什么都能成功。PLL的VCO频率范围是有限制的以7系列为例常用PLL的VCO范围为600MHz至1200MHz具体以数据手册为准。如果输入200MHz你想得到一个333MHz输出实际VCO可能被计算为1332MHz超出范围界面会直接标红或报错。此时要么改变输出频率规划要么改用MMCMMMCM的VCO范围更高要么添加一个中间倍频分频级。这个计算过程Vivado是自动完成的你不用手算但理解它很重要它能帮你在规划时钟树时避开VCO超限导致的隐性错误。最后在界面上确认一下每个输出时钟的Actual Freq是否和目标一致。3.4 Locked信号与复位极性设置在Clocking Options或对应的选项卡里要设置Reset Type同步/异步、Active High/Low以及Locked信号的相关属性。大部分场景下选择默认的Active High Reset即可但要注意在顶层代码中把IP核的reset信号正确地接出来不要悬空更不要直接拉高。Locked信号同样建议引出到顶层用来控制内部逻辑的复位释放。如果Locked一直为低先不要怀疑IP核而是优先排查输入时钟和reset。3.5 生成IP核并例化到工程所有参数配置完成后点击OKVivado会询问是否生成Output Products选择Generate。它会帮你生成IP核的例化模板、仿真模型和综合网表。接下来在Sources窗口找到该IP核右键选择“Open IP Example Design”可以看到一个官方例程里面有完整的例化代码和约束参考。也可以直接在工程顶层用“Instantiation Template”中的代码来例化通常在IP核目录下的.veo文件中。一个典型的例化代码如下pll_main u_pll_main( .clk_out1(clk_100m), .clk_out2(clk_200m), .clk_out3(clk_250m), .locked(pll_locked), .clk_in1_p(sys_clk_p), .clk_in1_n(sys_clk_n), .reset(~rst_n) );注意这里reset信号的接法。如果你的外部复位是低有效rst_n而IP核配置为高有效那就要用~rst_n接入否则复位永远处于有效状态PLL永远锁定不了。这个反相细节是很多新手上板后第一道坎。4. 约束文件差分时钟的引脚分配与时钟周期约束4.1 新建并管理XDC约束文件在Vivado里约束文件的后缀是.xdcXilinx Design Constraints。你可以在工程中添加一个新文件也可以让Vivado在综合后自动生成模板但对于时钟引脚约束我建议手动增加从设计一开始就约束好不要拖到布局布线阶段才补。添加方法Flow Navigator - Add Sources - Add or create constraints - File type选XDC填写文件名即可。文件名建议用工程名或板卡名比如top_pin.xdc或board_constraints.xdc。4.2 差分时钟引脚约束的正确写法差分时钟的引脚约束有固定的语法。假设时钟源连接到FPGA的M14和N14两个引脚其中M14为P端N14为N端电平标准为LVDS或LVDS_25那么XDC里要这样写set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVDS_25} [get_ports sys_clk_p] set_property -dict {PACKAGE_PIN N14 IOSTANDARD LVDS_25} [get_ports sys_clk_n]同时还要为这个差分时钟创建时钟约束create_clock -name sys_clk -period 5.000 [get_ports sys_clk_p]这里-period 5.000表示200MHz因为周期等于1/频率200MHz的周期就是5ns。很多人只写了引脚约束却忘了create_clock导致时序分析时Vivado认为时钟不存在后续的时序约束全部失效。这不会在综合时报错而是在实现阶段或时序报告里出现很多奇怪的未约束路径非常隐蔽。4.3 常见DRC报错RTSTAT-2等在实现阶段Vivado会运行DRC检查如果你的差分时钟引脚没有成对约束或者时钟没有接在CC引脚上会看到类似RTSTAT-2这样的报错。RTSTAT-2的典型提示是某个引脚使用了不合理的IOSTANDARD或者差分对的P/N极性接反。排查方法很简单回到原理图确认P和N的序号再回到XDC里核对约束方向。有一回我遇到P和N接反的情况Vivado不会直接禁止布局布线但上板后时钟完全跑不起来示波器测量又发现晶振正常排查了很久最后才发现是软件里把差分对搞反了。另外一个容易踩的坑是在同一个工程中同时使用多个时钟输入但只在一个XDC里写create_clock另一个时钟没有约束。此时Vivado会提示“Found 2 clock sources but no clocks defined”或直接生成主时钟未约束的警告。解决办法是确保每个时钟来源包括外部晶振输入都有明确的create_clock约束并且不要重复定义同名时钟。4.4 其他关键约束复位信号的异步处理如果你把locked信号作为内部模块的异步复位释放条件建议在XDC中对复位信号加set_false_path或进行异步复位同步释放处理。很多老工程师的经验是不要在顶层直接用外部按键复位驱动所有模块而是把外部复位和PLL locked配合经过两级D触发器同步后再作为全局复位信号。一个简洁的异步复位同步释放代码reg [1:0] rst_sync; always (posedge clk_100m or negedge rst_n) begin if (!rst_n) begin rst_sync 2b00; end else if (pll_locked) begin rst_sync {rst_sync[0], 1b1}; end end assign rst_out_n rst_sync[1];这个同步器能有效避免复位释放瞬间导致亚稳态。热搜词里提到“fpga复位信号亚稳态”这确实是新手容易忽视的问题很多人在复位的使用方式上过于随意导致上板后偶发性的逻辑异常难以复现又抓不到原因。5. 仿真验证与上板实测从波形到比特流5.1 无脑仿真前先学会看现象PLL IP核配置完成后建议先做行为仿真确认时钟频率和locked信号的表现。打开Vivado的Simulation - Run Behavioral Simulation会自动生成一个仿真顶层需要自己添加激励文件。最简单的testbench写法是模拟外部差分时钟的产生reg sys_clk_p; reg sys_clk_n; initial begin sys_clk_p 1b0; sys_clk_n 1b1; forever #2.5 begin sys_clk_p ~sys_clk_p; sys_clk_n ~sys_clk_n; end end这里#2.5就是200MHz时钟的半周期5ns / 2 2.5ns。仿真时重点观察两个信号pll_locked是否从低变高以及各个输出时钟的频率是否符合设定。注意行为仿真中IP核模型不会报告VCO超限等问题即使频率计算有问题仿真波形也可能看似正常。所以仿真通过不代表配置正确最终还是要看实现阶段的Reports和上板实测。5.2 上板实测的静态验证方法上板实测不必一开始就上复杂的逻辑先做一个简单的时钟验证工程即可。把PLL输出的时钟接出来分别连接到ILAIntegrated Logic Analyzer的时钟输入和采样通道然后用计数器或直接观察方式验证频率。ILA是Xilinx提供的片上逻辑分析仪可以在Vivado里以IP核形式加入工程也可以通过Mark Debug的方式把关键信号标记为调试信号。上板流程是连接JTAG下载器 - 打开Hardware Manager - Open Target - Program Device选择生成的bit文件。比特流生成之前要确保已经跑过综合和实现并且没有Timing Violation否则Program时可能报错或芯片内行为异常。5.3 怎么看输出频率对不对将ILA的采样时钟设为PLL输出的某个时钟比如100MHz然后在采样通道上观察另一个时钟比如200MHz。因为这两个时钟本身是整数倍关系你可以在ILA里看到200MHz信号翻转频率明显快一倍。更精确的做法是把输出时钟引到FPGA的普通IO接到示波器或频率计上测量。如果手头没有示波器也可以使用板载的LED和计数器来做直观验证。比如将100MHz时钟分频到1Hz驱动LED闪烁肉眼看到约1秒一次的闪烁说明PLL输出正常。这个方法简单粗暴但很有效至少能证明“时钟真的在跑”。我当时在做上板验证时习惯先把输出时钟分频到1Hz验证然后再用ILA抓高频波形。分频验证能快速排除“时钟完全没输出”的极端情况ILA则能精确看到频率关系和相位关系。5.4 关于generate bitstream失败的排查你可能会遇到write_bitstream阶段报错常见原因有几个XDC引脚约束引脚名和顶层端口名不一致约束了未使用的引脚多个约束文件之间冲突差分引脚约束不完整只有P没有N。Vivado会在Messages窗口给出具体原因。我的建议是逐条阅读错误不要只看第一行。很多时候后面的报错只是第一个问题的连锁反应。6. 常见问题与排查技巧实录6.1 Locked信号一直为低怎么排查这是PLL上板后最经典的问题。排查顺序我建议这样走先看reset信号确保PLL没有被长时间复位。确认外部按键或逻辑给出的复位是正常释放状态配置为高有效时复位信号必须为低。再看输入时钟。用示波器测量FPGA引脚的P端确认有200MHz信号。如果示波器探头带宽不够至少能看到一个摆动波形。没有示波器的话可以在顶层把输入时钟直接分频后输出到LED看灯是否闪烁。然后检查引脚约束。在Vivado的Floorplanning或Package视图里确认sys_clk_p和sys_clk_n约束的位置与原理图一致且IOSTANDARD正确。如果你用的是单端时钟却在IP核里选了差分输入locked也会拉不起来。这种配置错误在综合时可能不会立即报错但硬件上根本没有N端信号IP核内部的IBUFDS无法正常工作。6.2 差分时钟P/N接反的典型现象P/N接反后IBUFDS的差分输入实际上是在接收一个反相时钟。对于高频时钟源这通常会导致locked无法锁定或者在锁定和失锁之间反复跳变。有的系统可能看起来“能用”但时钟抖动很大偶发误码这种隐性故障比完全不能用还难排查。因此我建议在约束完引脚后直接查看Vivado的Device视图确认P/N极性对应关系无异常。6.3 Vivado 2020.2在配置IP核时的两个小毛病2020.2版本有一个不太友好的地方IP核配置界面修改参数后有时不会立即同步更新输出频率预览需要手动切换一下选项卡或者关掉重开。别以为是自己填错了可以先刷新界面再看看。另外如果你在同一个工程中反复修改IP核参数并多次Generate Output Products旧的IP核输出文件可能会被缓存导致上板时实际综合网表还是旧版本。这时候需要右键IP核选择Reset Output Products然后重新Generate。还有一个常见问题是在工程目录里直接手动编辑IP核的XCI文件来改参数这虽然能打开但Vivado会告诉你“This file is managed by Vivado IP Editor”建议通过GUI修改。手动改文件容易导致IP核状态不一致后续生成比特流时出现匪夷所思的报错。6.4 pin constraint、创建时钟与多时钟域检查新手工程里最常犯的一个全局性错误是只约束了PLL的输入时钟PLL的输出时钟却没有按预期传递到各逻辑模块。实际上Vivado会自动把PLL输出时钟作为生成时钟Generated Clock传递给后续逻辑不需要你手动为每个输出频率写create_clock。但在多时钟域设计中建议检查一下约束报告里的Clock Interaction情况。如果两个时钟域之间确实需要跨时钟域交互必须使用异步FIFO或脉冲同步器否则时序分析中会出现大量Violation或者上板后数据偶发错误。6.5 关于下载器驱动和环境变量很多新手在Program Device时发现Hardware Manager识别不到下载器。原因往往是JTAG驱动没有正确安装或者Vivado安装时勾选的线缆驱动不完整。Xilinx下载器在Windows下需要安装对应的USB驱动这个一般在Vivado安装目录下的\data\xicom\cable_drivers\nt64\里能找到手动安装一遍即可。如果你是在实验室共享电脑上操作还可能遇到权限问题导致驱动无法加载这时候要以管理员身份运行Vivado和驱动安装程序。7. 一些实用心得在PLL这个IP核上踩过的坑绝对不会白踩。每次排查都会让对时钟系统的理解更深一层。我的习惯是每一个要用PLL的新板子先花半小时仔细看原理图时钟部分确认频率、电平、引脚再花十分钟在纸上画出想要的时钟树标注每个时钟的频率、用途和来自哪个模块。做完这一步再打开Vivado配置IP基本一次就能成功不需要反复试错。最后分享一个小技巧建立工程后可以把Vivado生成的时钟报告Report Clocks和时序摘要Timing Summary导出成PDF归档到项目目录。后面调试时遇到疑似时钟问题先翻报告比对比自己瞎猜高效得多。PLL并不是一个黑盒掌握它的配置逻辑后你会发现它在FPGA开发里其实就是个“频率加工厂”。
返回列表