المعاملات
جزء من قسم الأساسيات في رحلة 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت