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

كتلة Always

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

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

تعمل كتلة always باستمرار — فهي تتكرر إلى الأبد بمجرد بدء المحاكاة. تُستخدم لوصف الأجهزة (hardware) التي تحتاج إلى الاستمرار في العمل، مثل القلابات (flip-flops)، والعدادات (counters)، والمنطق التوافقي (combinational logic).

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

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

تخبر @(sensitivity_list) الكتلة البرمجية (block) متى يجب التنفيذ. وبدونها، ستدخل الكتلة في حلقة مفرغة وتؤدي إلى تعليق المحاكاة.

مثال على كتلة 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 المفقودة لجعل هذه الوحدة (module) تعمل.

كيفية العمل:

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

ما يجب فعله:

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

ورقة مرجعية

تعمل كتلة always بشكل مستمر وتُستخدم لوصف الأجهزة (hardware) مثل القلابات (flip-flops) والعدادات (counters).

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

يتم تفعيل @(posedge clk) عند الحافة الصاعدة للساعة؛ ويتم تفعيل @(a or b) عند تغير أي إشارة مدرجة.

// العداد: يزداد عند كل حافة صاعدة للساعة
always @(posedge clk) count = count + 1;

// توافقي: يعمل عندما يتغير a أو b
always @(a or b) begin
  out = a & b;
end

ملاحظة: المخرجات التي يتم التحكم بها بواسطة كتل always يجب أن يتم التصريح عنها كـ reg.

جرّب بنفسك

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اختبر نفسك

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

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