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

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

جزء من قسم الأساسيات في رحلة 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 بثلاثة أشياء عن كل منفذ:

  1. الاتجاه — هل هو `input` أم `output` أم inout؟
  2. الحجم — كم عدد الـ `bit` في عرضه؟
  3. الاسم — ماذا يُطلق عليه (`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
challenge icon

التحدي

أكمل إعلانات المنافذ (Port Declarations)

المطلوب عمله:

  1. أضف input بحجم 8-bit باسم data_in
  2. أضف input أحادي الـ bit باسم clk
  3. أضف output بحجم 4-bit باسم result (استخدم reg — سيتم تعيينه داخل كتل always)
  4. أضف 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
quiz iconاختبر نفسك

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

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