WaveDrom
WaveDrom — это JavaScript-библиотека для рендеринга диаграмм цифровых временных сигналов из JSON-описаний. Она широко используется в документации по проектированию аппаратного обеспечения, разработке FPGA и инженерии встраиваемых систем для иллюстрации поведения сигналов, протоколов шин и тактовых доменов.
В Moraya оберните JSON-описание WaveDrom в огороженный блок кода с языковым тегом wavedrom, и редактор автоматически отрендерит интерактивную временную диаграмму.
Полное описание синтаксиса см. в официальной документации WaveDrom.
Обзор синтаксиса
Диаграмма WaveDrom определяется как JSON-объект. Основной ключ — signal, который содержит массив определений сигналов. Каждый сигнал имеет:
name— метка, отображаемая слеваwave— строка символов формы сигнала, определяющая его вид во времениdata— (необязательно) массив меток, размещаемых на именованных сегментах значений
Символы формы сигнала
| Символ | Значение |
|---|---|
0 | Низкий логический уровень |
1 | Высокий логический уровень |
x | Неопределённое состояние / не имеет значения |
z | Высокий импеданс |
= | Значение данных (использует следующий элемент из массива data) |
2-9 | Именованные значения данных с различными цветами |
p | Тактовый сигнал по переднему фронту |
n | Тактовый сигнал по заднему фронту |
P | Тактовый сигнал по переднему фронту со стрелкой |
N | Тактовый сигнал по заднему фронту со стрелкой |
. | Продолжение предыдущего состояния |
| | Разрыв / пропуск во времени |
Примеры
Простой тактовый сигнал
Базовый тактовый сигнал по переднему фронту, работающий в течение 8 циклов.
```wavedrom
{
"signal": [
{ "name": "clk", "wave": "p........" },
{ "name": "clk_n", "wave": "n........" }
]
}
```
Основные логические сигналы — временная диаграмма вентиля И
Демонстрирует два входных сигнала и результирующий выход И, показывая, что выход переходит в высокое состояние только тогда, когда оба входа находятся в высоком состоянии.
```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" }
]
}
```
Многоразрядная шина с метками данных
Шина данных, передающая последовательные значения байтов, синхронизированная с тактовым сигналом и управляемая сигналом валидности.
```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
Полная транзакция SPI, показывающая линии выбора микросхемы, тактовый сигнал, MOSI и MISO при обмене байтом данных.
```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"
}
}
```