جملة If
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 52 من 90.
تُعد جملة if بمثابة كتلة لاتخاذ القرار، حيث تقوم بتنفيذ الكود فقط عندما يكون الشرط صحيحاً (true). تتحقق جملة if من صحة الشرط.
إذا كان الشرط صحيحاً (1)، يتم تنفيذ الكود الموجود بالداخل. إذا كان الشرط خاطئاً (0)، يتم تخطي الكود.
الصيغة:
if (condition) begin
// يتم تنفيذ الكود عندما يكون الشرط صحيحاً
endمثال بسيط
if (reset) begin
count = 0;
endفي هذا المثال:
- تُستخدم
beginوendلتمييز بداية و نهاية كتلة الكود
- إذا كان
resetهو 1 (صحيح)، يتم تنفيذ الكود الموجود داخلbeginوend←countيصبح 0 - إذا كان
resetهو 0 (خطأ)، يتم تخطي الكود الموجود بالداخل ← لا يحدث شيء
تعمل begin و end مثل الأقواس المتعرجة { } في لغات البرمجة الأخرى. فهما يقومان بتجميع العبارات معاً حتى يعرف Verilog أي كود ينتمي إلى شرط if. على الرغم من وجود عبارة واحدة فقط هنا، إلا أن استخدام begin و end لا يزال ممارسة جيدة من أجل الاتساق.
جملة If في كتلة Always
always @(posedge clk) begin
if (reset)
count <= 0;
endملاحظة: بالنسبة لجملة برمجية واحدة، فإن begin و end اختياريان. على سبيل المثال، في كتلة always أعلاه، لا يلزم استخدام begin/end بعد if لأنها تحتوي على جملة واحدة فقط.
يمكن أن يكون الشرط أي تعبير
if (a > b) begin
max = a;
end
if (a && b) begin
out = 1;
end
if (data == 8'hFF) begin
match = 1;
endقواعد هامة
| القاعدة | الشرح |
|---|---|
| يجب أن يكون الشرط بت واحد فقط | أو تعبير يتم تقييمه إلى 0 أو 1 |
begin / end مطلوبة لعدة عبارات برمجية | مثل { } في اللغات الأخرى |
بدون begin/end، تتبعها عبارة برمجية واحدة فقط | السطر التالي فقط |
التحدي
ماذا تفعل:
- أضف جملة
ifالمفقودة لجعل هذا يعمل.
- عندما يكون
enableهو1، يجب أن يساويoutالقيمةa & b - عندما يكون
enableهو0، يجب أن يظلoutبقيمة0(لا يتغير)
يقوم كود البداية بتهيئة out = 0 ويختبر كلتا الحالتين.
ورقة مرجعية
تقوم جملة if بتنفيذ الكود فقط عندما يكون الشرط صحيحاً (1)، وتتجاهله عندما يكون خاطئاً (0).
if (condition) begin
// executes when condition is true
endبالنسبة لـ جملة واحدة، تعتبر begin/end اختيارية:
always @(posedge clk) begin
if (reset)
count <= 0;
endيمكن أن تكون الشروط أي تعبير يتم تقييمه إلى 0 أو 1:
if (a > b) begin max = a; end
if (a && b) begin out = 1; end
if (data == 8'hFF) begin match = 1; endالقواعد الأساسية:
- استخدم
begin/endلتجميع جمل متعددة (مثل{ }في اللغات الأخرى) - بدون
begin/end، ينتمي السطر التالي مباشرة فقط إلى جملةif
جرّب بنفسك
module if_challenge;
reg a, b, enable;
reg out = 0;
initial begin
a = 1;
b = 1;
// حالة الاختبار 1: enable = 1
enable = 1;
// TODO: أضف جملة if (out = a & b)
$display("enable=1: out = %d (should be 1)", out);
// حالة الاختبار 2: enable = 0
enable = 0;
out = 0;
// TODO: يجب أن تبقى out مساوية لـ 0
$display("enable=0: out = %d (should be 0)", out);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة