WaveDrom
WaveDromは、JSON記述からデジタルタイミング図をレンダリングするJavaScriptライブラリです。ハードウェア設計ドキュメント、FPGA開発、組込みシステムエンジニアリングにおいて、信号の動作、バスプロトコル、クロックドメインの図示に広く使用されています。
Morayaでは、WaveDromのJSONを言語タグ wavedrom のフェンスドコードブロック内に記述すると、エディタがインタラクティブなタイミング図を自動的にレンダリングします。
完全な構文リファレンスについては、WaveDrom公式ドキュメントを参照してください。
構文の概要
WaveDromダイアグラムはJSONオブジェクトとして定義されます。主キーは signal で、信号定義の配列を含みます。各信号には以下のプロパティがあります:
name— 左側に表示されるラベルwave— 時間経過に伴う信号の形状を定義する波形文字の文字列data— (オプション)名前付き値セグメントに配置されるラベルの配列
波形文字
| 文字 | 意味 |
|---|---|
0 | Lowロジックレベル |
1 | Highロジックレベル |
x | 不定 / ドントケア |
z | ハイインピーダンス |
= | データ値(data 配列の次の項目を使用) |
2-9 | 異なる色の名前付きデータ値 |
p | 立ち上がりエッジクロック |
n | 立ち下がりエッジクロック |
P | 矢印付き立ち上がりエッジクロック |
N | 矢印付き立ち下がりエッジクロック |
. | 前の状態を継続 |
| | ギャップ / 時間の中断 |
使用例
単純なクロック信号
8サイクル動作する基本的な立ち上がりエッジクロックです。
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p........" },
{ "name": "clk_n", "wave": "n........" }
]
}
```
基本ロジック信号 — ANDゲートタイミング
2つの入力信号と結果のAND出力を示し、両方の入力がHighの場合にのみ出力がHighになることを表しています。
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p........" },
{ "name": "input_a", "wave": "0.1..0.1." },
{ "name": "input_b", "wave": "0..1..1.." },
{},
{ "name": "output", "wave": "0...0.1.0" }
]
}
```
マルチビットバスとデータラベル
クロックに同期し、valid信号で制御されるデータバスが連続バイト値を伝送する様子です。
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p........" },
{ "name": "valid", "wave": "0.1....0." },
{ "name": "data", "wave": "x.=.=.=.x", "data": ["0xA0", "0xB1", "0xC2"] },
{ "name": "ready", "wave": "1........" }
]
}
```
SPI通信プロトコルタイミング
チップセレクト、クロック、MOSI、MISOラインで1バイトのデータを交換する完全なSPIトランザクションです。
```wavedrom
{
"signal": [
{ "name": "CS_n", "wave": "10......1" },
{ "name": "SCLK", "wave": "0.p.....0" },
{ "name": "MOSI", "wave": "x.=.=.=.x", "data": ["MSB", "...", "LSB"] },
{ "name": "MISO", "wave": "x..=.=.=x", "data": ["MSB", "...", "LSB"] }
],
"config": { "hscale": 2 }
}
```
メモリ読み出しサイクル
アドレス設定、チップイネーブル、アウトプットイネーブル、および読み出しレイテンシ後にバス上にデータが現れる様子を示すSRAMメモリ読み出し操作です。
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p.........." },
{ "name": "addr", "wave": "x.=........", "data": ["0x4000"] },
{ "name": "ce_n", "wave": "1.0........" },
{ "name": "oe_n", "wave": "1..0......." },
{ "name": "we_n", "wave": "1.........." },
{ "name": "data", "wave": "z...=......", "data": ["0xFF"] },
{ "name": "ready", "wave": "0....1....." }
],
"head": {
"text": "SRAM Read Cycle"
}
}
```
信号グループとエッジマーカー
信号を論理的なカテゴリにグループ化し、エッジマーカーを使用して信号間の因果関係を示します。
```wavedrom
{
"signal": [
["CPU",
{ "name": "req", "wave": "0.1..0.|.." },
{ "name": "addr", "wave": "x.3..x.|..", "data": ["A5"] },
{ "name": "wr", "wave": "0.1..0.|.." }
],
{},
["Memory",
{ "name": "ack", "wave": "0..1.0.|.." },
{ "name": "data", "wave": "z..4.z.|..", "data": ["D3"] },
{ "name": "ready", "wave": "0...10.|.." }
]
],
"edge": [
"req~>ack", "wr~>data", "ack~>ready"
],
"head": {
"text": "CPU-Memory Bus Transaction"
}
}
```