4. 触发条件设置:基本触发与高级触发
触发条件设置,说白了就是告诉逻辑分析仪「什么时候该停下来等你」。我刚开始用片上逻辑分析仪时,总觉得随便设个边沿触发就行,结果抓回来的波形要么是空的,要么是满屏无关信号。后来踩的坑多了,才明白触发条件设得好不好,直接决定调试效率。
4.1 基本触发:边沿触发与电平触发
这两种是最基础的触发方式,几乎所有逻辑分析仪都支持。我个人习惯把它们叫做「单条件触发」——只要信号满足一个条件,就立刻触发。
4.1.1 边沿触发
边沿触发检测信号的上升沿或下降沿。你指定一个信号,当它发生跳变时触发。
| 触发类型 | 触发条件 | 典型应用场景 |
|---|---|---|
| 上升沿触发 | 信号从 0→1 | 时钟上升沿、复位释放、握手信号 valid 拉高 |
| 下降沿触发 | 信号从 1→0 | 时钟下降沿、中断请求、错误标志置位 |
| 双沿触发 | 任意跳变 | 不确定边沿方向的调试场景 |
4.1.2 电平触发
电平触发检测信号保持高电平或低电平。它不关心跳变,只关心当前状态。
- 高电平触发:信号为 1 时触发。常用于检测总线忙状态、FIFO 满标志。
- 低电平触发:信号为 0 时触发。常用于检测复位有效、中断挂起。
- 任意电平触发:信号为 1 或 0 都触发。这个用得少,但调试毛刺时偶尔有用。
4.2 高级触发:序列触发与范围触发
基本触发只能解决「有没有信号」的问题。但实际调试中,你往往需要「在特定条件下抓特定数据」。这时候就得用高级触发了。
4.2.1 序列触发
序列触发允许你设置多个触发条件,按顺序依次满足后才触发。说白了就是「先 A 再 B 然后 C,最后才停下来」。
我遇到过最典型的场景是调试 AXI 总线事务:我想抓一次写操作完成后的读响应。如果只用基本触发,要么抓到写操作,要么抓到读操作,永远看不到完整的读写交互。用序列触发就能解决:
// 序列触发配置示例(伪代码)
Trigger_Sequence = {
Stage1: AWVALID == 1 && AWREADY == 1 // 写地址握手完成
Stage2: WVALID == 1 && WREADY == 1 // 写数据握手完成
Stage3: BVALID == 1 && BREADY == 1 // 写响应握手完成
Stage4: RVALID == 1 && RREADY == 1 // 读数据握手完成 → 触发
}
4.2.2 范围触发
范围触发检测信号值是否落在某个区间内。它常用于地址总线、数据总线的调试。
| 范围类型 | 触发条件 | 示例 |
|---|---|---|
| 等于 | addr == 0x1000 | 抓特定地址的访问 |
| 大于 | addr > 0x2000 | 抓地址越界访问 |
| 小于 | addr < 0x0800 | 抓低地址空间的访问 |
| 区间 | 0x1000 <= addr <= 0x1FFF | 抓某个地址段的访问 |
我个人习惯在调试 DMA 控制器时用范围触发。DMA 搬运数据时,地址会连续递增。如果我想确认 DMA 有没有访问到非法地址,就设一个「addr > 0xFFFF」的范围触发——一旦地址越界,立刻抓下来分析。
4.3 触发位置选择策略:Before / After / Center
触发位置决定了「触发点」在捕获窗口中的位置。这个设置直接影响你能看到触发前还是触发后的数据。
4.3.1 Before 模式
触发点位于捕获窗口的最右端。窗口内全是触发前的数据。适合你想看「触发条件发生之前发生了什么」的场景。比如检测到错误标志后,你想知道错误发生前系统在做什么。
4.3.2 After 模式
触发点位于捕获窗口的最左端。窗口内全是触发后的数据。适合你想看「触发条件发生后系统如何响应」的场景。比如你手动触发一次复位,想看复位后各模块的初始化顺序。
4.3.3 Center 模式
触发点位于捕获窗口的正中间。前后各有一半数据。这是最常用的模式,适合大多数调试场景——你既想看触发前的原因,也想看触发后的结果。
- 找原因 → 用 Before 模式(看触发前发生了什么)
- 看结果 → 用 After 模式(看触发后发生了什么)
- 查因果 → 用 Center 模式(前后兼顾)
4.4 触发条件设置的常见误区
- 触发条件太宽松:设一个边沿触发就开抓,结果抓回来的波形里全是无关信号。建议先想清楚「我要看什么」,再设触发条件。
- 触发条件太严格:序列触发设了 5 个 stage,结果等了半天也不触发。可能是某个中间条件永远不满足。我建议从 2 个 stage 开始试,逐步增加。
- 忽略触发位置:默认用 Center 模式,但想看的信号在触发前 1000 个时钟周期——窗口深度只有 1024,触发后数据占了 512 点,触发前只有 512 点,根本不够用。这时候就该用 Before 模式。