التعيين المستمر
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 37 من 90.
في العتاد الصلب (hardware)، يُعتبر الربط (connection) سلكًا فيزيائيًا يربط بين نقطتين في الدائرة الكهربائية. بمجرد إقامة السلك في مكانه، يصبح الربط دائمًا ونشطًا باستمرار. إذا تغير أحد الطرفين، يتغير الطرف الآخر على الفور.
في Verilog، نحتاج إلى طريقة لنمذجة هذا السلوك. نريد تمرير قيمة إلى wire وإبقائها متصلة إلى الأبد. تسمى عملية القيام بذلك continuous assignment (التعيين المستمر).
يستخدم التعيين المستمر (Continuous assignment) الكلمة المفتاحية assign لإنشاء اتصال دائم بين wire والتعبير (expression). يأخذ الـ wire قيمة التعبير بشكل مستمر (continuously) — تماماً مثل السلك الفيزيائي.
فكّر في الأمر على أنه لحام wire بدلاً من كتابة قيمة مرة واحدة.
بناء الجملة (Syntax)
assign wire_name = expression;| الجزء | المعنى |
|---|---|
assign | الكلمة المفتاحية that تبدأ continuous assignment |
wire_name | الـ wire الذي يتم توجيهه (لا يمكن أن يكون reg) |
expression | القيمة that تقود الـ wire |
مثال بسيط
wire out;
assign out = a & b;هذا يعني: out يكون always equal لـ a AND b. كلما تغير a أو b، يتغير out على الفور.
كيف يعمل
على عكس reg الذي يخزن قيمة، فإن wire مع continuous assignment يتم تحديثه باستمرار:
module continuous_demo;
reg a, b;
wire c;
assign c = a & b; // c يتبع a AND b في جميع الأوقات
initial begin
a = 0; b = 0;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0
a = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0 (1&0=0)
b = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=1 (1&1=1)
$finish;
end
endmoduleالناتج:
a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1في كل مرة تتغير فيها قيمة a أو b، يتحدث c تلقائيًا.
عمليات Assignment المتعددة
يمكنك استخدام عدة continuous assignment في module:
module multiple_assign (
input a, b, c,
output x, y
);
assign x = a & b;
assign y = x | c; // y يعتمد على x
endmoduleجميع عمليات الـ assignment تعمل بالتوازي، وبشكل continuous.
استخدامات شائعة
تُستخدم التعيينات المستمرة (continuous assignments) لـ:
- المنطق التجميعي البسيط (AND، OR، XOR)
- ربط الأسلاك ببعضها البعض
- إنشاء المنظمات ثلاثية الحالات (tri-state buffers)
- تشغيل المخرجات من التعبيرات التجميعية (combinational expressions)
التحدي
ما يجب فعله:
- أضف التعيين المستمر (continuous assignment) المفقود الذي يجعل
zمساوياً لـx AND y.
جرّب بنفسك
module continuous_challenge (
input x,
input y,
output z
);
// TODO: أضف التعيين المستمر المفقود الذي يجعل z يساوي x AND y
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة