Menu
CoddyTech

المعاملات

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

يمكنك إنشاء نسخ عديدة من الوحدة نفسها واستخدامها في أماكن مختلفة. يُسمّى هذا **تعدّد النسخ**. بدلًا من كتابة الشيفرة نفسها مرارًا وتكرارًا، تكتبها مرة واحدة وتعيد استخدامها كلما احتجت إليها. كل نسخة هي نسخة منفصلة من ذلك العتاد على الشريحة.

ولكن ماذا لو كنت تحتاج إلى أن تكون كل نسخة مختلفة؟ على سبيل المثال، عدّاد واحد من 8 بتات، وآخر من 16 بتًا، وثالث من 32 بتًا. من دون معاملات، ستحتاج إلى كتابة ثلاث وحدات منفصلة.

المعاملات تحل هذه المشكلة.

المعامل هو قيمة ثابتة يمكنك تعيينها عند إنشاء نسخة. يتيح لك ضبط كل نسخة من الوحدة بطريقة مختلفة.

التصريح عن المعاملات

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

يعرّف #(parameter WIDTH = 8) معلمةً تُسمّى WIDTH بقيمة افتراضية قدرها 8.

عند التصريح عن المعلمات، نستخدم الرمز # مباشرةً بعد اسم الوحدة وقبل قائمة المنافذ. يشير # إلى Verilog بأن ما يليه هو قائمة من المعلمات التي تهيئ الوحدة. إذا لم تكن وحدتك تحتوي على معلمات، فما عليك سوى حذف # بالكامل.

استخدام المعاملات

يمكن استخدام المعاملات في أي موضع تكون فيه هناك حاجة إلى ثابت:

reg [WIDTH-1:0] data;        // حجم المتجه
count <= count + 1;           // يعمل مع أي عرض
assign out = data[WIDTH-1];   // موضع البت الأعلى أهمية (MSB)

تجاوز المعلمات

عند استخدام الوحدة، يمكنك تغيير قيمة المعلمة:

// العرض الافتراضي (8 بتات)
counter u1 (.clk(clk), .count(count1));

// تغيير العرض إلى 16 بتًا
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

معلمات متعددة

يمكنك استخدام عدة معلمات:

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Localparam

يشبه localparam، لكن لا يمكن تجاوز قيمته من الخارج:

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

استخدم localparam للثوابت التي يجب ألا تتغير.

challenge icon

التحدي

أضف مُعاملًا باسم WIDTH بقيمة افتراضية 4.

ما المطلوب:

  1. أضف مُعاملًا باسم WIDTH
  2. اضبط قيمته الافتراضية على 4
  3. يوضع المُعامل داخل #( ) بعد اسم الوحدة

جرّب بنفسك

module counter #(
  // أضف المعامل WIDTH هنا بقيمة افتراضية 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconاختبر نفسك

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

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

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