الإسناد غير الحاجب
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 50 من 90.
في الدرس السابق، قمنا بتغطية الإسناد الحاجب (blocking assignment) (=)، والذي يتم تنفيذه خطوة بخطوة. الآن سنقوم بتغطية الإسناد غير الحاجب (non-blocking assignment) (<=)، والذي يتم تنفيذه دفعة واحدة — بالتوازي.
يستخدم الإسناد غير الحاجب (Non-blocking assignment) المعامل <=. ويُطلق عليه اسم "غير حاجب" لأنه لا يحجب تنفيذ الجملة التالية. يتم تنفيذ جميع عمليات الإسناد غير الحاجبة في الكتلة البرمجية في نفس الوقت.
الصيغة:
variable <= expression;متى تستخدم التعيين غير المحظور
يُستخدم التعيين غير المحظور (<=) لـ المنطق التتابعي — وهي الدوائر التي تستخدم ساعة ولديها ذاكرة. تتغير المخرجات فقط عند حافة الساعة (عادةً الحافة الصاعدة).
أمثلة على المنطق التتابعي:
- القلابات (Flip-flops)
- المسجلات (Registers)
- العدادات (Counters)
- آلات الحالة
- مسجلات الإزاحة
مثال Verilog:
initial begin
a <= 5; // مجدولة، ولكن لم يتم تنفيذها بعد
b <= a + 2; // مجدولة، تستخدم القيمة القديمة لـ a
c <= b * 3; // مجدولة، تستخدم القيمة القديمة لـ b
endتحدث جميع عمليات الإسناد الثلاثة في نفس الوقت باستخدام القيم القديمة. وفي نهاية الخطوة الزمنية، تحدث جميع التحديثات معاً.
Non-Blocking في كتل Always (المنطق التتابعي)
يُستخدم Non-blocking لـ المنطق التتابعي — الدوائر التي تستخدم ساعة ولديها ذاكرة (القلابات، المسجلات، العدادات).
always @(posedge clk) begin
q <= d; // تأخذ q قيمة d عند حافة الساعة
count <= count + 1; // يزداد count عند حافة الساعة
endتحدث كلتا عمليتي الإسناد في نفس الوقت، باستخدام القيم من قبل حافة الساعة.
الملخص
| القاعدة | الشرح |
|---|---|
استخدم <= للمنطق التتابعي | always @(posedge clk) |
استخدم = للمنطق التوافقي | always @(*) |
| التعيينات غير المحجوبة (Non-blocking) تُنفذ بالتوازي | تحدث جميع التعيينات في وقت واحد |
| تُحدث القيم في نهاية الخطوة الزمنية | ليس فوراً |
التحدي
أكمل التعيين غير المحظور (Non-Blocking Assignment)
أضف التعيينات غير المحظورة المفقودة لجعل سجل الإزاحة (shift register) المكون من 2 بت يعمل.
كيفية العمل:
- عند كل حافة للساعة، يحصل
q1علىd - يحصل
q2على القيمة القديمة لـq1
ما يجب فعله:
- قم بتعيين
dإلىq1(غير محظور) - قم بتعيين
q1إلىq2(غير محظور)
ورقة مرجعية
التخصيص غير الحاجب (Non-blocking assignment) (<=) ينفذ جميع العبارات بالتوازي — باستخدام القيم القديمة، ويقوم بالتحديث في نهاية الخطوة الزمنية.
// All use OLD values of a and b
a <= 5;
b <= a + 2; // uses old a
c <= b * 3; // uses old bاستخدم <= من أجل المنطق التتابعي (sequential logic) (القلابات flip-flops، السجلات registers، العدادات counters) داخل بلوكات always المتزامنة مع نبضات الساعة:
always @(posedge clk) begin
q <= d; // non-blocking
count <= count + 1; // non-blocking
end| التخصيص | يستخدم لـ | التنفيذ |
|---|---|---|
<= | المنطق التتابعي (posedge clk) | بالتوازي |
= | المنطق التوافقي (always @(*)) | خطوة بخطوة |
جرّب بنفسك
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: أضف منطق الإزاحة
// الخطوة 1: تعيين d إلى q1 (غير محجوب - non-blocking)
// الخطوة 2: تعيين q1 إلى q2 (غير محجوب - non-blocking)
end
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة التحسسالإسناد الحاجبالإسناد غير الحاجبمراجعة - Always مقابل Initial