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

3 - שערים לוגיים

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • כללי
  • רכיבי החלפות
  • בורר - Selector/multiplexer/mux
  • מימוש פונקציות באמצעות בוררים
  • סיבוכיות הבורר
  • מפענח - Decoder
  • Demultiplexer
  • העברת מידע באמצעות בורר למפענח
  • סיבוכיות המפענח
  • מתגים
  • מקודד - Encoder
  • הפשטה הספרתית - ממתח רציף לערכים בדידים
  • זמני שהייה
  • מודלים חלופיים "נוחים" לתזמון
  • סיכום מדדי זמן
  • מדדים והגדרות
  • תופעות מעבר (Hazards)
  • הבהוב סטטי
  • מניעת הבהובים סטטיים
  • שערים לוגיים באמצעות מתגים
  • חיבור מספרים בינאריים
  • מחבר מלא
  • מחבר מסתכל קדימה
  • מחבר ומחסר
  • יחידת חשבון (ALU)
  • גילוי תקלות צירופיות
  • תיקון תקלות
  • מגבלות השיטה

3 - שערים לוגיים

00440252

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

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

שערים לוגיים

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

uni-folder.vercel.app

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

שערבינוי מיתוגסמליל
שער ANDANDANDt=a⋅bt=a\cdot bt=a⋅b​andGate.svg
שער ORORORt=a+b+ct=a+b+ct=a+b+c​or3InputsGates.svg
שער NANDNANDNANDt=a⋅b⋅c‾t=\overline{a\cdot b\cdot c}t=a⋅b⋅c​nand3InputsGate.svg
שער NORNORNORt=a+b‾t=\overline{a+b}t=a+b​​norGate.svg
שער XORXORXORt=a⊕bt=a \oplus bt=a⊕b​xorGate.svg
שער NOTNOTNOTt=a‾t=\overline{a}t=a​notGate.svg
הערה

ניתן גם לעשות שער NANDNANDNAND כשער OR(NOT(A),NOT(B),NOT(C))OR(NOT(A),NOT(B),NOT(\mathbb{C}))OR(NOT(A),NOT(B),NOT(C)) בזכות דה מורגן

דוגמה (תיאור בשפת SystemVerilog של שער ANDANDAND)

module and_gate(
	input logic a,
	input logic b,
	output logic out
);
	assign out = a & b;
endmodule
הגדרה 1 (רכיב צירופי)

רכיב המממש פונקציית מיתוג בעלת התכונות הבאות יקרא רכיב צירופי.

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

מעגל הכולל רכיבים המחוברים ביניהם יקרא מעגל צירופי אם הוא מקיים:

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

המעגל קרוי צירופי כי יציאותיו תלויות אך ורק בצירוף הערכים בכניסותיו.

מסקנה

מעגל בו יש רכיב שיציאתו מחוברת לאחת מכניסותיו אינו מעגל צירופי.

דוגמה

Z=a(b+c)+c′dZ=a(b+c)+c'dZ=a(b+c)+c′d

​ספרתיות3-מעגל צירופי-דוגמה1.svg

תרגיל

ממשו את הפונקציה הבאה: f(a,b,c)=∑(2,5,6,7)=ac+bc′f(a,b,c)=\sum(2,5,6,7)=ac+bc'f(a,b,c)=∑(2,5,6,7)=ac+bc′ כמעגל צירופי:

​digitalSystems-transformationOfALogicGate.svg

רכיבי החלפות

בורר - Selector/multiplexer/muxmuxmux

קלט:

  • mmm כניסות בקרה המסומנות S0,…,Sm−1S_{0},\dots,S_{m-1}S0​,…,Sm−1​
  • n=2mn=2^mn=2m כניסות נתונים המסומנות D0,…,Dn−1D_{0},\dots,D_{n-1}D0​,…,Dn−1​
  • EEE כניסת הפעלה(enableenableenable)

פלט:

  • אם E=0E=0E=0 אז 000
  • אחרת, הסיבית DiD_{i}Di​ כאשר iii הוא המספר שיצוגו הבינארי מופיע ב-mmm סיביות הבקרה.

​digitalSystems-mux.svg

דוגמה

בורר 4 ל-1:
​muxThingi.svg

z=ES‾0S‾1D0+ES‾0S1D1+ES0S‾1D2+ES0S1D3z=E\overline{S}_{0}\overline{S}_{1}D_{0}+E\overline{S}_{0}S_{1}D_{1}+ES_{0}\overline{S}_{1}D_{2}+ES_{0}S_{1}D_{3}z=ES0​S1​D0​+ES0​S1​D1​+ES0​S1​D2​+ES0​S1​D3​
דוגמה (בורר 8 ל-1)

​בורר8ל1.png

נבחן את פונקציית הבורר:

  • לא ניתן לממש NOTNOTNOT ולכן הבורר הוא אינו מערכת שלמה z(x,x,x)=xx+x‾x=xz(x,x,x)=xx+\overline{x}x=xz(x,x,x)=xx+xx=x.
    ניתן לממש NOTNOTNOT עם קבועים(1 ו-0)
  • ננסה לממש XORXORXOR כך z=AB‾+A‾B=A⊕Bz=A\overline{B}+\overline{A}B=A \oplus Bz=AB+AB=A⊕B:
    D1=B‾D0=BS=AD_{1}=\overline{B} \qquad D_{0}=B \qquad S=AD1​=BD0​=BS=A
    זהו בדיוק מימוש מתאים לכך.
  • ננסה לממש ANDANDAND כך z=ABz=ABz=AB: לא נוכל לממש ANDANDAND לבד ונדרש להוסיף את הקבוע 000
מסקנה

בורר הוא מערכת פעולות חצי שלמה

מימוש פונקציות באמצעות בוררים

נניח יש לנו את הפונקציה הבאה: f(w,x,t,z)=∑(3,4,9,12,13,14)f(w,x,t,z)=\sum(3,4,9,12,13,14)f(w,x,t,z)=∑(3,4,9,12,13,14) אזי נוכל לקחת בורר עם 161616 כניסות ולקבל:
​ספרתיות הרצאה 3-1.png
בנוסף, ניתן לממש את אותה הפונקציה עם בורר קטן יותר של 888 ל-111 כך:
​ספרתיות הרצאה 3-2.png

דוגמה

נניח יש לנו את הפונקציה הבאה: xy′+xz′xy'+xz'xy′+xz′. נבנה לה טבלת אמת:

xyzf00000010010001101001101111011110\begin{array}{ccc|c} x & y & z & f \\ \hline 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 \\ 1 & 1 & 1 & 0 \end{array}x00001111​y00110011​z01010101​f00001110​​

אנו נרצה כעת לממש זאת באמצעות בורר של 444 ל-1 עם S0,S1S_{0},S_{1}S0​,S1​.
נבנה מפת קרנו:

z╲xy0001111001111\begin{array}{c|c|c|c|c|c|} _{z}\diagdown^{xy} & 00 & 01 & 11 & 10 \\ \hline 0 & & & 1 & 1 \\ \hline 1 & & & & 1 \\ \hline \end{array}z​╲xy01​00​01​111​1011​​

כדי לא להשתמש ב-NOTNOTNOT אנחנו נוכל להכניס את y,zy,zy,z רק מ-S0,S1S_{0},S_{1}S0​,S1​. נקבל את הבורר הבא:
​3 - שערים לוגיים 2026-05-19 17.16.32.excalidraw.svg

סיבוכיות הבורר

בורר בעל n+1n+1n+1 כניסות בקרה ו-K=2nK=2^nK=2n כניסות נתונים מכיל:

  • 2(n+1)2(n+1)2(n+1) מהפכים
  • 2n2^n2n שערי ANDANDAND בעלי n+2n+2n+2 כניסות כ"א וביחד 2n(n+1)2^n(n+1)2n(n+1) שערים
  • שער OROROR בעל 2n2^n2n כניסות השקול ל-2n−12^n-12n−1 שערים בעלי שתי כניסות

סה"כ מחירו של הבורר הוא O(Klog⁡2K)O(K\log_{2}K)O(Klog2​K) שערים.

מפענח - DecoderDecoderDecoder

קלט:

  • mmm כניסות בקרה d0,…,dm−1d_{0},\dots,d_{m-1}d0​,…,dm−1​
  • כניסת הפעלה - EEE

פלט:

  • יציאות n≤2mn\leq 2^mn≤2m המסומנות f0,…,fn−1f_{0},\dots,f_{n-1}f0​,…,fn−1​.

אם E=0E=0E=0 מתקיים ∀i∈N:  fi=0\forall i \in \mathbb{N}:\; f_{i}=0∀i∈N:fi​=0
אם E=1E=1E=1 אזי קיים iii שהוא המספר הבינרי המיוצג ע"י כניסות הבקרה ואז fi=1f_{i}=1fi​=1 ולכל iii אחר מתקיים fi=0f_{i}=0fi​=0.

​decoder-digitalSystems.svg
מימוש מפענח:
​ספרתיות הרצאה 3-3.png

דוגמה

נבנה בורר באמצעות מפענח כך:
​ספרתיות הרצאה 3-4.png

DemultiplexerDemultiplexerDemultiplexer

זוהי הרחבה של המפענח בו אנו במקום EEE מקבלים Data  inData\; inDatain ובאותו האופן כמו במפענח, המוצא בעל הקוד mmm מקבל את ערך הכניסה Data  inData\; inDatain.

בעצם מפענח הוא DemultiplexerDemultiplexerDemultiplexer כאשר EEE הוא בעצם כניסת המידע DDD.

העברת מידע באמצעות בורר למפענח

בורר ומפענח מבצעים פעולות הפוכות. אנו נשתמש בכניסת ה-EEE של המפענח ככניסת המידע(DemultiplexerDemultiplexerDemultiplexer)
המידע מן המסוף שנבחר יגיע למחשב המתאים אם הכתובות המוזנות לבורר ולמפענח הן תאומות.
​ספרתיות הרצאה 3-5.png

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

מפענח בעל n+1n+1n+1 כניסות ו-K=2nK=2^nK=2n יציאות מכיל:

  • 2(n+1)2(n+1)2(n+1) מהפכים
  • 2n2^n2n שערי ANDANDAND בעלי n+1n+1n+1 כניסות כ"א וביחד 2nn2^nn2nn שערים.

סה"כ מחירו של המפענח הוא O(Klog⁡2K)O(K\log_{2}K)O(Klog2​K)

מתגים

מתג מנתק ומחבר את היציאה.
ליציאה 3 ערכים אפשריים: 0,1,Z0,1,Z0,1,Z כאשר ZZZ נקרא גם 3−state3-state3−state או "צפה"
המתג מאפשר לחבר מספר יציאות לחוט יחיד הנקרא BUSBUSBUS.
חובה לדאוג שלכל היותר רק אחד מקווי ה-EEE יקבל את הערך 1.

המפענח חיוני למימוש ה-BUSBUSBUS שכן הוא זה שדואג לכך שרק אחד מקווי ה-EEE יקבל את הערך 111.
​ספרתיות הרצאה 3-6.png

דוגמה (מתג CrossbarCrossbarCrossbar מבוקר מפענחים)

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

מקודד - EncoderEncoderEncoder

קלט:

  • nnn כניסות המסומנות F0,…,Fn−1F_{0},\dots,F_{n-1}F0​,…,Fn−1​
  • כניסת הפעלה - EEE

פלט:

  • m=log⁡nm=\log nm=logn יציאות.

היציאה היא הקוד הבינארי של הכניסה היחידה שהיא 1.
​encoder-DigitalSystems.svg

הפשטה הספרתית - ממתח רציף לערכים בדידים

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

על מנת שנוכל להתמודד עם קצת הפרעות בזרם וזרם לא הכי יציב נחליט להגדיר כמה תחומים שיוכלו לייצג לנו 000 ו-111. נניח כאשר יש לנו אפשרויות למתח מ-000 עד 555 נחליט את הסקלה הבאה:
​ספרתיות הרצאה 3-8.png
כאשר הכחול והירוק נותנים 111 מצד ימין ו-000 מצד שמאל והאדום אסור!

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

בכניסה וביציאה משערים לוגיים האותות עוברים בתחום האסור במשך זמן סופי 0<0<0<.
כלומר, נדרש "לעצום את העיניים" ולהתעלם מהיציאה. משך הזמן הוא כתלות במודל.

זמני שהייה

  • tcdt_{cd}tcd​ - משך הזמן בו מובטח שיציאת רכיב לא תספיק להגיב לשינוי בכניסתו.
    כדי למצוא אותו נמדוד מהמועד בו הכניסה "עזבה" את ערכה הלוגי הקודם, שכן עד אז אין כל עילה להשתנות היציאה עד הרגע בו המתח ביציאה חורג מהתחום החוקי עבור ערך היציאה הישן.
  • tpdt_{pd}tpd​ - משך הזמן שאחריו מובטח שהיציאה תשקף את השינוי בערך הכניסה.
    כדי למצוא אותו נמדוד מהמועד בו הכניסה "הגיעה" לערכה הלוגי החדש שכן עד אז אין כל מחיובות לשינוי היציאה עד הרגע בו המתח ביציאה נכנס לתחום החוקי עבור ערך היציאה החדש.

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

מודלים חלופיים "נוחים" לתזמון

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

סיכום מדדי זמן

מדדים והגדרות

  • זמן זיהום המוצא, tCDt_{CD}tCD​ (Contamination Delay)
  • זמן התפשטות או שיהוי, tPDt_{PD}tPD​ (Propagation Delay)
  • זמן עליית האות, tRISEt_{RISE}tRISE​ (אינו מצטבר)
  • וזמן ירידתו, tFALLt_{FALL}tFALL​ (אינו מצטבר)

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

תופעות מעבר (Hazards)

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

  • האזארד סטטי (מתייצבים על ערך ישן), למשל 0-1-0
  • האזארד דינמי (מתייצבים על ערך חדש), למשל 0-1-0-1

הבהוב סטטי

נניח שהתבקשנו לתכנן מעגל שיממש את הפונקציה f(y1,y2,y3)=∑(3,4,5,7)f(y_{1},y_{2},y_{3})=\sum(3,4,5,7)f(y1​,y2​,y3​)=∑(3,4,5,7)

y3╲y1,y200011110011111\begin{array}{c|c|c|c|c|c|c|} _{y_{3}}\diagdown^{y_{1},y_{2}} & 00 & 01 & 11 & 10 \\ \hline 0 & & & & 1 \\ \hline 1 & & 1 & 1 & 1 \\ \hline \end{array}y3​​╲y1​,y2​01​00​011​111​1011​​ H=y1y2‾+y3y2H=y_{1}\overline{y_{2}}+y_{3}y_{2}H=y1​y2​​+y3​y2​

​hazard-digitalSystems-something.svg
נבחן מעבר כניסות מ-111111111 ל-101101101:
​ספרתיות הרצאה 3-11.png
למה שער ddd שאמור להישאר ב-111 ירד ל-000? רוב הרכיבים עובדים על שינוי רמה לוגית ולא על המתח שמגיע.
זה אופייני למעבר(במפת קרנו) מגורר אחד לגורר אחר והוא נגרם ע"י הבדלים בזמני ההתפשטות ברכיבים שונים.
זה למה חשוב מאוד להסתכל על יציאת המעגל הצירופי רק לאחר תום זמן ההשהיה.
אצלנו זה נוצר במעבר משני האחדים בלמטה אמצע לאחד בימין למטה+אחד בימין למעלה.

מניעת הבהובים סטטיים

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

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

מוסיפים למעגל גורר נוסף Y1⋅Y3Y_{1}\cdot Y_{3}Y1​⋅Y3​ המכסה את החץ שהופיע במפת קרנו - ערכו של גורר זה אינו משתנה כאשר Y2Y_{2}Y2​ משתנה מ-000 ל-111.

​hazards2-electricBogalo.svg

מעגל נקרא Hazard-Free אם הוא מממש ביטוי בצורת סכום מכפלות כך שכל זוג משבצות שכנות במפת קרנו המכילות 1 מכוסה ע"י אחת המכפלות(לפחות)

שערים לוגיים באמצעות מתגים

המימוש הטכנולוגי של שערים לוגיים נעשה באמצעות טרנזיסטורים המשמשים כמתגים. לכל מתג שלוש קצוות: כניסת כקרה(CCC) ושני קצוות A,BA,BA,B שהמתג יכול לחבר ביניהם.
נגדיר שני סוגי מתגים PPP ו-NNN באמצעות טבלת אמת:

NPמצב המתגCכניסת הבקרה מנותק0מחובר1מצב המתגCכניסת הבקרה מחובר0מנתוק1\begin{matrix} \\ {\color{red}N} & {\color{green}P} \\ \begin{array}{|c|c|} \hline \R{\text{מצב המתג}} & C\R{\text{כניסת הבקרה }} \\ \hline \R{\text{מנותק}} & 0 \\ \R{\text{מחובר}} & 1 \\ \hline \end{array} & \begin{array}{|c|c|} \hline \R{\text{מצב המתג}} & C\R{\text{כניסת הבקרה }} \\ \hline \R{\text{מחובר}} & 0 \\ \R{\text{מנתוק}} & 1 \\ \hline \end{array} \end{matrix}Nמצב המתגמנותקמחובר​Cכניסת הבקרה 01​​​Pמצב המתגמחוברמנתוק​Cכניסת הבקרה 01​​​

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

נבנה מהפך(NOTNOTNOT) באמצעות מתגים:

  • זוג מתגים המחוברים בטור בין הקבועים 111 ו-000 (Vplus,VminusV_{plus},V_{minus}Vplus​,Vminus​)
  • כאשר A=0A=0A=0 מתג NNN מנותק ומתג PPP מחובר וכך עובר הקבוע 111 ליציאה BBB
  • כאשר A=1A=1A=1 מתג NNN מחובר ומתג PPP מנותק וכך עובר הקבוע 000 ליציאה BBB

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

נביט גם בשער NANDNANDNAND המורכב מארבעה מתגים:
​ספרתיות הרצאה 3-14.png

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

בכל עמודה מחברים שלוש סיביות: נשא "נכנס"(אשר נושאת את השארית מפעולה קודמת) ושתי רשומות.
בכל עמודה מחשבים שתי תוצאות: סיבית סכום העמודה(ברור) וסיבית נשא "יוצא"(אשר נושאת את השארית לפעולה הבאה)

דוגמה

+11101100111110+\begin{array}{} & {\color{red}1} & {\color{red}1} \\ 1 & 0 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ \hline \color{blue}1 & \color{blue}1 & \color{blue}1 & \color{blue}0 \end{array}+101​1001​1111​110​​

מחבר מלא

מחבר מלא מוסיף עמודה אחת לתוצאה.
נסתכל על טבלת האמת ובכך נבנה את המעגל:

ABCinCoutS0000000101010010111010001101101101011111\begin{array}{|ccc|cc|} \hline A & B & C_{in} & C_{out} & S \\ \hline 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 1 \\ 0 & 1 & 0 & 0 & 1 \\ 0 & 1 & 1 & 1 & 0 \\ 1 & 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 0 & 1 & 0 \\ 1 & 1 & 1 & 1 & 1 \\ \hline \end{array}A00001111​B00110011​Cin​01010101​Cout​00010111​S01101001​​

​full adder - 1.svg
נרצה כמובן שזה יהיה מצומצם. נוכל לעשות זאת באמצעות מפת קרנו או באמצעות זהויות מיתוג.

Cout=AB+AC+BC=AB+(A+B)C=AB+(AB+A⊕B)C=AB+(A⊕B)CC_{out}=AB+AC+BC=AB+(A+B)C=AB+(AB+A \oplus B)C=AB+(A \oplus B)CCout​=AB+AC+BC=AB+(A+B)C=AB+(AB+A⊕B)C=AB+(A⊕B)C S=A‾   ⁣B‾C+A‾BC‾+ABC+AB‾   ⁣C‾=A⊕B⊕CS=\overline{A}\;\!\overline{B}C+\overline{A}B\overline{C}+ABC+A\overline{B}\;\!\overline{C}=A \oplus B \oplus CS=ABC+ABC+ABC+ABC=A⊕B⊕C

לכן המעגל שלנו יכול בצעם להיות:
​full adder - 2.svg
נראה גם איך הוא כתוב בשפת תיאור חומרה:

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

עד כה למדנו לחבר סיבית יחידה. איך נוכל לחבר מספר גדול של סיביות? פשוט שרשור של הרכיבים הללו אחד אחרי השני.
​3 - שערים לוגיים 2026-05-26 16.00.09.excalidraw.svg
כמה זמן לוקח לנו לבצע זאת? מהרגע ש-A,BA,BA,B נכנסים עד ש-SSS מוכן הם צריכים לעבור 2 יחידות זמן של שער XORXORXOR. אבל יש לנו nnn רכיבים כאלו משורשרים אחד אחרי השני ולכן הם כולם תלויים אחד בשני - בעצם, הם תלויים ב-CoutC_{out}Cout​ אחד של השני כדי להתקדם. עד שה-CoutC_{out}Cout​ יוצא יש 222 יחידות זמן של שערים לוגיים שונים וזה קורה גם כן n−1n-1n−1 פעמים ולכן:

tPD=2(n−1)+3≈2nt_{PD}=2(n-1)+3 \approx 2ntPD​=2(n−1)+3≈2n

נבנה כזה בשפת תיאור חומרה:

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

מחבר מסתכל קדימה

ראינו כי Ai,BiA_{i},B_{i}Ai​,Bi​ מגיעים ברגע אפס, זמן רב לפני שיגיע CiC_{i}Ci​.
אם g(i)≡A(i)B(i)=1g(i)\equiv A(i)B(i)=1g(i)≡A(i)B(i)=1 אזי C(i+1)=1C(i+1)=1C(i+1)=1 ואין צורך לחכות ל-C(i)C(i)C(i).
גם אם הנשא לא נוצר ביחידה iii הוא "יעבור" אם C(i)=1C(i)=1C(i)=1 וגם p(i)=A(i)+B(i)=1p(i)=A(i)+B(i)=1p(i)=A(i)+B(i)=1.

הערה

לצורך צמצום לוגי, כדאי לציין כי p(i)g(i)=0=A(i)⊕B(i)p(i)_{g(i)=0}=A(i)\oplus B(i)p(i)g(i)=0​=A(i)⊕B(i).

התוצאה ביחידה iii תהיה: C(i+1)=g(i)+p(i)C(i)C(i+1)=g(i)+p(i)C(i)C(i+1)=g(i)+p(i)C(i).
נתקדם עוד כמה צעדים:

Ci+1=gi+piCiC_{i+1}=g_{i}+p_{i}C_{i}Ci+1​=gi​+pi​Ci​ Ci+2=gi+1+pi+1Ci+1=gi+1+pi+1gi+pi+1piCiC_{i+2}=g_{i+1}+p_{i+1}C_{i+1}=g_{i+1}+p_{i+1}g_{i}+p_{i+1}p_{i}C_{i}Ci+2​=gi+1​+pi+1​Ci+1​=gi+1​+pi+1​gi​+pi+1​pi​Ci​ ⋮\vdots⋮ Ci+4=Gi+4+Pi+4CiC_{i+4}=G_{i+4}+P_{i+4}C_{i}Ci+4​=Gi+4​+Pi+4​Ci​

וכך הלאה.
נשים לב כי p(i),g(i)p(i),g(i)p(i),g(i) תלויים רק בכניסות A,BA,BA,B בעלות אותם אינדקסים.
באותו הזמן CCC מסוים ממתין רק ל-CCC הנוצר ארבעה שלבים קודם.
כאן אנו רואים במדוייק למה השיטה החדשה הזאת(שלא הוסברה טוב ע"י ניר) הרבה יותר עדיפה :)

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

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

מחבר ומחסר

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

יחידת חשבון (ALUALUALU)

נרחיב את המחבר ליחידה אשר מסוגלת לבצע את כל הפעולות הבאות:

  • חיבור - A+BA+BA+B
  • חיסור - A−BA-BA−B
  • גם - AND(A,B)AND(A,B)AND(A,B)
  • או - OR(A,B)OR(A,B)OR(A,B)

הנה מעגל עבור סיבית אחת:
​ספרתיות הרצאה 5 - 2.png

עבור 323232 ביטים פשוט נחבר אותם אחד אחרי השני.

הערה

למען הסימטריה, במחשב RISC−VRISC-VRISC−V ניתן גם להפוך את AAA כך
​ספרתיות הרצאה 5 - 3.png

נוכל גם ליצור יצור בשם ALU  with  SLTALU\; with\; SLTALUwithSLT אשר הוא מאפשר לנו לדעת איזה מספר גדול יותר - AAA או BBB.
הפעולה מציבה 000 בכל הסיביות חוץ מה-LSBLSBLSB אשר בה מוצב 0/10/10/1 תלוי בסיבית MSBMSBMSB של החיסור.

ניתן לבנות אותו באמצעות שפת תיאור חומרה כך:

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

גילוי תקלות צירופיות

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

הגדרה 3 (נצילות)

נניח יצרנו XXX צ'יפים ומתוכם KKK עובדים. אזי, הנצילות - YYY שלנו היא:

Y=KXY=\frac{K}{X}Y=XK​
הערה

כאשר אנו מייצרים צ'יפים אז המחיר של צ'יפ מחושב בערך ככה:

Cost of fabrication+testingY×# of fabricated chips\frac{\text{Cost of fabrication}+\text{testing}}{Y \times \text{\# of fabricated chips}}Y×# of fabricated chipsCost of fabrication+testing​

אנו נרצה למצוא דרכים לבדוק תקלות בקלות שכן אם ננסה לבדוק באופן ידני, נדרש לכל מעגל צירופי לבדוק את כל 2n2^n2n הצירופים האפשריים ולהשוות אותם לטבלת האמת.
זה, מאוד ארוך ולכן לא נרצה לעשות זאת בדרך הנאיבית.

נגדיר שתי סוגי בדיקת תקלות:

  • בדיקה לגילוי התקלות (האם המעגל תקין או לא)
  • בדיקה לאיתור התקלות (איפה בדיוק המעגל נכשל)

לעיתים קשה לקבוע בדיוק מה מיקום התקלה ואנו רק יודעים שיש אחת שכזו.

אנו נסתכל בקורס זה על שני סוגים של תקלות:

  1. צומת תקועה ב-0: תקלה אשר מספרת לנו על כך שחוט מסויים תקוע במצב לוגי 000.
  2. צומת תקועה ב-1: תקלה אשר מספרת לנו על כך שטוח מסויים תקוע במצב לוגי 111.
הערה

קיימים גם סוגים אחרים של תקלות: צומת מנותקת, גישור והשהייה
אך אנו לא נסתכל עליהם בקורס זה

תיקון תקלות

הגדרה 4 (טבלת תקלות)

טבלה ובה שורה לכל בדיקה אפשרית ועמודה לכל תקלה אפשרית תקרא טבלת תקלות
כאשר מיקום מסויים בטבלה מסומן ב-XXX אזי יש שם תקלה.

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

דוגמה

[תמונה להוסיף מעמוד 31 במצגת]
לפונקציה שלוש כניסות ולכן, צריך לכל היותר 888 בדיקות.
נסמן, למשל, ב-m0m_{0}m0​ את התקלה שבה החוט mmm תקוע ב-000. נכניס זאת לטבלת תקלות:

fABCm0n0p0q0m1n1p1q11000X0001XX1010X0011XXX1100X0101XXX11101111XXX\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline f & ABC & m_{0} & n_{0} & p_{0} & q_{0} & m_{1} & n_{1} & p_{1} & q_{1} \\ \hline 1 & 000 & & & & X \\ 0 & 001 & & & & & & & X & X \\ 1 & 010 & & & & X \\ 0 & 011 & & & & & X & & X & X \\ 1 & 100 & & & & X \\ 0 & 101 & & & & & & X & X & X \\ 1 & 110 \\ 1 & 111 & X & X & X \\ \hline \end{array}f10101011​ABC000001010011100101110111​m0​X​n0​X​p0​X​q0​XXX​m1​X​n1​X​p1​XXX​q1​XXX​​

נסמן את ה-XXX-ים היחידים בירוק כך:

fABCm0n0p0q0m1n1p1q11000X0001XX1010X0011XXX1100X0101XXX11101111XXX\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline f & ABC & m_{0} & n_{0} & p_{0} & q_{0} & m_{1} & n_{1} & p_{1} & q_{1} \\ \hline 1 & 000 & & & & X \\ 0 & 001 & & & & & & & X & X \\ 1 & 010 & & & & X \\ 0 & 011 & & & & & \color{green}X & & X & X \\ 1 & 100 & & & & X \\ 0 & 101 & & & & & & \color{green}X & X & X \\ 1 & 110 \\ 1 & 111 & \color{green}X & \color{green}X & \color{green}X \\ \hline \end{array}f10101011​ABC000001010011100101110111​m0​X​n0​X​p0​X​q0​XXX​m1​X​n1​X​p1​XXX​q1​XXX​​

אלו הן הבדיקות החיוניות שלנו להפעם - אנו חייבים אותן כדי לדעת האם המעגל שלנו עובד או לא.
נוסיף גם בדיקה עבור q0q_{0}q0​ וזאת בעזרת 000000000 - כך נבדוק את כל התקלות האפשריות.

הניסוי יורכב כך:

  • הכנס כניסה 011011011. אם היציאה 1 המעגל מקולקל.
  • אחרת, הכנס כניסה 101101101. אם היציאה 1 המעגל מקולקל.
  • אחרת, הכנס כניסה 111111111. אם היציאה 000 המעגל מקולקל.
  • אחרת, הכנס כניסה 000000000. אם היציאה 000 המעגל מקולקל
  • אחרת, המעגל תקין.

מגבלות השיטה

ישנן שתי מגבלות לשיטה שראינו עד כה:

  • הטבלה עלולה להיות גדולה מדי עבור מעגלים גדולים ואין הבטה שלא נזדקק לכל 2n2^n2n השורות.
  • אם נגביל את עצמנו למספר קטן של בדיקות, נרצה לדעת כיצד אנו מכסים את המספר הגבוה ביותר של תקלות.

אנו נגדיר כיסוי תקלות כאחוז התקלות שהניסוי מגלה מתוך סך כל התקלות האפשריות.

דוגמה (עם אותה דוגמה ממקודם)

נרכיב ניסוי שיבדוק 75%75\%75% מהתקלות:

  • נכניס כניסה 011011011, היא תבדוק את m1,p1,q1m_{1},p_{1},q_{1}m1​,p1​,q1​ - אם היציאה 111 המעגל מקולקל.
  • אחרת, נכניס כניסה 111111111, היא תבדוק את m0,n0,p0m_{0},n_{0},p_{0}m0​,n0​,p0​ - אם היציאה 1, המעגל מקולקל.
  • אחרת, נניח שהמעגל תקין.