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

Parameters

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

يمكنك إنشاء العديد من النسخ من نفس الـ module واستخدامها في أماكن مختلفة — ويُسمى هذا **multiple instances**. بدلاً من كتابة الكود نفسه مراراً وتكراراً، تكتبه مرة واحدة وتُعيد استخدامه بقدر ما تحتاجه. كل instance هي نسخة منفصلة من ذلك العتاد على الشريحة.

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

تحل الـ Parameters هذه المشكلة.

المُعلّمة (parameter) هي قيمة ثابتة يمكنك تحديدها عند إنشاء إنشاء نموذج (instance). وهي تتيح لك تهيئة كل نسخة من الـ module بشكل مختلف.

الإعلان عن المعاملات

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.

أثناء الإعلان عن المعاملات (parameters)، نستخدم الرمز # بعد اسم الـ module مباشرةً وقبل قائمة المنافذ (port list). يخبر الرمز # لغة Verilog أن ما يليه هو قائمة من parameter التي تُهيئ الـ module. إذا لم يحتوي الـ module الخاص بك على أي parameter، يمكنك ببساطة حذف الرمز # بالكامل.

استخدام الـ Parameters

يمكن استخدام الـ parameters في أي مكان يتطلب وجود ثوابت (constants):

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

تجاوز الـ Parameters

عند استخدام الـ module، يمكنك تغيير قيمة الـ parameter:

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

// تجاوز إلى 16 بت
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Multiple Parameters

يمكنك استخدام multiple parameters:

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 مشابه له ولكنه لا يمكن تعديله (overridden) من الخارج:

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

التحدي

أضف parameter باسم WIDTH بقيمة افتراضية قدرها 4.

ما يجب القيام به:

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

جرّب بنفسك

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

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

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

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