التعيين المستمر
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 37 من 90.
في عالم العتاد (Hardware)، تُعد الوصلة (connection) سلكاً مادياً يربط بين نقطتين في دائرة كهربائية. وبمجرد وضع السلك في مكانه، تصبح الوصلة دائمة ونشطة دائماً. فإذا تغير أحد الطرفين، يتغير الطرف الآخر على الفور.
في لغة Verilog، نحتاج إلى طريقة لنمذجة هذا السلوك. نريد تمرير قيمة إلى سلك (wire) وإبقائها متصلة للأبد. تُسمى عملية القيام بذلك التعيين المستمر (continuous assignment).
يستخدم التعيين المستمر (Continuous assignment) الكلمة المفتاحية assign لإنشاء اتصال دائم بين سلك (wire) وتعبير (expression). يأخذ السلك قيمة التعبير بشكل مستمر — تماماً مثل السلك الفيزيائي.
فكر في الأمر كـ لحام سلك بدلاً من كتابة قيمة لمرة واحدة.
الصيغة
assign wire_name = expression;| الجزء | المعنى |
|---|---|
assign | الكلمة المفتاحية التي تبدأ التعيين المستمر |
wire_name | السلك الذي يتم تشغيله (لا يمكن أن يكون reg) |
expression | القيمة التي تشغل السلك |
مثال بسيط
wire out;
assign out = a & b;هذا يعني: out يساوي دائمًا 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 تلقائيًا.
تعيينات متعددة
يمكنك الحصول على تعيينات مستمرة متعددة في وحدة (module):
module multiple_assign (
input a, b, c,
output x, y
);
assign x = a & b;
assign y = x | c; // y تعتمد على x
endmoduleتعمل جميع التعيينات بالتوازي، وبشكل مستمر.
الاستخدامات الشائعة
تُستخدم التعيينات المستمرة (Continuous assignments) لـ:
- المنطق التوافقي البسيط (AND, OR, XOR)
- توصيل الأسلاك ببعضها البعض
- إنشاء مخازن ثلاثية الحالات (tri-state buffers)
- قيادة المخرجات من التعبيرات التوافقية
التحدي
ماذا تفعل:
- أضف التعيين المستمر (continuous assignment) المفقود الذي يجعل
zمساوياً لـx AND y.
ورقة مرجعية
التعيين المستمر ينشئ اتصالاً دائماً بين سلك (wire) وتعبير باستخدام الكلمة المفتاحية assign:
assign wire_name = expression;يعكس السلك باستمرار قيمة التعبير — كلما تغيرت المدخلات، يتم تحديث المخرج فوراً:
wire out;
assign out = a & b; // out تساوي دائماً a AND bيتم تشغيل عمليات تعيين متعددة بالتوازي:
assign x = a & b;
assign y = x | c; // y تعتمد على x، والجميع يتحدث باستمرارالقواعد الأساسية: يمكن فقط لـ wire (وليس reg) أن يتم قيادته بواسطة assign.
جرّب بنفسك
module continuous_challenge (
input x,
input y,
output z
);
// مهام: أضف التعيين المستمر المفقود الذي يجعل z مساوياً لـ x و y
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة