שער לוגי הוא התקן המממש פונקציית מיתוג. הוא אלקטרוני(ליטרלי חומרה)
ניתן לתאר באמצעות ציור, טבלת אמת, ביטוי מיתוג ושפות תיאור חומרה(שאותם נראה בסדנה)
| שער | בינוי מיתוג | סמליל |
|---|---|---|
| שער | | |
| שער | | |
| שער | | |
| שער | | |
| שער | | |
| שער | |
ניתן גם לעשות שער כשער בזכות דה מורגן
module and_gate(
input logic a,
input logic b,
output logic out
);
assign out = a & b;
endmodule
רכיב המממש פונקציית מיתוג בעלת התכונות הבאות יקרא רכיב צירופי.
- כניסה אחת או יותר של משתני מיתוג
- יציאה אחת או יותר של משתני מיתוג
- התאמה של ערך מיתוג (0 או 1) לכל יציאה בעבור כל צירוף אפשרי של ערכי הכניסות(טבלת אמת)
- מגבלות תזמון (פיזיקליות)
מעגל הכולל רכיבים המחוברים ביניהם יקרא מעגל צירופי אם הוא מקיים:
- כל רכיב במעגל הוא רכיב צירופי
- כל כניסה לרכיב במעגל היא או כניסה למעגל או יציאה של רכיב אחר במעגל
- יציאות של רכיבים במעגל יכולות להתחבר רק לכניסות של רכיבים אחרים במעגל(ולא ליציאות אחרות)
- כל מסלול במעגל העובר דרך רכיביו בכיוון מן הכניסה אל היציאה עובר דרך כל רכיב לכל היותר פעם אחד
- כיציאות המעגל ניתן לבחור כל כניסה למעגל וכל יציאה של רכיב.
המעגל קרוי צירופי כי יציאותיו תלויות אך ורק בצירוף הערכים בכניסותיו.
מעגל בו יש רכיב שיציאתו מחוברת לאחת מכניסותיו אינו מעגל צירופי.
ממשו את הפונקציה הבאה: כמעגל צירופי:
רכיבי החלפות
בורר - Selector/multiplexer/
קלט:
- כניסות בקרה המסומנות
- כניסות נתונים המסומנות
- כניסת הפעלה()
פלט:
- אם אז
- אחרת, הסיבית כאשר הוא המספר שיצוגו הבינארי מופיע ב- סיביות הבקרה.
בורר 4 ל-1:

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

בנוסף, ניתן לממש את אותה הפונקציה עם בורר קטן יותר של ל- כך:

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

נבנה בורר באמצעות מפענח כך:

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

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


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

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

סיכום מדדי זמן
מדדים והגדרות
- זמן זיהום המוצא, (Contamination Delay)
- זמן התפשטות או שיהוי, (Propagation Delay)
- זמן עליית האות, (אינו מצטבר)
- וזמן ירידתו, (אינו מצטבר)

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

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

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

נביט גם בשער המורכב מארבעה מתגים:

