المعاملات
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 11 من 90.
يمكنك إنشاء نسخ عديدة من الوحدة نفسها واستخدامها في أماكن مختلفة. يُسمّى هذا **تعدّد النسخ**. بدلًا من كتابة الشيفرة نفسها مرارًا وتكرارًا، تكتبها مرة واحدة وتعيد استخدامها كلما احتجت إليها. كل نسخة هي نسخة منفصلة من ذلك العتاد على الشريحة.
ولكن ماذا لو كنت تحتاج إلى أن تكون كل نسخة مختلفة؟ على سبيل المثال، عدّاد واحد من 8 بتات، وآخر من 16 بتًا، وثالث من 32 بتًا. من دون معاملات، ستحتاج إلى كتابة ثلاث وحدات منفصلة.
المعاملات تحل هذه المشكلة.
المعامل هو قيمة ثابتة يمكنك تعيينها عند إنشاء نسخة. يتيح لك ضبط كل نسخة من الوحدة بطريقة مختلفة.
التصريح عن المعاملات
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.
عند التصريح عن المعلمات، نستخدم الرمز # مباشرةً بعد اسم الوحدة وقبل قائمة المنافذ. يشير # إلى Verilog بأن ما يليه هو قائمة من المعلمات التي تهيئ الوحدة. إذا لم تكن وحدتك تحتوي على معلمات، فما عليك سوى حذف # بالكامل.
استخدام المعاملات
يمكن استخدام المعاملات في أي موضع تكون فيه هناك حاجة إلى ثابت:
reg [WIDTH-1:0] data; // حجم المتجه
count <= count + 1; // يعمل مع أي عرض
assign out = data[WIDTH-1]; // موضع البت الأعلى أهمية (MSB)تجاوز المعلمات
عند استخدام الوحدة، يمكنك تغيير قيمة المعلمة:
// العرض الافتراضي (8 بتات)
counter u1 (.clk(clk), .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، لكن لا يمكن تجاوز قيمته من الخارج:
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 عبر الإنترنت