Timing diagram

À propos des diagrammes de chronométrage

Un diagramme de chronométrage montre comment les signaux numériques évoluent dans le temps — impulsions d'horloge, transitions de bus, valeurs de données et états haute impédance — représentés sous la forme d'un ensemble de bandes de formes d'onde horizontales avec un axe temporel commun. Les ingénieurs matériel les utilisent pour spécifier le comportement des protocoles, vérifier les contraintes de setup et hold, et documenter les interfaces de puces. Ils apparaissent dans les fiches techniques, les rapports de simulation HDL et les manuels de systèmes numériques.

Schematex utilise une notation de signal compatible WaveDrom — les mêmes caractères de forme d'onde (0, 1, x, z, p, =, …) et la même syntaxe d'étiquette de données que WaveDrom a introduits — de sorte que les DSL WaveDrom existants se transfèrent directement. Cette page documente ce que le parseur accepte aujourd'hui.

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.1 ms·6.0 KB SVG

1. Votre premier diagramme de chronométrage

Le diagramme de chronométrage utile le plus simple : une horloge et un signal de données. La façon la plus simple de l'écrire évite entièrement de compter les caractères :

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

Trois règles couvrent 80 % des usages :

  1. Commencez par le mot-clé timing, suivi éventuellement d'un titre entre guillemets et de [hscale: N].
  2. Chaque signal est une ligne : NOM: <forme_onde> — nom, deux-points, puis la forme d'onde. La forme d'onde peut être :
    • clock N — un générateur d'horloge avec N périodes (ajoutez neg pour une horloge à front descendant). Pas de comptage de caractères.
    • rle <état>*<compte> … — segments de codage par plage, ex. rle 1*2 0*6 = 11000000. Alignement automatique de la longueur.
    • une chaîne de forme d'onde WaveDrom brute — une suite contiguë de caractères d'état (sans espaces internes) pour un contrôle fin.
  3. Ajoutez data: ["val1", "val2"] après une chaîne de forme d'onde brute pour étiqueter les segments de bus.

Conseil d'alignement : La première cause d'un diagramme de chronométrage cassé est des signaux de longueur inégale. clock N et rle rendent explicite le nombre de cellules de chaque signal, de sorte qu'ils s'alignent. N'utilisez les chaînes de forme d'onde brutes que lorsque vous avez besoin d'un contrôle par cellule.

Les commentaires doivent commencer par # sur leur propre ligne.


2. Caractères de forme d'onde

La chaîne de forme d'onde est une séquence de caractères, un par période de temps. Le parseur accepte les suivants :

CaractèreÉtatSignification
0Niveau logique basSignal à GND / VSS
1Niveau logique hautSignal à VDD
xInconnuSans importance, non défini ou non initialisé
zHaute impédanceTri-state / haute impédance
pImpulsion d'horloge (positive)Horloge active sur front montant ; un p = une période complète (bas→haut→bas)
PImpulsion d'horloge (positive, haute)Identique à p, visuellement plus haute
nImpulsion d'horloge (négative)Active sur front descendant ; un n = une période complète (haut→bas→haut)
NImpulsion d'horloge (négative, haute)Identique à n, visuellement plus haute
=Données de busSegment de bus parallèle ; ajoutez des étiquettes via data: […]
29Segment de bus nomméIdentique à =, indexé dans data: […] par position
.Maintien / continuationProlonge l'état précédent d'une période de plus
h / HMaintien hautForce le signal haut pour cette période
l / LMaintien basForce le signal bas pour cette période
uFront montantDiagonal de bas en haut (transition uniquement)
d / DFront descendantDiagonal de haut en bas (transition uniquement)
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.7 ms·8.6 KB SVG

3. Étiquettes de données

Lorsqu'un signal porte une valeur de bus, annotez la forme d'onde avec data: ["étiquette1", "étiquette2", …]. Chaque chaîne non vide entre guillemets est placée dans le segment = (ou 29) correspondant.

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

Les chaînes vides "" laissent un segment sans étiquette (utile pour les segments qui prolongent une valeur précédente).

MISO:  zzzz====  data: ["","","","","0xFF","0x12","0x34","0x56"]
# les quatre premières périodes z n'ont pas d'étiquette ; quatre segments = reçoivent des étiquettes à partir de 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.3 ms·5.4 KB SVG

4. Regroupement de signaux

Enveloppez les signaux liés dans un bloc [NomDuGroupe]. Une ligne --- ferme le groupe et agit également comme séparateur visuel entre les groupes.

[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"]

La syntaxe alternative group "nom" { … } est également acceptée (le } fermant ferme le groupe).

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.5 ms·8.1 KB SVG

5. Titre et hscale

Titre : timing "SPI Transaction" — apparaît en haut du diagramme.

hscale : timing "titre" [hscale: 2] — met à l'échelle la largeur de chaque période. La valeur par défaut est 1. Utilisez 2 pour des périodes plus larges lorsque les étiquettes de données ont besoin de plus d'espace.

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

6. Étiquettes et commentaires

  • Nom du signal : tout ce qui précède le premier : sur une ligne de signal. Les noms avec des espaces sont acceptés — le deux-points est le délimiteur.
  • Étiquettes de données : data: ["a", "b"] après la chaîne de forme d'onde.
  • Titre : premier jeton après le mot-clé timing, entre guillemets.
  • Commentaires : # en début de ligne (après les espaces initiaux).
timing "Demo"
# ceci est un commentaire
CLK: pppp    # ← les commentaires de fin de ligne en ligne ne sont PAS supportés

7. Erreurs courantes

Vous avez écritLe parseur indiqueCorrection
CLK: p p p p (espaces dans la forme d'onde)La chaîne de forme d'onde est analysée comme p uniquement ; le reste est traité comme clause de donnéesSupprimez les espaces : CLK: pppp
DATA: ===== sans data:Les segments s'affichent comme des cellules de bus sans étiquetteAjoutez data: ["A","B","C","D","E"]
Caractère de forme d'onde s ou rTimingParseError: Invalid wave stringSeuls les caractères listés dans §2 sont valides
CLK pppp (sans deux-points)La ligne ne correspond pas au motif de signal ; ignorée silencieusementLe deux-points après le nom du signal est obligatoire
data: [A, B, C] (sans guillemets)Valeurs non reconnues — le parseur cherche "…"Mettez chaque valeur entre guillemets : data: ["A","B","C"]
[Group Name with spaces]L'étiquette du groupe est Group Name with spaces — analysée correctementSupporté
hscale: 2 sur sa propre ligneNon reconnu (hscale va sur la ligne d'en-tête)timing "titre" [hscale: 2]

8. Grammaire (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           = tout texte avant le premier ":"
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

Source faisant autorité : src/diagrams/timing/parser.ts. En cas de divergence avec le parseur, le parseur a la priorité — veuillez ouvrir un ticket.


9. Conformité aux normes

Les diagrammes de chronométrage Schematex suivent la notation de signal WaveDrom WaveJSON pour les caractères de forme d'onde et les étiquettes de données — le même ensemble utilisé par l'éditeur en ligne WaveDrom, rendant le DSL Schematex largement interchangeable avec l'entrée WaveDrom. L'option hscale, la syntaxe de groupe et le format des étiquettes de données sont tous compatibles.

Ce qui est implémenté aujourd'hui :

  • ✅ Tous les caractères de forme d'onde principaux : 0 1 x z p P n N h H l L u d D = . 2–9
  • ✅ Étiquettes de données via data: ["…"]
  • ✅ Blocs de groupe : syntaxe [Nom] et group "nom" { }
  • ✅ Séparateur / fermeture de groupe ---
  • ✅ Multiplicateur de largeur de période hscale
  • ⏳ Annotations de chronométrage (flèches entre les transitions de signaux, étiquettes t_su, t_pd)
  • ⏳ Décalage phase: par signal (décalage de cycle fractionnaire)
  • ⏳ Blocs d'annotation WaveDrom node: / edge:
  • ⏳ Skin / thème (default, narrow, lowkey)

Références :

  • WaveDrom — https://wavedrom.com (spécification WaveJSON)
  • IEEE Std 1364 (Verilog HDL) — concepts de simulation de chronométrage numérique
  • IEEE Std 1497 (Standard Delay Format) — conventions d'annotation de chronométrage

10. Exemples associés


11. Feuille de route

Prévu — pas encore analysable. N'utilisez pas ces éléments dans le DSL généré aujourd'hui ; le parseur les ignorera.

  • Flèches d'annotation de chronométrage — bloc annotate: avec la syntaxe A -> B [label: "t_su = 5ns"] pour dessiner des plages de setup/hold et de délai de propagation entre les transitions de signaux.
  • phase: par signal — décalage de cycle fractionnaire afin que les signaux puissent démarrer à mi-parcours d'une période.
  • WaveDrom node: / edge: — compatibilité complète avec les blocs d'annotation WaveDrom.
  • Options de skin — thèmes de rendu narrow (compact) et lowkey (palette atténuée).
  • Axe temporel — axe temporel numérique optionnel en bas (unités ns, µs, ps).

Suivez les tickets GitHub si vous avez besoin de l'une de ces fonctionnalités plus tôt.

Found this useful?

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