משווה 32 ביט על ידי ורילוג

Posted on June 20, 2010

0


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

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

פירוט הקוד

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

module comp_32

parameter word_size = 32;

input [word_size-1:0]

output A_greater_B, A_little_B, A_equal_B;

assign A_greater_B = (A>B),

A_little_B = (A<B),

A_equal_B = (A==B);

endmodule


עיבוד הרעיון לשימוש שונה

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

module comp_32_edg_sense

input A1,A0,B1,B0;

output A_greater_B, A_little_B, A_equal_B;

reg A_greater_B, A_little_B, A_equal_B;

always @(A0 or A1 or B0 or B1)

begin

A_little_B = ({A1,A0}<{B1,B0});

A_greater_B = ({A1,A0}>{B1,B0});

A_equal_B = ({A1,A0}=={B1,B0});

endmodule

כמה נקודות חשובות

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

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

module comp_32_edg_sense

input [1:0] A,B;

output A_greater_B, A_little_B, A_equal_B;

reg A_greater_B, A_little_B, A_equal_B;

always @(A or B)

begin

A_little_B = 0;

A_greater_B = 0;

A_equal_B = 0;

if (A==B)

A_equal_B=1;

else if (A>B)

A_greater_B=1;

else

A_little_B=1;

end

endmodule

הערה מקצועית

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


Posted in: Electronic