Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التعيين المستمر

جزء من قسم الأساسيات في رحلة 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)
  • قيادة المخرجات من التعبيرات التوافقية
challenge icon

التحدي

ماذا تفعل:

  1. أضف التعيين المستمر (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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات