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

Always Block

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

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

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

البنية الأساسية:

always @(sensitivity_list) begin
  // كود يعمل بشكل متكرر
end

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

مثال على كتلة always: Counter

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

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

كيف يعمل هذا الكود

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

تعمل block عند كل rising edge من clock. في كل مرة، يزداد count بمقدار 1.

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

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

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

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

يعمل هذا عند حدوث changes في a أو b.

challenge icon

التحدي

Add كتلة always المفقودة لجعل هذه الوحدة تعمل.

كيفية عملها:

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

ما يجب فعله:

  1. Add كتلة 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 يتبدل مع كل clock
  // out2 يتبع out1

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

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

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

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