حلقة For
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 58 من 90.
تسمح لك الحلقات (Loops) في Verilog بتنفيذ كتلة من الكود عدة مرات. وهي مفيدة بشكل خاص في بيئات الاختبار (testbenches) لتوليد أنماط اختبار متكررة، وتهيئـة الـ memory، والتكرار عبر المصفوفات. وعلى عكس توصيفات العتاد (hardware) التي تعمل بالتوازي، يتم تنفيذ الـ loops بتسلسل، مما يجعلها مثالية للمحاكاة والاختبار.
الحلقة الأكثر استخدامًا هي حلقة for، والتي تتكرر لعدد معين من المرات. تنفذ حلقة for كتلة من البرمجة بشكل متكرر، مع متغير loop يتغير في كل تكرار. أنت تتحكم بدقة في عدد مرات تشغيلها.
الصياغة (Syntax):
for (initialization; condition; increment) begin
// الكود للتكرار
end| Part | What It Does | Example |
|---|---|---|
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 عادةً لاختبار جميع مدخلات التراكيب الممكنة:
integer 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 Loop مع المصفوفات
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 مواقع في الـ memory.
قواعد مهمة
| القاعدة | الشرح |
|---|---|
يجب أن يكون متغير الـ Loop من النوع integer أو reg | لا يمكن أن يكون wire |
استخدم begin/end للعبارات المتعددة | مطلوب لأكثر من سطر واحد |
| تجنب الحلقات اللانهائية | تأكد من أن الـ condition ستصبح خاطئة (false) في النهاية |
| يفضل استخدامها في منصات الاختبار (testbenches) | معظم الحلقات (loops) غير قابلة للتصنيع البرمجي (not synthesizable) |
التحدي
ما يجب فعله:
أضف حلقة for المفقودة لطباعة الأرقام من 0 إلى 3.
جرّب بنفسك
module for_challenge;
integer i;
initial begin
$display("Printing 0 to 3:");
// TODO: أضف حلقة 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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة