الإسناد الحاجب
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 49 من 90.
يحتوي Verilog على نوعين من التعيينات الإجرائية: الحاجبة (blocking) (=) وغير الحاجبة (non-blocking) (<=). في هذا الدرس، نركز على التعيين الحاجب (blocking assignment).
يستخدم التعيين الحاجب (Blocking assignment) المعامل =. ويُطلق عليه اسم "حاجب" لأنه يحجب تنفيذ العبارة التالية حتى يكتمل التعيين الحالي. يتم تشغيل الكود خطوة بخطوة، وبالترتيب.
الصيغة:
variable = expression;متى يتم استخدام التعيين المحجوب (Blocking Assignment)
يُستخدم التعيين المحجوب (=) من أجل المنطق التوافقي (combinational logic) — وهي الدوائر التي تتغير مخرجاتها فوراً عند تغير المدخلات، مع عدم وجود ساعة (clock) وعدم وجود ذاكرة.
أمثلة على المنطق التوافقي:
- بوابات AND / OR / XOR
- الجامعات والطوارح
- المجمعات (Multiplexers)
- أجهزة فك التشفير (Decoders)
مثال Verilog:
always @(*) begin
sum = a + b; // تعيين حاجب (Blocking assignment)
carry = a & b; // تعيين حاجب (Blocking assignment)
endالتعيين المتسلسل (Blocking) في كتل Always (المنطق التوافقي)
always @(*) begin
temp = a & b; // الخطوة 1
out = temp | c; // الخطوة 2 (تستخدم temp من الخطوة 1)
endالترتيب مهم. هذا جيد للمنطق التوافقي.
Blocking مقابل Non-Blocking
Blocking (=) | Non-blocking (<=) | |
|---|---|---|
| التنفيذ | واحد تلو الآخر | الكل في وقت واحد |
| هل ينتظر السطر التالي؟ | نعم | لا |
| الاستخدامات | المنطق التوافقي (Combinational logic) | المنطق التسلسلي (Sequential logic) (flip-flops) |
هام: لا تستخدم الإسناد الحاجب (Blocking) مع القلابات (Flip-Flops)
التحدي
أضف الـ blocking assignments المفقودة لتبديل قيم x و y باستخدام متغير مؤقت.
ما يجب فعله:
- قم بتعيين قيمة
xإلىtemp(احفظ x في temp) - قم بتعيين قيمة
yإلىx(انقل y إلى x) - قم بتعيين قيمة
tempإلىy(انقل x المحفوظة إلى y)
ورقة مرجعية
الإسناد الحاجب (=) يُنفذ بالتسلسل — تكتمل كل جملة قبل أن تبدأ الجملة التالية. يُستخدم لـ المنطق التوافقي داخل كتل always @(*).
always @(*) begin
temp = a & b; // الخطوة 1
out = temp | c; // الخطوة 2 (يستخدم temp المحدثة)
endالحاجب (=) |
غير الحاجب (<=) |
|
|---|---|---|
| التنفيذ | واحدة تلو الأخرى | الكل في وقت واحد |
| يُستخدم لـ | المنطق التوافقي | المنطق التتابعي (flip-flops) |
جرّب بنفسك
module swap;
reg x, y;
reg temp;
initial begin
x = 1;
y = 0;
$display("Before swap: x=%d, y=%d", x, y);
// مهام: الخطوة 1 - تعيين x إلى temp
// مهام: الخطوة 2 - تعيين y إلى x
// مهام: الخطوة 3 - تعيين temp إلى y
$display("After swap: x=%d, y=%d", x, y);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة التحسسالإسناد الحاجبالإسناد غير الحاجبمراجعة - Always مقابل Initial