Menu
CoddyTech

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

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