Menu
CoddyTech

كتلة Always

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 46 من 90.

الكتلة الإجرائية هي كتلة من التعليمات البرمجية تُنفَّذ فيها التعليمات واحدة تلو الأخرى، بالتسلسل، تمامًا كما في لغات البرمجة مثل C أو Python. يحتوي Verilog على كتلتين إجرائيتين: initial (تُنفَّذ مرة واحدة) وalways (تُنفَّذ باستمرار). لنبدأ بكتلة always.

تعمل كتلة always باستمرار. وتتكرر إلى الأبد بمجرد بدء المحاكاة. وتُستخدم لوصف العتاد الذي يحتاج إلى الاستمرار في العمل، مثل القلابات والعدادات والمنطق التوافقي.

الصياغة الأساسية:

always @(sensitivity_list) begin
  // كود يُنفَّذ بشكل متكرر
end

تُخبر @(sensitivity_list) الكتلةَ بموعد تنفيذها. ومن دونها (ومع عدم وجود تأخير مثل #5 داخلها)، ستدخل الكتلة في حلقة لا نهائية وستتوقف المحاكاة عن الاستجابة.

مثال على كتلة always: عدّاد

إليك مثالًا على كيفية استخدام كتلة always لإنشاء عدّاد.

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

كيف تعمل هذه الشيفرة

الجزءالمعنى
alwaysنفّذ هذه الشيفرة بشكل متكرر إلى الأبد
@(posedge clk)انتظر حتى تنتقل الساعة من 0 إلى 1 (الحافة الصاعدة)
count <= count + 1خذ القيمة الحالية لـ count، وأضف إليها 1، ثم خزّنها مجددًا

تُنفَّذ الكتلة عند كل حافة صاعدة للساعة. وفي كل مرة، تزداد قيمة count بمقدار 1.

تخبره قائمة الحساسية @(posedge clk) بأن ينفذ عند حواف الساعة فقط، لا باستمرار. ومن دون ذلك، ستعمل الحلقة إلى الأبد من دون أي تأخير.

كتلة always مع إشارات متعددة

يمكنك إدراج إشارات محددة:

always @(a or b) begin
  out = a & b;
end

يُنفَّذ هذا عندما تتغير a أو b.

challenge icon

التحدي

أضف كتلة always الناقصة لجعل هذه الوحدة تعمل.

كيف تعمل:

  • عند كل حافة صاعدة للساعة، تتبدّل قيمة out1 (تنقلب) من 0 إلى 1 أو من 1 إلى 0
  • تتبع out2 قيمة out1 (لها القيمة نفسها التي لـ out1)

ما عليك فعله:

  1. أضف كتلة always @(posedge clk)
  2. داخلها، اجعل out1 تتبدّل (استخدم out1 = ~out1)
  3. اجعل out2 مساوية لـ out1

جرّب بنفسك

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: أضف كتلة always باستخدام posedge clk
  // تتبدّل قيمة out1 عند كل نبضة ساعة
  // تتبع out2 قيمة out1

endmodule
quiz iconاختبر نفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت