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

منافذ الإدخال والإخراج

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

تُعد منافذ Input وoutput هي الاتصالات التي تتيح للوحدة module التواصل مع العالم الخارجي. وهي تشبه الأطراف الموجودة على شريحة. المنافذ هي الواجهة بين الوحدة وبقية التصميم.

كل وحدة لها:

  • منافذ Input: إشارات تأتي إلى الوحدة
  • منافذ Output: إشارات تخرج من الوحدة

منافذ الإدخال

تستقبل منافذ الإدخال البيانات من الخارج. لا يمكن تغييرها داخل الوحدة: يمكن read فقط.

input clk;        // إدخال أحادي البت
input [7:0] data; // متجه إدخال 8 بت
input a, b;       // مدخلات متعددة في سطر واحد

قواعد inputs:

  • لا يمكن إسناد قيمة إليها داخل module
  • لا يمكن التصريح عنها كـ reg
  • دائمًا wire (افتراضيًا)

منافذ Output

ترسل منافذ Output البيانات إلى الخارج. ويمكن تشغيلها بواسطة كتل assign أو always.

output out;           // خرج بت واحد
output [3:0] result;  // خرج 4 بت
output reg busy;      // يمكن أن يكون الخرج reg
output wire ready;    // يمكن أن يكون الخرج wire

قواعد المخرجات:

  • يمكن أن تكون wire (مع assign) أو reg (مع always)
  • يجب أن تكون مدفوعة بشيء داخل الوحدة

صيغة تعريف المنافذ

صيغة تعريف المنافذ هي الطريقة المحددة التي تكتب بها منافذ input وoutput في module. وهي تخبر Verilog بثلاثة أشياء عن كل منفذ:

  1. الاتجاه: هل هو input أم output أم inout؟
  2. الحجم: كم عدد البتات التي يتكون منها؟
  3. الاسم: ما اسمُه؟
module example (
  input [7:0] data_in,    // متجه الإدخال
  input clk,              // إدخال واحد
  input enable,           // إدخال واحد
  output reg [7:0] out,   // خرج reg
  output busy             // خرج wire
);

لماذا يُعد اتجاه المنفذ مهمًا

يُخبر الاتجاه Verilog بما يلي:

  • ما الإشارات التي can readها الوحدة (inputs)
  • ما الإشارات التي can writeها الوحدة (المخرجات)
  • ما أنواع الاتصالات المسموح بها

يؤدي استخدام الاتجاه الخاطئ إلى حدوث أخطاء في الترجمة البرمجية.

مثال على الكود

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
challenge icon

التحدي

إكمال إعلانات المنافذ

ما يجب فعله:

  1. Add إدخالًا بحجم 8-bit يُسمى data_in
  2. Add إدخالًا بحجم single-bit يُسمى clk
  3. Add إخراجًا بحجم 4-bit يُسمى result (استخدم reg: ستتم إسناد قيمته في كتلة always)
  4. Add إخراجًا بحجم single-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
quiz iconاختبر نفسك

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

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

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