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

Port Mapping By Name

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

في الدرس السابق، تعلمت كيفية إنشاء مثيل لوحدة من خلال تمرير الإشارات بالترتيب نفسه الذي تظهر به المنافذ في تعريف الوحدة. ينجح هذا الأسلوب، لكنه ينطوي على مشكلة: الترتيب مهم.

إذا أخطأتَ عن طريق الخطأ في ترتيبها، فستتصل الإشارات بالمنافذ الخاطئة. وقد يصعب تصحيح هذا الخطأ.

مشكلة تعيين الترتيب

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: خطأ دقيق يسهل تفويته.

الحل: تعيين المنافذ بالاسم

يستخدم تعيين المنافذ بالاسم اسم المنفذ لإجراء الاتصالات. لا يهم الترتيب لأن كل اتصال يكون مُسمّى بوضوح.

البنية النحوية:

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

تشير النقطة . قبل اسم المنفذ إلى أننا نشير إلى منفذ داخل الوحدة. أما الإشارة الموجودة داخل الأقواس فهي ما نوصله به.

مثال

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

يقول هذا صراحةً:

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

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

عند تعيين المنافذ حسب الاسم، يمكنك كتابة التوصيلات بأي ترتيب:

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

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

التحدي

أكمل إنشاء النسخة بإضافة توصيلات المنافذ المفقودة باستخدام تعيين المنافذ حسب الاسم.

ما يجب فعله:

  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اختبر نفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت