לדלג לתוכן

0.4 - טבלאות אמת - הרצאה

דיסקליימר:
התמונות והאילוסטרציות בהרצאה זו לקוחות מהמשחק "Turing complete"

הקדמה

אז למדנו שמעבד יכול לשמור מידע בבינארית.
הוא יכול לשמור ביטים, והוא שומר ביטים באוגרים, בRAM ובעוד מקומות.
בהרצאה זו פחות נתעסק באיך הוא שומר ביטים, אלה מה הוא עושה איתם.
איך המעבד מבצע פעולות עם מספרים בינארים? איך הוא יודע לחבר אותם?
לדוגמה,
בהינתן 3 אוגרים, כל אחד בגודל של 8 ביטים:
נניח שאוגר מספר 1 מחזיק במספר 1010 (10)
ואוגר מספר 2 מחזיק במספר 1111 (15)
כיצד המעבד יודע לקחת את שני המספרים האלו, לחבר אותם ולהחזיר את התשובה 11001 (25)?
בזה בדיוק נעסוק בשיעור הזה.

ההמצאה של המאה

מה שהופך את כל זה לאפשרי זה ה"Nand gate", שער הNand הוא צ'יפ קטן שנראה כך:
איור: שער NAND עם שני רגלי קלט (Input 1, Input 2) ורגל פלט אחת (Output)
לצ'יפ יש 3 רגלים, 2 רגלי input (קלט) ורגל output (פלט).
כל אחד מהרגלים מעביר זרם, הזרם מייצג ביט- כאשר הזרם גבוהה, הוא מייצג את המספר 1 וכאשר הזרם נמוך הוא מייצג את המספר 0.

אופן פעולתו של הצ'יפ הוא כך,
)
איור: שער NAND ללא זרם בשני הקלטים, אין זרם בפלט
אם הוא מקבל באחד מרגלי הקלט את המספר 1 (זרם גבוהה), הוא גם מחזיר ברגל הפלט את המספר 1 (זרם גבוהה).
איור: שער NAND עם זרם ב-Input 1 בלבד, הפלט (OUT) דולק בירוק
איור: שער NAND עם זרם ב-Input 2 בלבד, הפלט (OUT) דולק בירוק
לעומת זאת, אם הצ'יפ מקבל בשני הרגליים שלו את המספר 1 (זרם גבוהה), אז הוא מחזיר את המספר 0 (זרם נמוך).
איור: שער NAND עם זרם בשני הקלטים (Input 1 ו-Input 2), הפלט (OUT) כבוי/אדום
בדרך כלל נהוג לבטא התנהגות של צ'יפים עם "טבלאות אמת".
טבלאת אמת, היא טבלאה שמציגה את התנהגות הצ'יפ- הנה לדוגמה טבלאה שמגדירה את התנהגות הNAND Gate
טבלת אמת של שער NAND: הפלט הוא 1 בכל הצירופים חוץ מ-1,1 שנותן 0
כאשר ירוק מסמן זרם גבוה, ואדום מסמן זרם נמוך.

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

לא נדבר בהרצאה זו כיצד הצ'יפ בנוי, כי אנחנו לא בשיעור פיסיקה.
דיאגרמת מעגל חשמלי: נגד R מחובר למקור מתח חיובי, שני מפסקים בטור S1 (x) ו-S2 (y) מחוברים לאדמה, הפלט Q נלקח מהצומת - מימוש פיזי של שער NAND

עוד צ'יפים

באמצעות הNAND gate נבנה עוד צ'יפים, שמייצרים טבלאות אמת שונות.
אחרי שנבנה הרבה צ'יפים שונים, נוכל להשתמש בכולם כדי לבנות את המעבד שלנו.

שער הNOT

שער הNOT מוגדר על פי טבלאת האמת הבאה:
טבלת אמת של שער NOT: קלט 1 נותן פלט 0, קלט 0 נותן פלט 1
כאשר הוא מקבל כקלט 1, הוא מחזיר 0- וכשהוא מקבל כקלט 0, הוא מחזיר 1.
כדי לבנות את השער, אנחנו נקח שער NAND- ונחבר את שני רגלי הקלט שלו.
איור: מימוש שער NOT על ידי חיבור שני רגלי הקלט של שער NAND למקור אחד (IN)
כאשר NAND מקבל בשני רגלי הקלט שלו 1, הוא מחזיר 0, וכשהוא מקבל 0 הוא מחזיר 1.
למעשה- כך אפשר לממש את שער הNOT.

שער הNOT הוא שער שהופך כל ביט שהוא מקבל , 0->1 ו- 1->0

שער הAND

שער הAND מוגדר על פי טבלאת האמת הבאה:
טבלת אמת של שער AND: הפלט הוא 1 רק כאשר שני הקלטים הם 1, אחרת 0
רק כאשר הוא מקבל 1 משני רגלי הקלט שלו, הוא מחזיר 1- אחרת הוא מחזיר 0 תמיד.
למעשה, טבלאת האמת שלו הפוכה מטבלאת האמת של NAND-
טבלת אמת של שער NAND: הפלט הוא 1 בכל הצירופים חוץ מ-1,1 שנותן 0
אז כדי ליצור את השער, נוכל לקחת שער NAND, ולשים ברגל הפלט שלו שער NOT- ובכך נהפוך את התוצאה שהוא מחזיר.
איור: מימוש שער AND על ידי חיבור שער NAND ולאחריו שער NOT (משולש N) על הפלט
שער הAND הוא שער שדולק רק ששני הרגליים שלו דולקים.
- שם השער מרמז לנו על פעולותו, כי גם הרגל הראשונה וגם הרגל השניה צריכה להיות דולקים כדי שידלוק ולכן הוא AND (וגם)
שער הNAND הוא שער שהפוך ממנו, הוא שער שדולק רק כאשר שני הרגליים שלו כבויים.
- שם השער מרמז לנו על פעולתו כי הוא הפוך מAND, אז הוא נקרא NAND- קיצור של NOT AND.

שער הOR

שער הOR מוגדר על פי טבלאת האמת הבאה:
טבלת אמת של שער OR: הפלט הוא 1 כאשר לפחות קלט אחד הוא 1, ו-0 רק כששני הקלטים 0
כאשר הוא מקבל 1 בלפחות רגל אחת, הוא מחזיר 1 אחרת הוא מחזיר 0.
כדי לבנות את השער עלינו לקחת NAND ולשים לו NOT בשני רגליו.
איור: מימוש שער OR על ידי חיבור שער NOT (N) על כל אחד משני הקלטים לפני כניסתם לשער NAND
שער הOR דולק רק שלפחות אחד מרגליו דולקים.
- שם השער מרמז לנו על פעולותו, כי אם הרגל הראשונה דולקת או הרגל השניה דולקת השער ידלוק, ולכן הוא OR (או)

שער הNOR

שער הNOR מוגדר על פי טבלאת האמת הבאה:
טבלת אמת של שער NOR: ההפך מ-OR, הפלט הוא 1 רק כששני הקלטים 0
למעשה שער הNOR הוא ההפך של שער הOR
NOR = not or
וכדי לבנות אותו, ניתן פשוט להוסיף את שער NOT ברגל הפלט של שער OR.
איור: מימוש שער NOR על ידי הוספת שער NOT נוסף על הפלט של שער ה-OR

שער הXOR

שער הXOR מוגדר על פי טבלאת האמת הבאה:
טבלת אמת של שער XOR: הפלט הוא 1 רק כשבדיוק קלט אחד הוא 1, ו-0 כששני הקלטים שווים
שער הXOR הוא שער מיוחד, שדלוק רק כשאחד הרגליים הוא 1 אבל לא ששניהם 1 ולא ששניהם 0.
כדי לבנות אותו, עלינו לחבר NAND, OR ו- AND.
איור: מימוש שער XOR באמצעות חיבור של NAND, OR ו-AND

הצ'יפים שבנינו יהיו אבני היסוד של המעבד. ובאמצעותן נוכל לבנות את כל חלקי המעבד שלנו.
AND
NAND
OR
NOR
NOT
XOR

הALU

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

חיבור מספרים בינארים

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

דוגמה:

נחבר את המספרים הבינאריים:

   1011  
+  1101  

נחבר מימין לשמאל:

ספרה חיבור תוצאה העברה
1 + 1 = 10 0 1
1 + 0 + 1 (שארית) = 10 0 1
0 + 1 + 1 (שארית) = 10 0 1
1 + 1 + 1 (שארית) = 11 1 1

