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

قائمة التحسس

جزء من قسم الأساسيات في رحلة 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
challenge icon

التحدي

ما يجب القيام به:

  1. أضف قائمة الحساسية (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
quiz iconاختبر نفسك

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

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