3. SignalTap II逻辑分析仪入门
SignalTap II Embedded Logic Analyzer 是 Quartus 中内嵌的片内逻辑分析仪。它的核心思路是:在 FPGA 内部综合出一块采样存储 RAM 和触发控制逻辑,把设计中的内部信号接到采样端口上,用 JTAG 把采集到的数据回传到 Quartus 波形窗口。因此它不需要外接示波器或逻辑分析仪探头,代价是消耗额外的逻辑资源与片内 RAM,并且会改变设计的时序与布局布线结果。
理解 SignalTap 的关键在于四个配置项:采样时钟、触发条件、采样深度、存储类型。它们共同决定了“什么时候采、采多深、怎么存”。本节以一个典型场景为例:一个 50 MHz 时钟驱动的计数器模块,需要观察 cnt 在 enable 拉高后是否按预期递增,并在 cnt 达到 8'hA5 时触发抓波。
一、插入 SignalTap 并添加待观测信号
在 Quartus 中通过 Tools → SignalTap Logic Analyzer 打开工具,新建一个 .stp 文件。第一步是设置采样时钟(Clock),第二步是在 Setup 标签页的信号列表中添加节点。添加节点时建议使用 Node Finder,过滤条件选 SignalTap: pre-synthesis,这样可以抓到综合前的信号名,避免综合后名字被优化改写。把 cnt、enable、done 三个信号加入列表,并把 cnt 的显示格式设为十六进制。
需要特别注意:SignalTap 只能观测综合后仍然存在的信号。如果某个信号被优化掉,需要在代码中加 (* keep *) 或 (* preserve *) 综合属性,或者在 Assignment 中设置 Virtual Pin。此外,采样时钟必须是设计中的真实时钟,不能使用 SignalTap 自己产生的时钟。
二、选择采样时钟
采样时钟决定了采样时刻的节拍。SignalTap 在每个采样时钟的有效沿对信号列表中的所有信号同时采样。选择原则有三条:
- 采样时钟应尽量与被观测信号同源,避免跨时钟域采样导致数据无意义;
- 采样时钟频率必须满足奈奎斯特条件,即至少是被观测信号最高频率的两倍,实际工程中通常取 2~4 倍以上;
- 采样时钟频率越高,单位时间内消耗的存储深度越大,因此要在观测精度和采样深度之间折中。
本例中 cnt 由 50 MHz 时钟驱动,直接选择该 50 MHz 时钟作为采样时钟即可。若被观测信号是 100 MHz 时钟域,则应选择 100 MHz 或更高频率的时钟作为采样时钟。
三、设置触发条件
触发条件决定 SignalTap 从哪个时刻开始记录数据。触发条件由多个触发信号通过逻辑组合构成,每个信号可以设置 Don't Care、Low、High、Falling Edge、Rising Edge 等条件。本例中设置触发条件为:cnt == 8'hA5 且 enable == 1。这样当计数器计到 A5 且使能有效时,SignalTap 立即触发。
触发位置(Trigger Position)决定触发事件在采样缓冲区中的位置。可选 Pre-trigger、Center、Post-trigger。若想观察触发前的信号变化,应选择 Pre-trigger 或 Center;若想观察触发后的行为,选择 Post-trigger。本例选择 Center,便于同时观察触发前后的 cnt 变化。
四、配置采样深度与存储类型
采样深度(Sample Depth)指一次采集能保存的采样点数,可选 128、256、512、1024、2048、4096 等。深度越大,能观察的时间窗口越长,但消耗的片内 RAM 越多。存储类型(Storage Qualifier)决定哪些采样点被真正写入 RAM,可选 Continuous(连续存储)或 Input Port(条件存储)。
本例中,若采样时钟为 50 MHz,采样深度设为 1024,则时间窗口为 1024 / 50 MHz ≈ 20.48 μs。若选择 Input Port 存储类型,可以设置一个存储限定信号,只在限定信号有效时才写入 RAM,从而在相同深度下覆盖更长的时间范围。例如设置 enable 为存储限定信号,则只有 enable 为高时才记录,等效时间窗口被拉长。
五、编译、下载与抓波
配置完成后,保存 .stp 文件,重新执行全编译(Full Compilation)。编译完成后,通过 Tools → Programmer 把 .sof 文件下载到 FPGA。然后在 SignalTap 窗口中点击 Run Analysis,等待触发条件满足。触发后,波形窗口会显示采集到的数据。
判断抓波是否成功,主要看三点:触发是否发生(Trigger 状态变为 Triggered)、波形是否与预期一致、采样数据是否完整。若长时间不触发,应检查触发条件是否过于严格、采样时钟是否在运行、信号是否被优化掉。若波形出现大量未知态(X),通常是采样时钟未连接或信号被综合优化。
六、结果判读与常见问题
抓波成功后,波形窗口会显示 cnt、enable、done 三条波形。若 cnt 在 enable 拉高后从 0 递增到 A5 并触发,说明设计行为符合预期。若 cnt 出现跳变或停滞,应检查计数器逻辑本身是否存在竞争或复位问题。
常见问题及排查方向:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 始终不触发 | 触发条件过严、采样时钟未运行、信号被优化 | 放宽触发条件;用示波器确认时钟;检查 keep 属性 |
| 波形全为 X | 采样时钟未连接、信号未初始化 | 确认采样时钟已分配引脚;检查复位逻辑 |
| 采样数据不完整 | 采样深度不足、存储类型设置不当 | 增大深度或改用 Input Port 条件存储 |
| 资源占用过高 | 采样深度过大、信号数量过多 | 减少观测信号;降低深度;使用条件存储 |
Disabled,否则会额外消耗资源并可能影响时序收敛。完成第一次抓波后,建议把 .stp 文件与工程一起纳入版本管理,并在团队内约定命名规范,例如 debug_cnt_trigger.stp,便于后续复用和问题追溯。