בסוף נוסיף את השארית:

 1 (last remainder)
  1011  
+ 1101  
-------
11000

תוצאה:

1011₂ + 1101₂ = 11000₂
או בדצימלי:
11 + 13 = 24, ובאמת 11000₂ = 24₁₀.

ה HALF ADDER

שער הHALF ADDER הוא שער שממש חיבור בין שתי ביטים. כאשר הוא מקבל ברגלי הקלט שלו שני ביטים שעליו לחבר, ומחזיר ברגל אחת את התוצאה של החיבור, וברגל שנייה את ה"CARRY", רגל שמסמנת אם נשאר שארית.
זוהי טבלאת האמת של השער:
טבלת אמת של Half Adder: עבור זוגות הקלט (0,0),(1,0),(0,1),(1,1), ה-Sum הוא 0,1,1,0 וה-Carry הוא 0,0,0,1
כאשר אם נחבר שני ביטים ששווים 0, נקבל 0.
אם נחבר ביט דולק וביט כבוי נקבל 1.
ואם נחבר שני ביטים דולקים, נקבל את המספר 10, כך ברגל הSUM נקבל 0, וברגל הCARRY נקבל 1- כי יש שארית.
כדי לבנות HALF ADDER נשתמש בADD ו- XOR
איור: מימוש Half Adder - שני קלטים נכנסים לשער XOR (מפיק את ה-SUM) ולשער AND (מפיק את ה-CAR/Carry)

שער הFULL ADDER

הבעיה בשער HALF ADDER, שכמו שראינו למעלה, כשמחשבים חיבור של מספר בינארי וכל מספר, יכול להיות שיהיה "שארית" שגם אותה תצטרכו לחבר. כך שאם נרצה לבנות שער גדול שמחבר מספרים בינארים, נצטרך לבנות שער שיודע לחבר 3 ביטים- בשביל 2 הביטים שצריך לחבר + שארית שאולי צריך לחבר.
כך יראה טבלאת אמת של FULL ADDER
טבלת אמת של Full Adder: עבור שמונה צירופי שלושת הקלטים, מוצגים ערכי ה-Sum וה-Carry הרצויים
ובצורה דומה לHALF ADDER, הFULL ADDER יכיל 2 XOR-ים ו2 AND-ים, כדי לחבר 3 ביטים.
איור: מימוש Full Adder - שני שערי XOR בשרשור מפיקים את ה-SUM, ושני שערי AND עם שער OR מפיקים את ה-CAR/Carry משלושת הקלטים

חיבור בינארים

באמצעות שער הFULL ADDER, נוכל לחבר מספרים בינארים עם כמות לא מוגבלת של ביטים!
אם נרצה לחבר 2 מספרים בינארים כאשר כל אחד מהמספרים עם 8 ביטים, נוכל לבצע זאת עם חיבור של 8 FULL ADDER-ים.
איור: שרשור של שמונה שערי FULL ADDER (ADD) המחוברים זה לזה כדי לחבר שני מספרים בינאריים בני 8 ביט

סיכום

מטרת השיעור הייתה לחשוף אתכם על רגל אחת כיצד פועל המעבד.
- למדנו כיצד באמצעות השער הלוגי NAND, בנינו מכונה שיודעת לחבר שתי מספרים. וממש מימשנו בעצמנו את הוראת "ADD" במעבד המומצא שלנו.
- הכרנו את השערים הלוגים הבסיסים, AND, NAND, NOT, OR, NOR, XOR ואת אופן פעולתם.
- אם תרצו לבנות בעצמכם מעבד עם שערים לוגים, מעבד עם ALU שלם, אוגרים, RAM, ועוד- אני ממליץ לכם מאוד לקנות את המשחק "Turing complete"- המשחק מאפשר לכם לבנות מעבד שלם ממש משער NAND פשוט- ואפילו מאפשר לכם לתכנת ולבנות משחקים על המחשב שבניתם.
- בנוסף אם התחום מעניין אתכם, אני ממליץ לעשות את הקורס האקדמי "NAND2TETRIS", שבו תלמדו כיצד לבנות מעבד מNAND ולתכנת מעליו את המשחק TETRIS.