منافذ الإدخال والإخراج
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 31 من 90.
منافذ الإدخال input والإخراج output هي **الاتصالات** التي تسمح للموديول module بالتواصل مع العالم الخارجي. فهي تشبه الدبابيس (pins) الموجودة على الشريحة. تعتبر المنافذ هي الواجهة بين الموديول module وبقية التصميم.
كل `module` يتكون من:
- منافذ `input` — الإشارات التي تدخل إلى الـ `module`
- منافذ `output` — الإشارات التي تخرج من الـ `module`
منافذ Input
تستقبل منافذ Input البيانات من الخارج. ولا يمكن تغييرها داخل الـ module—بل يمكن قراءتها فقط.
input clk; // إدخال بت واحد
input [7:0] data; // متجه إدخال 8 بت
input a, b; // مدخلات متعددة في سطر واحدقواعد الـ inputs:
- لا يمكن أسند قيمة لها داخل الـ module
- لا يمكن الإعلان عنها كـ
reg - تكون
alwaysمن نوعwire(افتراضيًا)
منافذ الخرج (Output Ports)
ترسل منافذ الخرج البيانات إلى الخارج. ويمكن محركتها باستخدام كتل assign أو always.
output out; // خرج أحادي البت
output [3:0] result; // خرج 4 بت
output reg busy; // يمكن أن يكون الخرج reg
output wire ready; // يمكن أن يكون الخرج wireقواعد المخرجات (outputs):
- يمكن أن تكون
wire(معassign) أوreg(معalways) - يجب أن يتم توجيهها/تشغيلها بواسطة شيء ما داخل الـ
module
بناء جملة إعلان المنافذ (Port Declaration Syntax)
بناء جملة إعلان المنافذ هو الطريقة المحددة التي تكتب بها منافذ الإدخال input والإخراج output في الـ module. وهو يخبر Verilog بثلاثة أشياء عن كل منفذ:
- الاتجاه — هل هو `input` أم `output` أم inout؟
- الحجم — كم عدد الـ `bit` في عرضه؟
- الاسم — ماذا يُطلق عليه (`called`)؟
module example (
input [7:0] data_in, // متجه الإدخال
input clk, // إدخال واحد
input enable, // إدخال واحد
output reg [7:0] out, // سجل الإخراج
output busy // سلك الإخراج
);لماذا تهم اتجاهات المنافذ (Port Direction)
يحدد الاتجاه لـ Verilog:
- ما هي الإشارات التي يمكن للوحدة قراءتها (إشارات
input) - ما هي الإشارات التي يمكن للوحدة كتابتها (إشارات
output) - ما هي أنواع التوصيلات المسموح بها
يؤدي استخدام الاتجاه الخاطئ إلى حدوث أخطاء في التجميع (compilation errors).
مثال على الكود
module port_demo (
input [3:0] a, // يمكن القراءة فقط
input [3:0] b, // يمكن القراءة فقط
output reg [3:0] sum, // يمكن الكتابة (reg)
output [3:0] diff // يمكن الكتابة (wire)
);
always @(*) begin
sum = a + b; // الكتابة إلى output reg
end
assign diff = a - b; // الكتابة إلى output wire
endmoduleالتحدي
أكمل إعلانات المنافذ (Port Declarations)
المطلوب عمله:
- أضف
inputبحجم 8-bitباسمdata_in - أضف
inputأحادي الـbitباسمclk - أضف
outputبحجم 4-bitباسمresult(استخدمreg— سيتم تعيينه داخل كتلalways) - أضف
outputأحادي الـbitباسمvalid(استخدمwire— سيتم تعيينه باستخدامassign)
جرّب بنفسك
module port_challenge (
// المهمة 1: أضف مدخلاً بـ 8 بت يسمى data_in
// المهمة 2: أضف مدخلاً ببت واحد يسمى clk
// المهمة 3: أضف مخرجاً بـ 4 بت يسمى result (استخدم reg)
// المهمة 4: أضف مخرجاً ببت واحد يسمى valid (استخدم wire)
);
reg [3:0] counter;
always @(posedge clk) begin
counter <= counter + 1;
result <= counter;
end
assign valid = (counter > 8);
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة