יציאות קלט-פלט
חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 32 מתוך 90.
יציאת inout היא יציאה דו־כיוונית שיכולה גם לשלוח וגם לקבל אותות. היא יכולה לשמש כקלט או כפלט בזמנים שונים. רוב היציאות הן או input (נתונים זורמים פנימה) או output (נתונים זורמים החוצה). יציאת inout יכולה לעשות את שני הדברים. היא יכולה להוציא נתונים או לקבל נתונים, בהתאם למצב.
חשבו על זה כמו על רחוב דו־סטרי במקום כביש חד־סטרי.
יציאות 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, המודול משחרר את האפיק (מצב קלט, high-Z)
כללים חשובים עבור Inout
| כלל | למה |
|---|---|
יש להצהיר עליו כ-wire | לא ניתן להשתמש ב-reg |
| אי אפשר לקרוא ולכתוב בו-זמנית | הדבר ייצור התנגשות (X) |
השתמשו ב-Z כדי לשחרר את האפיק | כך התקנים אחרים יכולים להפעיל אותו |
| רק התקן אחד יכול להפעיל אותו בכל רגע נתון | מונע התנגשות באפיק |
Inout לעומת Input לעומת Output
| סוג היציאה | כיוון | יכול להניע | יכול לקרוא |
|---|---|---|---|
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 אונליין