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

Parameters

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

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

لكن ماذا لو كنت تحتاج إلى أن تكون كل نسخة مختلفة؟ على سبيل المثال، عدّاد واحد بحجم 8 بت، وعدّاد واحد بحجم 16 بت، وعدّاد واحد بحجم 32 بت. من دون parameters، ستحتاج إلى كتابة ثلاث وحدات 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.

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

استخدام Parameters

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

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

تجاوز parameter

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

// العرض الافتراضي (8 بت)
counter u1 (.clk(clk), .reset(reset), .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 ذلك، ولكن لا يمكن 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

التحدي

أضف مُعامِلًا يُسمّى 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 عبر الإنترنت