Salta al contenuto
Note per Studenti Formulario · Circuiti Digitali

FormularioCircuiti Digitali: definizioni, teoremi e formule delle note, in ordine di capitolo

In questa pagina 13

I. Sistemi digitali e rappresentazione dell'informazione

Sistemi digitali, segnali binari e livelli di astrazione

Formula (margini di rumore)

NMH=VOH,min⁡−VIH,min⁡=0,9−0,6=0,3 V,NML=VIL,max⁡−VOL,max⁡=0,4−0,1=0,3 VNM_H=V_{OH,\min}-V_{IH,\min}=0{,}9-0{,}6=0{,}3\,\mathrm V,\qquad NM_L=V_{IL,\max}-V_{OL,\max}=0{,}4-0{,}1=0{,}3\,\mathrm V

Esempio. Con VOH,min⁡=2,4 VV_{OH,\min}=2{,}4\,\mathrm V, VIH,min⁡=2,0 VV_{IH,\min}=2{,}0\,\mathrm V, VOL,max⁡=0,4 VV_{OL,\max}=0{,}4\,\mathrm V e VIL,max⁡=0,8 VV_{IL,\max}=0{,}8\,\mathrm V: NMH=2,4−2,0=0,4 VNM_H=2{,}4-2{,}0=0{,}4\,\mathrm V e NML=0,8−0,4=0,4 VNM_L=0{,}8-0{,}4=0{,}4\,\mathrm V.

Proprietà (combinazioni di nn bit). Un gruppo di nn bit ha 2n2^n combinazioni distinte, quindi può rappresentare 2n2^n elementi:

bit 1 2 3 4 8 10 16
combinazioni 2 4 8 16 256 1024 65536

Esempio. n=4n=4 bit danno 24=162^4=16 combinazioni; per distinguere 401401 valori servono 99 bit, perché 28=256<401≤29=5122^8=256<401\le2^9=512.

Basi di numerazione e conversioni - binario, ottale ed esadecimale

Definizione (notazione posizionale in base rr). In base rr si usano le rr cifre 0,1,…,r−10,1,\dots,r-1. Il valore di una cifra dipende dalla posizione: è il coefficiente di una potenza di rr. Un numero con cifre anan−1…a1a0.a−1a−2…ama_na_{n-1}\dots a_1a_0.a_{-1}a_{-2}\dots a_{m} vale N=∑i=mnai ri.N=\sum_{i=m}^{n}a_i\,r^i .

Esempio. 3458=3⋅82+4⋅8+5=22910345_8=3\cdot8^2+4\cdot8+5=229_{10}; 1A16=1⋅16+10=26101A_{16}=1\cdot16+10=26_{10}.

Proprietà (cifre ottali ed esadecimali e bit). Poiché 8=238=2^3 e 16=2416=2^4, una cifra ottale corrisponde esattamente a 3 bit e una esadecimale a 4 bit: sono scritture compatte del binario, lunghe un terzo o un quarto.

Esempio. 78=11127_8=111_2, F16=11112F_{16}=1111_2; 7548=111 101 1002754_8=111\,101\,100_2.

Proprietà (conversione binario-esadecimale). Si formano gruppi di 4 bit partendo dalla virgola (verso sinistra per la parte intera, verso destra per la frazionaria), completando con zeri i gruppi estremi, e si sostituisce ogni gruppo con la sua cifra. Esempio: 0010 1100 0110 1011,1111 0000 01102=2C6B,F06160010\,1100\,0110\,1011{,}1111\,0000\,0110_2=2C6B{,}F06_{16}.

Esempio. 1011 01102=B616=11⋅16+6=182101011\,0110_2=B6_{16}=11\cdot16+6=182_{10}.

Proprietà (parte intera: divisioni successive per rr). Si divide il numero per la base, si annota il resto, si divide il quoziente, e così via fino al quoziente 00. Il primo resto è la cifra meno significativa: i resti si leggono dal basso verso l'alto. Perché funziona: ogni divisione per rr stacca la cifra a0a_0 (il resto) e sposta tutte le altre di una posizione, come cancellare l'ultima cifra in decimale.

Esempio: 625625 in binario. 625→312625\to312 r 11; 312→156312\to156 r 00; 156→78156\to78 r 00; 78→3978\to39 r 00; 39→1939\to19 r 11; 19→919\to9 r 11; 9→49\to4 r 11; 4→24\to2 r 00; 2→12\to1 r 00; 1→01\to0 r 11. Letti dal basso: 10011100011001110001 ✓ (stesso risultato).

Proprietà (parte frazionaria: moltiplicazioni successive per rr). Si moltiplica la parte frazionaria per 2; la parte intera del prodotto (0 o 1) è la prossima cifra dopo la virgola, a partire dalla più significativa; si ripete sulla nuova parte frazionaria finché si ottiene 00 o si hanno abbastanza cifre.

Esempio: 41,12541{,}125. La parte intera: 41=32+8+1→10100141=32+8+1\to101001. Frazione: 0,125⋅2=0,250{,}125\cdot2=0{,}25 (cifra 00); 0,25⋅2=0,50{,}25\cdot2=0{,}5 (cifra 00); 0,5⋅2=1,00{,}5\cdot2=1{,}0 (cifra 11), residuo 00, stop. Quindi 41,12510=101001,001241{,}125_{10}=101001{,}001_2.

Codici binari - BCD, ASCII, Unicode, parità e Gray

Definizione (codice BCD). Il BCD (Binary-Coded Decimal) codifica ogni cifra decimale con il suo valore binario su 4 bit. Per scrivere un numero si codifica cifra per cifra:

Esempio. 18510=0001  1000  0101BCD185_{10}=0001\;1000\;0101_{BCD}, mentre in binario puro è 10111001210111001_2: le due rappresentazioni sono diverse. Invece 310=0011BCD=1123_{10}=0011_{BCD}=11_2 coincidono solo perché il numero ha una cifra.

Definizione (codifica UTF-8)

intervallo del code point byte schema dei bit
U+0000 – U+007F 1 0xxxxxxx
U+0080 – U+07FF 2 110xxxxx 10xxxxxx
U+0800 – U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

I bit x sono quelli del code point, scritti in binario e distribuiti da sinistra a destra.

Esempio ±: B116=1011 00012B1_{16}=1011\,0001_2 sta in 22 byte. Gli 1111 bit di payload sono 000 1011 0001000\,1011\,0001: i primi 55 (0001000010) vanno nel primo byte, gli ultimi 66 (110001110001) nel secondo: 11000010  1011000111000010\;10110001. Esempio €: 20AC16=0010 0000 1010 1100220AC_{16}=0010\,0000\,1010\,1100_2, 1616 bit, quindi 33 byte: 11100010  10000010  1010110011100010\;10000010\;10101100.

Definizione (bit di parità). Per rilevare errori (non correggerli) si aggiunge un bit scelto in modo che il numero totale di 1 sia pari (parità pari, la più usata) oppure dispari.

Esempio. 1011001 ha quattro 1: con parità pari il bit è 00 (01011001), con parità dispari è 11 (11011001).

Definizione (distanza di Hamming). La distanza di Hamming tra due configurazioni è il numero di bit in cui differiscono. Esempi: 8=10008=1000 e 11=101111=1011 differiscono nei due bit meno significativi, distanza 22; 8=10008=1000 e 4=01004=0100 differiscono in due posizioni, distanza 22; 0=0000=000 e 7=1117=111, distanza 33. Non è la differenza algebrica dei numeri.

Esempio. d(0110,1101)=3d(0110,1101)=3: i due codici differiscono in 33 bit su 44 (0110⊕1101=10110110\oplus1101=1011).

Definizione (codice Gray). Il codice Gray è un codice in cui due numeri consecutivi hanno distanza di Hamming 11: passando dal numero al successivo cambia un solo bit.

Esempio. A 44 bit 5→01115\to0111 e 6→01016\to0101 differiscono in un solo bit.

Formula (conversione binario-Gray). Il bit più significativo si copia; ogni altro bit è lo XOR del bit binario corrispondente con quello alla sua sinistra: gi=bi⊕bi+1g_i=b_i\oplus b_{i+1}. Esempio: b=1011b=1011: g3=1g_3=1; g2=0⊕1=1g_2=0\oplus1=1; g1=1⊕0=1g_1=1\oplus0=1; g0=1⊕1=0g_0=1\oplus1=0, quindi g=1110g=1110. La conversione inversa è bi=bi+1⊕gib_i=b_{i+1}\oplus g_i.

Esempio. b=0110b=0110 (66): g3=0g_3=0, g2=0⊕1=1g_2=0\oplus1=1, g1=1⊕1=0g_1=1\oplus1=0, g0=1⊕0=1g_0=1\oplus0=1, quindi g=0101g=0101.

Numeri con segno, complemento a 2, sottrazione e overflow

Definizione (complemento a 1 e a 2). Dato NN su nn bit:

  • complemento a 1: (2n−1)−N(2^n-1)-N, cioè il complemento di ogni bit (si scambiano 0 e 1);
  • complemento a 2: 2n−N2^n-N, cioè complemento a 1 più 1.

Esempio. N=1011001N=1011001 su 77 bit: complemento a 1 =0100110=0100110 (bit invertiti), complemento a 2 =0100110+1=0100111=0100110+1=0100111.

Definizione (numeri con segno in complemento a 2). I positivi sono come in senza segno (00 seguito dal modulo); un negativo −N-N si rappresenta con il complemento a 2 di NN, cioè 2n−N2^n-N. L'MSB è 00 per tutti i positivi e 11 per tutti i negativi. Con 4 bit:

bit senza segno segno e modulo complemento a 2
0000 0 +0+0 0
0111 7 7 7
1000 8 −0-0 −8-8
1001 9 −1-1 −7-7
1010 10 −2-2 −6-6
1011 11 −3-3 −5-5
1100 12 −4-4 −4-4
1101 13 −5-5 −3-3
1110 14 −6-6 −2-2
1111 15 −7-7 −1-1

Esempio. A 88 bit −13=28−13=243=11110011-13=2^8-13=243=11110011.

Proprietà (intervallo e peso dell'MSB in complemento a 2). In complemento a 2 c'è un solo zero e l'intervallo è asimmetrico: da −2n−1-2^{n-1} a 2n−1−12^{n-1}-1 (con 8 bit da −128-128 a 127127; −(−128)-(-128) non è rappresentabile). Il valore si legge dando all'MSB il peso −2n−1-2^{n-1}: 11110011=−128+64+32+16+2+1=−1311110011=-128+64+32+16+2+1=-13.

Esempio. A 44 bit l'intervallo è da −8-8 a +7+7; 1011=−8+2+1=−51011=-8+2+1=-5.

Formula (sottrazione in complemento a 2). A−B=A+(−B)A-B=A+(-B), cioè si somma ad AA il complemento a 2 di BB: A−B=A+B‾+1A-B=A+\overline B+1 (complemento a 1 di BB più 1). Esempio: +7−(−12)+7-(-12): −12=11110100-12=11110100, il suo complemento a 2 è 0000110000001100 (+12+12), e 00000111+00001100=00010011=+1900000111+00001100=00010011=+19 ✓.

Esempio. A 44 bit, 5−35-3: 0101+0011‾+1=0101+1100+1=(1) 0010=+20101+\overline{0011}+1=0101+1100+1=(1)\,0010=+2, riporto scartato.

Proprietà (overflow in complemento a 2). Somma e sottrazione di operandi di segno diverso non hanno mai overflow (il modulo non cresce). Si ha overflow solo se i due addendi (per la sottrazione: AA e −B-B) hanno lo stesso segno e il risultato ha segno opposto. In termini di riporti: c'è overflow se il riporto che entra nel bit di segno è diverso dal riporto che esce dal bit di segno: V=Cin, MSB⊕Cout, MSB.V=C_{in,\,MSB}\oplus C_{out,\,MSB}.

Esempio. A 44 bit 5+45+4: 0101+0100=10010101+0100=1001, riporto entrante nel segno 11, uscente 00, quindi V=1V=1 (il risultato 10011001 sarebbe −7-7).

II. Algebra di Boole, porte logiche e minimizzazione

Algebra di Boole - assiomi, teoremi e complemento di una funzione

Proprietà (identità fondamentali dell'algebra di Boole). Le identità vengono a coppie duali: la seconda si ottiene dalla prima scambiando AND con OR e 00 con 11.

nome forma OR forma AND (duale)
elemento neutro X+0=XX+0=X X⋅1=XX\cdot1=X
minimo e massimo X+1=1X+1=1 X⋅0=0X\cdot0=0
idempotenza X+X=XX+X=X X⋅X=XX\cdot X=X
complemento X+X‾=1X+\overline X=1 X⋅X‾=0X\cdot\overline X=0
doppia negazione X‾‾=X\overline{\overline X}=X
commutativa X+Y=Y+XX+Y=Y+X XY=YXXY=YX
associativa X+(Y+Z)=(X+Y)+ZX+(Y+Z)=(X+Y)+Z X(YZ)=(XY)ZX(YZ)=(XY)Z
distributiva X(Y+Z)=XY+XZX(Y+Z)=XY+XZ X+YZ=(X+Y)(X+Z)X+YZ=(X+Y)(X+Z)

Esempio. (A+B)(A+B‾)=A+BB‾=A+0=A(A+B)(A+\overline B)=A+B\overline B=A+0=A (seconda distributiva e complemento).

Teorema (De Morgan)

X+Y‾=X‾⋅Y‾,X⋅Y‾=X‾+Y‾.\overline{X+Y}=\overline X\cdot\overline Y,\qquad\overline{X\cdot Y}=\overline X+\overline Y .

Esempio. A+B‾ C‾=A‾⋅(B+C‾)\overline{A+\overline B\,C}=\overline A\cdot(B+\overline C): si scambiano AND e OR e si negano i letterali.

Teorema (semplificazione: assorbimento, adiacenza e consenso)

nome forma dimostrazione
assorbimento X+XY=XX+XY=X X+XY=X(1+Y)=X⋅1=XX+XY=X(1+Y)=X\cdot1=X
assorbimento (dual) X(X+Y)=XX(X+Y)=X duale
X+X‾Y=X+YX+\overline XY=X+Y X+X‾Y=(X+X‾)(X+Y)=1⋅(X+Y)X+\overline XY=(X+\overline X)(X+Y)=1\cdot(X+Y)
adiacenza (unificazione) XY+XY‾=XXY+X\overline Y=X X(Y+Y‾)=X⋅1=XX(Y+\overline Y)=X\cdot1=X
consenso XY+X‾Z+YZ=XY+X‾ZXY+\overline XZ+YZ=XY+\overline XZ vedi sotto

Esempio. X+X‾Y=X+YX+\overline XY=X+Y: per X=0,Y=1X=0,Y=1 entrambi i membri valgono 11, per X=0,Y=0X=0,Y=0 valgono 00.

Proprietà (complemento di una funzione). Il complemento F‾\overline F ha la tabella di verità con 00 e 11 scambiati nella colonna dell'uscita. Per ottenerne l'espressione si hanno due vie.

(a) De Morgan. Esempio: F1=A‾B+AB‾F_1=\overline AB+A\overline B (XOR). F1‾=A‾B‾⋅AB‾‾=(A+B‾)(A‾+B)=AA‾+AB+B‾ A‾+B‾B=AB+A‾ B‾\overline{F_1}=\overline{\overline AB}\cdot\overline{A\overline B}=(A+\overline B)(\overline A+B)=A\overline A+AB+\overline B\,\overline A+\overline BB=AB+\overline A\,\overline B (XNOR) ✓.

(b) Duale e negazione dei letterali. Si scrive l'espressione duale (scambio di AND/OR e di 0/10/1) e poi si nega ogni letterale. Stesso esempio: il duale di A‾B+AB‾\overline AB+A\overline B è (A‾+B)(A+B‾)(\overline A+B)(A+\overline B); negando i letterali si ottiene (A+B‾)(A‾+B)(A+\overline B)(\overline A+B), uguale al risultato di (a) ✓.

Esempio. F=A+BC‾F=A+B\overline C ha F‾=A‾⋅(B‾+C)\overline F=\overline A\cdot(\overline B+C) (De Morgan); per A=0,B=1,C=0A=0,B=1,C=0 si ha F=1F=1 e F‾=0\overline F=0.

Porte logiche, ritardi e porte universali

Definizione (porte AND, OR e NOT). AND (congiunzione, prodotto logico; Z=X⋅Y=XY=X∧YZ=X\cdot Y=XY=X\land Y): Z=1Z=1 se e solo se tutti gli ingressi valgono 1.

OR (disgiunzione, somma logica; Z=X+Y=X∨YZ=X+Y=X\lor Y): Z=1Z=1 se almeno uno degli ingressi vale 1.

NOT (negazione, inverter; Z=X‾=X′Z=\overline X=X'): Z=1Z=1 se X=0X=0.

Esempio. Con X=1X=1, Y=0Y=0: XY=0XY=0, X+Y=1X+Y=1, X‾=0\overline X=0.

Definizione (porte NAND, NOR, XOR e XNOR)

  • NAND = NOT(AND): Z=XY‾Z=\overline{XY}; vale 0 solo se tutti gli ingressi sono 1.
  • NOR = NOT(OR): Z=X+Y‾Z=\overline{X+Y}; vale 1 solo se tutti gli ingressi sono 0.
  • XOR (OR esclusivo, Z=X⊕YZ=X\oplus Y): vale 1 se gli ingressi sono diversi.
  • XNOR: complemento dello XOR; vale 1 se gli ingressi sono uguali.

Esempio. Con X=1X=1, Y=1Y=1: NAND =0=0, NOR =0=0, XOR =0=0, XNOR =1=1.

Definizione (ritardo di una porta). Una porta reale ha un tempo di ritardo tGt_G (gate delay, tempo di propagazione): il tempo che trascorre da quando cambia almeno un ingresso a quando il cambiamento arriva all'uscita. Dipende dalla tecnologia, dalla tensione di alimentazione, dalla temperatura e dal carico pilotato (fan-out). In genere il ritardo per la commutazione 0→10\to1 in uscita (tpLHt_{pLH}) è diverso da quello per 1→01\to0 (tpHLt_{pHL}), e dipende da quale ingresso commuta; per semplicità si assume spesso tpLH=tpHL=tGt_{pLH}=t_{pHL}=t_G.

Esempio. Porta AND con tG=2 nst_G=2\,\mathrm{ns}. AA vale 1 tra 1010 e 40 ns40\,\mathrm{ns} (0 altrove); BB vale 1 tra 2020 e 60 ns60\,\mathrm{ns}. Il prodotto ideale A⋅BA\cdot B è 1 tra 2020 e 40 ns40\,\mathrm{ns} (quando entrambi sono 1). Con il ritardo l'uscita sale a 22 ns22\,\mathrm{ns} e scende a 42 ns42\,\mathrm{ns}: stessa forma, spostata di tGt_G.

Proprietà (porte universali: NAND e NOR). Un insieme di porte è universale (o completo) se con esse si realizza ogni funzione booleana. {AND,OR,NOT}\{AND, OR, NOT\} lo è per definizione; NAND da sola lo è, e NOR da sola lo è.

Con NAND (un inverter è una NAND con gli ingressi cortocircuitati):

  • NOT: X‾=X⋅X‾\overline X=\overline{X\cdot X} (1 NAND);
  • AND: X⋅Y=XY‾‾X\cdot Y=\overline{\overline{XY}}, cioè una NAND seguita da un inverter (2 NAND);
  • OR: X+Y=X‾⋅Y‾‾X+Y=\overline{\overline X\cdot\overline Y} (De Morgan: due inverter e una NAND, 3 NAND).

Con NOR, dualmente: NOT == NOR con ingressi uniti; OR =X+Y‾‾=\overline{\overline{X+Y}} (2 NOR); AND X⋅Y=X‾+Y‾‾X\cdot Y=\overline{\overline X+\overline Y} (3 NOR).

Esempio: XOR con quattro NAND. Siano n1=ab‾n_1=\overline{ab}, n2=a n1‾n_2=\overline{a\,n_1}, n3=b n1‾n_3=\overline{b\,n_1}, y=n2n3‾y=\overline{n_2n_3}. Verifica (tutte le righe):

Forme canoniche - mintermini, maxtermini, SOP e POS

Definizione (mintermine). Un mintermine (minterm) è un prodotto (AND) in cui compare una e una sola volta ciascuna variabile della funzione, in forma diretta o negata. Ogni mintermine corrisponde a una riga della tabella di verità: vale 11 per la combinazione di valori di quella riga e 00 per tutte le altre. Si costruisce prendendo ciascuna variabile diretta se il suo bit nella riga è 1, negata se è 0. Se la riga è il numero ii (letto in binario con la prima variabile come bit più significativo) il mintermine si chiama mim_i.

Esempio. Con le variabili X,Y,ZX,Y,Z la riga 5=1015=101 dà m5=XY‾Zm_5=X\overline YZ.

Definizione (maxtermine). Il maxtermine (maxterm) è il concetto duale: una somma (OR) che contiene una e una sola volta tutte le variabili, dirette o negate. Ogni maxtermine vale 00 su una sola riga e 11 su tutte le altre. Si costruisce con ciascuna variabile negata se il suo bit nella riga è 1, diretta se è 0 (è l'opposto della regola dei mintermini). Anche i maxtermini sono 2n2^n e corrispondono alle righe della tabella.

Esempio. Con le variabili X,Y,ZX,Y,Z la riga 5=1015=101 dà M5=X‾+Y+Z‾M_5=\overline X+Y+\overline Z.

Proprietà (mintermine e maxtermine con lo stesso indice). Il mintermine e il maxtermine con lo stesso indice sono uno il complemento dell'altro: mi‾=Mi\overline{m_i}=M_i. Per i=3i=3: X‾YZ‾=X+Y‾+Z‾\overline{\overline X YZ}=X+\overline Y+\overline Z ✓ (De Morgan, Algebra di Boole - assiomi, teoremi e complemento di una funzioneL'algebra di Boole opera su variabili a due valori con AND, OR, NOT. Identità fondamentali (neutro, idempotenza, complemento, commutativa, associativa, distributiva in entrambe le forme), dualità (si scambiano AND/OR e 0/1), De Morgan $\overline{X+Y}=\overline X,\overline Y$, assorbimento $X+XY=X$, $X+\overline XY=X+Y$, adiacenza $XY+X\overline Y=X$, consenso $XY+\overline XZ+YZ=XY+\overline XZ$. Si dimostrano per induzione perfetta (tabella) o algebricamente. Il complemento di una funzione si ottiene con De Morgan o con duale + negazione dei letterali. Costo: numero di letterali o di ingressi delle porte.Algebra di Boole - assiomi, teoremi e complemento di una funzione →).

Esempio. m5‾=XY‾Z‾=X‾+Y+Z‾=M5\overline{m_5}=\overline{X\overline YZ}=\overline X+Y+\overline Z=M_5.

Definizione (forme canoniche SOP e POS). Dalla tabella di verità di FF:

  • SOP canonica (Sum Of Products): somma dei mintermini delle righe in cui F=1F=1. In breve F=∑m(… )F=\sum m(\dots).
  • POS canonica (Product Of Sums): prodotto dei maxtermini delle righe in cui F=0F=0. In breve F=∏M(… )F=\prod M(\dots).

Esempio. Se F(A,B)F(A,B) vale 11 sulle righe 11 e 33 (cioè F=BF=B): F=∑m(1,3)=A‾B+ABF=\sum m(1,3)=\overline AB+AB e F=∏M(0,2)=(A+B)(A‾+B)F=\prod M(0,2)=(A+B)(\overline A+B).

Mappe di Karnaugh - implicanti e copertura minima

Definizione (mappa di Karnaugh). La mappa ha una cella per ogni riga della tabella di verità, cioè per ogni mintermine (Forme canoniche - mintermini, maxtermini, SOP e POSUn mintermine è un prodotto che contiene una e una sola volta tutte le variabili (dirette o negate) e vale 1 su una sola riga della tabella di verità; un maxtermine è la somma duale e vale 0 su una sola riga; con $n$ variabili ci sono $2^n$ mintermini e $2^n$ maxtermini, e $\overline{m_i}=M_i$. Forma canonica SOP = somma dei mintermini delle righe con $F=1$; POS = prodotto dei maxtermini delle righe con $F=0$. Le forme canoniche si ricavano sempre dalla tabella ma sono ridondanti: servono come punto di partenza per la minimizzazione. SOP e POS si realizzano con circuiti a due livelli.Forme canoniche - mintermini, maxtermini, SOP e POS →). Le variabili sono distribuite su righe e colonne, e le combinazioni sono ordinate in codice Gray (00,01,11,1000,01,11,10, non 00,01,10,1100,01,10,11) in modo che due celle vicine differiscano di una sola variabile, cioè siano a distanza di Hamming 11 (Codici binari - BCD, ASCII, Unicode, parità e GrayUn codice binario a $n$ bit distingue $2^n$ elementi. BCD: una cifra decimale ogni 4 bit (1010–1111 non usati; 10 richiede 8 bit, non è il binario del numero). ASCII: 7 bit per 128 caratteri, la cifra ASCII è 011 seguito dal BCD. Unicode/UTF-8: da 1 a 4 byte, compatibile con ASCII. Bit di parità: rileva errori su un numero dispari di bit. Distanza di Hamming = numero di bit diversi. Codice Gray: numeri consecutivi differiscono di un solo bit (sensori di posizione); si costruisce per riflessione o con $g_i=b_i\oplus b_{i+1}$.Codici binari - BCD, ASCII, Unicode, parità e Gray →).

Esempio. A 33 variabili le colonne BCBC seguono l'ordine 00,01,11,1000,01,11,10; le celle 22 (010010) e 66 (110110) sono adiacenti perché differiscono solo per AA.

Proprietà (gruppo di 2k2^k celle). Estendendo: un gruppo rettangolare di 2k2^k celle (1, 2, 4, 8, 16) formato da 1 elimina kk variabili; il prodotto che lo rappresenta contiene le sole variabili che non cambiano all'interno del gruppo, dirette se valgono 1, negate se valgono 0.

Esempio. A 44 variabili le celle 0,1,4,50,1,4,5 (k=2k=2) hanno costanti A=0A=0 e C=0C=0: il gruppo dà A‾ C‾\overline A\,\overline C.

Definizione (implicante, implicante primo ed essenziale, copertura)

  • Implicante: prodotto per cui la funzione vale 1 ogni volta che il prodotto vale 1 (un gruppo di 1).
  • Implicante primo (IP): implicante che non è contenuto in nessun implicante più grande (gruppo massimo, non ingrandibile).
  • Implicante primo essenziale (IPE): IP che è l'unico a coprire almeno un mintermine della funzione; va incluso in ogni copertura.
  • Copertura: insieme di implicanti che copre tutti gli 1. Obiettivo: copertura minima, cioè tutti gli IPE più il minor numero di altri IP che copre i mintermini rimasti.

Esempio. F=∑m(1,2,3)F=\sum m(1,2,3) a 22 variabili: gli implicanti primi sono BB (celle 1,31,3) e AA (celle 2,32,3), entrambi essenziali; la copertura minima è F=A+BF=A+B.

Mappe di Karnaugh - POS, condizioni di don't care e parità

Proprietà (POS minima dai gruppi di zeri). La SOP raggruppa gli 1. La POS si ottiene raggruppando gli 0, ossia lavorando sul complemento F‾\overline F:

  1. si marcano gli 0 della mappa e si raggruppano come si farebbe con gli 1 (rettangoli di 2k2^k, IP e IPE), ottenendo una SOP minima di F‾\overline F;
  2. si complementa con De Morgan: F=F‾‾F=\overline{\overline F}. In pratica, per ogni gruppo si scrive una somma con le variabili che non cambiano, diretta se nel gruppo valgono 0, negata se valgono 1;
  3. FF è il prodotto di queste somme.

Esempio. Un gruppo di 00 che per F‾\overline F dà A‾B\overline AB diventa nella POS la somma A+B‾A+\overline B.

Proprietà (condizioni di don't care). Una X si può usare come 1 o come 0, a seconda di ciò che serve per fare gruppi più grandi. Regole:

  • una X dentro un gruppo viene trattata come 1, e non è coperta esplicitamente: la funzione ottenuta vale 1 su quella combinazione;
  • una X lasciata fuori è trattata come 0;
  • non si fa un gruppo che contenga solo X, e non è obbligatorio coprire le X;
  • una X non rende un gruppo "essenziale": gli IPE si definiscono rispetto ai soli mintermini a 1.

Esempio. Con una cifra BCD le celle 1010–1515 sono X: il gruppo delle celle 3,2,11,103,2,11,10 dà B‾C\overline BC usando le X di 1010 e 1111.

Proprietà (XOR a tre variabili e mappa a scacchiera). La funzione XOR a 3 variabili (disparità, vale 1 se il numero di 1 in ingresso è dispari) è X⊕Y⊕Z=∑m(1,2,4,7)X\oplus Y\oplus Z=\sum m(1,2,4,7). La sua mappa ha gli 1 a scacchiera:

X\YZX\backslash YZ 00 01 11 10
0 0 1 0 1
1 1 0 1 0

Nessun 1 è adiacente a un altro: i mintermini sono a distanza di Hamming 2 l'uno dall'altro. Non esistono gruppi da più di una cella, quindi la SOP minima coincide con la canonica (44 prodotti da 33 letterali) e non si semplifica. Conviene usare le porte XOR: S=(X⊕Y)⊕ZS=(X\oplus Y)\oplus Z con due porte. Lo stesso vale per 4 variabili (16 celle, scacchiera da 8 mintermini dispari) e per la funzione di parità (complemento: 11 se gli 1 sono in numero pari), che si ottiene sostituendo le XOR con XNOR.

Esempio. X⊕Y⊕ZX\oplus Y\oplus Z vale 11 per 111111 (tre 1, dispari) e 00 per 110110 (due 1, pari).

III. Progettazione di reti combinatorie

Progettazione di una rete combinatoria - approccio gerarchico e porte NAND-NOR

Definizione (circuito combinatorio e sequenziale)

Esempio. Un half adder con ingressi (1,1)(1,1) dà sempre S=0S=0, C=1C=1 (combinatorio); un contatore con lo stesso ingresso può dare uscite diverse a seconda dello stato (sequenziale).

Definizione (circuito di abilitazione). Enabling (abilitazione). Un circuito di abilitazione lascia passare il segnale XX all'uscita se il segnale di enable EN vale 1, altrimenti forza l'uscita a un valore fisso. Due forme: F=X⋅ENF=X\cdot EN (se EN=0EN=0 allora F=0F=0) e F=X+EN‾F=X+\overline{EN} (se EN=0EN=0 allora F=1F=1).

Esempio: comandi di un'auto. Luci, radio e alzacristalli funzionano solo ad auto accesa: il segnale di accensione IS fa da enable per i tre interruttori LS,RS,WSLS,RS,WS. Equazioni: L=IS⋅LSL=IS\cdot LS, R=IS⋅RSR=IS\cdot RS, W=IS⋅WSW=IS\cdot WS. Se IS=0IS=0 tutte le uscite sono 0 qualunque sia lo stato degli interruttori (nella tabella di verità le righe con IS=0IS=0 hanno XX negli ingressi interruttore: sono righe "multi-mintermine", un prodotto che non è un mintermine).

Proprietà (SOP realizzata con sole NAND). SOP →\to NAND-NAND. Una somma di prodotti si realizza con AND seguite da una OR. Applicando due volte la doppia negazione e De Morgan: F=P1+P2+⋯+Pk=P1+P2+⋯+Pk‾‾=P1‾⋅P2‾⋯Pk‾‾.F=P_1+P_2+\dots+P_k=\overline{\overline{P_1+P_2+\dots+P_k}}=\overline{\overline{P_1}\cdot\overline{P_2}\cdots\overline{P_k}}. Ogni Pi‾\overline{P_i} è l'uscita di una NAND con gli ingressi del prodotto, e la parte esterna è una NAND con kk ingressi. Esempio: F=AB+CD‾+A‾CF=AB+C\overline D+\overline AC diventa F=AB‾⋅CD‾‾⋅A‾C‾‾F=\overline{\overline{AB}\cdot\overline{C\overline D}\cdot\overline{\overline AC}}: tre NAND a 2 ingressi più una NAND a 3 ingressi (più gli inverter per D‾\overline D e A‾\overline A). Un prodotto con un solo letterale richiede un inverter al posto della NAND. Le due realizzazioni (AND-OR e NAND-NAND) sono equivalenti per tutte le 16 combinazioni degli ingressi.

Esempio. F=AB+C=AB‾⋅C‾‾F=AB+C=\overline{\overline{AB}\cdot\overline C}: una NAND a 22 ingressi per ABAB, un inverter per CC e una NAND finale a 22 ingressi.

Proprietà (POS realizzata con sole NOR). POS →\to NOR-NOR. Dualmente F=S1S2⋯Sk=S1‾+S2‾+…‾F=S_1S_2\cdots S_k=\overline{\overline{S_1}+\overline{S_2}+\dots} si realizza con NOR di somme e una NOR finale. Esempio: F=(A+B‾)(C+D)(A‾+D‾)=A+B‾‾+C+D‾+A‾+D‾‾‾F=(A+\overline B)(C+D)(\overline A+\overline D)=\overline{\overline{A+\overline B}+\overline{C+D}+\overline{\overline A+\overline D}}: tre NOR a 2 ingressi più una NOR a 3 ingressi.

Esempio. F=(A+B)(C+D)=A+B‾+C+D‾‾F=(A+B)(C+D)=\overline{\overline{A+B}+\overline{C+D}}: due NOR a 22 ingressi e una NOR finale a 22 ingressi.

Decoder, encoder e priority encoder

Definizione (codifica one-hot). Nella codifica one-hot una configurazione a mm bit contiene uno e un solo 1, in una posizione che identifica il valore. Con n=3n=3 bit binari i valori 0,…,70,\dots,7 diventano:

binario 000 001 010 011 100 101 110 111
one-hot (8 bit) 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

Esempio. Il valore 55 in one-hot a 88 bit è 0010000000100000: vale 11 solo il bit di posizione 55.

Definizione (decoder nn-to-mm). Un decoder nn-to-mm ha nn ingressi e m≤2nm\le2^n uscite D0,…,Dm−1D_0,\dots,D_{m-1}: pone a 1 l'uscita il cui indice è codificato dagli ingressi e a 0 le altre. Se a ogni combinazione degli ingressi corrisponde un'uscita valida, m=2nm=2^n. Esempio: ingresso A1A0=11A_1A_0=11 (cioè 33) ⇒\Rightarrow D3D2D1D0=1000D_3D_2D_1D_0=1000.

Le uscite di un decoder sono i 2n2^n mintermini degli ingressi: Di=miD_i=m_i (Forme canoniche - mintermini, maxtermini, SOP e POSUn mintermine è un prodotto che contiene una e una sola volta tutte le variabili (dirette o negate) e vale 1 su una sola riga della tabella di verità; un maxtermine è la somma duale e vale 0 su una sola riga; con $n$ variabili ci sono $2^n$ mintermini e $2^n$ maxtermini, e $\overline{m_i}=M_i$. Forma canonica SOP = somma dei mintermini delle righe con $F=1$; POS = prodotto dei maxtermini delle righe con $F=0$. Le forme canoniche si ricavano sempre dalla tabella ma sono ridondanti: servono come punto di partenza per la minimizzazione. SOP e POS si realizzano con circuiti a due livelli.Forme canoniche - mintermini, maxtermini, SOP e POS →). Quindi si realizza con mm porte AND a nn ingressi, ciascuna con la combinazione di ingressi diretti e negati del proprio mintermine.

Esempio. Decoder 33-to-88: con ingresso 101101 (55) le uscite D7…D0D_7\dots D_0 valgono 0010000000100000, e D5=A2A1‾A0D_5=A_2\overline{A_1}A_0.

Proprietà (funzione realizzata con un decoder e una OR). Una funzione in SOP è la somma dei suoi mintermini; il decoder genera tutti i mintermini. Quindi ogni funzione si realizza con un decoder e una porta OR a cui si collegano le uscite dei mintermini della SOP.

Definizione (encoder). L'encoder esegue l'operazione inversa del decoder: riceve un segnale 1-hot a 2n2^n bit e produce la codifica binaria a nn bit. Per l'encoder da ottale a binario con ingressi D0,…,D7D_0,\dots,D_7 (un solo 1 alla volta): A0=D1+D3+D5+D7,A1=D2+D3+D6+D7,A2=D4+D5+D6+D7.A_0=D_1+D_3+D_5+D_7,\quad A_1=D_2+D_3+D_6+D_7,\quad A_2=D_4+D_5+D_6+D_7 .

Esempio. Con D5=1D_5=1 e gli altri ingressi a 00: A0=1A_0=1, A1=0A_1=0, A2=1A_2=1, cioè A=101=5A=101=5.

Definizione (priority encoder). Il priority encoder gestisce ingressi non 1-hot con due modifiche:

  1. una funzione di priorità: conta solo l'ingresso a 1 con la priorità più alta, gli altri sono ignorati;
  2. un'uscita V (valid): V=1V=1 se almeno un ingresso vale 1, V=0V=0 se sono tutti 0 (e allora l'uscita AA è don't care).

Esempio a 4 ingressi, priorità D3>D2>D1>D0D_3>D_2>D_1>D_0:

Multiplexer e funzioni logiche realizzate con decoder e multiplexer

Definizione (multiplexer 2n2^n-to-1). Un MUX ha 2n2^n ingressi dati I0,…,I2n−1I_0,\dots,I_{2^n-1}, nn ingressi di selezione Sn−1…S0S_{n-1}\dots S_0 e un'uscita YY. Il segnale di selezione può essere binario o 1-hot; qui è binario: se SS vale ii in binario, allora Y=IiY=I_i.

MUX 2-to-1 (n=1n=1): Y=S‾ I0+S I1Y=\overline S\,I_0+S\,I_1. Se S=0S=0 allora Y=I0Y=I_0, se S=1S=1 allora Y=I1Y=I_1.

MUX 4-to-1 (n=2n=2): Y=S‾1S‾0I0+S‾1S0I1+S1S‾0I2+S1S0I3.Y=\overline S_1\overline S_0I_0+\overline S_1S_0I_1+S_1\overline S_0I_2+S_1S_0I_3 .

L'equazione generale è Y=∑imi(S)⋅IiY=\sum_i m_i(S)\cdot I_i: i mintermini degli ingressi di selezione fanno da "porte" per i dati.

Esempio. MUX 44-to-11 con I3I2I1I0=1101I_3I_2I_1I_0=1101: per S1S0=10S_1S_0=10 si ha Y=I2=1Y=I_2=1, per S1S0=01S_1S_0=01 si ha Y=I1=0Y=I_1=0.

Proprietà (funzione di nn variabili con un MUX 2n2^n-to-1). Una funzione di nn variabili si realizza con un MUX 2n2^n-to-1: le nn variabili sono collegate agli ingressi di selezione (rispettando l'ordine dei bit: la variabile più significativa va a Sn−1S_{n-1}), e agli ingressi dati si applica il valore della tabella di verità, riga per riga: Ii=F(i)I_i=F(i), una costante 0 o 1 (value fixing). Perché funziona: per la riga ii il MUX seleziona IiI_i, che è proprio il valore che la funzione deve avere.

Esempio. F=A⊕BF=A\oplus B con un MUX 44-to-11 e selezione S1S0=ABS_1S_0=AB: I0=0I_0=0, I1=1I_1=1, I2=1I_2=1, I3=0I_3=0.

Proprietà (funzione con un MUX 2n−12^{n-1}-to-1 e l'ultima variabile come dato). Si può usare un MUX più piccolo, con un ingresso di selezione in meno: si collegano alla selezione solo n−1n-1 variabili e agli ingressi dati si applicano le costanti 00, 11 oppure la variabile rimasta XX o il suo complemento X‾\overline X. Per ogni valore della selezione, le due righe della tabella (con X=0X=0 e X=1X=1) danno una coppia di valori:

F(X=0)F(X=0) F(X=1)F(X=1) ingresso dati
0 0 00
1 1 11
0 1 XX
1 0 X‾\overline X

Esempio. F(A,B,C,D)=∑m(1,3,4,11,12,13,14,15)F(A,B,C,D)=\sum m(1,3,4,11,12,13,14,15) con un MUX 8-to-1 e selezione S2S1S0=ABCS_2S_1S_0=ABC. Per ogni valore di ABCABC si guarda la coppia (F(D=0),F(D=1))(F(D=0),F(D=1)):

IV. VHDL per la logica combinatoria

Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione

Definizione (entity). È la "targa" del blocco: ne dà il nome e definisce l'interfaccia con l'esterno (quali porte, di che direzione e tipo). Non dice che cosa c'è dentro, come il simbolo di un circuito in uno schema. Un blocco deve avere una sola entity.

Esempio. port (a, b : in std_logic; y : out std_logic); dichiara due ingressi e un'uscita da un bit; il ; non va dopo l'ultima porta.

Definizione (architecture). È una descrizione particolare del contenuto di una entity: come si comporta e come opera internamente. Una entity può avere più architecture nello stesso progetto (per esempio una structural e una dataflow); un progetto non può avere più entity per lo stesso blocco.

Esempio. architecture beh of and2 is begin y <= a and b; end beh; descrive l'entity and2: con a='1' e b='1' si ha y='1'.

Definizione (vettori std_logic_vector). std_logic_vector(n-1 downto 0) ha il bit più significativo a sinistra, di indice n−1n-1; std_logic_vector(0 to n-1) ha l'indice 00 a sinistra (è il MSB). Un bit si estrae con x(2), una porzione con x(3 downto 1); il concatenamento si scrive &: "10" & "01" vale "1001". I letterali esadecimali si scrivono x"1F". Il tipo integer si usa per parametri (lunghezza dei vettori, indici dei cicli) e si scrive in decimale senza virgolette.

Esempio. Con x : std_logic_vector(3 downto 0) := "1010"; si ha x(3)='1', x(0)='0', x(3 downto 2)="10" e x & "01" vale "101001".

Formula (confronto A>BA>B a 2 bit)

A>B=A1B1‾+A0B1‾ B0‾+A1A0B0‾.A>B=A_1\overline{B_1}+A_0\overline{B_1}\,\overline{B_0}+A_1A_0\overline{B_0}.

Esempio. Con A=10A=10 e B=01B=01: A1B1‾=1⋅1=1A_1\overline{B_1}=1\cdot1=1, quindi A>B=1A>B=1 (infatti 2>12>1).

VHDL - istruzioni concorrenti, process e testbench

Definizione (assegnazione concorrente). y <= (a and b) or c; è un'equazione booleana. Ogni volta che cambia un segnale a destra, y viene rivalutato. Con più assegnazioni allo stesso segnale in istruzioni concorrenti si hanno più driver: in simulazione, se i valori sono diversi, il segnale diventa 'X' (conflitto); è un errore di progetto.

Esempio. y <= (a and b) or c; con a='1', b='0', c='1' dà y='1'.

Proprietà (when ... else). Le condizioni sono valutate in ordine: se la prima è vera si sceglie il primo valore e le successive non contano. Serve per le priorità e permette decisioni su segnali diversi in condizioni diverse.

Esempio. Con S = "01" la prima condizione è falsa e la seconda vera: Y <= I1.

Proprietà (with ... select). Si valuta una sola espressione di scelta (S); tutte le scelte hanno la stessa priorità, tutti i valori possibili devono essere coperti da una e una sola scelta e when others è obbligatorio per i valori non elencati. È più semplice del when-else per i circuiti a selezione (multiplexer, decoder, tabelle di verità). Più valori si elencano con |: '1' when "0100" | "1000".

Esempio. Con S = "11" nessuna scelta esplicita corrisponde e vale when others: Y <= I3.

Definizione (lista di sensibilità). Lista di sensibilità (sensitivity list): i segnali al cui cambiamento il process si attiva. Per descrivere un circuito combinatorio deve contenere tutti gli ingressi (in VHDL-2008 si può scrivere process (all)). Può contenere solo segnali leggibili (ingressi o signal interni, non uscite). Un process senza lista parte subito all'inizio della simulazione e va avanti ripetendosi, a meno di un wait: è lo schema dei testbench.

Esempio. process (a, b) begin y <= a and b; end process; viene rivalutato a ogni cambiamento di a o di b.

Proprietà (aggiornamento dei segnali in un process). Il valore assegnato a un segnale dentro un process viene aggiornato solo quando il process si sospende (finite le istruzioni o a un wait). Se lo stesso segnale è assegnato più volte nello stesso passaggio, vale l'ultima assegnazione. Quindi

process (b)
begin
  a <= b;
  a <= not b;
end process;

descrive a=b‾a=\overline b: un semplice inverter, cioè logica combinatoria, e non un flip-flop né un segnale che alterna.

Esempio. Con b='1', le due assegnazioni a <= b; a <= not b; lasciano a='0': vale l'ultima.

Proprietà (memoria non voluta). Se in un if (o in un case) non si specificano tutte le condizioni, il segnale mantiene il valore precedente per quelle non coperte: il sintetizzatore deve introdurre un elemento di memoria (latch). È lo stesso meccanismo con cui si descrive di proposito un latch o un flip-flop; ma in un circuito che deve essere combinatorio è un errore.

Esempio. Numeri primi a 3 bit (1,2,3,5,71,2,3,5,7):

Definizione (testbench). Il testbench è codice VHDL che simula un circuito: applica segnali in ingresso al circuito da verificare (DUT, device under test) e osserva le uscite. Non si sintetizza: serve solo per la simulazione.

Esempio: funzione maggioranza (y=1y=1 se almeno due ingressi sono 1):

V. Sommatori e sottrattori binari

Sommatori binari - half adder, full adder e ripple carry

Formula (half adder)

S=X⊕Y,C=X⋅Y.S=X\oplus Y,\qquad C=X\cdot Y .

Esempio. Con X=Y=1X=Y=1: S=1⊕1=0S=1\oplus1=0 e C=1⋅1=1C=1\cdot1=1, cioè 1+1=1021+1=10_2.

Formula (full adder: somma e riporto). La somma SS vale 1 quando il numero di 1 in ingresso è dispari: è la funzione di disparità (Mappe di Karnaugh - POS, condizioni di don't care e paritàPer la POS minima si raggruppano gli 0 della mappa, si ottiene la SOP minima di $\overline F$ e si scrive $F$ come prodotto di somme (variabile diretta se vale 0 nel gruppo, negata se vale 1). Le condizioni di don't care (X) sono combinazioni di ingresso che non si presentano o la cui uscita è indifferente: si usano come 1 o come 0 a seconda di quel che allarga i gruppi (mai raggruppamenti fatti solo di X). Le funzioni XOR a più variabili (disparità) e XNOR (parità) hanno mappa a scacchiera: non si semplificano con i gruppi.Mappe di Karnaugh - POS, condizioni di don't care e parità →), S=X⊕Y⊕Z=∑m(1,2,4,7)S=X\oplus Y\oplus Z=\sum m(1,2,4,7). Il riporto CC vale 1 quando almeno due ingressi valgono 1 (funzione maggioranza): C=∑m(3,5,6,7)=XY+XZ+YZC=\sum m(3,5,6,7)=XY+XZ+YZ (SOP minima: 3 implicanti primi, tutti essenziali).

Esempio. Con X=Y=Z=1X=Y=Z=1: S=1S=1 e C=1C=1 (1+1+1=1121+1+1=11_2); con X=1,Y=0,Z=1X=1,Y=0,Z=1: S=0S=0 e C=1C=1 (1+0+1=1021+0+1=10_2).

Formula (full adder con propagate e generate). Si pone P=X⊕YP=X\oplus Y (propagate) e G=XYG=XY (generate). Allora S=P⊕Z,C=G+P⋅Z.S=P\oplus Z,\qquad C=G+P\cdot Z .

Esempio. Con X=1,Y=0,Z=1X=1,Y=0,Z=1: P=1P=1, G=0G=0, S=P⊕Z=0S=P\oplus Z=0 e C=G+PZ=1C=G+PZ=1.

Definizione (sommatore ripple carry). Per sommare due numeri di nn bit A=An−1…A0A=A_{n-1}\dots A_0 e B=Bn−1…B0B=B_{n-1}\dots B_0 si collegano nn full adder: il riporto in uscita di ciascuno è il riporto in ingresso del successivo, dal LSB (C0C_0, di solito 00) al MSB (CnC_n). Il riporto si propaga (ripple = ondeggiare) lungo la catena.

Esempio: 0110+01110110+0111 (6+76+7). Si procede dal bit 0:

Formula (ritardo del sommatore ripple carry). Ogni full adder può calcolare la propria somma solo quando riceve il riporto dal precedente: i riporti si determinano uno dopo l'altro. Se ogni porta ha ritardo tGt_G, il riporto attraversa ogni stadio in circa 2tG2t_G (una AND e una OR). Il ritardo totale cresce linearmente con nn: circa 2n tG2n\,t_G per l'ultima somma. Il ripple adder è il più semplice e il più lento; per numeri a molti bit si usano circuiti con riporto anticipato (carry look-ahead), non trattati nel corso.

Esempio. Con n=8n=8 bit e tG=1 nst_G=1\,\mathrm{ns} l'ultima somma arriva dopo circa 2⋅8⋅1=16 ns2\cdot8\cdot1=16\,\mathrm{ns}.

VI. Reti sequenziali: latch, flip-flop e macchine a stati

Elementi di memoria - latch SR, latch D e flip-flop D

Definizione (circuito sequenziale). In un circuito sequenziale le uscite dipendono dagli ingressi presenti e dalla storia passata, riassunta dallo stato. Si realizza collegando ingressi e uscite di una rete combinatoria con uno o più elementi di memoria (per noi i flip-flop), con un percorso di retroazione (feedback): le uscite degli elementi di memoria tornano agli ingressi della rete combinatoria. I circuiti combinatori sono aciclici, quelli sequenziali ciclici.

Esempio. Un contatore a 22 bit con il solo ingresso di clock passa dagli stati 00,01,10,1100,01,10,11: a parità di ingresso l'uscita dipende dallo stato.

Definizione (latch SR). Con S=1,R=0S=1,R=0 l'uscita va a Q=1Q=1 (Q‾=0\overline Q=0): set. Con S=0,R=1S=0,R=1 va a Q=0Q=0 (Q‾=1\overline Q=1): reset. Con S=R=0S=R=0 il latch conserva lo stato precedente. Nel funzionamento normale QQ e Q‾\overline Q sono uno il complemento dell'altro.

La combinazione S=R=1S=R=1 è proibita: porta entrambe le uscite a 00, violando il requisito che Q‾\overline Q sia il complemento di QQ; e il vero problema è che, passando da (1,1)(1,1) a (0,0)(0,0), non si può prevedere il valore delle uscite (dipende dall'ordine in cui commutano SS e RR e dai ritardi delle porte). Nella simulazione ideale con commutazioni simultanee e ritardi uguali l'uscita finirebbe a un valore intermedio tra 0 e 1, non realistico.

Esempio di evoluzione (si parte con Q=0Q=0):

Definizione (latch D). Il latch D elimina lo stato proibito con un solo ingresso dato DD (e il controllo CC): internamente S=DS=D e R=D‾R=\overline D, quindi SS e RR non possono valere 1 insieme.

Esempio. Con C=1C=1 e D=1D=1 si ha Q=1Q=1; con C=0C=0 il latch conserva QQ qualunque sia DD.

Definizione (flip-flop master-slave). Un flip-flop si costruisce con due latch D in cascata (master e slave, o primario e secondario) comandati da segnali di controllo opposti: il primo è abilitato quando il clock vale un livello, il secondo quando vale l'altro. Il trigger è il cambiamento che abilita le variazioni dell'uscita.

Esempio. Se D=1D=1 quando il clock sale, dopo il fronte Q=1Q=1; una variazione successiva di DD non cambia QQ fino al fronte seguente.

Formula (equazione caratteristica del flip-flop D). Equazione caratteristica: Q(t+1)=D(t)Q(t+1)=D(t), valutata sul fronte attivo.

Esempio. Con D=1,0,1D=1,0,1 ai tre fronti di salita successivi, QQ vale 1,0,11,0,1 dopo ciascun fronte.

Temporizzazione dei flip-flop - setup, hold e frequenza massima di clock

Definizione (tempi di setup, hold e propagazione). Si consideri un D flip-flop positive-edge-triggered (Elementi di memoria - latch SR, latch D e flip-flop DUn circuito sequenziale ha uscite che dipendono da ingressi e stato (memoria); è un circuito combinatorio con elementi di memoria in retroazione; stato presente = uscite dei FF, stato futuro = ingressi dei FF. Sincrono (clock) o asincrono. Latch SR (NOR): S=1,R=0 set; S=0,R=1 reset; 00 memoria; 11 proibito. Latch D: C=1 trasparente (Q=D), C=0 memoria, sensibile al livello. Flip-flop D edge-triggered = due latch D in cascata (master-slave) con clock opposti: cambia solo sul fronte attivo e non è trasparente. Si assume D flip-flop positive-edge-triggered.Elementi di memoria - latch SR, latch D e flip-flop D →) con ingresso DD e fronte di salita del clock all'istante tclkt_{clk}.

  • Tempo di setup tst_s: durata minima dell'intervallo in cui l'ingresso deve rimanere stabile (al valore desiderato) PRIMA del fronte di clock che provoca il cambiamento dell'uscita. Se DD cambia troppo tardi, l'uscita del primo latch (master) potrebbe trovarsi a un livello di tensione intermedio quando il suo valore è trasferito al secondo: il dato memorizzato non è affidabile.
  • Tempo di hold tht_h: durata minima dell'intervallo in cui l'ingresso deve rimanere stabile DOPO il fronte di clock. Se DD cambia troppo presto dopo il fronte, il master potrebbe ancora essere trasparente e propagare il cambiamento allo slave.
  • Tempo di propagazione tpd,FFt_{pd,FF} (o tpt_p): intervallo tra il fronte di clock che fa da trigger e l'istante in cui l'uscita comincia a commutare (tp,min⁡t_{p,\min}) o si è stabilizzata (tp,max⁡t_{p,\max}).

In sintesi: finestra di stabilità del dato =[ tclk−ts, tclk+th ]=[\,t_{clk}-t_s,\ t_{clk}+t_h\,], in cui DD non deve cambiare; l'uscita QQ è valida dopo tclk+tpd,FFt_{clk}+t_{pd,FF}.

Esempio. Con ts=0,2t_s=0{,}2 ns, th=0,1t_h=0{,}1 ns e fronte a tclk=10t_{clk}=10 ns, DD deve restare fermo in [9,8; 10,1][9{,}8;\,10{,}1] ns.

Formula (periodo minimo di clock). Quindi, aggiungendo un margine di sicurezza tslackt_{slack} (slack = "gioco"): T ≥ tpd,FF+tCOMB+ts,FF+tslack,fmax=1Tmin.T\ \ge\ t_{pd,FF}+t_{COMB}+t_{s,FF}+t_{slack},\qquad f_{max}=\frac1{T_{min}} .

Esempio. tpd,FF=0,5t_{pd,FF}=0{,}5 ns, tCOMB=2,3t_{COMB}=2{,}3 ns, ts,FF=0,2t_{s,FF}=0{,}2 ns. Senza margine: Tmin=3,0T_{min}=3{,}0 ns, fmax=333f_{max}=333 MHz. Con tslack=0,3t_{slack}=0{,}3 ns: Tmin=3,3T_{min}=3{,}3 ns, fmax=303f_{max}=303 MHz.

Formula (vincolo di hold). Le variazioni dell'uscita di un flip-flop non devono arrivare troppo presto a un altro flip-flop (o a se stesso) per non violare il tempo di hold. Con i ritardi minimi del flip-flop e della rete combinatoria: tpd,FF,min⁡+tCOMB,min⁡ ≥ th.t_{pd,FF,\min}+t_{COMB,\min}\ \ge\ t_h .

Esempio. tpd,FF,min⁡=0,1t_{pd,FF,\min}=0{,}1 ns, tCOMB,min⁡=0,05t_{COMB,\min}=0{,}05 ns, th=0,3t_h=0{,}3 ns: 0,15<0,30{,}15<0{,}3, violazione di 0,150{,}15 ns. Abbassare la frequenza non la cura; servono almeno 0,150{,}15 ns di ritardo in più sul percorso più corto.

Analisi delle reti sequenziali - tabella e diagramma degli stati, Mealy e Moore

Definizione (tabella degli stati). Con mm flip-flop (variabili di stato) e nn ingressi la tabella ha 2m+n2^{m+n} righe, con m+nm+n colonne per stato presente e ingressi, mm per lo stato futuro e le colonne delle uscite. Si costruisce elencando tutte le combinazioni di stato presente e ingressi, calcolando lo stato futuro dalle equazioni di ingresso e l'uscita dall'equazione di uscita. Una forma alternativa, la tabella bidimensionale degli stati, ha una riga per stato e colonne separate per ogni valore dell'ingresso (stato futuro/uscita).

Esempio. Con m=2m=2 flip-flop e n=1n=1 ingresso la tabella ha 2m+n=23=82^{m+n}=2^3=8 righe.

Definizione (modelli di Mealy e di Moore)

  • Modello di Mealy: le uscite dipendono dallo stato presente e dagli ingressi. Sul diagramma l'uscita è accanto a ogni freccia (ingresso/uscita).
  • Modello di Moore: le uscite dipendono solo dallo stato presente. L'uscita si scrive dentro il cerchio dello stato; sulle frecce c'è solo l'ingresso.

Esempio di conteggio. Un sistema con un ingresso deve portare l'uscita a 1 quando riconosce la sequenza 0101: servono 2 stati in Mealy e 3 stati in Moore (il terzo è lo stato "ho riconosciuto 0101", che ha l'uscita nel cerchio).

Definizione (stati equivalenti). Due stati sono equivalenti se, per ogni valore dell'ingresso, producono la stessa uscita e portano a stati futuri uguali o equivalenti. Stati equivalenti si possono fondere, ottenendo un circuito più semplice con meno stati e meno flip-flop. La riduzione non porta sempre a un costo minore: il costo dipende anche dalla rete combinatoria, non solo dai flip-flop.

Esempio (Mealy, ingresso xx, uscita 1 quando xx passa da 1 a 0):

Sintesi delle reti sequenziali - riconoscitore di sequenza e codifica degli stati

Proprietà (stato futuro di un D flip-flop). Una volta fissata la codifica, il progetto si riduce a due reti combinatorie: una per lo stato futuro, una per l'uscita. Per un D flip-flop lo stato futuro è direttamente l'ingresso DD.

Esempio. Se la tabella dà come stato futuro 0101 (con A,BA,B come variabili di stato), allora DA=0D_A=0 e DB=1D_B=1.

Definizione (riconoscitore di sequenza). Un riconoscitore di sequenza rivela che una certa sequenza è comparsa in ingresso, indipendentemente da ciò che è successo prima. Esempio: ingresso XX, uscita ZZ; riconoscere 11011101 (le sequenze possono sovrapporsi); Z=1Z=1 quando si è presentata la sequenza 110110 e X=1X=1; Z=0Z=0 altrimenti.

Esempio. Con il riconoscitore di 11011101 e ingresso X=0,1,1,0,1X=0,1,1,0,1 si ottiene Z=0,0,0,0,1Z=0,0,0,0,1.

Formula (numero di bit per codificare gli stati). Per rappresentare mm stati servono n=⌈log⁡2m⌉n=\lceil\log_2m\rceil bit (2n≥m2^n\ge m). Le scelte possibili sono molte; meno bit (meno flip-flop) non vuol dire sempre costo minore: conta anche la rete combinatoria. L'ottimizzazione della codifica è un problema complesso, risolto con metodi euristici. Si confrontano due codifiche.

Esempio. m=4m=4 stati richiedono n=⌈log⁡24⌉=2n=\lceil\log_24\rceil=2 bit; m=5m=5 stati richiedono n=⌈log⁡25⌉=3n=\lceil\log_25\rceil=3 bit.

VII. VHDL per la logica sequenziale

VHDL - latch, flip-flop e reset sincrono e asincrono

Proprietà (latch D in VHDL). La lista di sensibilità contiene sia DD sia CC: con C=1C=1 ogni cambio di DD riattiva il process e si propaga all'uscita (trasparenza).

Esempio. process (D, C) begin if C = '1' then Q <= D; end if; end process; con C='1' e D='1' dà Q='1'; con C='0' Q conserva il valore.

Definizione (fronte di salita in VHDL). CLK'event è vero quando CLK ha appena cambiato valore; CLK'event and CLK = '1' identifica il fronte di salita (con '0' si avrebbe un flip-flop negative-edge-triggered). In VHDL moderno si scrive spesso rising_edge(CLK) (equivalente a meno dei passaggi da valori non definiti). Il process è sensibile solo a CLK: DD non compare nella lista, perché un cambio di DD da solo non deve fare nulla.

Esempio. Se CLK passa da '0' a '1' con D='1', il process con CLK'event and CLK = '1' assegna Q <= '1'; con '0' il fronte attivo sarebbe quello di discesa.

Definizione (reset asincrono). Reset asincrono (agisce subito, in qualunque istante, anche senza fronte di clock). RST è nella lista di sensibilità ed è testato per primo:

architecture async_reset of dff is
begin
  process (RST, CLK)
  begin
    if RST = '1' then                 -- ha priorità sul clock
      Q <= '0';
    elsif CLK'event and CLK = '1' then
      Q <= D;
    end if;
  end process;
end async_reset;

Esempio. Con RST='1' il process si attiva subito e Q va a '0' anche senza fronte di clock.

Definizione (reset sincrono). Reset sincrono (sincronizzato con il clock: ha effetto solo sul fronte attivo; richiede un fronte di clock per essere efficace). La lista contiene solo CLK e RST è testato dentro il ramo del fronte:

architecture sync_reset of dff is
begin
  process (CLK)
  begin
    if CLK'event and CLK = '1' then
      if RST = '1' then
        Q <= '0';
      else
        Q <= D;
      end if;
    end if;
  end process;
end sync_reset;

Esempio. Con RST='1' tra due fronti di clock Q non cambia; al fronte successivo Q diventa '0'.

Proprietà (flip-flop con load enable). Per un flip-flop che aggiorna lo stato solo quando richiesto si aggiunge una condizione senza else:

if CLK'event and CLK = '1' then
  if load = '1' then Q <= D; end if;      -- se load = '0' Q conserva il valore
end if;

Esempio. Con load='0' al fronte di salita Q conserva il valore; con load='1' e D='1' Q diventa '1'.

VHDL - macchine a stati finiti e testbench sequenziale

Definizione (modello a tre process della FSM)

  1. Registro di stato (parte sequenziale): sul fronte di clock aggiorna state <= next_state, e il reset porta in uno stato iniziale noto.
  2. Stato futuro (logica combinatoria): calcola next_state in funzione di state e degli ingressi.
  3. Uscita (logica combinatoria): la calcola in funzione di state (Moore) oppure di state e ingresso (Mealy).

Esempio. Nel riconoscitore di 11011101: il process 1 esegue state <= next_state al fronte di clock, il process 2 calcola next_state con un case state, il process 3 assegna Z.

Definizione (tipo enumerato). Con type si definisce un tipo elencando i valori tra parentesi, separati da virgole (enumerazione): serve per segnali con un numero finito di valori, indicati con nomi e non con numeri, per leggibilità. Lo stesso std_logic è un'enumerazione (9 valori). Il sintetizzatore sceglie la codifica binaria degli stati, a meno che non la si imponga (per esempio con costanti std_logic_vector, come nell'esempio del semaforo).

Esempio. type state_type is (S1, S2, S3, S4); crea un tipo con 44 valori simbolici; signal state : state_type; ne dichiara un segnale (il sintetizzatore lo codifica con 22 bit).

VIII. Tecnologie implementative

Porte CMOS e parametri tecnologici dei circuiti integrati

Legge (di Moore). La legge di Moore descrive la crescita esponenziale del numero di transistor per chip (circa un raddoppio ogni due anni), che ha reso possibili microprocessori da miliardi di transistor.

Esempio. Con un raddoppio ogni 22 anni, in 1010 anni i transistor per chip diventano 210/2=322^{10/2}=32 volte.

Definizione (modello a interruttore dei MOSFET). Nella trattazione semplificata i MOSFET sono interruttori controllati dal valore logico al gate: se l'interruttore è aperto (OFF) non passa segnale tra source e drain, se è chiuso (ON) passa. Si ignora la fisica del dispositivo e si cattura solo il comportamento logico.

transistor gate =0=0 gate =1=1
nMOS OFF (aperto) ON (chiuso)
pMOS ON (chiuso) OFF (aperto)

Esempio. Con gate =1=1 l'nMOS è ON e il pMOS è OFF; con gate =0=0 l'nMOS è OFF e il pMOS è ON.

Definizione (porta CMOS statica: pull-up e pull-down). Porta generica. È formata da un pull-up network (PUN), fatto di soli pMOS, tra VddV_{dd} e l'uscita, e da un pull-down network (PDN), fatto di soli nMOS, tra l'uscita e massa. PUN e PDN sono duali: per ogni combinazione degli ingressi uno è ON e l'altro è OFF:

  • PUN ON, PDN OFF ⇒\Rightarrow uscita =1=1;
  • PUN OFF, PDN ON ⇒\Rightarrow uscita =0=0.

Esempio. Inverter: con A=0A=0 il pMOS è ON e l'nMOS è OFF, quindi Q=1Q=1; con A=1A=1 il pMOS è OFF e l'nMOS è ON, quindi Q=0Q=0.

Proprietà (NAND e NOR CMOS a 2 ingressi). NAND a 2 ingressi. PDN: due nMOS in serie (la serie conduce solo se A=1A=1 e B=1B=1); PUN: due pMOS in parallelo (conduce se A=0A=0 o B=0B=0). NOR a 2 ingressi, duale: PDN con due nMOS in parallelo; PUN con due pMOS in serie. Con ingressi A,BA,B:

AA BB NAND: pMOS ON NAND: nMOS ON NAND: QQ NOR: pMOS ON NOR: nMOS ON NOR: QQ
0 0 2 0 1 2 0 1
0 1 1 1 1 1 1 0
1 0 1 1 1 1 1 0
1 1 0 2 0 0 2 0

Esempio. NAND con A=B=1A=B=1: la serie degli nMOS è chiusa e il parallelo dei pMOS è aperto, quindi Q=0Q=0.

Formula (numero di transistor di una porta). Una porta NAND o NOR a nn ingressi ha 2n2n transistor (nn pMOS e nn nMOS); un inverter ne ha 2; una AND (== NAND ++ inverter) ne ha 2n+22n+2. Per questo le AND e le OR costano più delle NAND e NOR, che sono anche più veloci, e i circuiti si realizzano di solito con NAND/NOR (Progettazione di una rete combinatoria - approccio gerarchico e porte NAND-NORUna rete combinatoria ha uscite che dipendono solo dagli ingressi presenti (nessuna memoria, nessuna retroazione); una sequenziale dipende anche dalla storia (stato, memoria, feedback). Progetto: specifiche, tabella di verità, funzione a costo minimo, diagramma logico, verifica. Con molti ingressi si usa l'approccio gerarchico (blocchi e sottoblocchi riusabili; regolarità). Blocchi base: funzioni di una variabile, vettori, enabling. Mappatura tecnologica: in CMOS NAND e NOR sono più compatte, quindi SOP $\to$ NAND-NAND e POS $\to$ NOR-NOR.Progettazione di una rete combinatoria - approccio gerarchico e porte NAND-NOR →).

Esempio d'esame. NAND CMOS a 3 ingressi con A=0,B=0,C=1A=0,B=0,C=1: sono accesi i pMOS con gate 0 (quelli di AA e BB: 2) e gli nMOS con gate 1 (quello di CC: 1); poiché la serie degli nMOS non conduce (manca AA e BB), il PDN è aperto, il PUN (parallelo) è chiuso: Q=1Q=1. Risposta: 2 pMOS e 1 nMOS accesi. In una NAND a 2 ingressi i pMOS sono 2.

Logica programmabile - ROM, PLA, PAL e FPGA

Definizione (ROM 2k×n2^k\times n). In una ROM i dati sono memorizzati in modo permanente, anche senza alimentazione (memoria non volatile). Si può solo leggere: si fornisce l'indirizzo e si legge la parola. Una ROM con kk ingressi di indirizzo e nn uscite dati contiene 2k2^k parole da nn bit (sigla 2k×n2^k\times n).

Esempio. Con k=10k=10 bit di indirizzo e n=8n=8 uscite la ROM contiene 210=10242^{10}=1024 parole da 88 bit (ROM 1024×81024\times8, cioè 10241024 byte).

Definizione (PLA). Un PLA è simile a una ROM, ma il decoder è sostituito da una matrice di porte AND programmabili: ciascuna genera un termine prodotto (anche con meno letterali delle variabili di ingresso, quindi in forma semplificata) a partire dagli ingressi, diretti o negati. I termini prodotto sono poi collegati in modo programmabile a porte OR, che sommano. Entrambe le matrici (AND e OR) sono programmabili. A differenza della ROM, il PLA non genera tutti i mintermini, solo un sottoinsieme programmabile, e i termini prodotto possono essere condivisi tra le uscite. Le uscite delle OR possono passare per una porta XOR programmabile, che permette di avere l'uscita diretta o negata.

Esempio. F1=AB‾+ACF_1=A\overline B+AC, F2=AC+BC‾F_2=AC+B\overline C. Termini prodotto: P1=AB‾P_1=A\overline B, P2=ACP_2=AC, P3=BC‾P_3=B\overline C. Il termine P2P_2 è condiviso:

Definizione (PAL). Un PAL ha una matrice di AND programmabile e una matrice di OR fissa. È meno flessibile del PLA (dove entrambe le matrici sono programmabili) ma più semplice, più economico e più veloce; i PAL commerciali hanno almeno 8 ingressi e 8 uscite. Nei PAL i termini prodotto non si possono condividere tra più OR: ogni uscita ha le sue AND. Quindi si ottimizzano le funzioni a due livelli una uscita alla volta, mentre per i PLA si ottimizzano le uscite insieme.

Esempio. Per F1=AB‾+ACF_1=A\overline B+AC e F2=AC+BC‾F_2=AC+B\overline C un PAL richiede 44 AND (il termine ACAC va duplicato), un PLA ne richiede 33.

Definizione (look-up table). In molte famiglie il blocco logico contiene LUT (Look-Up Table): memorie 2k×12^k\times1 che, tramite un multiplexer, realizzano la tabella di verità di una funzione di kk variabili (Multiplexer e funzioni logiche realizzate con decoder e multiplexerIl multiplexer (MUX) $2^n$-to-1 ha $2^n$ ingressi dati, $n$ ingressi di selezione e un'uscita che copia l'ingresso selezionato: $Y=\sum_i m_i(S),I_i$. Si realizza con decoder + AND di enable + OR (costo 22 per il 4-to-1) o direttamente (costo 18). Un MUX $2^n$-to-1 realizza qualunque funzione di $n$ variabili (ingressi dati = colonna della tabella di verità); con un MUX $2^{n-1}$-to-1 si usano le $n-1$ variabili come selezione e gli ingressi dati valgono $0$, $1$, $X$ o $\overline X$ (l'ultima variabile). I MUX a vettori selezionano gruppi di bit.Multiplexer e funzioni logiche realizzate con decoder e multiplexer →). I bit di configurazione fissano i valori agli ingressi dati del MUX.

Esempio. LUT a 22 ingressi con c00,c01,c10,c11=0,1,1,0c_{00},c_{01},c_{10},c_{11}=0,1,1,0: per (a,b)=(1,0)(a,b)=(1,0) legge c10=1c_{10}=1, cioè a⊕b=1a\oplus b=1.

IX. Registri, contatori e sistemi non programmabili

Registri e microoperazioni

Definizione (load enable). Il clock arriva sempre ai FF; si controlla l'ingresso: un MUX 2-to-1 seleziona per il D tra il dato DD (se EN=1EN=1) e l'uscita QQ del FF stesso (se EN=0EN=0):

  • EN=1EN=1: Q(t+1)=DQ(t+1)=D (si carica il dato al fronte di salita);
  • EN=0EN=0: Q(t+1)=Q(t)Q(t+1)=Q(t) (il registro mantiene il valore).

Esempio. Con EN=0EN=0 il MUX riporta QQ all'ingresso DD e il flip-flop conserva il valore; con EN=1EN=1 carica il dato DD.

Definizione (microoperazione di trasferimento). R2←R1R_2\leftarrow R_1: il contenuto di R1R_1 (sorgente) viene copiato in R2R_2 (destinazione); per definizione cambia la destinazione, non la sorgente. Nel circuito gli nn bit di uscita di R1R_1 sono collegati agli ingressi di R2R_2 e il segnale di controllo K1K_1 è collegato al LoadLoad di R2R_2. Un trasferimento è condizionato se avviene solo quando un segnale di controllo vale 1: K1: R2←R1K_1:\ R_2\leftarrow R_1 (prima dei due punti la condizione). Il clock non compare nello statement: si assume che tutto avvenga sul fronte attivo. I trasferimenti simultanei si separano con una virgola: K3: R1←R2, R2←R1K_3:\ R_1\leftarrow R_2,\ R_2\leftarrow R_1 scambia i contenuti al fronte di clock in cui K3=1K_3=1 (entrambi leggono i valori vecchi).

Esempio. K1: R2←R1K_1:\ R_2\leftarrow R_1 con R1=0110R_1=0110 e R2=1001R_2=1001: se K1=1K_1=1 al fronte di clock si ha R2=0110R_2=0110 e R1R_1 resta 01100110.

Formula (somma e sottrazione condizionate). Somma (++), sottrazione (−-), incremento (+1+1), decremento (−1-1), complemento. Moltiplicazione e divisione non sono elementari: si ottengono da sequenze di microoperazioni di base. Un sommatore-sottrattore con segnali di controllo XX (0 somma, 1 sottrazione) e K1K_1: X‾K1: R1←R1+R2,XK1: R1←R1+R2‾+1.\overline X K_1:\ R_1\leftarrow R_1+R_2,\qquad XK_1:\ R_1\leftarrow R_1+\overline{R_2}+1 .

Esempio. Con R1=0110R_1=0110, R2=0011R_2=0011 e K1=1K_1=1: se X=0X=0, R1←0110+0011=1001R_1\leftarrow0110+0011=1001; se X=1X=1, R1←0110+1100+1=(1) 0011R_1\leftarrow0110+1100+1=(1)\,0011, cioè 6−3=36-3=3.

Proprietà (maschere per azzerare, porre a 1 e complementare bit). Operazioni bit a bit (bitwise): ogni bit del registro è una variabile binaria. Operazioni: NOT, AND, OR, XOR. (Il simbolo ++ può essere somma aritmetica oppure OR logico: lo dice il contesto; dentro una funzione booleana è un OR.) Servono anche per modificare alcuni bit di un registro usando una maschera:

scopo operazione maschera
azzerare (clear) alcuni bit AND 00 sui bit da azzerare, 11 sugli altri
porre a 1 (set) alcuni bit OR 11 sui bit da porre a 1, 00 sugli altri
complementare alcuni bit XOR 11 sui bit da complementare, 00 sugli altri

Esempio. R=1010 1101R=1010\,1101: AND con 0000 11110000\,1111 dà 0000 11010000\,1101; OR con 1111 00001111\,0000 dà 1111 11011111\,1101; XOR con 1111 00001111\,0000 dà 0101 11010101\,1101.

Definizione (microoperazioni di scorrimento). 4. Scorrimento (shift). Spostano lateralmente i bit di un registro. Shift a sinistra (slsl): i bit si spostano verso il MSB; il bit uscente è quello più a sinistra del sorgente, il bit entrante nella posizione più a destra del destinazione. Shift a destra (srsr): i bit si spostano verso il LSB; bit uscente a destra, bit entrante a sinistra. Qui il bit entrante è 00 e il bit uscente è scartato. R←sl RR\leftarrow sl\,R equivale a moltiplicare per 22 (se non c'è overflow), R←sr RR\leftarrow sr\,R a dividere per 22 (senza segno).

Esempio. Con R=0011R=0011 (33): sl R=0110sl\,R=0110 (6=3⋅26=3\cdot2) e sr R=0001sr\,R=0001 (il bit uscente è scartato).

Registri a scorrimento e contatori

Formula (trasferimento da più sorgenti). Un registro di destinazione può ricevere il contenuto da più sorgenti (altri registri, uscite di logica combinatoria). Con un trasferimento condizionato scritto in RTL come un if-then-else controllato da due segnali K1,K2K_1,K_2: K1: R0←R1,K1‾K2: R0←R2.K_1:\ R_0\leftarrow R_1,\qquad \overline{K_1}K_2:\ R_0\leftarrow R_2 .

Esempio. Con K1=0K_1=0 e K2=1K_2=1 si ha R0←R2R_0\leftarrow R_2; con K1=1K_1=1 si ha R0←R1R_0\leftarrow R_1 (priorità a K1K_1).

Definizione (registro a scorrimento). Un registro a scorrimento è una catena di flip-flop D collegati in cascata (l'uscita di ciascuno è l'ingresso del successivo), tutti con lo stesso clock; a ogni fronte attivo i bit scorrono lateralmente di una posizione (a destra, a sinistra o in entrambe le direzioni).

Esempio. Shift register a 4 bit con SISI che porta la sequenza 1,0,1,1,0,0,0,1,1,01,0,1,1,0,0,0,1,1,0 (un bit per ciclo, partenza da 00000000); il bit entra in Q0Q_0 e avanza verso Q3Q_3:

Proprietà (scorrimento e caricamento parallelo). In RTL: Shift: Q←sl QShift:\ Q\leftarrow sl\,Q (SISI entra in Q0Q_0, ogni Qi→Qi+1Q_i\to Q_{i+1}, cioè verso il MSB) e Shift‾⋅Load: Q←D\overline{Shift}\cdot Load:\ Q\leftarrow D; l'hold è implicito quando nessuna condizione è soddisfatta. Lo scorrimento ha priorità sul caricamento (vale con Shift=1Shift=1 indipendentemente da LoadLoad).

Esempio. Con Q=0110Q=0110, SI=1SI=1 e Shift=1Shift=1 (anche se Load=1Load=1) si ha Q←sl Q=1101Q\leftarrow sl\,Q=1101.

Definizione (contatore). Un contatore è un registro che, in risposta a una serie di ingressi (il clock), attraversa una sequenza predefinita di stati (numeri binari, sequenza casuale...), fornendo in uscita un conteggio. Un contatore binario a nn bit conta da 00 a 2n−12^n-1. Due categorie: ripple (asincrono) e sincrono.

Esempio. Un contatore binario a 44 bit conta da 00 a 24−1=152^4-1=15 e poi riparte da 00000000.

Definizione (contatore ripple). Una catena di FF D le cui uscite Q0,Q1,Q2,Q3Q_0,Q_1,Q_2,Q_3 danno il numero binario. Il FF del LSB riceve il clock di sistema; ogni FF successivo riceve come clock l'uscita negata del precedente; l'ingresso DD di ogni FF è collegato alla sua uscita negata Q‾\overline Q: al fronte di salita del proprio clock ogni FF cambia stato (toggle). Un reset asincrono azzera il registro.

Esempio. Da 00010001 il fronte di clock di sistema porta il contatore a 00100010; da 11111111 a 00000000.

Definizione (contatore sincrono binario). Contatore sincrono binario seriale. Ingresso ENEN (abilita il conteggio) e uscita COCO (carry output, permette di costruire contatori a più stadi). Con EN=1EN=1, a ogni fronte il valore memorizzato è incrementato di 1. Ogni XOR somma 0 o 1 al bit memorizzato (il bit ii commuta quando tutti i bit inferiori valgono 1), ogni AND propaga il segnale ENEN allo stadio successivo. Il ritardo di propagazione è quello di 4 AND per COCO e di 3 AND più una XOR per Q3Q_3.

Esempio. Con EN=1EN=1 e Q=0111Q=0111 il fronte successivo porta Q=1000Q=1000: tutti i bit inferiori valgono 1 e fanno commutare anche il bit 33.

Datapath e unità di controllo - un sistema digitale non programmabile

Definizione (cella di registro). Una cella di registro è un flip-flop corredato di logica combinatoria per svolgere microoperazioni sul contenuto del registro. Un registro a nn bit si realizza con nn copie della cella; se le microoperazioni vanno eseguite su più bit, parte della logica può essere condivisa tra le celle (shared logic).

Esempio. Registro AA che realizza tre microoperazioni logiche con il dato BB (nn bit), ciascuna attivata da un segnale di controllo: AND: A←A∧B,EXOR: A←A⊕B,OR: A←A∨B.AND:\ A\leftarrow A\wedge B,\qquad EXOR:\ A\leftarrow A\oplus B,\qquad OR:\ A\leftarrow A\vee B . Si assume che al massimo uno dei tre segnali valga 1; se valgono tutti 0 il registro resta invariato (hold). A ogni fronte attivo il contenuto di AA è sovrascritto con il risultato; le operazioni sono bitwise, quindi basta progettare un bit.

Formula (ingresso del flip-flop con tre microoperazioni logiche)

Di=Ai‾Bi C1+AiBi‾ C2+AiBi C3,C1=EXOR+OR, C2=EXOR+OR+H, C3=AND+OR+H.D_i=\overline{A_i}B_i\,C_1+A_i\overline{B_i}\,C_2+A_iB_i\,C_3,\quad C_1=EXOR+OR,\ C_2=EXOR+OR+H,\ C_3=AND+OR+H .

Esempio. Con AND=1AND=1 e gli altri segnali a 00: C1=0C_1=0, C2=0C_2=0, C3=1C_3=1 e quindi Di=AiBiD_i=A_iB_i.

Definizione (sistemi programmabili e non programmabili)

Esempio. Il sistema che somma cinque valori svolge un solo compito (non programmabile); una CPU esegue istruzioni indirizzate dal program counter (programmabile).

Definizione (microoperazione). Una microoperazione (μ\muop) è un insieme di operazioni elementari su più segnali per realizzare una certa azione: ogni μ\muop è una combinazione dei segnali di controllo.

Esempio. La μ\muop op_acc_acc ha acc_load=1, acc_clear=0, out_load=0 e realizza ACC←ACC+aACC\leftarrow ACC+a.

X. Memorie

Memorie ROM e RAM - SRAM, DRAM e organizzazione dei chip

Formula (capacità di una RAM). La capacità è il numero di word 2k2^k per il numero di bit per word: size=2k×n\text{size}=2^k\times n bit. Gli indirizzi vanno da 00 a 2k−12^k-1. Il numero di bit di indirizzo kk è indipendente da nn.

Esempio. RAM con linee dati da 1616 bit e indirizzo da 1010 bit: 10241024 word da 1616 bit, capacità 1K×161\mathrm K\times16 bit =214=2^{14} bit =2=2 KB. Alla locazione di indirizzo 11 può esserci il dato 10101011 10001001. Quando una word viene letta o scritta la memoria opera in parallelo su tutti i bit della parola come su un'unità (è la quantità minima indirizzabile).

Proprietà (array di chip di memoria). Se la memoria richiesta è più grande di un chip si costruisce un array.

  • Più parole: per ottenere 256K×8256\mathrm K\times8 (1818 bit di indirizzo) da quattro chip 64K×864\mathrm K\times8 (1616 bit di indirizzo) si applicano 2 bit di indirizzo aggiuntivi a un decoder 2-to-4 che abilita (Chip Select) uno dei 4 chip. In lettura sul bus da 8 bit ci sono i dati del chip selezionato, mentre le uscite dei chip non selezionati sono in alta impedenza; in scrittura i dati vanno al chip con CS attivo.
  • Più bit per parola: per 64K×1664\mathrm K\times16 si collegano due chip 64K×864\mathrm K\times8 con gli stessi indirizzi: il numero di bit di indirizzo (16) resta quello del singolo chip e il numero di bit in uscita raddoppia.

Esempio. Per 256K×8256\mathrm K\times8 con chip 64K×864\mathrm K\times8: servono 256/64=4256/64=4 chip e 18−16=218-16=2 bit di indirizzo per il decoder 2-to-4 dei Chip Select.

XI. Un semplice microprocessore e pipeline

Un semplice microprocessore - datapath, ALU e register file

Definizione (register file). Un datapath ha tipicamente più di quattro registri (32 o più sono comuni): si realizzano con un register file, memoria veloce che permette un accesso simultaneo a più locazioni. Contiene 2m⋅n2^m\cdot n bit, dove mm = numero di bit di indirizzo e nn = bit di ogni locazione. Qui m=3m=3 (88 registri R0…R7R_0\dots R_7) e n=16n=16. Ha:

  • due porte di lettura con indirizzi AAAA e BABA (uscite bus A e bus B);
  • una porta di scrittura con indirizzo DADA, dato D data e abilitazione RWRW (write).

Esempio. Con m=3m=3 e n=16n=16 il register file contiene 23⋅16=1282^3\cdot16=128 bit: 88 registri R0…R7R_0\dots R_7 da 1616 bit.

Definizione (ALU). La ALU (Arithmetic Logic Unit, Unità aritmetico-logica (ALU)Ruolo dell'ALU, ingressi, uscite e flag; ALU a 1 bit con AND, OR e sommatore selezionati da un multiplexer; estensione a 32 bit, sottrazione, confronto set-less-than e rilevazione dello zero e dell'overflow; tabella dei segnali di controllo; unità di moltiplicazione e virgola mobile.Unità aritmetico-logica (ALU) →) è un circuito combinatorio che esegue un insieme di operazioni aritmetiche e logiche di base, scelte da linee di selezione (S2S_2 = selezione del modo, S1S0S_1S_0 = operazione, più CinC_{in}). Si progetta dividendola in parte aritmetica e parte logica, poi collegate da un MUX 2-to-1 comandato da S2S_2 (S2=0S_2=0 aritmetica, S2=1S_2=1 logica).

Esempio. Con S2=1S_2=1 e codice 0000 la ALU esegue l'AND: A=0110A=0110 e B=0011B=0011 danno G=0010G=0010.

Formula (parte aritmetica della ALU). Un sommatore (nn full adder in cascata, Sommatori binari - half adder, full adder e ripple carryHalf adder (2 ingressi): $S=X\oplus Y$, $C=XY$. Full adder (3 ingressi, con riporto in ingresso $Z$): $S=X\oplus Y\oplus Z$, $C=XY+XZ+YZ=G+PZ$ con $P=X\oplus Y$, $G=XY$; si realizza con due half adder e una OR. Il ripple carry adder a $n$ bit concatena $n$ full adder: il riporto "ondeggia" dal LSB al MSB, quindi il ritardo cresce linearmente con $n$. È un circuito iterativo (gerarchico e regolare). Il moltiplicatore a 2 bit usa 4 AND e 2 half adder.Sommatori binari - half adder, full adder e ripple carry →) con una logica di ingresso su BB che produce YY e con riporto in ingresso CinC_{in}: G=A+Y+CinG=A+Y+C_{in}.

Esempio. Con A=0110A=0110, B=0011B=0011, Y=B‾=1100Y=\overline B=1100 e Cin=1C_{in}=1: G=0110+1100+1=(1) 0011G=0110+1100+1=(1)\,0011, cioè A−B=3A-B=3.

Definizione (bit di stato N, Z, C e V). Dal risultato della unità funzionale: NN = bit di segno (MSB del risultato); Z=1Z=1 se tutti i bit del risultato sono 0 (NOR di tutti i bit); CC = riporto in uscita dal sommatore; VV = overflow = riporto entrante nel bit di segno XOR riporto uscente (Numeri con segno, complemento a 2, sottrazione e overflowSottrazione senza segno: se $M\ge N$ nessun prestito in uscita, altrimenti il risultato $M-N+2^n$ è scorretto. Complemento a 1: $2^n-1-N$ (inversione bit a bit); complemento a 2: $2^n-N=$ complemento a 1 $+1$. Numeri con segno: segno e modulo (due zeri, intervallo simmetrico) oppure complemento a 2 (un solo zero, da $-2^{n-1}$ a $2^{n-1}-1$, MSB di peso $-2^{n-1}$). In complemento a 2 somma e sottrazione sono la stessa addizione: $A-B=A+\overline B+1$, riporto in uscita scartato. Overflow: senza segno $\Leftrightarrow C_{out}=1$ nella somma; con segno $\Leftrightarrow C_{in,MSB}\ne C_{out,MSB}$ (due operandi dello stesso segno con risultato di segno opposto).Numeri con segno, complemento a 2, sottrazione e overflow →). Esempio a 8 bit: 70+8070+80 dà G=10010110G=10010110 (150, letto come −106-106) con V=1V=1, C=0C=0, N=1N=1, Z=0Z=0; 255+1255+1 dà G=0G=0 con C=1C=1, Z=1Z=1, V=0V=0, N=0N=0.

Esempio. A 44 bit 0111+0001=10000111+0001=1000: N=1N=1, Z=0Z=0, C=0C=0, V=1V=1 (overflow in complemento a 2).

Proprietà (codici FS dell'unità funzionale). L'unità funzionale = ALU + shifter, con un MUX F che sceglie il risultato (MFMF: 0 ALU, 1 shifter). Le microoperazioni possibili sono 15, quindi bastano codici FS a 4 bit invece di far pilotare tutti i 7 segnali di controllo (MFMF, G3…G0G_3\dots G_0, H1H0H_1H_0) alla unità di controllo: si aggiunge una piccola rete combinatoria che ricava i 7 segnali dal codice FSFS.

Esempio. Le 1515 microoperazioni si codificano con ⌈log⁡215⌉=4\lceil\log_2 15\rceil=4 bit di FSFS invece di pilotare direttamente 77 segnali di controllo.

Un semplice microprocessore - istruzioni, ciclo singolo e cicli multipli

Definizione (istruzione, instruction set e ISA). Un'istruzione è un insieme di bit che specifica completamente un'operazione in modo sintetico; l'instruction set è l'insieme di tutte le istruzioni; l'ISA ne è il catalogo con la descrizione completa. Si vedono due strutture di controllo: ciclo singolo e cicli multipli.

Esempio. Con un opcode di 77 bit l'instruction set può avere fino a 27=1282^7=128 istruzioni, ciascuna di 1616 bit.

Definizione (formato delle istruzioni a 16 bit). I bit sono divisi in campi. L'opcode specifica l'operazione; gli operandi (registri o memoria) sono indicati in modo esplicito (bit dedicati) o implicito (inclusi nell'opcode). Tre formati, a 16 bit:

formato bit 15–9 bit 8–6 bit 5–3 bit 2–0
Registro opcode (7) DR (registro destinazione) SA (sorgente A) SB (sorgente B)
Immediato opcode (7) DR SA OP (operando immediato)
Salto (jump/branch) opcode (7) AD sinistra SA AD destra

Esempio. Nel formato registro 7+3+3+3=167+3+3+3=16 bit; con DR=R3DR=R_3, SA=R1SA=R_1 e SB=R2SB=R_2 i tre campi valgono 011011, 001001 e 010010.

Formula (periodo di clock del ciclo singolo). Il periodo di clock deve essere almeno la somma dei ritardi di tutti i blocchi lungo il cammino critico, perché in un ciclo il segnale attraversa tutti in sequenza. Esempio con ritardi tipici:

blocco PC memoria istruzioni register file (lettura) MUX B unità funzionale o memoria dati MUX D register file (scrittura)
ritardo (ns) 0,2 4 0,6 0,2 4 0,2 0,6

Somma =9,8=9{,}8 ns ⇒\Rightarrow fmax≈102f_{max}\approx102 MHz. Anche l'istruzione più semplice (un ADD) impiega l'intero periodo, dimensionato sulla più lenta (LD). Inoltre servono memorie separate per istruzioni e dati (nello stesso ciclo si accede a entrambe), cosa costosa: le due limitazioni si superano con il computer a cicli multipli, e le prestazioni con la pipeline (Pipeline, hazard e architetture RISC e CISCLa pipeline divide l'esecuzione in stadi separati da registri (IF, DOF, EX, WB) che lavorano in parallelo su istruzioni diverse: la latenza di una istruzione non cambia, il throughput aumenta di un fattore minore del numero di stadi (ritardo dei FF, stadio più lento). Con $k$ stadi e $N$ istruzioni servono $k+N-1$ cicli (riempimento e svuotamento). Gli hazard bloccano la pipeline: di dato (operando non ancora scritto: rimedi NOP, stall, forwarding) e di controllo (salti: bolle, branch prediction). RISC: istruzioni semplici, load/store, formato unico, 32 registri con R0$=0$; CISC: istruzioni complesse, più modi di indirizzamento, formato variabile, controllo microprogrammato.Pipeline, hazard e architetture RISC e CISC →).

Esempio. Con ritardo totale 0,2+4+0,6+0,2+4+0,2+0,6=9,80{,}2+4+0{,}6+0{,}2+4+0{,}2+0{,}6=9{,}8 ns si ha fmax=1/9,8 ns≈102f_{max}=1/9{,}8\ \mathrm{ns}\approx102 MHz.

Pipeline, hazard e architetture RISC e CISC

Definizione (latenza e throughput)

  • Latenza: durata totale di una istruzione: non cambia (anzi cresce un poco) con la pipeline.
  • Throughput (resa): numero di istruzioni completate nell'unità di tempo: aumenta di un fattore circa uguale al numero di stadi.

Esempio. Con 33 stadi da 1,01{,}0 ns la latenza è 3⋅1,0=3,03\cdot1{,}0=3{,}0 ns, ma a regime si completa una istruzione ogni 1,01{,}0 ns (throughput 11 GHz).

Formula (cicli per eseguire NN istruzioni). Nei primi k−1k-1 cicli non tutti gli stadi sono attivi (la pipeline si riempie, filling), analogamente alla fine (si svuota, emptying). Per NN istruzioni servono k+N−1k+N-1 cicli: con 7 istruzioni su 4 stadi, 1010 cicli. Un programma di una sola istruzione su una pipeline a 6 stadi richiede 6 cicli (la latenza). A regime si completa 1 istruzione per ciclo, con al più kk istruzioni in volo contemporaneamente (una per stadio): una pipeline a 4 stadi esegue "al massimo 4 istruzioni per ciclo" nel senso che 4 sono contemporaneamente in lavorazione, mai di più (e meno durante il riempimento).

Esempio. k=4k=4 stadi e N=7N=7 istruzioni: k+N−1=4+7−1=10k+N-1=4+7-1=10 cicli.

Definizione (architettura RISC). Un RISC (Reduced Instruction Set Computer) è ottimizzato per istruzioni semplici: hardware più semplice e veloce; ai compilatori è lasciato il compito di realizzare operazioni complesse combinando istruzioni semplici. Caratteristiche:

  • accesso alla memoria load/store;
  • modi di indirizzamento semplici e limitati (quattro): registro, registro indiretto (solo per load/store), immediato, relativo (branch e jump);
  • unica lunghezza di istruzione;
  • istruzioni con operazioni elementari, eseguibili con un solo passaggio nella pipeline.

Esempio. Con 32 registri bastano 55 bit per indicare un registro; con un opcode di 77 bit si hanno 27=1282^7=128 operazioni.

Definizione (hazard). Un hazard è un problema, nei dati o nel controllo, che impedisce di eseguire normalmente l'istruzione successiva nel ciclo successivo.

  • Hazard di dato: l'istruzione successiva cerca di usare il risultato di un'istruzione precedente o un operando prima che sia disponibile.
  • Hazard di controllo: il programma salta a una posizione diversa dalla successiva, ma la pipeline ha già caricato le istruzioni seguenti.

Esempio. Se l'istruzione 3 legge R4R_4 nel ciclo 4 ma l'istruzione 2 lo scrive solo nel ciclo 5, c'è un hazard di dato.

Proprietà (rimedi ai data hazard). Rimedi.

  • NOP inseriti dal compilatore: istruzioni "nessuna operazione" tra le due per ritardare l'esecuzione della seconda.
  • Stall hardware (pipeline stalled, bubble): l'hardware stesso inserisce NOP e blocca IF/DOF finché il dato non è pronto. Una logica confronta i registri sorgente e destinazione delle istruzioni in volo (segnale DHS, Data Hazard Stall): si sprecano cicli di clock.
  • Forwarding (data forwarding): se il risultato che serve è già calcolato (all'uscita dello stadio EX) lo si manda avanti direttamente allo stadio che lo richiede, senza aspettare la scrittura: nessun ciclo sprecato.

Esempio. Nel caso di R4R_4 lo stall ritarda l'istruzione 3 di un ciclo (DOF al ciclo 5, quando R4R_4 è stato scritto); con il forwarding non si perde nessun ciclo.

Proprietà (hazard di controllo e predizione dei salti). In un salto (branch) il PC cambia, ma nei due cicli successivi la pipeline ha già caricato istruzioni che non dovrebbero essere eseguite. Soluzioni: inserire NOP in attesa del salto (si perdono due cicli di clock) o prevedere il salto: si assume che il salto non sia preso e si prosegue; se invece è preso, si annullano le istruzioni caricate disabilitando RWRW (nessuna scrittura nei registri), BSBS (nessun salto) e MWMW (nessuna scrittura in memoria): è come inserire una bolla (bubble) nella pipeline. In sintesi: il branch prediction evita (o riduce) le perdite dovute ai control hazard, non i data hazard, e non aumenta la frequenza del clock.

Esempio. Inserendo NOP si perdono 22 cicli per ogni salto; con la predizione "salto non preso" non si perde nessun ciclo se il salto non è preso, altrimenti le 22 istruzioni caricate diventano bolle.

Definizione (architettura CISC). Un CISC (Complex Instruction Set Computer) ha istruzioni complesse, molto difficili o impossibili da eseguire con un unico ciclo o un solo passaggio nella pipeline. Caratteristiche: più modi di indirizzamento, istruzioni di lunghezza variabile, istruzioni di salto più sofisticate.

Esempio. Il load con doppio accesso alla memoria R[DR]←M[M[R[SA]]]R[DR]\leftarrow M[M[R[SA]]] è tipico di un CISC: non entra in un solo passaggio della pipeline.

XII. Input-output e gerarchia di memoria

Interfacce di input-output - strobing, handshaking, interrupt e DMA

Definizione (codifica NRZI). Codifica NRZI (Non-Return-to-Zero Inverted), per ottenere fronti utili alla sincronizzazione: uno 0 si trasmette con una transizione del livello (da 1 a 0 o da 0 a 1); un 1 con il livello invariato. Se ci sono troppi 1 consecutivi (più di 6) non ci sono transizioni: dopo sei 1 si inserisce uno 0 (bit stuffing). Esempio, con livello iniziale alto: i bit 0,1,1,0,1,0,0,10,1,1,0,1,0,0,1 danno i livelli 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1 (si inverte a ogni 0); la sequenza 1,1,1,1,1,1,1,01,1,1,1,1,1,1,0 viene trasmessa come 1,1,1,1,1,1,0,1,01,1,1,1,1,1,0,1,0.

Esempio. Con livello iniziale alto, i bit 0,1,1,00,1,1,0 danno i livelli 0,0,0,10,0,0,1: il livello si inverte solo a ogni 00.

Definizione (I/O programmato). Il trasferimento è iniziato e controllato da un'istruzione del programma. La CPU controlla costantemente lo stato della periferica in un ciclo di istruzioni, il busy-wait, e non può fare altro; la periferica è di solito molto più lenta, quindi si sprecano molti cicli macchina. Sistema semplice ma inefficiente.

Esempio. Periferica a 100100 byte/s: un byte ogni 1010 ms. Se la CPU impiega 100100 ns per controllare lo stato, tra un trasferimento e il successivo lo controlla 10 ms/100 ns=100 00010\,\mathrm{ms}/100\,\mathrm{ns}=100\,000 volte, quasi tutte inutilmente.

Definizione (interrupt). Il trasferimento non è più monitorato dalla CPU ma da un'interfaccia che genera un segnale, l'interrupt, quando i dati sono disponibili. Nel frattempo la CPU fa lavoro utile; quando arriva l'interrupt, interrompe l'operazione corrente, esegue un programma di servizio per processare i dati e ritorna al compito iniziale. L'interrupt è un segnale di uscita della periferica e di ingresso della CPU.

Esempio. Per la periferica da 100100 byte/s (un byte ogni 1010 ms) la CPU viene interrotta 100100 volte al secondo, invece di eseguire 100 000100\,000 controlli di stato per ogni byte.

Definizione (priorità con daisy chain)

  • Daisy chain: la priorità è determinata dall'ordine nella catena di collegamento delle periferiche; il primo dispositivo che ha generato l'interrupt trasmette il suo vector address e viene servito dalla CPU. Le periferiche si propagano il permesso lungo la catena, per cui la CPU non determina la periferica a priorità più alta (lo fa la catena) e due interrupt non possono essere gestiti in parallelo.

Esempio. Se P1,P2,P3P_1,P_2,P_3 sono in catena e richiedono insieme un interrupt, viene servita per prima P1P_1, la più vicina alla CPU.

Definizione (DMA). Spesso i dati di una periferica vanno trasferiti in memoria; un trasferimento massiccio da una periferica veloce (un disco) tiene occupata la CPU a lungo. Lasciando che la periferica trasferisca i dati in memoria senza coinvolgere la CPU, il sistema è molto più efficiente: è il DMA. Il controllore DMA prende il controllo dei bus e gestisce direttamente il trasferimento dal dispositivo di I/O alla memoria.

La CPU supporta il controllore con due segnali:

  • Bus Request (BR): il controllore DMA chiede il permesso di usare il bus;
  • Bus Granted (BG): la CPU concede il bus e si impegna a non usarlo.

Esempio. Per trasferire 10241024 word il registro indirizzo del controllore DMA viene incrementato 10241024 volte e al termine viene generato un solo interrupt.

Cache e memoria virtuale - mappatura e tabelle delle pagine

Formula (tempo medio di accesso alla memoria). Perché la gerarchia sia efficace la CPU deve trovare i dati necessari il più possibile nella cache: cache hit = il dato è nella cache; hit rate = percentuale di hit. Altrimenti si ha un cache miss (miss rate) e i dati vanno recuperati in blocco dalle altre memorie. Un modello standard del tempo medio di accesso è tmedio=thit+miss rate⋅tpenalitaˋt_{medio}=t_{hit}+\text{miss rate}\cdot t_{\text{penalità}}: per thit=1t_{hit}=1 ns, miss rate 5%5\% e penalità 5050 ns si ha 1+0,05⋅50=3,51+0{,}05\cdot50=3{,}5 ns.

Esempio. Con thit=2t_{hit}=2 ns, miss rate 10%10\% e penalità 4040 ns: tmedio=2+0,10⋅40=6t_{medio}=2+0{,}10\cdot40=6 ns.

Definizione (cache a mappatura diretta). Gruppi di locazioni contigue della memoria principale vengono mappate direttamente in una locazione della cache; i bit più significativi dell'indirizzo identificano il gruppo trasferito (tag). Semplice, ma l'hit rate non è molto elevato.

Esempio. Cache da 88 word (8×328\times32 bit), indirizzo di cache a 33 bit; memoria principale da 256256 word (11 KB), indirizzo di word a 88 bit. Gli ultimi tre bit dell'indirizzo di word sono l'indice della cache (la locazione), i 55 bit più significativi sono il tag, memorizzato con il dato. All'accesso: si usa l'indice per scegliere la riga, si confronta il tag memorizzato con il tag dell'indirizzo: se uguali (e la riga è valida) hit, altrimenti miss: i dati sono trasferiti dalla memoria alla cache sostituendo la riga.

Definizione (cache completamente associativa). L'associazione tra locazioni della memoria principale e della cache è arbitraria: qualunque dato può stare in qualunque riga. Il tag è l'indirizzo completo. Prestazioni ottime ma complessità alta: confrontare in sequenza tutti i tag non è fattibile, quindi si usa una memoria associativa che esegue il confronto in parallelo: la scrittura è convenzionale, la lettura è in parallelo; il segnale di match di ciascuna riga pilota la sua word line e l'OR di tutti i match è il segnale di hit/miss.

Esempio. Con indirizzi di word a 88 bit il tag è l'indirizzo completo (88 bit) e viene confrontato in parallelo con quello di tutte le righe.

Definizione (cache associativa a kk vie). È una via di mezzo. Per ogni valore dei bit di ordine minore (indice dell'insieme) c'è un numero limitato kk di locazioni disponibili (per esempio k=2k=2): la logica di match si semplifica molto. Una word può trovarsi solo in kk locazioni della cache (le kk vie dell'unico insieme che le corrisponde); buffer three-state collegano l'uscita appropriata al bus. Quindi in una cache a 22 vie un dato proveniente dalla memoria centrale può essere immagazzinato in 2 locazioni distinte.

Esempio. Cache da 88 righe a 22 vie: 8/2=48/2=4 insiemi, quindi insieme =a mod 4=a\bmod4; l'indirizzo 1919 va nell'insieme 33 con tag ⌊19/4⌋=4\lfloor19/4\rfloor=4.

Definizione (tabella delle pagine). La mappatura tra pagine virtuali e pagine fisiche è nella tabella delle pagine. Ogni riga ha, oltre al numero di pagina fisica (frame):

  • valid: se 00, la pagina non corrisponde a codice o dati effettivi in memoria;
  • dirty: se 11, c'è stata almeno una scrittura (la pagina andrà copiata su disco prima di essere sostituita);
  • used: serve a gestire la sostituzione delle pagine.

Esempio di traduzione. Pagine da 44 KB: l'indirizzo virtuale a 16 bit è diviso in numero di pagina (4 bit alti) e offset (12 bit); la traduzione sostituisce il numero di pagina con il frame, lasciando invariato l'offset. Tabella: pagina 0 →\to frame 2 (valid); pagina 1: non valida; pagina 2 →\to frame 7 (valid, dirty); pagina 3 →\to frame 5 (valid).

Definizione (page fault). Il page fault si ha quando la pagina richiesta non è in memoria (bit valid a 0): deve essere recuperata dal disco, con un tempo enormemente superiore a quello di una DRAM, per cui il sistema operativo gestisce il fault e sostituisce una pagina (se dirty la salva prima).

Esempio. Con la tabella dell'esempio, l'accesso a un indirizzo della pagina 11 (valid =0=0) provoca un page fault: la pagina va caricata dal disco.

XIII. Verifica dei propri risultati

Verificare reti logiche e automi con Python

Definizione (SOPform e POSform). SOPform e POSform calcolano la forma minima da un elenco di mintermini (e, facoltativamente, di don't care), come farebbe una mappa di Karnaugh (Mappe di Karnaugh - implicanti e copertura minimaLa mappa di Karnaugh è la tabella di verità disposta in una griglia con righe e colonne in codice Gray, così che celle adiacenti (anche tra bordi opposti) differiscano in una sola variabile. Si raggruppano gli 1 in rettangoli di $2^k$ celle: ogni gruppo elimina $k$ variabili e dà un prodotto. Implicante primo = gruppo massimo; essenziale = unico a coprire un mintermine; la copertura minima contiene tutti gli essenziali più il minimo di altri primi (può non essere unica). Efficace fino a 4 variabili.Mappe di Karnaugh - implicanti e copertura minima →). Le variabili si elencano dalla più significativa alla meno significativa:

from sympy import symbols
from sympy.logic.boolalg import SOPform, POSform

d, c, b, a = symbols('d c b a')                      # d = MSB, a = LSB
print(SOPform([d, c, b, a], minterms=[0, 1, 2, 3, 4, 5, 7, 14, 15]))
print(POSform([d, c, b, a], minterms=[0, 1, 2, 3, 4, 5, 7, 14, 15]))
print(SOPform([d, c, b, a], minterms=[1, 2, 3, 5, 7], dontcares=list(range(10, 16))))

Esempio. SOPform([b, a], minterms=[1, 2, 3]) restituisce a | b, cioè F=∑m(1,2,3)=A+BF=\sum m(1,2,3)=A+B.

Definizione (equivalenza di due espressioni con sympy). Due espressioni sono equivalenti se non esiste una combinazione di ingressi in cui differiscono:

from sympy import symbols, Not, Equivalent
from sympy.logic.inference import satisfiable

x, y, z = symbols('x y z')
e1 = (x & y) | (~x & z) | (y & z)
e2 = (x & y) | (~x & z)
print(satisfiable(Not(Equivalent(e1, e2))))          # False  -> equivalenti (teorema del consenso)

Esempio. satisfiable(Not(Equivalent(x | (x & y), x))) restituisce False: x+xy=xx+xy=x (assorbimento).

Proprietà (conversioni, distanza di Hamming e codice Gray in Python). Per le conversioni tra basi bastano bin(), oct(), hex(), int(s, base) e format(n, '08b'); bin(a ^ b).count('1') dà la distanza di Hamming; n ^ (n >> 1) converte in codice Gray (Basi di numerazione e conversioni - binario, ottale ed esadecimaleUn numero in base $r$ vale $\sum a_i r^i$ (cifre $a_i\in{0,\dots,r-1}$). Conversioni: base $r\to$ decimale con la somma pesata; decimale $\to$ base $r$ per divisioni successive (parte intera, resti letti dal basso) e moltiplicazioni successive (parte frazionaria, parti intere lette dall'alto); binario $\leftrightarrow$ ottale/esadecimale a gruppi di 3/4 bit. Somma, differenza e prodotto binari seguono le regole decimali con cifre 0 e 1; la differenza ha prestiti, il prodotto somma prodotti parziali traslati.Basi di numerazione e conversioni - binario, ottale ed esadecimale →, Codici binari - BCD, ASCII, Unicode, parità e GrayUn codice binario a $n$ bit distingue $2^n$ elementi. BCD: una cifra decimale ogni 4 bit (1010–1111 non usati; 10 richiede 8 bit, non è il binario del numero). ASCII: 7 bit per 128 caratteri, la cifra ASCII è 011 seguito dal BCD. Unicode/UTF-8: da 1 a 4 byte, compatibile con ASCII. Bit di parità: rileva errori su un numero dispari di bit. Distanza di Hamming = numero di bit diversi. Codice Gray: numeri consecutivi differiscono di un solo bit (sensori di posizione); si costruisce per riflessione o con $g_i=b_i\oplus b_{i+1}$.Codici binari - BCD, ASCII, Unicode, parità e Gray →).

Esempio. bin(0b0110 ^ 0b1101).count('1') dà 3 (distanza di Hamming) e format(6 ^ (6 >> 1), '04b') dà '0101' (il Gray di 66).