كتلة 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.
التحدي
أضف كتلة always المفقودة لجعل هذه الوحدة (module) تعمل.
كيفية العمل:
- عند كل حافة صاعدة للساعة (rising clock edge)، تتبدل قيمة
out1(تنعكس) من 0 إلى 1 أو من 1 إلى 0 - يتبع
out2قيمةout1(نفس قيمةout1)
ما يجب فعله:
- أضف كتلة
always @(posedge clk) - بالداخل، اجعل
out1يتبدل (استخدمout1 = ~out1) - اجعل
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة التحسسالإسناد الحاجبالإسناد غير الحاجبمراجعة - Always مقابل Initial