From 363af65f93ed9b1ab2b075a5134a15dc4cdb821b Mon Sep 17 00:00:00 2001 From: Andrea Mazzai <97525105+andreamazzai@users.noreply.github.com> Date: Fri, 1 Nov 2024 14:25:47 +0100 Subject: [PATCH] adder --- docs/_docs/97-bin-math.md | 48 +++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/docs/_docs/97-bin-math.md b/docs/_docs/97-bin-math.md index 534b328..28ea3a7 100644 --- a/docs/_docs/97-bin-math.md +++ b/docs/_docs/97-bin-math.md @@ -761,16 +761,16 @@ In altre parole: - l'espressione Generate viene utilizzata da un Adder "N" per identificare quando, in assenza di un Carry agli ingressi dello stadio precedente "N-1", questi produrrà ("genererà") un Carry in uscita; - l'espressione Propagate viene utilizzata da un Adder "N" per identificare quando, in presenza di un Carry agli ingressi dello stadio precedente "N-1", questi produrrà ("propagherà") un Carry in uscita. -La circuiteria Look Ahead considera se lo stadio precedente introduce un Carry analizzando le due condizioni: dati gli ingressi A, B e CIN: +La circuiteria Look Ahead considera se lo stadio precedente introduce un Carry analizzando le due condizioni precedenti. Dati gli ingressi A, B e CIN: - un Carry COUT è **generato** solo se A*B = 1 - un Carry COUT è **propagato** solo se CIN = 1 e A+B = 1 A questo punto possiamo identificare il Carry Out per ogni stadio con una generica espressione: -COUT = g + p*CIN, cioè, effettuando le sostituzioni di **g** e **p**: +COUT = g + p\*CIN, cioè, effettuando le sostituzioni di **g** e **p**: -COUT = A*B + (A+B)\*CIN, con la quale abbiamo familiarità perché altri non è il COUT di ogni Full Adder. +COUT = A*B + (A+B)\*CIN, con la quale abbiamo già familiarità, perché altri non è il COUT di ogni Full Adder. Utilizzamo ora **i** per identificare la posizione di ogni bit all'interno del Multiple Bit Adder, ad esempio 0-3 per un Adder a 4 bit, e scrivere le espressioni generali per **p** e **g**: @@ -779,38 +779,36 @@ pi = Ai+Bi (ad esempio, p3 = A3\*Bi+1 = gi + pi\*Ci -Possiamo ora scrivere le espressioni per i Carry In di tutti gli stadi: +Possiamo ora scrivere le espressioni per i Carry In di tutti gli stadi. L'espressione per il Carry In del secondo Adder è: -L'espressione per il Carry In del secondo Adder è: +C1 = g0 + C0\*C0, cioè\ +C1 = A0*B0 + (A0+B0)\*C0 -C1 = g0 + p0\*C0, cioè\ -C1 = A0*B0 + (A0+B0)\*C0 - -Si noti che questa espressione dipende dunque dai soli input A, B e C0.\ +Si noti che questa espressione dipende dunque dai soli input A, B e C0.\ Andiamo ora a scrivere l'espressione per il Carry In del terzo Adder: -C2 = g1 + p1\*C1, cioè, sostituendo C1:\ -C2 = g1 + p1\*(g0 + p0\*\C0), che significa che C2 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B dell'Adder precedente e da C0. Applicando la proprietà distributiva, si ottiene:\ -C2 = g1 + p1\*g0 + p1\*p0*\C0 +C2 = g1 + p1\*C1, cioè, sostituendo C1:\ +C2 = g1 + p1\*(gC0 + pC0\*\CC0), che significa che C2 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B dell'Adder precedente e da CC0. Applicando la proprietà distributiva, si ottiene:\ +C2 = g1 + p1\*gC0 + p1\*pC0*\CC0 -Si noti che questa espressione dipende dunque dai soli input A, B e C0.\ +Si noti che questa espressione dipende dunque dai soli input A, B e CC0.\ Andiamo ora a scrivere l'espressione per il Carry In del quarto Adder: -C3 = g2 + p2\*C2, cioè, sostituendo C2:\ -C3 = g2 + p2\*(g1 + p1\*g0 + p1\*p0\*C0), che significa che C3 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B degli Adder precedenti e da C0. Applicando la proprietà distributiva, si ottiene:\ -C3 = g2 + p2\*g1 + p2\*p1\*g0 + p2\*p1\*p0\*C0 +C3 = g2 + p2\*C2, cioè, sostituendo C2:\ +C3 = g2 + p2\*(g1 + p1\*gC0 + p1\*pC0\*CC0), che significa che C3 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B degli Adder precedenti e da CC0. Applicando la proprietà distributiva, si ottiene:\ +C3 = g2 + p2\*g1 + p2\*p1\*gC0 + p2\*p1\*pC0\*CC0 -Si noti che questa espressione dipende dunque dai soli input A, B e C0.\ +Si noti che questa espressione dipende dunque dai soli input A, B e CC0.\ Andiamo ora a scrivere l'espressione per C4, che è il Carry Out del quarto Adder: -C4 = g3 + p3\*C3, cioè, sostituendo C3:\ -C4 = g3 + p3\*(g2 + p2\*(g1 + p1\*g0 + p1\*\p0\*C0)), che significa che C4 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B degli Adder precedenti e da C0. Applicando la proprietà distributiva, si ottiene:\ -C4 = g3 + p3\*(g2 + p2\*g1 + p2\*p1\*\g0 + p2\*\p1\*\p0\*\C0). Applicando nuovamente la proprietà distributiva, si ottiene:\ -C4 = g3 + p3\*\g2 + p3\*p2\*g1 + p3\*p2\*p1\*g0 + p3\*p2\*p1\*p0\*C0 +C4 = g3 + p3\*C3, cioè, sostituendo C3:\ +C4 = g3 + p3\*(g2 + p2\*(g1 + p1\*gC0 + p1\*\pC0\*CC0)), che significa che C4 non dipende dal risultato dell'Adder precedente, ma solo dagli input A e B degli Adder precedenti e da CC0. Applicando la proprietà distributiva, si ottiene:\ +C4 = g3 + p3\*(g2 + p2\*g1 + p2\*p1\*\gC0 + p2\*\p1\*\pC0\*\CC0). Applicando nuovamente la proprietà distributiva, si ottiene:\ +C4 = g3 + p3\*\g2 + p3\*p2\*g1 + p3\*p2\*p1\*gC0 + p3\*p2\*p1\*pC0\*CC0 -Si noti che questa espressione dipende dunque dai soli input A, B e C0. +Si noti che questa espressione dipende dunque dai soli input A, B e CC0. Andiamo ora a realizzare un Carry Look Ahead Adder, ma prima modifichiamo i Full Adder considerando quanto visto sopra e creiamo dei Modified Full Adder. @@ -820,13 +818,13 @@ Andiamo ora a realizzare un Carry Look Ahead Adder, ma prima modifichiamo i Full La somma **Q**, come sempre, corrisponde ad A0⊕B0⊕C0. Aggiungiamo al Full Adder una porta OR e una porta AND con il solo scopo di ottenere i termini p0 (cioè A0+B0) e g0 (cioé A0*B0). -Vediamo la logica del Carry C1 = g0 + p0\*C0: +Vediamo la logica del Carry C1 = gC0 + pC0\*CC0: ![Logica del Carry del Modified Full Adder](../../assets/math/modifified-full-adder-2.png){:width="100%"} *Logica del Carry del Modified Full Adder.* -Si noti che il Carry Out C1 del primo Adder si trova al livello 3, che significa che il percorso più lungo è rappresentato da una OR che ha in ingresso A0 e B0, il cui output p0 entra in una AND, il cui output entra in una OR finale dalla quale si ottiene C1. In effetti, a questo punto, siamo come nel RCA, il cui C1 veniva generato al 3° livello. +Si noti che il Carry Out C1 del primo Adder si trova al livello 3, che significa che il percorso più lungo è rappresentato da una OR che ha in ingresso AC0 e BC0, il cui output pC0 entra in una AND, il cui output entra in una OR finale dalla quale si ottiene C1. In effetti, a questo punto, siamo come nel RCA, il cui C1 veniva generato al 3° livello. Aggiungendo il prossimo Modified Full Adder, si verifica che la somma è computata al 4° livello, mentre il Carry è, come nell'adder precedente, computato ancora al 3° livello.