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

ربط المنافذ بالاسم

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

في الدرس السابق، تعلمت كيفية إنشاء نموذج مفرد (instantiate a module) عن طريق تمرير الإشارات بنفس الترتيب الذي تظهر به الـ ports في تعريف الـ module. هذه الطريقة تعمل، لكن بها مشكلة: الترتيب مهم (order).

إذا قمت بالخلط بين الترتيب عن طريق الخطأ، ستتصل الإشارات بالـ ports الخاطئة (Wrong). وقد يكون من الصعب تصحيح هذا الخطأ.

مشكلة الربط بالترتيب

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// تعيين الترتيب - يجب أن يتطابق الترتيب
or_gate or1 (input_a, input_b, output_y);  // صحيح
or_gate or1 (input_b, input_a, output_y);  // خطأ! مدخلات متبادلة

السطر الثاني يقوم بتوصيل input_b بـ in1 و input_a بـ in2 — وهو خطأ برمجي دقيق يسهل إغفاله.

الحل: تعيين المنافذ بالاسم (Port Mapping By Name)

يستخدم تعيين المنافذ بالاسم اسم المنفذ (port name) لإجراء التوصيلات. الترتيب لا يهم لأن كل توصيل يتم تسميته بشكل صريح.

Syntax:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

النقطة . قبل اسم الـ port تشير إلى أننا نرجع إلى منفذ داخل الـ module. أما الـ signal الموجود داخل القوسين فهو ما نربطه به.

مثال

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

هذا يوضح صراحةً:

  • المنفذ in1 يحصل على الإشارة input_a
  • المنفذ in2 يحصل على الإشارة input_b
  • المنفذ result يحصل على الإشارة output_y

التيرتيب لا يهم

باستخدام رسم الخرائط لـ port بالاسم، يمكنك كتابة التوصيلات بأي ترتيب:

// الثلاثة جميعها متطابقة

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

or_gate or1 (
  .result(output_y),
  .in1(input_a),
  .in2(input_b)
);

or_gate or1 (
  .in2(input_b),
  .result(output_y),
  .in1(input_a)
);

جميعها تقوم بنفس الشيء تمامًا لأن كل توصيلة لها تسمية محددة.

challenge icon

التحدي

أكمل عملية إنشاء المثيل بإضافة اتصالات المنفذ المفقودة باستخدام **ربط المنافذ بالاسم** (port mapping by name).

ما يجب فعله:

  1. قم بتوصيل المنفذ clk بالإشارة clock_signal
  2. قم بتوصيل المنفذ data_in بالإشارة input_data
  3. قم بتوصيل المنفذ data_out بالإشارة output_data

جرّب بنفسك

module register (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out
);
  always @(posedge clk) begin
    data_out <= data_in;
  end
endmodule

module top (
  input clock_signal,
  input [7:0] input_data,
  output [7:0] output_data
);
  
  register reg1 (
    // TODO: أضف تعيينات المنافذ باستخدام صيغة .port(signal)
  );
  
endmodule
quiz iconاختبر نفسك

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

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