חיבור מספרים בינאריים
בכל עמודה מחברים שלוש סיביות: נשא "נכנס"(אשר נושאת את השארית מפעולה קודמת) ושתי רשומות.
בכל עמודה מחשבים שתי תוצאות: סיבית סכום העמודה(ברור) וסיבית נשא "יוצא"(אשר נושאת את השארית לפעולה הבאה)
מחבר מלא
מחבר מלא מוסיף עמודה אחת לתוצאה.
נסתכל על טבלת האמת ובכך נבנה את המעגל:
נרצה כמובן שזה יהיה מצומצם. נוכל לעשות זאת באמצעות מפת קרנו או באמצעות זהויות מיתוג.
לכן המעגל שלנו יכול בצעם להיות:
נראה גם איך הוא כתוב בשפת תיאור חומרה:
module FullAdder2(
input a, b, cin,
output wire cout, s // carry and sum
);
assign s = a ^ b ^ cin;
assign cout = (a & b) | (a & cin) | (b & cin);
endmodule
עד כה למדנו לחבר סיבית יחידה. איך נוכל לחבר מספר גדול של סיביות? פשוט שרשור של הרכיבים הללו אחד אחרי השני.
כמה זמן לוקח לנו לבצע זאת? מהרגע ש- נכנסים עד ש- מוכן הם צריכים לעבור 2 יחידות זמן של שער . אבל יש לנו רכיבים כאלו משורשרים אחד אחרי השני ולכן הם כולם תלויים אחד בשני - בעצם, הם תלויים ב- אחד של השני כדי להתקדם. עד שה- יוצא יש יחידות זמן של שערים לוגיים שונים וזה קורה גם כן פעמים ולכן:
נבנה כזה בשפת תיאור חומרה:
module RCA #(paramterer n = 8) (
input logic [n-1:0] a, b,
input logic cin,
output logic [n-1:0] s,
output logic cout
);
assign {cout, s} = a + b + cin;
endmodule
מחבר מסתכל קדימה
ראינו כי מגיעים ברגע אפס, זמן רב לפני שיגיע .
אם אזי ואין צורך לחכות ל-.
גם אם הנשא לא נוצר ביחידה הוא "יעבור" אם וגם .
לצורך צמצום לוגי, כדאי לציין כי .
התוצאה ביחידה תהיה: .
נתקדם עוד כמה צעדים:
וכך הלאה.
נשים לב כי תלויים רק בכניסות בעלות אותם אינדקסים.
באותו הזמן מסוים ממתין רק ל- הנוצר ארבעה שלבים קודם.
כאן אנו רואים במדוייק למה השיטה החדשה הזאת(שלא הוסברה טוב ע"י ניר) הרבה יותר עדיפה :)
איך זה נראה בפועל?

כעת נראה זאת כתוב בשפת תיאור חומרה:
module Adder2 #(parameter n = 8) (
input logic [n-1:0] a, b,
input logic cin,
output logic [n-1:0] s,
output logic cout
);
logic [n-1:0] p = a ^ b;
logic [n-1:0] g = a & b;
logic [n:0] c = {g | }
endmodule
מחבר ומחסר
לפעמים כשאנו רוצים גם לחבר וגם לחסר אנו נרצה להשתמש באותו הרכיב, איך נעשה זאת? נרצה לקחת את ולהפוך אותו למינוס מה שיתן לנו את האפשרות להשתמש באותו הרכיב.
איך עושים בשערים לוגיים? אנו משתמשים בשער עם קלט אחד שהוא והקלט השני הוא זרם של .
יחידת חשבון ()
נרחיב את המחבר ליחידה אשר מסוגלת לבצע את כל הפעולות הבאות:
- חיבור -
- חיסור -
- גם -
- או -
הנה מעגל עבור סיבית אחת:

עבור ביטים פשוט נחבר אותם אחד אחרי השני.
למען הסימטריה, במחשב ניתן גם להפוך את כך

נוכל גם ליצור יצור בשם אשר הוא מאפשר לנו לדעת איזה מספר גדול יותר - או .
הפעולה מציבה בכל הסיביות חוץ מה- אשר בה מוצב תלוי בסיבית של החיסור.
ניתן לבנות אותו באמצעות שפת תיאור חומרה כך:
module RISCVALU (ALUctl,A,B,ALUOut,Zero);
input logic [3:0] ALUctl;
input logic [31:0] A ,B;
output logic [31:0] ALUOut ; // Result.
output logic Zero; assign Zero = (ALUOut == O); //Zero is true if ALUOut is 0
always_comb@(ALUctl, A, B) begin //reevaluate if these change
case (ALUctl)
0: ALUOut <= A & B;
1: ALUOut <= A | B;
2: ALUOut <= A + B;
6: ALUOut <= A - B;
7: ALUOut <=(A < B)? 1 : 0;
12: ALUOut <= ~(A | B); // NOR
default: ALUOut <= 0;
endcase
end
endmodule
גילוי תקלות צירופיות
כשאנו מייצרים רכיב אנו חייבים לוודא שהוא עובד לפני שאנו שולחים אותו ללקוח.
נניח יצרנו צ'יפים ומתוכם עובדים. אזי, הנצילות - שלנו היא:
כאשר אנו מייצרים צ'יפים אז המחיר של צ'יפ מחושב בערך ככה:
אנו נרצה למצוא דרכים לבדוק תקלות בקלות שכן אם ננסה לבדוק באופן ידני, נדרש לכל מעגל צירופי לבדוק את כל הצירופים האפשריים ולהשוות אותם לטבלת האמת.
זה, מאוד ארוך ולכן לא נרצה לעשות זאת בדרך הנאיבית.
נגדיר שתי סוגי בדיקת תקלות:
- בדיקה לגילוי התקלות (האם המעגל תקין או לא)
- בדיקה לאיתור התקלות (איפה בדיוק המעגל נכשל)
לעיתים קשה לקבוע בדיוק מה מיקום התקלה ואנו רק יודעים שיש אחת שכזו.
אנו נסתכל בקורס זה על שני סוגים של תקלות:
- צומת תקועה ב-0: תקלה אשר מספרת לנו על כך שחוט מסויים תקוע במצב לוגי .
- צומת תקועה ב-1: תקלה אשר מספרת לנו על כך שטוח מסויים תקוע במצב לוגי .
קיימים גם סוגים אחרים של תקלות: צומת מנותקת, גישור והשהייה
אך אנו לא נסתכל עליהם בקורס זה
תיקון תקלות
טבלה ובה שורה לכל בדיקה אפשרית ועמודה לכל תקלה אפשרית תקרא טבלת תקלות
כאשר מיקום מסויים בטבלה מסומן ב- אזי יש שם תקלה.
כדי לתקן תקלות בתצורה הכי טובה, נתחיל בלבדוק האם יש עמודות בהן יש רק אחד - אם יש, נסמנו בצבע או בעיגול. למה? השורות האלו מסמנות בדיקות חיוניות - כאלו שחובה לעשות.
על מנת להרכיב ניסוי לגילוי התקלות, נוסיף לבדיקות החיוניות עוד בדיקות כך שבכל עמודה לפחות לאחד מה--ים תהיה בדיקה.
[תמונה להוסיף מעמוד 31 במצגת]
לפונקציה שלוש כניסות ולכן, צריך לכל היותר בדיקות.
נסמן, למשל, ב- את התקלה שבה החוט תקוע ב-. נכניס זאת לטבלת תקלות:
נסמן את ה--ים היחידים בירוק כך:
אלו הן הבדיקות החיוניות שלנו להפעם - אנו חייבים אותן כדי לדעת האם המעגל שלנו עובד או לא.
נוסיף גם בדיקה עבור וזאת בעזרת - כך נבדוק את כל התקלות האפשריות.
הניסוי יורכב כך:
- הכנס כניסה . אם היציאה 1 המעגל מקולקל.
- אחרת, הכנס כניסה . אם היציאה 1 המעגל מקולקל.
- אחרת, הכנס כניסה . אם היציאה המעגל מקולקל.
- אחרת, הכנס כניסה . אם היציאה המעגל מקולקל
- אחרת, המעגל תקין.
מגבלות השיטה
ישנן שתי מגבלות לשיטה שראינו עד כה:
- הטבלה עלולה להיות גדולה מדי עבור מעגלים גדולים ואין הבטה שלא נזדקק לכל השורות.
- אם נגביל את עצמנו למספר קטן של בדיקות, נרצה לדעת כיצד אנו מכסים את המספר הגבוה ביותר של תקלות.
אנו נגדיר כיסוי תקלות כאחוז התקלות שהניסוי מגלה מתוך סך כל התקלות האפשריות.
נרכיב ניסוי שיבדוק מהתקלות:
- נכניס כניסה , היא תבדוק את - אם היציאה המעגל מקולקל.
- אחרת, נכניס כניסה , היא תבדוק את - אם היציאה 1, המעגל מקולקל.
- אחרת, נניח שהמעגל תקין.