Timing-Diagramm

Über Timing-Diagramme

Ein Timing-Diagramm zeigt, wie sich digitale Signale über die Zeit verändern – Taktimpulse, Bus-Übergänge, Datenwerte und Hochimpedanz-Zustände – dargestellt als eine Reihe horizontaler Wellenform-Bänder mit einer gemeinsamen Zeitachse. Hardware-Ingenieure nutzen sie zur Spezifikation des Protokollverhaltens, zur Überprüfung von Setup- und Hold-Constraints und zur Dokumentation von Chip-Schnittstellen. Sie erscheinen in Datenblättern, HDL-Simulationsberichten und digitalen Systemlehrbüchern.

Schematex verwendet eine WaveDrom-kompatible Signalnotation – dieselben Wellenformzeichen (0, 1, x, z, p, =, …) und die Datenlabel-Syntax, die WaveDrom eingeführt hat – sodass vorhandene WaveDrom-DSL direkt übertragen werden kann. Diese Seite dokumentiert, was der Parser heute akzeptiert.

timing·§ WaveJSON
↘ preview
100%
SPI Transaction Digital timing diagram with 4 signals 0xAB0xCD0xEF0x010x020x030x04 CLK CS_N MOSI MISO SPI Transaction
UTF-8 · LF · 5 lines · 202 chars✓ parsed·2.0 ms·6.0 KB SVG

1. Ihr erstes Timing-Diagramm

Das kleinste nützliche Timing-Diagramm: ein Takt und ein Datensignal. Die einfachste Schreibweise vermeidet das Zählen von Zeichen vollständig:

timing·§ WaveJSON
↘ preview
100%
Timing Diagram Digital timing diagram with 3 signals AB CLK RST DATA
UTF-8 · LF · 4 lines · 70 chars✓ parsed·0.6 ms·4.0 KB SVG

Drei Regeln decken 80 % der Anwendungsfälle ab:

  1. Beginnen Sie mit dem Schlüsselwort timing, optional gefolgt von einem Titel in Anführungszeichen und [hscale: N].
  2. Jedes Signal ist eine Zeile: NAME: <wave> – Name, Doppelpunkt, dann die Wellenform. Die Wellenform kann sein:
    • clock N – ein Taktgenerator mit N Perioden (fügen Sie neg für einen Negedge-Takt hinzu). Kein Zeichenzählen.
    • rle <state>*<count> … – Lauflängensegmente, z. B. rle 1*2 0*6 = 11000000. Ausrichtung automatisch.
    • eine rohe WaveDrom-Wellenformzeichenkette – eine zusammenhängende Folge von Zustandszeichen (keine internen Leerzeichen) für feine Steuerung.
  3. Fügen Sie data: ["val1", "val2"] nach einer rohen Wellenformzeichenkette hinzu, um Bus-Segmente zu beschriften.

Tipp zur Ausrichtung: Die häufigste Ursache für ein defektes Timing-Diagramm sind Signale unterschiedlicher Länge. clock N und rle machen die Zellenanzahl jedes Signals explizit, sodass sie sich ausrichten. Verwenden Sie rohe Wellenformzeichenketten nur, wenn Sie Steuerung auf Zellenebene benötigen.

Kommentare müssen mit # auf einer eigenen Zeile beginnen.


2. Wellenformzeichen

Die Wellenformzeichenkette ist eine Folge von Zeichen, eines pro Zeitperiode. Der Parser akzeptiert diese:

ZeichenZustandBedeutung
0Logisch niedrigSignal bei GND / VSS
1Logisch hochSignal bei VDD
xUnbekanntDon't-care, undefiniert oder nicht initialisiert
zHigh-ZTri-State / Hochimpedanz
pTaktimpuls (positiv)Positiv-flanken-aktiver Takt; ein p = eine vollständige Periode (niedrig→hoch→niedrig)
PTaktimpuls (positiv, hoch)Wie p, visuell höher
nTaktimpuls (negativ)Negativ-flanken-aktiv; ein n = eine vollständige Periode (hoch→niedrig→hoch)
NTaktimpuls (negativ, hoch)Wie n, visuell höher
=Bus-DatenParalleles Bus-Segment; Labels über data: […] hinzufügen
29Benanntes Bus-SegmentWie =, positionsbasiert in data: […] indiziert
.Halten / fortsetzenVorherigen Zustand für eine weitere Periode verlängern
h / HHoch haltenFür diese Periode auf hoch zwingen
l / LNiedrig haltenFür diese Periode auf niedrig zwingen
uSteigende FlankeDiagonal von niedrig nach hoch (nur Übergang)
d / DFallende FlankeDiagonal von hoch nach niedrig (nur Übergang)
timing·§ WaveJSON
↘ preview
100%
Wave character reference Digital timing diagram with 9 signals ADDRDATA clk high low unkn hiz bus hold rise fall Wave character reference
UTF-8 · LF · 10 lines · 222 chars✓ parsed·0.6 ms·8.6 KB SVG

3. Datenlabels

Wenn ein Signal einen Bus-Wert trägt, versehen Sie die Wellenform mit data: ["label1", "label2", …]. Jede nicht leere Zeichenkette in Anführungszeichen wird im entsprechenden =- (oder 29-) Segment platziert.

MOSI:  x=======  data: ["0xAB","0xCD","0xEF","0x01","0x02","0x03","0x04","0x05"]

Leere Zeichenketten "" lassen ein Segment unbeschriftet (nützlich für Segmente, die einen vorherigen Wert erweitern).

MISO:  zzzz====  data: ["","","","","0xFF","0x12","0x34","0x56"]
# Die ersten vier z-Perioden haben kein Label; vier =-Segmente erhalten Labels ab 0xFF
timing·§ WaveJSON
↘ preview
100%
I2C read burst Digital timing diagram with 2 signals ADDR+RACKD0D1D2D3D4 SCL SDA I2C read burst
UTF-8 · LF · 3 lines · 122 chars✓ parsed·0.4 ms·5.4 KB SVG

4. Signale gruppieren

Umschließen Sie verwandte Signale in einem [GroupName]-Block. Eine ----Zeile schließt die Gruppe und fungiert auch als visueller Trenner zwischen Gruppen.

[Control]
CLK:   pppppppp
CS_N:  10000001
---
[Data]
MOSI:  x=======  data: ["0xAB","0xCD","0xEF","0x01","0x02","0x03","0x04","0x05"]
MISO:  zzzz====  data: ["","","","","0xFF","0x12","0x34","0x56"]

Die alternative group "name" { … }-Syntax wird ebenfalls akzeptiert (die schließende } schließt die Gruppe).

timing·§ WaveJSON
↘ preview
100%
UART frame Digital timing diagram with 4 signals STARTD0D1D2D3D4D5D6D7STOP D0D1D2D3D4 Clock & control CLK TX_EN Data lines TX RX UART frame
UTF-8 · LF · 8 lines · 246 chars✓ parsed·0.4 ms·8.1 KB SVG

5. Titel und hscale

Titel: timing "SPI Transaction" – erscheint oben im Diagramm.

hscale: timing "title" [hscale: 2] – skaliert die Breite jeder Zeitperiode. Standard ist 1. Verwenden Sie 2 für breitere Perioden, wenn Datenlabels mehr Platz benötigen.

timing "Wide bus" [hscale: 2]
CLK:  pppp
DATA: ====  data: ["long label here","another","third","fourth"]

6. Beschriftungen & Kommentare

  • Signalname: alles vor dem ersten : in einer Signalzeile. Namen mit Leerzeichen sind in Ordnung – der Doppelpunkt ist das Trennzeichen.
  • Datenlabels: data: ["a", "b"] nach der Wellenformzeichenkette.
  • Titel: erstes Token nach dem timing-Schlüsselwort, in Anführungszeichen.
  • Kommentare: # am Anfang einer Zeile (nach führenden Leerzeichen).
timing "Demo"
# Dies ist ein Kommentar
CLK: pppp    # ← Inline-Trailing-Kommentar wird NICHT unterstützt

7. Häufige Fehler

