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

Input And Output Ports

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

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

كل وحدة لها:

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

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

تستقبل منافذ الإدخال data من الخارج. لا يمكن تغييرها داخل module: يمكن 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 بما يلي:

  • ما الإشارات التي يمكن لـ module can read (inputs)
  • ما الإشارات التي يمكن لـ module can write (outputs)
  • ما أنواع الاتصالات المسموح بها

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

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

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 عبر الإنترنت