قائمة التحسس
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 48 من 90.
تخبر قائمة الحساسية (sensitivity list) كتلة always متى يتم التنفيذ. وتُكتب داخل أقواس بعد رمز @.
قائمة الحساسية (sensitivity list) هي مجموعة من الإشارات أو الأحداث التي تُحفز كتلة always. عندما تتغير أي إشارة في القائمة، يتم تنفيذ الكتلة.
الصيغة:
always @(sensitivity_list) begin
// يتم تشغيل الكود عندما تتغير الإشارات في القائمة
endأنواع قائمة الحساسية (Sensitivity List)
| النوع | الصيغة (Syntax) | متى يتم تنفيذ الكتلة (Block) |
|---|---|---|
| جميع الإشارات (توافقي - combinational) | always @(*) | عندما تتغير أي إشارة بالداخل |
| إشارات محددة | always @(a or b) | عندما تتغير a أو b |
| قدح الحافة (تتابعي - sequential) | always @(posedge clk) | عند الحافة الصاعدة للساعة (clock) |
| حواف متعددة | always @(posedge clk or posedge reset) | عند حافة الساعة أو حافة إعادة الضبط (reset) |
الخيار 1: جميع الإشارات (*)
الأكثر أماناً وشيوعاً للمنطق التوافقي (combinational logic).
always @(*) begin
out = a & b; // يتم التشغيل عندما يتغير a أو b
endتقوم الـ * بتضمين جميع الإشارات المقروءة في الكتلة تلقائياً.
الخيار 2: إشارات محددة
always @(a or b) begin
out = a & b; // يتم التشغيل عندما يتغير a أو b
endإذا نسيت إشارة، فستحصل على مزلاج (latch) (ذاكرة غير مقصودة).
الخيار 3: قدح الحافة (posedge)
always @(posedge clk) begin
q <= d; // يعمل عند الحافة الصاعدة للساعة
endاستخدم posedge للحافة الصاعدة، و negedge للحافة الهابطة.
الخيار 4: حواف متعددة
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endيعمل عند حافة الساعة أو حافة إعادة الضبط.
أخطاء شائعة
| الخطأ | لماذا هو خاطئ |
|---|---|
always @(a or b or c) ولكن يستخدم d | نقص في d ← latch |
always @(posedge clk or reset) | نقص في posedge لـ reset |
always @(clk) | يجب استخدام posedge clk لـ flip-flops |
التحدي
ما يجب القيام به:
- أضف قائمة الحساسية (sensitivity list) الصحيحة لجعل هذا الـ flip-flop يعمل. يجب أن يتم تنفيذ الكتلة البرمجية عند الحافة الصاعدة لـ
clk.
ورقة مرجعية
تأتي قائمة الحساسية (sensitivity list) بعد @ وتحدد متى يتم تنفيذ كتلة always:
always @(sensitivity_list) begin
// يتم التنفيذ عند تغير الإشارات المدرجة
end| النوع | الصيغة | يتم التفعيل عندما |
|---|---|---|
| جميع الإشارات | always @(*) | تتغير أي إشارة مقروءة |
| إشارات محددة | always @(a or b) | تتغير a أو b |
| الحافة الصاعدة | always @(posedge clk) | الحافة الصاعدة لـ clk |
| حواف متعددة | always @(posedge clk or posedge reset) | يتم تفعيل أي من الحافتين |
استخدم @(*) للمنطق التوافيقي (combinational logic)؛ واستخدم posedge/negedge للمنطق التتابعي (sequential logic):
// توافيقي (Combinational)
always @(*) begin
out = a & b;
end
// تتابعي (قلاب مع إعادة ضبط غير متزامنة)
always @(posedge clk or posedge reset) begin
if (reset) q <= 0;
else q <= d;
endأخطاء شائعة: يؤدي فقدان إشارة في قائمة محددة إلى حدوث مزلاج (latch)؛ كتابة always @(clk) بدلاً من always @(posedge clk) للقلابات (flip-flops)؛ إغفال posedge قبل reset في قائمة متعددة الحواف.
جرّب بنفسك
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة التحسسالإسناد الحاجبالإسناد غير الحاجبمراجعة - Always مقابل Initial