WaveDrom
什么是WaveDrom
WaveDrom是一个画数字电路时序图的插件,可以集成到HTML中,如何集成,暂时没有试过,使用json格式,格式正确能显示效果,格式不正确,不能显示效果
VScode安装插件
在VSCode的扩展插件中安装Waveform Render,写完代码保存后,快捷键的使用在扩展插件中有说明,我默认使用快捷键Ctrl + k,然后使用Ctrl + d在vscode的右边会有效果图
怎么使用WaveDrom
新建一个文件,命名为test.txt或者test.json,二者皆可,我更倾向于test.txt,使用也很简单,官网给出了7步学会,其中最重要的只有2个字段,其他字段属于特别的时候会用到。
代码总测试示例
{
signal: [
{ name: "clk", wave: "p.....|............." },
{ name: "Data", wave: "x.345x|=.x..........", data: ["head", "body", "tail", "data"] },
{ name: "Request", wave: "0.1..0|1.0.........." },
{},
{ name: "Acknowledge", wave: "1.....|01..........." },
{ name: "test", wave: "npPN0x|1=23456zud...", data: ["1","2","1","2","1","2"]},
{ name: "test1", wave: "p.....|.......", data: ["1","2","3","4","5","6"]},
{ name: "ts", wave: "N....", period: 4 },
{ name: "ts1", wave: "P....", period: 1, phase: 0.5 },
{ name: "ts2", wave: "23456", period: 1, phase: 0.9 },
{ name: 'A', wave: '01.01......0....', node: '.a.Kl.m...j' },
{ name: 'B', wave: '0.1.......0.1..', node: '..b.......i' },
{ name: 'C', wave: '0..1....0...1..', node: '...c....h..' },
{ name: 'D', wave: '0...1..0.....1.', node: '....d..g...' },
{ name: 'E', wave: '0....10.......1', node: '.....ef....' },
['Master',
['ctrl',
{name: 'write', wave: '01.0....'},
{name: 'read', wave: '0...1..0'}
],
{ name: 'addr', wave: 'x3.x4..x', data: 'A1 A2'},
{ name: 'wdata', wave: 'x3.x....', data: 'D1' },
],
],
edge: ["a-b label1", "b-|-c label2","a~>h", "K#e >",
],
config: { hscale: 2},
}
效果图:
红色那根线是错误的使用方法
代码讲解
基础语法
- Json的语法会用大括号
{对象1:[{键值对1}, {键值对2}, ], }
表示,每个对象使用数组进行赋值,键值对之间的间隔使用,
表示,字段表示键名,字段后面使用:
进行赋值。 - WaveDrom对象中最重要的是signal,用法就是
signal:[{ name : "clk", wave: "p...}],
,我经常会在对象或者键值对后面添加,
添加上不会有错误,不添加上会有错误,防止经常犯错,在signal中重要的是name和wave的键值对,如果有两个signal
对象,会显示最后一个signal的波形 name
字段是用来表示这个波形的名称,会在波形的头部显示,其中clk
就是这个波形的名称wave
字段是用来绘制波形的,一个波形图可以表示多种波形,每一种符号是一个周期内的波形p
- 起始边沿是上升沿的时钟周期n
- 起始边沿是下降沿的时钟周期P
- 起始边沿是上升沿箭头的时钟N
- 起始边沿是下降沿箭头的时钟0
- 一个周期低电平1
- 一个周期高电平=
- 双线2
- 颜色13
- 颜色24
- 颜色35
- 颜色4x
- 未定义的数据.
- 扩展1周期数据z
- 高组态u
- 前半周期上升沿d
- 前半周期下降沿|
- 延长前一个周期并在中间添加间隙
{ name: "test", wave: "2..", data: ["1","2","3","4","5","6"]},
,data
字段作用于信号通道的标签,就是双线或者是数字2,3,4,5…的标签{ name: "test", wave: "p..", period: 2},
,period
字段作用是分频,默认以1个时钟周期为单位,代码解释:2分频,起始是上升沿的时钟,2个时钟周期单位为一个test
字段的周期{ name: "ts1", wave: "P....", period: 1, phase: 0.5 },
,phase
字段的值:波形移位,正数向左移位,负数向右移位,代码解释:起始边沿向左移动0.5周期,{ name: 'A', wave: '01.01......0....', node: '.a.Kl.....j' },
,node
字段的值:在每个周期开始时的一个标号,缺少的位置没有标签.
,表示没有标号a~z
,表示可见字母标号- 大写字母表示不可见标号
特殊语法
-
edge: ["a->b label1", "b<-~>c label2","a~~h",],
,edge
对象,以数组的方式存放键值对,与signal并列关系,用于每个标号进行连线,其中字值是根据node中的标号,连线有曲线~
和直线-
等区分,箭头<
,箭头>
。中间的箭头可以使用连线中的文字
表示,其中字段内容是起始标号 连接线类型 终止标号 连线中间的文字
,其中的连线类型可以是多个-
- 水平线连接|
- 垂直线连接,一般会搭配水平线连接~
- 曲线连接/
- 添加对角线,不知道怎么使用#
- 指示箭头标签位置,也不知道怎么使用+
- 线段连接
-
group
概念,signal
中的每个键值对,都可以是属于不同的组,需要把键值对放在一个数组里['Mater',{键值对a} ]
,键值对a属于Master组中 -
config
对象hscale:#
字段是用来控制水平的刻度,#
表示数字skin:'...'
字段是用来控制第一个时序的形状
效果图:
head/foot:{test:'a', tick:0, tock:9, every:2}
对象,其中tick
添加与垂直标记对齐的时间线标签,test
添加标题/说明文字,tock
在垂直标记中间添加时间线标签。every
每 N 个周期仅渲染一次 tick 和 tocks,官网还有一段代码,很神奇,有时间可以研究研究,不是很常用,用的是tspan
属性,其中h1 h2 h3 h4 h5 h6
是预定义字体大小
{signal: [
{name:'clk', wave: 'p.....PPPPp....' },
{name:'dat', wave: 'x....2345x.....', data: 'a b c d' },
{name:'req', wave: '0....1...0.....' }
],
head: {text:
['tspan',
['tspan', {class:'error h1'}, 'error '],
['tspan', {class:'warning h2'}, 'warning '],
['tspan', {class:'info h3'}, 'info '],
['tspan', {class:'success h4'}, 'success '],
['tspan', {class:'muted h5'}, 'muted '],
['tspan', {class:'h6'}, 'h6 '],
'default ',
['tspan', {fill:'pink', 'font-weight':'bold', 'font-style':'italic'}, 'pink-bold-italic']
]
},
foot: {text:
['tspan', 'E=mc',
['tspan', {dy:'-5'}, '2'],
['tspan', {dy: '5'}, '. '],
['tspan', {'font-size':'25'}, 'B '],
['tspan', {'text-decoration':'overline'},'over '],
['tspan', {'text-decoration':'underline'},'under '],
['tspan', {'baseline-shift':'sub'}, 'sub '],
['tspan', {'baseline-shift':'super'}, 'super ']
],tock:-5
}
}
效果图:
完成个I2C数字时序
{
signal:[
['address',
{ name:"SCL", wave:"10.101010101010101010.", period:1, phase:0 },
{ name:"SDA", wave:"1023456789=1", period:2, phase:1.5, data:["A6", "A5", "A4", "A3", "A2", "A1", "A0", "R/W", "ACK"], },
],
['data',
{ name:"SCL", wave:"10.101010101010101010.", period:1, phase:0 },
{ name:"SDA", wave:"1023456789=1", period:2, phase:1.5, data:["D7", "D6", "D5", "D4", "D3", "D2", "D1", "D0", "ACK"], },
],
],
head:{ test:'I2C', tick:0, every:2 },
foot:{ test:'I2C', tick:0 },
}