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

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

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

דְּלַגְלַג (Flip Flop)
יש לנו בעיה, היא מאוד דומה לבעיה שבגללה הוספנו את רגל ה-. הבעיה הינה שכל עוד המערכת שלנו יכולה להשתנות. אנו רוצים שברגע מסויים היא תשתנה ולא תשתנה עוד. לשם כך נוסיף יצור בשם אשר ברגע שהוא עולה מ- ל- הוא משנה את המצב פעם אחת ותו לא.
אנחנו נבנה רכיב עם שני רכיבי אשר ישמשו כמעין כספת עם שני מנעולים.
לפני שהשעון יהפוך ל- הרכיב הראשון ידגום את הקלט, וברגע שהוא יהפוך ל- הרכיב הראשון ינעל והשני יפתח ואז מה שאנו רוצים לשמור יעבור מהראשון לשני. אחרי זה, הרכיב השני ינעל מחדש והראשון יפתח מחדש כדי לקלוט עוד מידע לצורכינו.
כך זה יראה:

נסמן אותו כך:

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

נעילת Flip Flop
ניתן להוסיף רגל נוספת אשר תאפשר לנו לנעול את הזכרון שלנו. את רגל זו נוסיף באמצעות בוחר שכזה והיא תראה כך:

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

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

כאשר נרצה לשמור מילים של ביטים זה יהיה חיבור של מעגלים כאלו אשר להם יהיו להם כניסות ויציאות שונות חוץ מכניסת ה- וכניסת ה- אשר יהיו זהות לכל המעגלים.
כעת, לאחר שבנינו רגיסטר שיכול לשמור ביטים, נבנה מערכת זכרון של מחשב עם רגיסטרים:

במערכת זו יש לנו מפענח אחד המאפשר לכתוב, שני בוררים אשר בעזרתם אנו בחורים מאיזה 2 רגיסטרים לקרוא.
למה אנו קוראים מ-2 רגיסטרים בו זמנית? כדי לאפשר לנו לבצע פקודות כמו add אשר לוקחות ערכים משני רגיסטרים. אנו נטען את הערכים הללו באותו הזמן ואז נחזיר אותם לרגיסטר שלישי באמצות כתיבה אליו.
מכל רגיסטר יוצאים חוטים שכן יש מעגלי בכל רגיסטר.
איך כותבים דבר כזה בשפת תיאור חומרה?
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
ישנו גם יצור בשם אשר מאפשר לשמור מידע כמו ששמרנו קודם באמצעות הזזה של הקלטים כך:

כל סיבית מתקדמת DFF אחד כל מחזור שעון.