GeschriebenParser-MeldungKorrektur
CLK: p p p p (Leerzeichen in Wellenform)Wellenformzeichenkette wird als nur p geparst; der Rest wird als Daten-Klausel behandeltLeerzeichen entfernen: CLK: pppp
DATA: ===== ohne data:Segmente werden als unbeschriftete Bus-Zellen gerendertdata: ["A","B","C","D","E"] hinzufügen
Wellenformzeichen s oder rTimingParseError: Invalid wave stringNur die in §2 aufgeführten Zeichen sind gültig
CLK pppp (kein Doppelpunkt)Zeile entspricht nicht dem Signal-Muster; wird stillschweigend übersprungenDer Doppelpunkt nach dem Signalnamen ist erforderlich
data: [A, B, C] (ohne Anführungszeichen)Werte nicht erkannt – Parser sucht nach "…"Jeden Wert in Anführungszeichen setzen: data: ["A","B","C"]
[Group Name with spaces]Gruppenbezeichnung ist Group Name with spaces – korrekt geparstUnterstützt
hscale: 2 auf einer eigenen ZeileNicht erkannt (hscale gehört in die Header-Zeile)timing "title" [hscale: 2]

8. Grammatik (EBNF)

document       = header (blank | comment | group-open | group-close | separator | signal)*

header         = "timing" ( WS quoted-string )? ( WS "[" "hscale:" number "]" )? NEWLINE
quoted-string  = '"' any-char-but-quote* '"'

group-open     = "[" label "]" NEWLINE
               | "group" WS quoted-string WS "{"? NEWLINE
group-close    = "}" NEWLINE
separator      = "---" NEWLINE

signal         = name ":" WS wave-string ( WS data-clause )? NEWLINE
name           = beliebiger Text vor dem ersten ":"
wave-string    = wave-char+
wave-char      = "0"|"1"|"x"|"z"
               | "p"|"P"|"n"|"N"
               | "h"|"H"|"l"|"L"
               | "u"|"d"|"D"
               | "="|"."|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"

data-clause    = "data:" WS ( "[" quoted-string ("," quoted-string)* "]"
                            | quoted-string+ )

comment        = "#" any NEWLINE

Maßgebliche Quelle: src/diagrams/timing/parser.ts. Falls dies vom Parser abweicht, hat der Parser Vorrang – bitte öffnen Sie ein Issue.


9. Standardkonformität

Schematex-Timing-Diagramme folgen der WaveDrom WaveJSON-Signalnotation für Wellenformzeichen und Datenlabels – denselben wie WaveDroms Online-Editor, was Schematex-DSL weitgehend mit WaveDrom-Eingaben austauschbar macht. Die hscale-Option, die Gruppen-Syntax und das Datenlabel-Format sind alle kompatibel.

Was heute implementiert ist:

  • ✅ Alle Kern-Wellenformzeichen: 0 1 x z p P n N h H l L u d D = . 2–9
  • ✅ Datenlabels über data: ["…"]
  • ✅ Gruppenblöcke: [Name] und group "name" { }-Syntax
  • ----Trenner / Gruppenabschluss
  • hscale-Periodenbreiten-Multiplikator
  • ⏳ Timing-Annotationen (Pfeile zwischen Signal-Übergängen, t_su, t_pd-Labels)
  • phase:-Versatz pro Signal (fraktionaler Zyklusversatz)
  • ⏳ WaveDrom-node: / edge:-Annotationsblöcke
  • ⏳ Skin / Theme (default, narrow, lowkey)

Referenzen:

  • WaveDrom — https://wavedrom.com (WaveJSON-Spezifikation)
  • IEEE Std 1364 (Verilog HDL) — Konzepte der digitalen Timing-Simulation
  • IEEE Std 1497 (Standard Delay Format) — Timing-Annotationskonventionen

10. Verwandte Beispiele


11. Roadmap

Geplant – noch nicht parsebar. Verwenden Sie diese heute nicht in generiertem DSL; der Parser wird sie ignorieren.

  • Timing-Annotationspfeileannotate:-Block mit A -> B [label: "t_su = 5ns"]-Syntax zum Zeichnen von Setup/Hold- und Propagationsverzögerungs-Spannen zwischen Signal-Übergängen.
  • phase: pro Signal – fraktionaler Zyklusversatz, damit Signale mitten in einer Periode beginnen können.
  • WaveDrom node: / edge: – vollständige Kompatibilität mit WaveDrom-Annotationsblöcken.
  • Skin-Optionennarrow (kompakt) und lowkey (gedämpfte Palette) Rendering-Themes.
  • Zeitachse – optionale numerische Zeitachse unten (ns, µs, ps Einheiten).

Verfolgen Sie die GitHub-Issues, wenn Sie eines davon früher benötigen.

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.