حلقة For
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 58 من 90.
تسمح الحلقات التكرارية (Loops) في Verilog بتنفيذ كتلة من الكود عدة مرات. وهي مفيدة بشكل خاص في منصات الاختبار (testbenches) لتوليد أنماط اختبار متكررة، وتهيئة الذاكرة، والتكرار عبر المصفوفات. وعلى عكس أوصاف الأجهزة (hardware descriptions) التي تعمل بالتوازي، يتم تنفيذ الحلقات التكرارية بشكل تسلسلي، مما يجعلها مثالية للمحاكاة والاختبار.
الحلقة الأكثر استخدامًا هي حلقة <strong>for</strong>، والتي تتكرر لعدد محدد من المرات. تقوم حلقة for بتنفيذ كتلة برمجية بشكل متكرر، مع وجود متغير للحلقة يتغير في كل تكرار. يمكنك التحكم بدقة في عدد مرات تشغيلها.
الصيغة:
for (initialization; condition; increment) begin
// الكود المراد تكراره
end| الجزء | ماذا يفعل | مثال |
|---|---|---|
initialization | يحدد قيمة البداية | i = 0 |
condition | متى يتوقف | i < 10 |
increment | يتغير في كل دورة | i = i + 1 |
مثال بسيط
integer i;
for (i = 0; i < 5; i = i + 1) begin
$display("i = %d", i);
endالمخرجات:
i = 0
i = 1
i = 2
i = 3
i = 4تعمل الحلقة 5 مرات (i = 0, 1, 2, 3, 4).
حلقة For في منصات الاختبار (Testbenches)
تُستخدم حلقات For بشكل شائع لاختبار جميع تركيبات المدخلات:
reg [3:0] test_value;
for (test_value = 0; test_value < 16; test_value = test_value + 1) begin
$display("test_value = %d", test_value);
endيختبر هذا جميع القيم الـ 16 الممكنة لإشارة مكونة من 4 بتات.
حلقة For مع المصفوفات
reg [7:0] memory [0:9];
integer i;
initial begin
for (i = 0; i < 10; i = i + 1) begin
memory[i] = i * 8;
end
endيقوم هذا بتهيئة 10 مواقع في الذاكرة.
قواعد هامة
| القاعدة | الشرح |
|---|---|
يجب أن يكون متغير الحلقة integer أو reg | لا يمكن أن يكون wire |
استخدم begin/end لعدة جمل برمجية | مطلوب لأكثر من سطر واحد |
| تجنب الحلقات اللانهائية | تأكد من أن الشرط سيصبح خاطئاً في النهاية |
| يفضل استخدامه في منصات الاختبار (testbenches) | معظم الحلقات غير قابلة للتصنيع (not synthesizable) |
التحدي
ماذا تفعل:
أضف حلقة for المفقودة لطباعة الأرقام من 0 إلى 3.
ورقة مرجعية
تكرر حلقة for في Verilog كتلة من الكود لعدد محدد من المرات:
for (initialization; condition; increment) begin
// الكود المراد تكراره
endمثال لطباعة الأرقام من 0 إلى 4:
integer i;
for (i = 0; i < 5; i = i + 1) begin
$display("i = %d", i);
endالقواعد الأساسية:
- يجب أن يكون متغير الحلقة من نوع
integerأوreg(ليسwire) - استخدم
begin/endللجمل المتعددة - تأكد من أن الشرط سيصبح خاطئاً في النهاية لتجنب الحلقات اللانهائية
- يُفضل استخدام الحلقات في منصات الاختبار (testbenches) (غالباً لا تكون قابلة للتصنيع/التركيب - synthesizable)
جرّب بنفسك
module for_challenge;
integer i;
initial begin
$display("Printing 0 to 3:");
// مهام: أضف حلقة for
// تهيئة i = 0
// التكرار طالما i < 4
// زيادة i = i + 1
// في الداخل، اطبع i
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة