قائمة التحسس
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 48 من 90.
تحدد قائمة الحساسية (sensitivity list) لكتلة always متى يتم التنفيذ (when to execute). وتُكتب بين قوسين بعد الرمز @.
إن قائمة الحساسية (sensitivity list) هي مجموعة من الإشارات (signals) أو الأحداث (events) التي تحفز كتلة always. عندما تتغير (changes) أي إشارة في القائمة، يتم تنفيذ الكتلة (executes).
الصياغة (Syntax):
always @(sensitivity_list) begin
// يعمل الكود عندما تتغير الإشارات في القائمة
endأنواع قائمة الحساسية (Sensitivity List)
| النوع | بناء الجملة (Syntax) | متى يتم تنفيذ الكتلة |
|---|---|---|
| جميع الإشارات (تجميعي/combinational) | always @(*) | عندما تتغير أي إشارة بداخلها |
| إشارات محددة | always @(a or b) | عندما يتغير a أو b |
| قدح بالحافة (تتابعي/sequential) | always @(posedge clk) | عند الحافة الصاعدة لـ clock |
| حواف متعددة | always @(posedge clk or posedge reset) | عند حافة clock أو حافة reset |
الخيار 1: جميع الإشارات (*)
الأكثر أمانًا والأكثر شيوعًا للـ combinational logic.
always @(*) begin
out = a & b; // يعمل عندما يتغير a أو b
endيتضمن الـ * تلقائيًا جميع الـ signals التي يتم قراءتها داخل الكتلة.
الخيار 2: إشارات محددة
always @(a or b) begin
out = a & b; // يعمل عندما يتغير a أو b
endإذا نسيت إشارة، فلن يتحدث الـ output في المحاكاة عندما تتغير تلك الإشارة — وبذلك لن تتطابق المحاكاة بعد الآن مع العتاد المصنع (synthesized hardware).
Option 3: Edge Trigger (posedge)
always @(posedge clk) begin
q <= d; // يعمل على الحافة الصاعدة للساعة
endاستخدم posedge للحافة الصاعدة (rising edge)، و negedge للحافة الهابطة (falling edge).
الخيار 4: حواف متعددة (Multiple Edges)
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
endيعمل عند حافة الـ clock أو حافة الـ reset.
الأخطاء الشائعة
| الخطأ | سبب الخطأ |
|---|---|
always @(a or b or c) ولكن يستخدم d | فقدان d ← يصبح output غير محدث في المحاكاة (عدم تطابق المحاكاة/التجميع) |
always @(posedge clk or reset) | فقدان posedge لـ reset |
always @(clk) | يجب استخدام posedge clk بالنسبة لـ flip-flops |
التحدي
ما يجب فعله:
- أضف قائمة الحساسية الصحيحة لجعل هذا الـ flip-flop يعمل. يجب أن تنفذ الكتلة البرمجية عند الـ
posedgeللـclk.
جرّب بنفسك
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