{signal: [
{name: 'clk', wave: 'p.....|...'},
{name: 'dat', wave: 'x.345x|=.x', data: ['head', 'body', 'tail', 'data']},
{name: 'req', wave: '0.1..0|1.0'},
{},
{name: 'ack', wave: '1.....|01.'}
]}
这段代码是使用WaveDrom语法描述的时序图(波形图),用于直观展示数字电路或信号处理中的信号时序关系。下面逐行解析其含义:
整体结构
这是一个 JSON 格式的数组,每个对象代表一个信号的波形,包含name(信号名)和wave(波形描述),部分信号还有data(数据标注)。
各信号解析
1. 时钟信号(clk)
json





{name: 'clk', wave: 'p.....|...'}

◦ name: 'clk':信号名为时钟(clock)。
◦ wave: 'p.....|...':波形描述,p表示时钟的上升沿(positive edge),后续的.表示时钟周期延续(每个.代表一个周期),|是分隔符(无实际意义,仅用于视觉分段)。
波形含义:第一个周期上升沿触发,之后延续多个周期。
2. 数据信号(dat)
json





{name: 'dat', wave: 'x.345x|=.x', data: ['head', 'body', 'tail', 'data']}

◦ name: 'dat':信号名为数据(data)。
◦ wave: 'x.345x|=.x':波形描述:
◦ x:初始状态为未知(不确定值)。
◦ .:第一个周期后保持不变。
◦ 3,4,5:分别对应data数组中的第 3、4、5 个元素(索引从 0 开始),即'head'(3)、'body'(4)、'tail'(5)。
◦ 第二个x:数据变为未知状态。
◦ =:保持前一个值(此处延续x的未知状态)。
◦ .:保持不变。
◦ 最后一个x:再次回到未知状态。
◦ 整体含义:数据信号依次出现head→body→tail,之后变为未知。
3. 请求信号(req)
json





{name: 'req', wave: '0.1..0|1.0'}

◦ name: 'req':信号名为请求(request)。
◦ wave: '0.1..0|1.0':波形描述(数字表示电平):
◦ 0:初始为低电平。
◦ .:第一个周期保持低电平。
◦ 1:变为高电平(请求有效)。
◦ ..:保持高电平 2 个周期。
◦ 0:回到低电平(请求结束)。
◦ |:分隔符。
◦ 1:再次变为高电平。
◦ .:保持 1 个周期。
◦ 0:最终回到低电平。
4. 空行
json





{}

◦ 用于在时序图中插入空白行,分隔不同功能的信号组,提升可读性。
5. 应答信号(ack)
json





{name: 'ack', wave: '1.....|01.'}

◦ name: 'ack':信号名为应答(acknowledge)。
◦ wave: '1.....|01.':波形描述:
◦ 1:初始为高电平(应答有效)。
◦ .....:保持高电平 5 个周期。
◦ |:分隔符。
◦ 0:变为低电平(应答无效)。
◦ 1:再次变为高电平。
◦ .:保持 1 个周期。
时序关系总结
• 时钟(clk)是所有信号的时间基准,每个字符对应一个时钟周期。
• req(请求)有效时,dat(数据)传输head→body→tail。
• ack(应答)在大部分时间保持有效,与req的时序存在交互(通常请求与应答会有因果关系,如请求触发应答)。
通过 WaveDrom 工具可以将这段代码渲染为可视化的时序图,清晰展示信号间的同步关系,常用于数字电路设计、接口协议分析等场景。