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];
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 للثوابت التي يجب ألا تتغير.
التحدي
أضف مُعامِلًا يُسمّى WIDTH بقيمة افتراضية 4.
ما يجب فعله:
- أضف مُعامِلًا باسم
WIDTH - اضبط قيمته الافتراضية على
4 - يأتي المُعامِل داخل
#( )بعد اسم الوحدة
جرّب بنفسك
module counter #(
// أضف المعامل WIDTH هنا بالقيمة الافتراضية 4
)(
input clk,
input reset,
output reg [WIDTH-1:0] count
);
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت