WaveDrom
WaveDrom ist eine JavaScript-Bibliothek, die digitale Timing-Diagramme aus JSON-Beschreibungen rendert. Sie wird haufig in der Hardware-Designdokumentation, FPGA-Entwicklung und Embedded-Systems-Technik eingesetzt, um Signalverhalten, Busprotokolle und Taktdomanen zu veranschaulichen.
In Moraya umschliessen Sie Ihr WaveDrom-JSON in einem eingehegten Codeblock mit dem Sprach-Tag wavedrom, und der Editor rendert automatisch ein interaktives Timing-Diagramm.
Die vollstandige Syntaxreferenz finden Sie in der offiziellen WaveDrom-Dokumentation.
Syntaxubersicht
Ein WaveDrom-Diagramm wird als JSON-Objekt definiert. Der primare Schlussel ist signal, der ein Array von Signaldefinitionen enthalt. Jedes Signal hat:
name— die links angezeigte Beschriftungwave— eine Zeichenkette mit Wellenzeichen, die die Signalform uber die Zeit definiertdata— (optional) ein Array von Beschriftungen, die auf benannten Wertsegmenten platziert werden
Wellenzeichen
| Zeichen | Bedeutung |
|---|---|
0 | Niedriger Logikpegel |
1 | Hoher Logikpegel |
x | Undefiniert / beliebig |
z | Hochohmig |
= | Datenwert (verwendet nachstes Element aus dem data-Array) |
2-9 | Benannte Datenwerte mit unterschiedlichen Farben |
p | Positive Taktflanke |
n | Negative Taktflanke |
P | Positive Taktflanke mit Pfeil |
N | Negative Taktflanke mit Pfeil |
. | Vorherigen Zustand fortsetzen |
| | Lucke / Zeitunterbrechung |
Beispiele
Einfaches Taktsignal
Ein grundlegendes positiv-flankengesteuertes Taktsignal uber 8 Zyklen.
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p........" },
{ "name": "clk_n", "wave": "n........" }
]
}
```
Grundlegende Logiksignale — AND-Gatter-Timing
Zeigt zwei Eingangssignale und den resultierenden AND-Ausgang, wobei der Ausgang nur dann hoch ist, wenn beide Eingange hoch sind.
```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" }
]
}
```
Mehrbit-Bus mit Datenbeschriftungen
Ein Datenbus, der sequenzielle Bytewerte ubertragt, synchronisiert mit einem Takt und gesteuert durch ein Valid-Signal.
```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-Kommunikationsprotokoll-Timing
Eine vollstandige SPI-Transaktion, die Chip Select, Takt, MOSI- und MISO-Leitungen beim Austausch eines Datenbytes zeigt.
```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 }
}
```
Speicher-Lesezyklus
Ein SRAM-Lesevorgang, der Adressaufbau, Chip Enable, Output Enable und das Erscheinen der Daten auf dem Bus nach einer Leselatenz zeigt.
```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"
}
}
```
Signalgruppen mit Flankenmarkierungen
Gruppiert Signale in logische Kategorien und verwendet Flankenmarkierungen, um kausale Beziehungen zwischen Signalen darzustellen.
```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"
}
}
```