חזור לתיקייה: 00440252 - מערכות ספרתיות ומבנה המחשב

4 - זיכרון

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • דְּלַגְלַג (Flip Flop)
  • נעילת Flip Flop
  • קישורים של Flip Flop-ים
  • סוגים של מעגלים
  • אוגר - Register

4 - זיכרון

00440252

מערכות ספרתיות ומבנה המחשב

רשימות הרצאה לקריאה בשבת

זיכרון

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

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

מערכת סגורה בעלת שני רכיבים היא יציבה. זאת לעומת מערכת בעלת 3 רכיבים שמשנה את ערכה כל כמה זמן.
לכן, מערכת בעלת 2 רכיבים היא רכיב זיכרון אשר מאפשרת לנו לשמור בה ערכים.
​4 - זיכרון 2026-05-26 17.37.11.excalidraw.svg
אך איך נוכל להכניס אליה ערכים? נשתמש בטריק מגניב: נהפוך את שעך ה-NOTNOTNOT שלנו לשער NORNORNOR כאשר כניסה אחת שלו היא 000.
​4 - זיכרון 2026-05-26 17.39.22.excalidraw.svg
כעת, אם נשנה את הערך 000 בכל אחד מהם נוכל לשנות את הערך בתוך רכיב הזכרון שלנו. איזה יופי, אה?
נתן לרגליים שמות: SSS לרגל השמאלית ו-RRR לרגל הימנית. למה? כי הכנסת 1 ל-SSS משנה את הערך ל-111 והכנסת 111 ל-RRR עושה ResetResetReset לזכרון.
​ספרתיות הרצאה 5 - 4.png
לרכיב הזה קוראים:

SR    Latch\LARGE SR\;\; LatchSRLatch

נראה כיצד הוא עובד:

SRQ(t+1)00Q(t)010101110\begin{array}{cc|c} S & R & Q(t+1) \\ \hline 0 & 0 & Q(t) \\ 0 & 1 & 0 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \end{array}S0011​R0101​Q(t+1)Q(t)010​​

בעצם הכנסת 0,00,00,0 מאפשרת שמירה של הערך הקודם שנכנס.
האם אנו באמצת צריכים להכניס את ה-1,11,11,1 הזה? לא ממש כי כבר יש לנו אפס - אבל באמת איכפת לנו שיהיה אותו? כן! זאת מכיוון ש-(1) קשה להוריד בדיוק באותו זמן את הערך בשני חוטים שונים ובנוסף, גם אם הצלחנו אז (2) אנו לא יודעים אילו מהרכיבים מהיר יותר ואז אחד מהם יתעדכן קודם ונקבל את אחד המצבים האחרים שזה לא מה שאנו רוצים.
לכן, הכנסת 1,11,11,1 ל-SR LatchSR\,LatchSRLatch היא פעולה לא חוקית.

עדיין יש לנו בעיה. אם נניח לאחד החוטים לוקח יותר זמן להתעדכן מהשני או שיש איזה עיכוב או משהו כזה, התוצאה תצא לא נכונה, שכן העדכון הוא מיידי. נרצה דרך להחליט מתי הרכיב שלנו יוכל לקבל מידע נוסף ומתי הוא יוכל להתעדכן. לכניסה חדשה זו נקרא GateGateGate והיא תחליט מתי ה-LatchLatchLatch שלנו יתעדכן:

SR    Gated    Latch\LARGE SR\;\; Gated\;\; LatchSRGatedLatch

​ספרתיות הרצאה 5 - 5.png

GSRQ(t+1)0∅∅Q(t)10101101111X\begin{array}{ccc|c} G & S & R & Q(t+1) \\ \hline 0 & \varnothing & \varnothing & Q(t) \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & X \end{array}G0111​S∅011​R∅101​Q(t+1)Q(t)01X​​

נוצרה לנו כעת בעיה חדשה - אנו נדרשים להכניס שלושה חוטים כדי לשמור על ערך אחד. כדי לפתור זאת, נחבר את SSS ו-RRR ע"י שער NOTNOTNOT ונקרא לרגל הזאת DDD. נקבל:

D−Latch\LARGE D-LatchD−Latch

​ספרתיות הרצאה 5 - 6.png

GDQ(t+1)0∅Q(t)100111\begin{array}{cc|c} G & D & Q(t+1) \\ \hline 0 & \varnothing & Q(t) \\ 1 & 0 & 0 \\ 1 & 1 & 1 \end{array}G011​D∅01​Q(t+1)Q(t)01​​

דְּלַגְלַג (Flip Flop)

יש לנו בעיה, היא מאוד דומה לבעיה שבגללה הוספנו את רגל ה-GGG. הבעיה הינה שכל עוד G=1G=1G=1 המערכת שלנו יכולה להשתנות. אנו רוצים שברגע מסויים היא תשתנה ולא תשתנה עוד. לשם כך נוסיף יצור בשם ClockClockClock אשר ברגע שהוא עולה מ-000 ל-111 הוא משנה את המצב פעם אחת ותו לא.

