WaveDrom是一个使用代码进行数字波形绘制的工具。其官方文档似乎有些简略,故写此文,对其官方文档进行解析,便于查阅。
Step0.How to install it?
我在vscode中安装了Waveform Render
插件,这样新建.json
文件就可以渲染波形。记得关闭json文件报错。
当然,也可以下载桌面端,也可以在其官方网站进行在线渲染:WaveDrom
Step1.The signal 信号
代码:
1 | { signal: [{ name: "Alfa", wave: "01.zx=ud.23.456789" }] } |
解析:
首先,name
指定了所显示波形的名称,而wave
中的每一个字符代表一个周期的波形。
这里的0
和1
应该指的是高与低电平。如果下一周期的波形延续之前的状态,使用.
即可。
z
代表了高阻态,而x
指的是未知状态。
=
表示白色框框(虚线框后面一个周期的波形)。u
是高虚线,d
是低虚线。
2
和=
一样,都是白色框框,而3
4
5
6
7
7
9
分别对应 黄/橙/蓝/青/绿/粉/红 颜色的框框。
Step2.Adding Clock 时钟
关于时钟信号,有其专有代码。
1 | { signal: [ |
p
代表上升沿时钟,其大写P
代表绘有箭头的上升沿时钟。同样n
和N
对应下降沿时钟。
h
代表持续一个周期的高电平,其大写H
代表绘有箭头的高电平(如果有边沿)。同样l
和L
对应低电平。
x
代表未知态,同时绘有边沿(如果有);而其大写X
不包括边沿。
Step 3. Putting all together 信号与时钟组合起来
在典型的时序图中,会同时出现信号与时钟。
在Step1中所讲的带颜色的框框,表示multi-bit signal 多位信号。
1 | { signal: [ |
对多位信号(=
2~9
),会自动从data
中获取标签,与所有的框框一一对应,绘制在波形图上。
Step 4. Spacers and Gaps 省略
有时候需要对信号/时钟进行省略,使用|
符号即可。
1 | { signal: [ |
Step 5. The groups 分组
信号可以分组,只需要将需要的信号使用一对[]
包裹起来即可,在中括号内最前端加上'name'
即可对组进行命名。分组可以嵌套。
1 | { signal: [ |
Step 6. Period and Phase 周期和相位
Step1中说过,wave
中的一个符号代表一个时间周期。但这不是固定的。通过调节period
参数可以控制一个符号占据几个时间周期(只能是整数!如不是,会自动向上取整)。
同时,如果不同路信号之间有相位差,可以通过phase
参数调节。注意,该参数范围为0-1.
1 | { signal: [ |
尽管示例代码中只对clk进行了周期调整、只对信号进行了相位调整,但实际上周期和相位调整对信号与时钟都可用。
Step 7.The config{} property 配置一些属性
config:{...}
语句能够调整渲染的很多属性,且听我一一道来。
7.1 hscale 横向比例
使用方式见代码
1 | { signal: [ |
将1调整为2后:
调整hscale
参数大小能够调整一个时间单元对应的宽度。参数应当是大于0的整数。默认值为1.
7.2 skin 风格?
config:{skin:'...'}
语句调整skin
,只有两种:default
和`narrow,前者是默认,后者更窄一点。
需要注意的是,如果需要同时调整skin
与hscale
,需要像下面这样写:
1 | { signal: [ |
7.3 head/foot 上下标注
head:{...}
和foot:{...}
分别定义了时序图上下区域中的内容。
- tick:添加与垂直标记(时间单元的边界)对齐的时间线标签
- tock:在垂直标记之间添加时间线标签
- text:添加标题或说明文字
- every:每隔N个周期进行tick/tock操作
多说无益,看代码:
1 | {signal: [ |
需要注意的点:
tick/tock
语句后面跟的参数,意味着时间线标记开始的数字head
开启了tick
,且every=2
,每隔两个周期才会标记一次
head/text
文本具有svg文本的所有属性。可以使用标准的svgtspan
属性来修改文本的默认属性。使用text
命令即可对文字标注进行调整。
h1
h2
h3
h4
h5
h6
定义了字体大小。h1
最大。muted
warning
error
info
success
定义了字体颜色风格。分别:灰/黄/红/蓝/绿。
看代码:
1 | {signal: [ |
Step 8. Arrows 箭头
可以对波形图中的两点进行连线,并附上文字。有两种:曲线和直线。
8.1 直线
先看代码:
1 | { signal: [ |
翻译:(其实符号本身能和形状能够对应起来)
-
两点直接连线-|
带一个拐点的连线-|-
带两个拐点的连线<->
双箭头两点直线<-|>
带一个拐点的双箭头直线<-|->
带两个拐点的双箭头直线->
单箭头两点直线-|>或|->
带一个拐点的单箭头直线 两者方向不同-|->
带两个拐点的单箭头直线
8.2 曲线
1 | { signal: [ |
翻译:
~
S曲线-~
单段曲线<~>
双箭头S曲线<-~>
双箭头单段曲线~>
单箭头S曲线-~>或~->
单箭头单段曲线 二者弯向的方向不同
Step 9. Some code 一些代码
1 | (function (bits, ticks) { |
可能是某种自动化?不知道用什么语言运行,我也不会js,这一块压根没看hh。