حلقة While
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 59 من 90.
تكرر حلقة while كتلة من الكود طالما أن الشرط صحيح. وعلى عكس حلقة for، فهي لا تحتوي على عداد مدمج — يجب عليك تحديث متغير الحلقة بنفسك.
تقوم حلقة while بفحص شرط قبل كل تكرار. إذا كان الشرط صحيحاً، يتم تنفيذ الحلقة. أما إذا كان خاطئاً، فتتوقف الحلقة.
الصيغة:
while (condition) begin
// الكود المراد تكراره
endمثال بسيط
integer i = 0;
while (i < 5) begin
$display("i = %d", i);
i = i + 1;
endالمخرجات:
i = 0
i = 1
i = 2
i = 3
i = 4تعمل الحلقة طالما أن i < 5.
حلقة While مقابل حلقة For
| حلقة For | حلقة While | |
|---|---|---|
| العداد | مدمج | أنت من يديره |
| متى يُستخدم | عدد معروف من التكرارات | غير معروف متى ستتوقف الحلقة |
| الصيغة البرمجية | for (i=0; i<5; i=i+1) | while (i < 5) |
حلقة While في منصات الاختبار (Testbenches)
تعد حلقات While مفيدة عندما لا تعرف بالضبط عدد التكرارات التي تحتاجها:
integer i = 0;
while (i < 16) begin
$display("Testing value %d", i);
i = i + 1;
endالبحث عن قيمة محددة
integer i = 0;
reg [7:0] data;
while (data[i] != 1) begin
i = i + 1;
end
$display("First 1 found at position %d", i);قواعد هامة
| القاعدة | الشرح |
|---|---|
| يجب أن يصبح الشرط خاطئاً (false) | وإلا ستحدث حلقة تكرار لا نهائية |
| تحديث متغير الحلقة بالداخل | أو لن تنتهي الحلقة أبداً |
يجب أن يكون متغير الحلقة من نوع integer | لا يمكن أن يكون reg |
استخدم begin/end للجمل المتعددة | مطلوب لأكثر من سطر واحد |
التحدي
ماذا تفعل:
أضف حلقة while المفقودة لطباعة الأرقام من 0 إلى 2.
ورقة مرجعية
تكرر حلقة while كتلة من الكود طالما أن الشرط صحيح. يجب عليك تحديث متغير الحلقة يدوياً.
integer i = 0;
while (i < 5) begin
$display("i = %d", i);
i = i + 1;
endالقواعد الأساسية:
- يجب أن يكون متغير الحلقة من نوع
integer(وليسreg) - قم دائماً بتحديث متغير الحلقة داخل الحلقة لتجنب الحلقات اللانهائية
- استخدم
begin/endللبيانات المتعددة
While مقابل For: استخدم for عندما يكون عدد التكرارات معروفاً؛ واستخدم while عندما يكون شرط التوقف ديناميكياً (على سبيل المثال، البحث عن قيمة).
// البحث عن أول بت مضبوط (set bit)
while (data[i] != 1) begin
i = i + 1;
endجرّب بنفسك
module while_challenge;
integer i;
initial begin
i = 0;
$display("Printing 0 to 2:");
// TODO: أضف حلقة while
// التكرار طالما i < 3
// في الداخل، اطبع i
// زيادة i بمقدار 1
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة