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.