Menu
Coddy logo textTech

יציאות קלט-פלט

חלק מהיחידה יסודות במסלול ה-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;
challenge icon

אתגר

הוסף את יציאת inout החסרה ואת משפטי assign כדי שהמאגר הדו־כיווני הזה יפעל.

מה לעשות:

  1. הוסף יציאת inout בת 8 סיביות בשם io_bus
  2. הוסף משפט assign שמניע את io_bus באמצעות send_value כאשר send_enable הוא 1, ואחרת באמצעות Z
  3. הוסף משפט 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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין