المصفوفات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 10 من 90.
تسمح لك المصفوفة (array) بتخزين قيم متعددة في متغير واحد. يمكن الوصول إلى كل عنصر في المصفوفة من خلال الفهرس (index) الخاص به.
ملاحظة: المصفوفة ليست نوع بيانات منفصل. إنها مجموعة من أنواع wire أو reg أو integer أو real.
تصريح المصفوفات
الصيغة: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256 بايت من الذاكرة (كل منها 8 بت)
reg data [0:7]; // 8 سجلات أحادية البت
wire [3:0] bus [0:3]; // 4 نواقل، كل منها بعرض 4 بت
integer counters [0:9]; // 10 أعداد صحيحةالرقم الموجود بين الأقواس [ ] هو حجم المصفوفة، وليس عرض البت.
الوصول إلى عناصر المصفوفة
reg [7:0] memory [0:3];
memory[0] = 165; // عشري 165
memory[1] = 90; // عشري 90
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]); // يطبع: 255المصفوفات مفيدة جداً في منصات الاختبار لتخزين بيانات الاختبار.
المصفوفات متعددة الأبعاد
يمكنك إنشاء مصفوفات بأبعاد متعددة:
reg [7:0] matrix [0:3][0:3]; // مصفوفة 4x4 من قيم 8-بت
matrix[0][0] = 255; // 8'hFF = 255 عشري
matrix[2][1] = 85; // 8'h55 = 85 عشريArray مقابل Vector
| Vector | Array | |
|---|---|---|
| ما هو | سلك (wire) أو سجل (reg) متعدد البتات | مجموعة من القيم المتعددة |
| بناء الجملة (Syntax) | [MSB:LSB] | [size] |
| مثال | reg [7:0] data; | reg [7:0] mem [0:255]; |
| الوصول | data[3] (البت 3) | mem[3] (العنصر 3) |
المتجه (vector) هو قيمة واحدة ذات بتات متعددة.
المصفوفة (array) هي قيم متعددة، لكل منها بتاتها الخاصة.
ملاحظات هامة
- المصفوفات غير قابلة للتوليف (not synthesizable) في العديد من الأدوات عند استخدامها بأحجام كبيرة
- تُستخدم المصفوفات غالباً في منصات الاختبار (testbenches)
- بالنسبة لذاكرة العتاد (hardware memory)، استخدم العناصر الأولية الخاصة بالذاكرة (memory primitives)
التحدي
أكمل الكود أدناه لإنشاء مصفوفة تخزن 4 قيم اختبار.
ما يجب القيام به:
- قم بالتصريح عن مصفوفة تسمى
test_data- استخدم نوع البيانات
reg(لأنه يخزن القيم في testbench) - يجب أن يكون عرض كل عنصر 8 بت (
[7:0]) - يجب أن تحتوي المصفوفة على 4 عناصر (
[0:3])
- استخدم نوع البيانات
ورقة مرجعية
تقوم المصفوفات (Arrays) بتخزين قيم متعددة في متغير واحد، ويتم الوصول إليها عن طريق الفهرس (index). المصفوفة هي مجموعة من أنواع wire أو reg أو integer أو real.
صيغة التصريح: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256 عنصراً، كل منها بعرض 8 بت
wire [3:0] bus [0:3]; // 4 عناصر، كل منها بعرض 4 بت
integer counters [0:9]; // 10 أعداد صحيحةالوصول إلى العناصر:
memory[0] = 165;
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]);المصفوفات متعددة الأبعاد:
reg [7:0] matrix [0:3][0:3]; // مصفوفة 4x4 من قيم بحجم 8 بت
matrix[0][0] = 255;المصفوفة مقابل المتجه (Array vs Vector):
- المتجه (Vector) — قيمة واحدة ذات بتات متعددة:
reg [7:0] data;—data[3]يصل إلى البت رقم 3 - المصفوفة (Array) — قيم متعددة، كل منها له بتاته الخاصة:
reg [7:0] mem [0:255];—mem[3]يصل إلى العنصر رقم 3
تُستخدم المصفوفات غالباً في منصات الاختبار (testbenches)؛ بالنسبة لذاكرة الأجهزة (hardware memory)، استخدم نماذج الذاكرة الأولية الخاصة (memory primitives).
جرّب بنفسك
module arrays;
// صرّح عن مصفوفة تسمى test_data
// يجب أن تحتوي على 4 عناصر، كل منها بعرض 8 بت
// استخدم نوع البيانات reg (لأنه يخزن القيم في منصة الاختبار)
integer i;
initial begin
test_data[0] = 170;
test_data[1] = 240;
test_data[2] = 204;
test_data[3] = 15;
for (i = 0; i < 4; i = i + 1) begin
$display("test_data[%0d] = %b", i, test_data[i]);
end
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة