יציאות קלט-פלט
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 32 מתוך 90.
יציאת inout היא יציאה דו־כיוונית שיכולה גם לשלוח וגם לקבל אותות. בזמנים שונים היא יכולה לתפקד כקלט או כפלט. רוב היציאות הן input (הנתונים זורמים פנימה) או output (הנתונים זורמים החוצה). יציאת inout יכולה לעשות את שני הדברים. בהתאם למצב, היא יכולה להוציא נתונים או לקבל נתונים.
חשוב על זה כמו על רחוב דו־סטרי במקום על דרך חד־סטרית.
משתמשים ביציאות קלט/פלט דו־כיווניות עבור:
- אפיקים משותפים: כמה התקנים מחוברים לאותם חוטים
- אפיקי נתונים של זיכרון: אפשר לקרוא או לכתוב נתונים
- תקשורת דו־כיוונית: I2C, SPI וכו׳
רק התקן אחד מניע את האפיק בכל רגע נתון. התקנים אחרים חייבים להיות במצב עכבה גבוהה (Z).
הצהרת יציאת inout
inout [7:0] data_bus; // אפיק דו־כיווני של 8 ביטים
inout ready; // אות דו־כיווני של ביט יחידאיך Inout פועל
יציאת inout דורשת אות בקרה כדי לקבוע אם היא פועלת כקלט או כפלט:
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // Drive bus when enabled, else Z
assign data_in = bus; // Always read the bus
endmodule- כאשר
enable = 1, המודול מניע את האפיק (מצב פלט) - כאשר
enable = 0, המודול משחרר את האפיק (מצב קלט, עכבה גבוהה)
כללים חשובים עבור Inout
| כלל | למה |
|---|---|
יש להצהיר עליו בתור wire | הוא לא יכול להיות reg |
| אסור לכמה התקנים להניע את האפיק בו-זמנית | התקנים מניעים סותרים יוצרים X |
יש להשתמש ב-Z כדי לשחרר את האפיק | כך התקנים אחרים יכולים להניע אותו |
| רק התקן אחד מניע בכל פעם | מונע התנגשות באפיק |
כניסה/יציאה לעומת כניסה לעומת יציאה
| סוג יציאה | כיוון | יכול להניע | יכול לקרוא |
|---|---|---|---|
input | כיוון אחד (כניסה בלבד) | לא | כן |
output | כיוון אחד (יציאה בלבד) | כן | כן (את הערך שהוא מניע) |
inout | שני כיוונים (שניהם) | כן (כאשר מופעל) | כן (תמיד) |
טעות נפוצה
// שגוי: אי אפשר לבצע השמה ל-inout בתוך בלוק always
always @(posedge clk) begin
data_bus <= something; // שגיאה! יש להשתמש ב-assign עם תנאי
end
// נכון: יש להשתמש ב-assign עם תנאי enable
assign data_bus = (enable) ? something : 8'bZ;אתגר
הוסף את יציאת inout החסרה ואת פקודות assign כדי שהמאגר הדו־כיווני הזה יפעל.
מה לעשות:
- הוסף יציאת
inoutברוחב 8 ביט בשםio_bus - הוסף פקודת
assignשמניעה אתio_busבאמצעותsend_valueכאשרsend_enableהוא 1, ואחרת באמצעותZ - הוסף פקודת
assignשקוראת אתio_busלתוךreceive_value
נסו בעצמכם
module bidir_buffer (
// משימה 1: הוסיפו כאן פורט inout ברוחב 8 ביטים בשם io_bus
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// משימה 2: הוסיפו משפט assign שמציב את send_value על io_bus כאשר send_enable הוא 1, ואחרת מציב Z
// משימה 3: הוסיפו משפט assign שקורא את io_bus אל receive_value
endmoduleהשיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין