1. SignalTap 报 waiting for clock 到底卡在哪搞 FPGA 调试的人几乎都绕不开 SignalTap。它把逻辑分析仪搬进了芯片内部不用外接探头、不用飞线只要 JTAG 连上就能抓波形这玩意儿用顺手之后是真的回不去。但凡是用过 SignalTap 的人大概率都见过那个让人血压升高的提示——waiting for clock。采样窗口一片空白进度条不动波形死活出不来你盯着 Quartus 界面怀疑人生怀疑板子坏了怀疑 JTAG 线松了甚至怀疑自己是不是下错了 sof。先把结论摆在前面waiting for clock 的本质是 SignalTap 的采样时钟没有真正“跑起来”。SignalTap 内部逻辑要靠一个时钟来驱动采样、存储、触发判断这个时钟必须是一个在 FPGA 内部真实翻转、且被 SignalTap 实例正确引用到的信号。只要这个时钟没翻转、没连对、或者被优化掉了SignalTap 就永远停在等待状态。这篇文章面向的是已经会基本操作 SignalTap、但被这个报错卡住的工程师也适合刚上手 Quartus 想少走弯路的同学。我会把三种最常见的成因和对应姿势讲透再附上一份引脚配置的避坑指南——因为相当一部分 waiting for clock根子其实在引脚和时钟源上而不是 SignalTap 本身。全文基于 Quartus Prime18.1、20.1、25.1 这些版本逻辑一致的实际调试经验工具版本差异我会单独点出来。先给一个判断思路方便你对号入座现象大概率原因对应章节采样时钟是外部输入但板子没给时钟时钟源未接入/引脚没分配第 2 章、第 4 章采样时钟来自 PLL 输出PLL 没锁PLL 配置或参考时钟问题第 3 章时钟明明在跑SignalTap 还是等时钟被综合优化/引用错误第 2 章换了个工程就好这个工程不行引脚约束或时钟约束缺失第 4 章提示遇到 waiting for clock先别急着重编译先确认“采样时钟”这个信号在你的设计里到底有没有在翻转。这是所有排查的起点。2. 姿势一采样时钟没真正翻转SignalTap 自然干等这是最朴素也最常见的一种。SignalTap 的采样时钟Sample Clock默认是你在实例化时指定的那个信号很多人图省事直接选了个系统时钟结果那个时钟压根没起来。2.1 采样时钟的驱动逻辑要搞清楚SignalTap 的采样时钟不是随便挑一个信号就行它必须满足两个条件第一这个信号在 FPGA 内部是真实存在的物理网络第二它在采样期间持续翻转。听起来像废话但实际工程里翻车就翻在这两点上。举个典型场景你的设计里有一个clk_50m从外部晶振进来经过一个 IBUF 进到内部然后分频成各种时钟。你在 SignalTap 里选了clk_50m作为采样时钟但板子上的晶振没焊、或者晶振供电没起来、或者你根本没给板子上电就点了运行。这时候 SignalTap 当然等不到时钟。还有一种更隐蔽的你选的时钟是某个模块内部的使能信号分频出来的而那个模块因为复位没释放一直处于复位状态时钟自然不翻转。这种情况在带复位逻辑的设计里特别常见尤其是复位信号极性搞反的时候。2.2 用 SignalTap 自己验证时钟是否翻转有个很实用的技巧在 SignalTap 里把采样时钟本身也加进采样信号列表同时加一个已知会翻转的信号比如一个自由运行的计数器。如果运行后连计数器都不动说明采样时钟根本没跑如果计数器在动但采样时钟那一路是平的说明你选错了时钟网络。具体操作上我习惯在顶层加一个“心跳”计数器专门用来验证时钟reg [25:0] heartbeat; always (posedge clk_50m or negedge rst_n) begin if (!rst_n) heartbeat 26d0; else heartbeat heartbeat 1b1; end这个计数器不需要综合出实际用途加个/* synthesis keep */或者把它接到一个空闲引脚上防止被优化掉。SignalTap 里把heartbeat加进去只要它在动就说明clk_50m是活的。这一步能帮你快速排除“时钟源本身没起来”的问题。2.3 时钟被综合优化掉的坑Quartus 的综合器很聪明聪明到有时候会把“看起来没用”的时钟网络优化掉。如果你的采样时钟只被 SignalTap 引用而设计逻辑里没有其他地方用到它综合器可能会认为这个时钟是冗余的直接把它优化没。这时候 SignalTap 引用的就是一个不存在的网络自然等不到时钟。解决办法有两个一是给这个时钟加综合属性防止优化二是在设计里保留一个对该时钟的真实使用。我一般用第一种(* keep 1 *) wire clk_sample;或者在 Quartus 的 Assignment Editor 里给这个网络加KEEP约束。实测下来加 keep 之后时钟网络会稳定保留SignalTap 引用就不会落空。注意keep属性和preserve属性作用范围不同keep针对信号网络preserve针对寄存器。别搞混了加错地方等于没加。2.4 采样时钟频率和 JTAG 带宽的匹配还有一个容易被忽略的点采样时钟频率太高而 JTAG 下载线带宽不够也会表现为长时间 waiting。SignalTap 的采样数据要通过 JTAG 传回 PC如果你的采样时钟是 200MHz采样深度又设得很大数据回传就会非常慢界面看起来就像卡住了。这种情况的典型特征是等很久之后偶尔能出波形但刷新极慢。解决办法是降低采样时钟频率用分频后的时钟做采样或者减小采样深度或者提高 JTAG 时钟频率在 SignalTap 的 Hardware 设置里调。我一般把采样时钟控制在 50MHz 以内采样深度 1K~2K这样回传速度比较舒服。3. 姿势二PLL 没锁采样时钟就是死的第二种高频场景采样时钟来自 PLL 输出。PLL 没锁的时候输出时钟要么不翻转要么频率乱跳SignalTap 自然等不到稳定时钟。这个问题在带高速接口、DDR、AD9361 这类射频前端的设计里特别突出。3.1 PLL 锁定的前提条件PLL 要锁定需要满足几个条件参考时钟稳定、PLL 配置参数合理、供电和温度在范围内、复位已经释放。任何一条不满足PLL 的 locked 信号就是低的输出时钟就不稳定。我见过最多的翻车是参考时钟问题。比如你的 PLL 参考时钟来自外部晶振但晶振的引脚分配错了或者晶振频率和 PLL 配置里写的不一致。PLL 配置里写的是 50MHz 参考实际进来的是 25MHzPLL 要么锁不上要么锁到一个错误的频率上。排查方法很直接把 PLL 的locked信号引到一个 LED 或者空闲引脚上上电看灯亮不亮。灯不亮PLL 就没锁别往下查 SignalTap 了先解决 PLL。3.2 用 locked 信号做 SignalTap 的采样门控一个很实用的设计习惯把 PLL 的locked信号作为采样时钟的使能或者作为 SignalTap 的触发条件。这样即使 PLL 暂时没锁你也能通过触发条件看到 locked 的状态变化而不是干等。具体做法是在 SignalTap 里把locked加进采样信号设置触发条件为locked 1。这样 SignalTap 会等到 PLL 锁定后才开始采样避免在 PLL 未锁期间抓一堆无意义的波形。当然前提是采样时钟本身要能跑——如果采样时钟就是 PLL 输出那 PLL 没锁时采样时钟也不跑这个触发条件就没意义了。所以更稳妥的做法是用一个独立的、不依赖 PLL 的时钟作为采样时钟比如外部晶振直连的时钟然后用它来观察 PLL 的 locked 和输出。3.3 PLL 输出时钟的约束问题PLL 输出时钟如果没有做时序约束Quartus 在布局布线时可能不会把它当作时钟网络来处理导致时钟偏斜大、甚至不翻转。这种情况在 Timing Analyzer 里会报 unconstrained clock 的警告。解决办法是在 SDC 文件里给 PLL 输出时钟加约束create_generated_clock -name clk_pll_out -source [get_pins {pll_inst|altpll_component|auto_generated|pll1|inclk[0]}] [get_pins {pll_inst|altpll_component|auto_generated|pll1|clk[0]}]这条约束告诉 Quartusclk_pll_out是从 PLL 的 inclk 生成的频率关系由 PLL 配置决定。加了约束之后时钟网络会被正确识别SignalTap 引用它就不会出问题。提示不同 Quartus 版本 PLL 的层次路径可能略有差异用get_pins的时候先在 Chip Planner 里确认一下实际路径别照抄。3.4 AD9361 这类射频前端的时钟链排查热词里提到了 AD9361 初始化时 CP OVRG HIGH 被置位、RX PLL 没锁定这其实是同一类问题的射频版本。AD9361 的 RX PLL 没锁意味着它的采样时钟链没建立如果 FPGA 这边的 SignalTap 采样时钟又依赖 AD9361 输出的时钟那必然 waiting for clock。排查顺序应该是先确认 AD9361 的参考时钟通常是 40MHz 或 30.72MHz是否正常再确认 SPI 配置是否成功写入最后看 RX PLL 的 locked 状态。FPGA 侧的 SignalTap 采样时钟建议先用本地晶振等 AD9361 链路通了再切换到射频时钟。这样能把问题域隔离开不至于两头抓瞎。4. 姿势三引脚配置和时钟约束的避坑指南第三种情况时钟在跑、PLL 也锁了但 SignalTap 还是等。这时候八成是引脚配置或者时钟约束出了问题。这一章我把常见的引脚坑整理成一份避坑指南都是实际项目里踩出来的。4.1 时钟输入引脚必须分配到专用时钟引脚FPGA 的时钟输入引脚不是随便哪个 IO 都能当的。以常见的 Cyclone、Arria 系列为例外部时钟必须接到专用的 CLK 引脚上否则时钟信号进不了全局时钟网络抖动大、偏斜大SignalTap 引用它就会不稳定。在 Pin Planner 里分配时钟引脚时注意看引脚类型。专用时钟引脚在 Pin Planner 里会标注为CLK或者GCLK。如果你把时钟分配到了普通 IO 上Quartus 编译时会报 warning但很多人忽略 warning 直接下载结果就是时钟质量差SignalTap 时好时坏。引脚类型能否做时钟输入典型表现专用 CLK 引脚可以推荐时钟稳定SignalTap 正常普通 IO 引脚勉强可以不推荐抖动大SignalTap 可能 waiting差分对引脚可以需用 IBUFDS时钟质量好适合高速4.2 引脚分配和顶层端口名要对得上这个坑听起来低级但真的很多人中招。顶层模块的端口名是clk_50mPin Planner 里分配的时候写成了clk50mQuartus 找不到对应端口这个引脚就没分配时钟自然进不来。更隐蔽的是大小写问题。Verilog 是大小写敏感的Clk_50M和clk_50m是两个不同的信号。Pin Planner 里如果名字对不上编译不报错只是 warning但引脚没分配下载后时钟就是死的。排查方法编译后看 Pin Planner 的Unassigned Pins列表如果有你的时钟引脚在里面那就是名字没对上。另外看 Compilation Report 里的Fitter报告确认时钟引脚被正确分配到专用时钟网络。4.3 时钟约束缺失导致时钟网络未优化前面提过 PLL 输出时钟的约束这里补充外部输入时钟的约束。外部时钟进来后要在 SDC 里声明它的频率和周期create_clock -name clk_50m -period 20.000 [get_ports {clk_50m}]没有这条约束Quartus 不知道这个时钟的频率时序分析做不了布局布线时也不会优先把它放到全局时钟网络上。结果就是时钟偏斜大SignalTap 采样不稳定。我习惯在 SDC 里把所有时钟都声明一遍包括外部输入、PLL 输出、分频时钟。这样 Timing Analyzer 能给出完整的时序报告SignalTap 的采样时钟也有保障。4.4 JTAG 引脚和配置引脚的冲突还有一种情况JTAG 引脚TCK、TMS、TDI、TDO和你的设计引脚冲突了。比如你把某个信号分配到了 JTAG 专用的引脚上导致 JTAG 通信不稳定SignalTap 下载后连不上或者通信中断界面就卡在 waiting。Quartus 默认会保留 JTAG 引脚但如果你在 Pin Planner 里手动分配了这些引脚就会冲突。检查方法是看 Pin Planner 里有没有引脚被分配到TCK、TMS、TDI、TDO这些保留引脚上。有的话赶紧改掉。另外AS 配置模式Active Serial用的引脚DCLK、ASDI、nCSO、DATA0也是保留的别乱分配。热词里提到quartus ii 的 as 模式这个模式下配置引脚是专用的设计信号不能占用。4.5 引脚配置避坑速查表把上面这些整理成一张表方便你排查时对照坑点现象排查方法解决时钟分配到普通 IOSignalTap 时好时坏Pin Planner 看引脚类型改到专用 CLK 引脚端口名大小写不一致引脚未分配看 Unassigned Pins统一命名缺时钟约束时序警告采样不稳Timing Analyzer 报告SDC 加 create_clockJTAG 引脚被占用下载后通信中断Pin Planner 看保留引脚释放 JTAG 引脚AS 配置引脚冲突配置失败或通信异常检查配置引脚分配避开配置专用引脚注意引脚分配改完之后一定要重新全编译不能只做增量编译。引脚变化会影响布局布线增量编译可能不生效。5. 常见问题与排查技巧实录这一章把实际调试中遇到的各种 waiting for clock 变体整理出来配上排查思路和解决方法。有些问题很刁钻常规文档里不会写但实际项目里就是会碰到。5.1 SignalTap 实例没使能或者被禁用SignalTap 实例在 SignalTap File 里有一个 Enable 选项如果没勾选运行时就不会采样。这个选项默认是勾选的但有时候复制工程或者改配置时会不小心取消。检查方法打开 SignalTap 窗口看实例列表里对应实例前面的勾选框有没有勾上。还有一种情况是 SignalTap 实例的采样模式设置成了Continuous但触发条件永远不满足看起来也像 waiting。改成Auto或者设置一个必然满足的触发条件比如1b1试试。5.2 采样深度和 RAM 资源不足SignalTap 的采样数据存在 FPGA 的 RAM 里如果采样深度设得太大超过了可用 RAM 资源Quartus 编译时会报错或者自动缩减。缩减后的行为可能异常表现为 waiting。检查方法看 Compilation Report 里的SignalTap II部分确认采样深度和 RAM 使用情况。如果 RAM 使用率接近 100%把采样深度调小或者减少采样信号数量。5.3 时钟域交叉导致的采样异常如果采样时钟和被采样信号不在同一个时钟域SignalTap 抓到的数据可能是亚稳态的看起来像时钟没跑。这种情况不是 waiting for clock但现象类似。解决办法确保采样时钟和被观察信号同域或者用 SignalTap 的多时钟域采样功能需要多个采样时钟。Quartus 的 SignalTap 支持多时钟域但配置起来麻烦我一般建议先单域调试确认时钟没问题再扩展。5.4 板子供电和晶振的实际检查软件排查了一圈没问题最后发现是板子的问题。这种情况我遇到过好几次晶振没焊、晶振供电电压不对、板子电源纹波太大导致 PLL 锁不上。实际检查步骤先用示波器量晶振输出确认有波形再量 PLL 供电引脚确认电压在范围内最后看 locked 信号。硬件问题软件解决不了该上示波器就上。5.5 排查流程速查把整个排查流程整理成一个决策树方便你按顺序走确认采样时钟信号在设计里存在且未被优化确认采样时钟在采样期间真实翻转用心跳计数器验证如果采样时钟来自 PLL确认 PLL locked检查引脚分配确认时钟在专用引脚检查 SDC 约束确认时钟已声明检查 JTAG 和配置引脚无冲突检查 SignalTap 实例使能和采样深度以上都正常上示波器查硬件5.6 几个独家避坑技巧最后分享几个我踩坑总结出来的技巧常规文档里不会写技巧一先用最慢的时钟做采样时钟。调试初期别用 PLL 输出或者高速时钟直接用外部晶振分频后的低频时钟比如 1MHz做采样。低频时钟稳定、容易排查等逻辑通了再换回正常时钟。技巧二SignalTap 里永远加一个心跳信号。不管调什么采样信号列表里加一个自由运行的计数器。只要它在动就说明采样时钟是活的能快速排除时钟问题。技巧三保留一个“最小可运行”工程。遇到疑难杂症新建一个最小工程只包含时钟、复位、心跳计数器、SignalTap。如果最小工程能跑说明问题在你的设计逻辑里如果最小工程也 waiting说明是环境或硬件问题。技巧四Quartus 版本差异要注意。18.1 和 20.1 的 SignalTap 界面略有不同25.1 精简版Lite功能有裁剪。如果换版本后出问题先确认 SignalTap 功能是否完整。热词里提到的quartus prime lite 25.1是免费版部分高级调试功能可能受限。技巧五编译卡死和 waiting 是两回事。热词里有quartus运行卡死那是编译阶段的问题和 SignalTap 运行时的 waiting for clock 不是一回事。编译卡死通常是资源不足或者 license 问题别混为一谈。5.7 关于 Quartus 安装和版本的补充热词里大量出现 Quartus 安装、下载、版本相关的内容这里顺带说几句和调试相关的。Quartus II 13.x 是比较老的版本SignalTap 功能基本但够用Quartus Prime 18.1 和 20.1 是目前比较稳定的版本SignalTap 功能完善25.1 Lite 是较新的免费版适合学习和中小项目。安装时注意器件库的选择只装你实际用到的器件系列能省不少磁盘空间。quartus 器件库装错了会导致编译时找不到器件但不会直接导致 SignalTap waiting。另外quartus ii 13.1 认证问题这类 license 问题会影响编译和下载但 SignalTap 本身的运行不依赖 licenseLite 版除外。我个人在实际操作中的体会是waiting for clock 这个问题九成以上都能通过“确认采样时钟是否翻转”这一步定位。剩下的那一成要么是 PLL 没锁要么是引脚配置的坑。把这三类问题吃透SignalTap 调试基本就畅通了。真正难的不是工具本身而是对自己设计的时钟树有没有清晰的认知——你知道每个时钟从哪来、到哪去、什么时候翻转waiting for clock 就永远不会成为你的拦路虎。
企业数字化 ERP 产品动态
相关推荐
Cheat Engine入门避坑指南:权限、内存扫描与指针原理 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:54:41
2017优秀网站设计欣赏新手入门避坑指南 2017优秀网站设计欣赏新手入门避坑指南 很多甲方老板一接到“2017优秀网站设计欣赏”这类老话题,第一反应不是看审美,而是心里打鼓:这站还能用吗?备案会不会卡住?其实,比起怀旧,更扎心的是你发现手里的老站点根本没做过安全加固,备案流程更是… · 2026/9/27 1:54:41
Hadoop伪分布式启动失败的四大Linux环境根源 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:54:41
电子学会Python一级考级全攻略:考点拆解与三周备考计划 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:17:45
魔百盒CM201-2长虹版刷机指南:EMMC与NAND免拆刷机及救砖全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:17:39
本地消息表(本地事务表) 目录
一、核心思想
二、本地消息表字段设计(常用)
三、完整执行流程
阶段 1:业务方本地事务(原子)
阶段 2:定时任务轮询投递
阶段 3:消费端处理
四、优缺点
✅ 优点
❌ 缺点
五、常见… · 2026/9/27 3:17:39
膳食营养实训室建设方案2026版:职业院校标准化布局与功能升级设计 随着职业院校健康管理、康养服务、营养配餐专业的不断成熟,膳食营养实训室已经成为专业实训体系的核心基础设施。2026年院校膳食营养实训室建设,不再追求单纯的设备堆砌,而是更加注重空间布局合理性、实训场景完整性、功能分区科学性以及教学… · 2026/9/27 3:17:33
AnyTXT无遮挡版实现指南:移除浮层提升本地搜索体验 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:17:33
葡萄酒感官评价建模:小样本下PLS与PCA实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:17:33
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01