אנחנו נבנה רכיב flip−flopflip-flopflip−flop עם שני רכיבי D−LatchD-LatchD−Latch אשר ישמשו כמעין כספת עם שני מנעולים.
לפני שהשעון יהפוך ל-111 הרכיב הראשון ידגום את הקלט, וברגע שהוא יהפוך ל-111 הרכיב הראשון ינעל והשני יפתח ואז מה שאנו רוצים לשמור יעבור מהראשון לשני. אחרי זה, הרכיב השני ינעל מחדש והראשון יפתח מחדש כדי לקלוט עוד מידע לצורכינו.
כך זה יראה:
​ספרתיות הרצאה 5 - 7.png
נסמן אותו כך:
​ספרתיות הרצאה 5 - 8.png

הרכיב הזה דורש זמן כדי לעבוד. אנו נדרשים לזמן טעינה tSUt_{SU}tSU​ אשר מאפשר ל-LatchLatchLatch הראשון לקבל את הערך הרצוי ובנוסף נדרש גם לזמן החזקה - tHt_{H}tH​ אשר מאפשר לערך להינעל לפני שאנו פותחים את השער מחדש.
​ספרתיות הרצאה 5 - 9.png

נעילת Flip Flop

ניתן להוסיף רגל נוספת אשר תאפשר לנו לנעול את הזכרון שלנו. את רגל זו נוסיף באמצעות בוחר שכזה והיא תראה כך:
​ספרתיות הרצאה 5 - 11.png

קישורים של Flip Flop-ים

​ספרתיות הרצאה 5 - 10.png
לפני עליית השעון:

  • בכניסה ininin ישנו ערך aaa.
  • ה-DFFDFFDFF השמאלי שומר את הערך bbb וה-DFFDFFDFF הימני שומר את הערך ccc.

לאחר עליית השעון:

  • ה-DFFDFFDFF השמאלי קיבל ושומר את aaa.
  • ה-DFFDFFDFF הימני קיבל ושומר את bbb.
  • הערך ccc לא נשמר יותר

סוגים של מעגלים

ניתן להסתכל כעת על שני סוגים שונים של מעגלים:

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

אוגר - RegisterRegisterRegister

ה-Flip  FlopFlip\; FlopFlipFlop שראינו מאפשר לנו לבנות רגיסטרים המאפשרים כתיבה או קריאה בו זמנית של מספר סיביות.
רגיסטר אשר שומר על ביט אחד הוא פשוט מעגל Flip  FlopFlip\; FlopFlipFlop והוא נראה כך:
​ספרתיות הרצאה 5 - 12.png
כאשר נרצה לשמור מילים של 323232 ביטים זה יהיה חיבור של 323232 מעגלים כאלו אשר להם יהיו להם כניסות ויציאות שונות חוץ מכניסת ה- וכניסת ה- אשר יהיו זהות לכל המעגלים.
כעת, לאחר שבנינו רגיסטר שיכול לשמור 323232 ביטים, נבנה מערכת זכרון של מחשב עם 323232 רגיסטרים:
​ספרתיות הרצאה 5 - 13.png
במערכת זו יש לנו מפענח אחד המאפשר לכתוב, שני בוררים אשר בעזרתם אנו בחורים מאיזה 2 רגיסטרים לקרוא.
למה אנו קוראים מ-2 רגיסטרים בו זמנית? כדי לאפשר לנו לבצע פקודות כמו add אשר לוקחות ערכים משני רגיסטרים. אנו נטען את הערכים הללו באותו הזמן ואז נחזיר אותם לרגיסטר שלישי באמצות כתיבה אליו.

הערה

מכל רגיסטר יוצאים 323232 חוטים שכן יש 323232 מעגלי DFFDFFDFF בכל רגיסטר.

איך כותבים דבר כזה בשפת תיאור חומרה?

module registerfile (Read1,Read2,WriteReg,WriteData,RegWrite,Data1,Data2,clock);
	input logic [4:0] Read1,Read2,WriteReg; // reg numbers to read or write
	input logic [31:0] WriteData; // data to write 
	input logic RegWrite, // the write control 
		clock; // the clock to trigger write
	output logic [31:0] Data1,Data2; // the register values read
	logic [31:0] RF [31:0]; // 32 registers each 32 bits long
	assign Data1 = RF[Read1]; // 32->1 selector x 32 (asynchronous)
	assign Data2 = RF[Read2]; // 32->1 selector x 32
	
	always_ff begin 
		// write the register with new value if Regwrite is high
		@(posedge clock) if (RegWrite) RF[WriteReg] <= WriteData; // Decoder(synch)
	end 
endmodule
הערה

ישנו גם יצור בשם Shit  RegisterShit\; RegisterShitRegister אשר מאפשר לשמור מידע כמו ששמרנו קודם באמצעות הזזה של הקלטים כך:
​ספרתיות הרצאה 5 - 14.png
כל סיבית מתקדמת DFF אחד כל מחזור שעון.