פרימיטיבים ב verilog מול vhdl

Posted on April 17, 2010

0


מהם בעצם פרימיטיבים בשפות verilog ו vhdl ? למה אנחנו צריכים אותם

פרימיטיבים הם העצמות, אבני היסוד של השפה. על ידי פרימיטיבים אנחנו מסוגלים להגדיר דברים ברורים (לנו) כגון שער or או מהו not.

הצורך בכתיבת פרימיטיבים שאינם מסופקים על ידי חבילת התוכנה בה אנו משתמשים עולה כאשר אנחנו משתמשים בגירסאות חינמיות ומעצם כך מוגבלות בכמות הפרימיטיבים שניתנים לנו.

סיבה נוספת יכולה להיות שימוש ברכיב מיוחד שאיננו מופיע בחבילות התוכנה. מדי פעם הרכיב תוכנן במיוחד לפרוייקט מסויים ולכן אין להשיג כלל פרימיטיב לרכיב. בנקודה זו עלינו פשוט לכתוב פרימיטיב לרכיב אם איננו רוצים לכתוב כל פעם מחדש, במהלך התוכנית, את הגדרותיו. כמובן שמרגע כתיבת הפרימיטיב נוכל פשוט לקרוא לו ובכך לחסוך זמן, מאמץ והרבה שורות פקודה.

פרימיטיבים ב  verilog

למעשה, הדוגמא שאני אתן תיהיה לסוג מסויים של פרימיטיב. ניתן לכתוב פרימיטיב על ידי הגדרת התנהגות לכניסה מסויימת, על ידי פונקציה כלשהי (אולי מתמטית), על ידי כתיבת טבלת ערעור של ממש ועוד.

הדוגמאות שלי יהיו הבסיסיות ביותר, כלומר כתיבת טבלת ערעור.

primitive my_mux (mux_out, select, a, b);

output mux_out;

input select, a, b;

table

// select row        a row     b  row   :   mux_out

0                    0              0       :     0;

0                    0              1        :     0;

0                    0              x        :     0;   // here x is like z

0                    1              0        :     1;

0                    1               1         :     1;

0                    1               x         :     1;

1                    0              0         :     0;

1                    1               0         :     0;

1                     x               0        :     0;

1                     0               1        :     1;

1                     1                1        :     1;

1                     x                1        :     1;

x                    0               0        :     0;

x                     1               1         :     1 ;

endtable

endprimitive

פרימיטיבים ב vhdl

לא הצלחתי למצוא הסברים להזנת טבלת אמת כמו שעשיתי בורילוג (אני אשמח עם מי מכם יאיר את עיני בנושא). בכל מקרה החלטתי לבנות את הטבלה על ידי וקטור של שלושה משתנים ובכך להזין לתוכו את האינפורציה על הכניסות והיציאות האפשריות. אבל יש בעיה. במידה ונעשה כך נקבל אובייקט בעל כניסה אחת ויציאה אחת וזאת מכיוון שהמהדר יצפה לקבל וקטור כלומר שירשור של אינפורציה מאותו מקור.

שימו לב לקוד ולתוצאת המהדר:

library ieee;
use ieee.std_logic_1164.all;

entity my_mux is                                        — the primitive entity
port( x: in std_logic_vector (0 to 2);      –here x is
y  : out std_logic);                                       –x0=x
end my_mux;                                               –x1=y
–x2=sel

architecture primitive of my_mux is      — and y is out
begin
with x select
y <= ‘1’ when “010”|”101″|”111″,
‘0’ when others;

end primitive;

בכדי לפתור את הבעיה נשתמש בלינק מסויים שיחבר לנו את הכניסות השונות לכדי וקטור שיקל עלינו את עבודת העיבוד בתוך האובייקט.

input <= a & b & c;

אחרי תיקון של הקוד נקבל:

library ieee;
use ieee.std_logic_1164.all;

entity my_mux2 is — the primitive entity
port( x,y,sel: in std_logic;
info_out: out std_logic);
end my_mux2;

architecture primitive of my_mux2 is
— here we decalre the signals
signal inputs : std_logic_vector (2 downto 0);
signal outputs : std_logic;
begin
inputs <= x & y & sel;
with inputs select
outputs <= ‘1’ when “010”|”101″|”111″,
‘0’ when others;

info_out <= outputs;
end primitive;

והתוצאה תתאים  למה שרצינו.

Posted in: Electronic