WaveDrom
WaveDrom هي مكتبة JavaScript تعرض مخططات التوقيت الرقمي من أوصاف JSON. تُستخدم على نطاق واسع في توثيق تصميم العتاد وتطوير FPGA وهندسة الأنظمة المدمجة لتوضيح سلوك الإشارات وبروتوكولات الناقل ونطاقات الساعة.
في Moraya، ضع كود WaveDrom بصيغة JSON داخل كتلة أكواد محاطة بعلامة اللغة 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........" }
]
}
```
إشارات منطقية أساسية — توقيت بوابة AND
يوضح إشارتي إدخال وناتج بوابة AND، حيث يرتفع الخرج فقط عندما يكون كلا الإدخالين مرتفعين.
```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"
}
}
```