Menu
CoddyTech

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

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

منافذ الإدخال والإخراج هي التوصيلات التي تسمح للوحدة بالتواصل مع العالم الخارجي. وهي تشبه الأرجل الموجودة على الشريحة. المنافذ هي الواجهة بين الوحدة وبقية التصميم.

تحتوي كل وحدة على:

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

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

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

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

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

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

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

ترسل منافذ الإخراج البيانات إلى الخارج. ويمكن التحكم بها باستخدام كتل assign أو كتل always.

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

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

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

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

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

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

لماذا يهم اتجاه المنفذ

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

  • ما الإشارات التي يمكن للوحدة قراءتها (المدخلات)
  • ما الإشارات التي يمكن للوحدة كتابتها (المخرجات)
  • ما أنواع التوصيلات المسموح بها

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

مثال على الشيفرة

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;        // الكتابة إلى خرج من نوع reg
  end
  
  assign diff = a - b;   // الكتابة إلى خرج من نوع wire
endmodule
challenge icon

التحدي

أكمل تعريفات المنافذ

ما المطلوب:

  1. أضف مدخلًا بعرض 8 بتات باسم data_in
  2. أضف مدخلًا بعرض بت واحد باسم clk
  3. أضف مخرجًا بعرض 4 بتات باسم result (استخدم reg: ستُسنَد قيمته في كتلة always)
  4. أضف مخرجًا بعرض بت واحد باسم 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 عبر الإنترنت