פרמטרים
חלק מהיחידה יסודות במסלול ה-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), .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 דומה, אך אי אפשר לשנות את ערכו מבחוץ:
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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין