ربط المنافذ حسب الاسم
جزء من قسم الأساسيات في رحلة 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت