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)
);تُجري جميعها الشيء نفسه تمامًا لأن كل توصيلة تحمل تسمية.
التحدي
أكمل إنشاء النسخة بإضافة توصيلات المنافذ المفقودة باستخدام تعيين المنافذ حسب الاسم.
ما يجب فعله:
- صِل المنفذ
clkبالإشارةclock_signal - صِل المنفذ
data_inبالإشارةinput_data - صِل المنفذ
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت