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

במימוש הרכיב האמיתי אנו נשתמש ב-.

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

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

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

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

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

יציאת המונה תהיה עם קבלת ה- השמיני, הששה עשר, העשרים ורביעי וכו'.

אנו נקבל את טבלת המצבים הבאה:
נקבל את הפונקציות הבאות:

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

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

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