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];
endmoduleLocalparam
إنّ 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 للثوابت التي لا ينبغي أن تتغير.
التحدي
أضف parameter باسم WIDTH بقيمة افتراضية قدرها 4.
ما يجب القيام به:
- أضف
parameterباسمWIDTH - اضبط قيمته الافتراضية على
4 - يوضع الـ
parameterداخل#( )بعد اسم الـmodule
جرّب بنفسك
module counter #(
// أضف المعامل WIDTH هنا بالقيمة الافتراضية 4
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة