You are on page 1of 49

Architettura elaboratori

PDF generato attraverso il toolkit opensource ''mwlib''. Per maggiori informazioni, vedi [[http://code.pediapress.com/ http://code.pediapress.com/]].
PDF generated at: Sat, 18 Sep 2010 16:01:39 UTC
Indice
Voci
Architettura MIPS 1
IA-32 8
Registro (informatica) 19
Pipeline dati 21
Flip-flop 24
Multivibratore 26
Algebra di Boole 28
Multiplexer 39
Full-adder 43
Half-adder 44

Note
Fonti e autori delle voci 45
Fonti, licenze e autori delle immagini 46

Licenze della voce


Licenza 47
Architettura MIPS 1

Architettura MIPS
MIPS è l'acronimo di Microprocessor without
Interlocked Pipeline Stages, è un processore di
architettura RISC sviluppato da MIPS Computer
Systems Inc. (in seguito nota come MIPS Technologies,
Inc).
Il MIPS è utilizzato nel campo dei computer SGI, e
hanno trovato grossa diffusione nell'ambito dei sistemi
embedded, dei devices di Windows CE e nei router di
Cisco . Le console Nintendo 64, Sony PlayStation,
Sony PlayStation 2 e Sony PlayStation Portable
utilizzano processori MIPS.

Le prime architetture MIPS erano realizzate a 32-bit


(generalmente 32-bit per registri e data paths), mentre
le ultime versioni sono a 64-bit. Esistono cinque
revisioni del MIPS instruction set, chiamate MIPS I,
MIPS II, MIPS III, MIPS IV, e MIPS 32/64. Un microprocessore MIPS R4400 fabbricato da Toshiba

L'ultima di queste, MIPS 32/64 Release 2, definisce


un insieme di registri di controllo come l'instruction set. Molte estensioni "add-on" sono anche disponibili, incluso
MIPS-3D che è un semplice insieme di istruzioni dedicate SIMD in floating-point per applicazioni 3D , MDMX che
è un'istruzione SIMD molto costosa su interi che usa registri floating-point a 64-bit, MIPS16 che aggiunge
compressione alle istruzioni che creano un programma riducendo lo spazio occupato (una tecnologia simile alla
tecnologia Thumb implementata dall'architettura ARM), e il più recente MIPS MT, una nuova aggiunta
multithreading per i sistemi simili all'HyperThreading implementato da Intel nei processori Pentium 4.

Il disegno dell'architettura e del set di istruzioni è semplice e lineare e viene spesso utilizzato come caso di studio nei
corsi universitari indirizzati allo studio delle architetture dei processori. L'architettura dei processori MIPS ha
influenzato le architetture di molti altri processori RISC tra i quali si segnala la famiglia DEC Alpha.

Storia
Architettura MIPS 2

Nel 1981 il professore John L.


Hennessy della Stanford University
avviò un gruppo di ricerca sulle
architetture RISC. Le ricerche del team
di sviluppo portarono allo sviluppo
della prima generazione di processori
MIPS. Allora era noto che per
incrementare le prestazioni dei
processori si sarebbe potuto utilizzare
la tecnica delle pipeline. Questa
tecnica sebbene fosse semplice da
ideare non era semplice da
implementare. Le pipeline per
Classica pipeline MIPS a 5 stadi
funzionare correttamente richiede che
le varie unità siano sincronizzate e che
i dati delle varie istruzioni non si sovrappongano, quindi all'interno delle pipeline vengono posti dei blocchi
(Interlock) che sorvegliano il completamento delle varie istruzioni e fanno procedere la pipeline solamente quando
tutti gli stadi sono pronti. Questo meccanismo garantisce la corretta esecuzione del programma ma introduce spesso
stalli nella CPU che deprime le prestazioni.

La caratteristica distintiva del progetto MIPS e che tutte le istruzioni dovevano essere completate dagli stadi della
pipeline in un solo ciclo di clock in modo da non introdurre ritardi e stalli nella pipeline. Questo permetteva di
rimuovere anche molta dell'elettronica legata alla sincronizzazione degli stadi, semplificando il progetto.
Questa scelta portò a semplificare e velocizzare il progetto ma portò anche degli svantaggi molto evidenti come
l'eliminazione di istruzioni utili come la moltiplicazione e la divisione. Alcuni osservatori segnalarono che il progetto
MIPS (e più in generale la filosofia RISC) imponevano al programmatore di sostituire le moltiplicazioni e le
divisioni con una serie di operazioni più semplici e che quindi il miglioramento di prestazioni veniva eliminato o
notevolmente ridimensionato. Questi osservatori non comprendevano che il miglioramento derivato dalla struttura a
pipeline senza stalli compensava ampiamente le moltiplicazioni e le divisioni lente.
Nel 1984 Hennessy si convinse delle potenzialità commerciali del progetto e abbandono temporaneamente
l'università per fondare la MIPS Computer Systems. La società presentò l'R2000 nel 1985 e il successore R3000 nel
1988. Questi processori erano basati su un'architettura a 32 bit furono la base di molti sistemi commerciali, tra i
maggiori utilizzatori delle CPU si distinse la Silicon Graphics che utilizzo le CPU nelle sue workstation. Il progetto
commerciale delle CPU MIPS si differenziavano dal progetto accademico per la presenza delle istruzioni di
moltiplicazione e di divisione e di conseguenza per la presenza di unità di Interlock tra gli stadi che contraddiceva il
nome stesso della microarchitettura.
Nel 1991 MIPS presento il suo primo processore a 64 bit l'R4000. La MIPS in quel periodo affrontava una serie crisi
finanziaria e quindi SGI decise di acquisire la società per assicurarsi la commercializzazione del processore a 64 bit
dato che era fondamentale per le sue workstation. Come sussidiaria della SGI la società cambiò nome in MIPS
Technologies.
Agli inizi degli anni '90 la MIPS iniziò a licenziare i suoi processori a fornitori terzi. Questa scelta era ragionevole
considerando la semplicità e la potenza del progetto. I processori MIPS iniziarono a sostituire i processori CISC in
molte applicazioni embedded, va ricordato che il prezzo di un processore è legato al numero di transistor e al numero
di piedini del processore, quindi i processori MIPS risultavano avvantaggiati per il loro basso uso di transistor. Sun
Microsystems cercò di replicare il successo dei processori MIPS fornendo in licenza i suoi processori SPARC. Il
progetto di Sun non ebbe successo e i processori SPARC non si diffusero nel settore embedded. I processori MIPS
durante gli anni novanta acquisirono elevate quote di mercato nel segmento embedded e nel 1997 la società festeggiò
Architettura MIPS 3

il quarantottesimo milione di processori venduti, rendendo il MIPS il primo processore RISC a superare la famosa
famiglia Motorola 68000. Nel 1998 la SGI si separò dalla MIPS Technologies e attualmente più della metà dei
guadagni della società dipendono dalle licenze vendute mentre i rimanenti guadagni derivano dallo sviluppo di
processori per compratori esterni che verranno prodotti da fornitori esterni.
Nel 1999 MIPS annunciò la possibilità di acquistare la
licenza per due processori base. Il processore MIPS32
a 32 bit e il processore MIPS64 a 64 bit. NEC, Toshiba
e SiByte (in seguito acquisita da Broadcom) ottennero
la licenza del MIPS64 appena questa fu annunciata.
Philips, LSI Logic e IDT acquisirono la licenza in
seguito. Successo dopo successo attualmente i
processori MIPS sono tra i processori più utilizzati per
applicazioni ad alta potenza di calcolo ma che
richiedono dissipazioni contenute tipo PDA, Set-top
box etc. Un chiaro indicatore della bontà del progetto la
si ha dalla scelta di Freescale (società spin-off di
Motorola) di utilizzare il core MIPS per i suoi
processori invece del core PowerPC di sua proprietà.

La possibilità di utilizzare sotto licenza il core MIPS ha


IDT R4700
spinto molte persone a fondare delle società che
producessero versioni personalizzate del processore.
Una delle prime società fu la Quantum Effect Devices. Alcuni progettisti MIPS che progettarono il processore
R4300 abbandonarono la MIPS per fondare la società SandCraft e sviluppare l'R5432 per la NEC che in seguito ha
sviluppato l'R7100, uno dei primi processori per applicazioni embedded in grado di eseguire istruzioni fuori ordine. I
progettisti del primo StrongARM si divisero in due gruppi e fondarono due società che svilupparono processori
basati su core MIPS. Il primo gruppo fondò la SiByte e sviluppò l'SB-1250 uno dei primi processori
systems-on-a-chip (SOC) ad alte prestazioni su architettura MIPS. Il secondo gruppo fondò la Alchemy
Semiconductor (in seguitò acquisita da AMD) che produsse l'Au-1000, un processore SOC) per applicazioni a basso
consumo. Lexra utilizzò un core tipo MIPS e vi aggiunse estensioni DPS per il trattamento di dati audio e estensioni
multithreading per la gestione delle reti locali. MIPS intentò contro Lexra due cause legali per violazioni delle sue
proprietà intellettuali. La prima si risolse rapidamente quando Lexra promise di non pubblicizzare i suoi processori
come MIPS compatibili. La seconda causa fu molto più lunga e danneggiò gli affari di entrambi le società; si
concluse con MIPS Technologies che forniva a Lextra una licenza gratuita e un ingente risarcimento economico.

Famiglie MIPS
Il primo MIPS commerciale fu l'R2000 che venne presentato nel 1985. Questo processore rispetto alla versione
sviluppata all'università aggiungeva istruzioni per la moltiplicazione e la divisione che venivano trattate in modo
indipendente dal processore. Nuove istruzioni furono aggiunte per recuperare i risultati prodotti dalle moltiplicazioni
e dalle divisioni. Ironicamente queste istruzioni erano bloccanti (utilizzavano l'interlock) e quindi contraddicevano il
nome stesso del processore pur migliorando la densità del codice.
L'R2000 poteva utilizzare la codifica big-endian o little-endian. Era dotato di 32 registri a 32 bit di uso generale,ma
non utilizzava la tecnica della register window dato che era considerata un potenziale collo di bottiglia. La register
window invece era utilizzata da processori come l'AMD 29000 e il DEC Alpha. Inoltre il program counter non era
direttamente accessibile.
Architettura MIPS 4

L'R2000 poteva gestire fino a quattro coprocessori,di cui uno era integrato all'interno del processore e veniva
utilizzato per gestire le eccezioni e le trap mentre gli altri tre erano disponibili per altri usi. Uno poteva essere il
processore opzionale R2010,un coprocessore che implementava una FPU con trentadue registri a 32bit,i quali
potevano essere utilizzati come 16 registri a 64 bit per la doppia precisione.
L'R3000 successore dell'R2000 venne presentato nel 1988,
aggiunse una cache da 32 KB per istruzioni e dati (in seguito
venne espansa a 64 KB) che supportava la coerenza delle cache
per facilitare lo sviluppo di sistemi multiprocessore. Sebbene il
supporto del multiprocesso fosse parzialmente fallato l'R3000
venne utilizzato da molti sistemi multiprocessore. L'R3000
includeva una MMU, una caratteristica comune per i processori di
quell'epoca. L'R3000 fu il primo processore MIPS a vendere più di
un milione di processori. Il processore R3000A venne utilizzato
nella console Playstation della Sony ed era una versione a 40
Megahertz. Come l'R2000 anche l'R3000 poteva essere affiancato MIPS R3000A-compatible (R3051) 32bit a 33,8688
da un coprocessore matematico, l'R3010. Pacemips produsse MHz della playstation
l'R3400 e IDT produsse l'R3500, che non era altro che un R3000
e R3010 in un solo chip. Il Toshiba R3900 è virtualmente il primo SoC per i primi palmari basati su Windows CE.

L'R4000 venne presentato nel 1991 ed estese il set di istruzioni MIPS portandolo a 64 bit. La FPU venne integrata
nel processore per creare un singolo chip molto veloce (venne presentato con una frequenza di 100 Mhz). Tuttavia
per ottenere una frequenza elevata i progettisti ridussero la cache a 8 KB e ogni accesso richiedeva comunque 3 cicli.
L'elevata frequenza venne ottenuta creando una pipeline profonda (chiamata super pipeline dalla società). Dopo la
presentazione dell'R4000 molte altre versioni vennero presentate. Tra le varie versioni è da segnalare l'R4400
presentato nel 1993. Il processore era dotato di 16 KB di cache,un'architettura a 64 bit e un controller per una cache
esterna di secondo livello da 1 megabyte.
Dopo essere diventata divisione della SGI, la MIPS sviluppò il processore a basso costo R4200 e in seguito l'R4300,
un R4200 con bus esterno a 32 bit. Il Nintendo 64 utilizzò il processore VR4300 prodotto dalla NEC che era una
versione a basso costo del MIPS R4300i[1]
Quantum Effect Devices (QED), era una compagnia
nata dall'abbandono della MIPS di alcuni progettisti, la
compagnia sviluppò i processori R4600, R4700, R4650
e R5000. I progettisti della QED erano rimasti
contrariati dalla scelta della famiglia R4000 di
sacrificare la cache per ottenere delle frequenze di
funzionamento elevate. I progettisti invece
enfatizzarono la presenza di una ampia cache ad
accesso rapido (due cicli di clock per accedervi) e
fecero un uso efficiente del silicio. L'R4600 e l'R4700
vennero utilizzati da SGI per le sue macchine a basso
costo SGI Indy. Furono i primi processori di tipo MIPS
ad essere utilizzati da Cisco per i suoi router. L'R4650
venne utilizzato per il set-top box WebTV. La FPU
dell'R5000 era più efficiente della FPU
dell'R4000,difatti gli SGI Indy basati su R5000 QED RM7000
Architettura MIPS 5

fornivano prestazioni notevolmente migliori nel settore grafico rispetto alle macchine SGI Indy basate su R4000. In
seguito la QED presentò i processori RM7000 e RM9000 per applicazioni embedded come dispositivi di rete e
stampanti laser. QED venne acquisita da PMC-Sierra nell'agosto del 2000.
Nel 1994 venne presentato l'R8000 il primo MIPS
superscalare. Il processore era dotato di due ALU ed
era in grado di eseguire due operazioni per ciclo di
clock. Il progetto del processore venne diviso su sei
integrati. Un integrato conteneva le unità di esecuzione
per gli interi (con una cache da 16 KB per i dati e da
16KB per le istruzioni). Un secondo integrato
conteneva l'unita FPU, due integrati contenevano una
cache di secondo livello e un integrato arbitrava il bus
della cache. L'ultimo integrato era un controller della
cache ASIC. Il progetto era basato su due pipeline
complete con unità di moltiplicazione e di somma a
doppia precisione. Le pipeline venivano alimentate Microarchitettura del processore R10000

dalla cache di secondo livello da 4 Mbyte. L'R8000


venne utilizzato dai server SGI Power Challenge inizialmente e dai server Power Indigo2 in seguito. Le ridotte
prestazioni nel calcolo sugli interi e il suo elevato costo scoraggiò molti acquirenti sebbene le prestazioni nel calcolo
in virgola mobile furono apprezzate dagli enti scientifici. L'R8000 rimase sul mercato per solo un anno quindi è un
processore MIPS abbastanza raro.

Nel 1995 venne presentato l'R10000. Il processore era basato su un disegno a singolo integrato ed era progettato per
essere molto più veloce dell'R8000. Era dotato di una cache primaria da 32 KB per i dati e le istruzioni. Il processore
era superscalare e gestiva l'esecuzione fuori ordine delle istruzioni. Sebbene fosse dotato di una sola FPU e di una
solo bus verso la memoria, le prestazioni elevate nel calcolo sugli interi, il basso costo e la alta densità resero
l'R10000 la scelta preferita dalla maggior parte dei clienti.
Progetti successivi vennero basati sull'architettura dell'R10000. L'R12000 era una versione miniaturizzata
dell'R10000 per poter innalzare la frequenza operativa. Il processore R14000 era una versione a frequenza maggiore
con in aggiunta il supporto per le memorie DDR SDRAM per la cache di secondo livello. Inoltre il processore era
dotato di un bus esterno a 200 Mhz per aumentare le prestazioni. La versione successiva chiamata R16000 e
R16000A era dotata di una frequenza di funzionamento maggiore, una cache di primo livello maggiore e una
dimensione minore grazie alla nuova tecnologia di produzione.

Specifiche microprocessori MIPS

Modello Frequenza Anno Processo Transistor Die size IO Potenza Voltaggio Dcache Icache Scache
[MHz] [µm] [milioni] [mm²] Pin [W] [k] [k] [k]

R2000 8-16.7 1985 2.0 0.11 -- -- -- -- 32 64 none

R3000 20-40 1988 1.2 0.11 66.12 145 4 -- 64 64 none

R4000 100 1991 0.8 1.35 213 179 15 5 8 8 1024

R4400 100-250 1992 0.6 2.3 186 179 15 5 16 16 1024

R4600 100-133 1994 0.64 2.2 77 179 4.6 5 16 16 512

R5000 150-200 1996 0.35 3.7 84 223 10 3.3 32 32 1024

R8000 75-90 1994 0.5 2.6 299 591 30 3.3 16 16 1024

R10000 150-250 1995 0.35 6.8 299 599 30 3.3 32 32 512

R12000 270-400 1998 0.18–0.25 6.9 204 600 20 4 32 32 1024


Architettura MIPS 6

R14000 500-600 2001 0.13 7.2 204 527 17 -- 32 32 2048

R16000 700-800 2002 0.11 -- -- -- 20 -- 64 64 4096

Nota: Le specifiche indicate sono le più comuni ma esistono delle varianti soprattutto per la cache di secondo livello.

Applicazioni
Molti produttori di workstation hanno utilizzato processori MIPS. Tra i vari segnaliamo la SGI, MIPS Computer
Systems Inc., Olivetti, Siemens-Nixdorf, Acer, Digital Equipment Corporation, NEC, e DeskStation. Molti sistemi
operativi sono stati portati per le architetture basate su processori MIPS. I più famosi sono l'IRIX prodotto da SGI,
Microsoft Windows NT (sebben il supporto per processori MIPS sia terminato con Windows NT 4.0), Windows CE,
Linux, BSD, UNIX System V, SINIX, MIPS Computer Systems RISC/OS e altri.
Tuttavia l'utilizzo dei processori MIPS all'interno di computer e workstation è in declino costante. SGI ha annunciato
la dismissione delle macchine basate su architettura MIPS preferendosi concentrare su macchine basate su processori
Intel IA-64.
Comunque l'uso dei processori MIPS nelle macchine embedded è ancora comune. I processori sono a basso consumo
e offrono buone prestazioni quindi sono spesso scelti per macchine portatili. Inoltre l'architettura MIPS è diffusa
quindi esistono molti tool di sviluppo e programmatori esperti della piattaforma.

Altri modelli e sviluppi futuri


La famiglia MIPS include anche l'R6000, una implementazione ECL dell'architettura MIPS prodotto da Bipolar
Integrated Technology. L'R6000 introdusse il set di istruzioni MIPS II. Il TLB e l'architettura della cache era
diversa da quella degli altri membri della famiglia MIPS. R6000 non aveva le prestazioni che i progettisti speravano
e dopo un breve utilizzo da parte di Control Data Corporation venne abbandonato. L'RM7000 era una versione
dell'R5000 con 256 KB di cache di secondo livello e un controller per una cache di terzo livello opzionale. Il suo
mercato primario erano i dispositivi embedded e i dispositivi di rete, difatti venne utilizzato estesamente da Cisco
System. Il nome R9000 non è stato mai utilizzato.
In quel periodo SGI decise di abbandonare la piattaforma MIPS a favore dei processori Intel Itanium e quindi fermò
lo sviluppo dei processori successivi all'R10000. I tempi di passaggio alla piattaforma Itanium furono più lunghi del
previsto e intanto le macchine basate su MIPS venivano migliorate. Nel 1999 comunque era chiaro che lo sviluppo
dei processori di fascia alta era stato abbandonato troppo rapidamente e quindi vennero presentati i processori
R14000 e R16000 che nonostante il nome non erano molto dissimili dall'R10000. SGI cercò di portare la potente
FPU della serie R8000 in altri processori MIPS e di sviluppare una versione dual core,ma problemi finanziari
bloccarono il progetto. Inoltre SGI decise di utilizzare la tecnologia QuickTransit per permettere alle macchine
basate su Itanium di utilizzare i programmi compilati per MIPS e quindi pose la parola fine allo sviluppo dei
processori MIPS per piattaforma IRIX.
Architettura MIPS 7

Core
Negli ultimi anni molti core MIPS sono stati rilasciati in tecnologia IP core per permettere una progettazione di
sistemi embedded su misura. Core a 32 e 64 bit sono stati immessi sul mercato con i nomi 4K e 5K e sono stati
venduti tramite licenza, come anni prima fu fatto per i progetti MIPS32 e MIPS64. I core possono essere collegati
ad altre unità come unità FPU, sistemi SIMD e altri dispositivi di input/output, etc.
I core MIPS sono stati un successo commerciale e sono utilizzati da molte industrie per realizzare i loro prodotti. Per
esempio Cisco e Linksys utilizzano i core per i propri router e modem. I core sono all'interno di molte stampanti
laser, lettori di smartcard, set top box, robot, computer portatili, console come la Sony PlayStation 2 e la PlayStation
Portable. In dispositivi come i telefoni e i PDA tendenzialmente vengono utilizzati processori ARM che sono
principali concorrenti dei processori MIPS nel settore embedded. In questo settore Microchip Technology, uno dei
maggiori produttori mondiali di microcontrollori, ha utilizzato il core MIPS 4K per il suo modello di punta PIC32.

Programmazione e emulatori
Esiste un emulatore gratuito del processori R2000/R3000 chiamato SPIM che funziona su molti sistemi operativi
(Unix, Linux, Mac OS X, MS Windows 95/98/NT/2000/XP e MS DOS) che fornisce un buon ambiente per imparare
l'assemby MIPS e per impratichirsi con la programmazione di macchine RISC [2].
GXemul invece è un emulatore molto potente (conosciuto precedentemente come mips64emul project) che non
emula solamente i processori (dall'R4000 all'R10000) ma può emulare le macchine complete. Per esempio si può
utilizzare GXemul per simulare il funzionamento di una macchina DECstation con MIPS R4400 o una macchina
SGI O2 con MIPS R10000 e un discreto numero di periferiche come controller SCSI, schede grafiche, etc.
Qemu è un ben noto emulatore opensource e multipiattaforma. Sebbene sia usato principalmente per emulare un
processore x86, permette anche di emulare una piattaforma virtuale MIPS based, simulando un processore MIPS32
4Kc.

Curiosità
Nel videogioco Super Mario 64, il coniglio si chiama Mips, in omaggio al processore MIPS del Nintendo 64.

Bibliografia
• Patterson and Hennessy: Computer Organization and Design. The Hardware/Software Interface. Morgan
Kaufmann Publishers. ISBN 1-55860-604-1
• Dominic Sweetman: See MIPS Run. Morgan Kaufmann Publishers. ISBN 1-55860-410-3

Voci correlate
• MIPS-X
• Loongson
Architettura MIPS 8

Altri progetti
• Wikimedia Commons contiene file multimediali su Architettura MIPS

Collegamenti esterni
• (EN) summary of MIPS assembly language [3]
• (EN) MIPS reference [4]
• (EN) MIPS processor images and descriptions at cpu-collection.de [5]
• (EN) A programmed introduction to MIPS assembly [6]
• (EN) mips bitshift operators [7]
• (EN) MIPS64 ISA simulator [8]

Note
[1] NEC Offers Two High Cost Performance 64-bit RISC Microprocessors (http:/ / www. nec. co. jp/ press/ en/ 9801/ 2002. html)
[2] http:/ / www. cs. wisc. edu/ ~larus/ spim. html
[3] http:/ / logos. cs. uic. edu/ 366/ notes/ MIPS%20Quick%20Tutorial. htm
[4] http:/ / www. mrc. uidaho. edu/ mrc/ people/ jff/ digital/ MIPSir. html
[5] http:/ / www. cpu-collection. de/ ?tn=1& l0=cl& l1=MIPS%20Rx000
[6] http:/ / chortle. ccsu. edu/ AssemblyTutorial/ TutorialContents. html
[7] http:/ / www. cs. umd. edu/ class/ spring2003/ cmsc311/ Notes/ Mips/ bitshift. html
[8] http:/ / www. edumips. org

IA-32
Con IA-32 (Intel Architecture 32 bit), a volte i386, si definisce l'architettura o l'instruction set dei microprocessori
prodotti da Intel, AMD e altre compagnie minori per il mercato desktop a partire dal 1985, e che è presente nella
grandissima maggioranza dei personal computer esistenti al mondo. Spesso viene definita un'architettura CISC, ma
queste distinzioni stanno sempre più perdendo significato con l'avanzare della tecnologia.

Storia
Il termine fu coniato per distinguere il set di istruzioni per le CPU compatibili con il processore Intel 80386 da quelli
per serie incompatibili come Itanium. Il set IA-32 viene implementato in tutte le CPU della grande famiglia x86
successive all'80386, ovvero quelle a 32 bit. I programmi che sono utilizzati con uno di questi processori possono
girare in modalità protetta, usare memoria maggiore di 640K, disporre di memoria virtuale e ambiente multitasking.
Inoltre essi possono accedere ad uno spazio di memoria lineare di circa 4 GB.
IA-32 9

Modalità di operazione dei processori IA-32


L'IA-32 supporta tre modalità di funzionamento: la modalità reale, la modalità protetta e la modalità 8086 virtuale. In
modalità protetta i programmi possono sfruttare appieno il processore e tutta la memoria disponibile sulla macchina,
mentre in modalità reale e in modalità 8086 virtuale il software ha a disposizione un solo megabyte di RAM e il
processore si comporta come un semplice 8086.

Registri
La CPU 80386 (e tutti i suoi successori) ha 4 registri ad uso generico a 32 bit e 6 registri di segmento, più il registro
dei flag, due registri indice e due registri per la gestione dello stack. A questi registri di uso comune si aggiungono
alcuni destinati a compiti particolari: ci sono 4 Control Register, 6 Debug Register e 4 Test Register, oltre
naturalmente ai registri descrittori di segmento necessari per l'implementazione dei meccanismi di memoria virtuale.
Il coprocessore matematico 80387 aggiungeva al sistema altri 8 registri in virgola mobile. I processori seguenti
hanno incorporato il coprocessore matematico e introdotto altri registri per le istruzioni SIMD, come l'MMX, il
3DNow! e l'SSE, ma senza abbandonare mai il gruppo di registri originario del 386.

Registri ad uso generico


I registri ad uso generico x86 non sono realmente destinati all'uso generico come indicherebbe la definizione, a causa
di alcuni processi specifici che possono spesso essere eseguiti impiegando solo uno o due di questi registri. In altre
architetture i registri ad uso generico sono impiegabili in modo assolutamente indistinto, mentre i registri x86 sono
suddivisi tra specifici per i dati e specifici per gli indirizzi.
Inoltre molte operazioni possono essere svolte o in un registro o direttamente nella RAM, senza necessità di caricare
i dati in un registro. Questo comportamento dimostra i trent'anni di età di quest'architettura.
Nota: con l'arrivo dell'estensione AMD64 all'architettura x86 questa caratteristica è stata eliminata, almeno in
modalità a 64 bit: ora i registri ad uso generico sono realmente ad uso generico, senza distinzioni. Questo non
influenza comunque l'architettura IA-32.

Registri a 8 e 16 bit
È inoltre possibile l'accesso ad ulteriori set di registri a 8 e 16 bit. Per esempio, si può accedere ai 16 bit inferiori del
registro a 32 bit EAX chiamandoli AX. Alcuni registri a 16 bit possono essere divisi ulteriormente in registri a 8 bit:
la metà superiore del registro a 16 bit AX visto sopra è chiamata AH e l'inferiore AL. Allo stesso modo, il registro a
32 bit EBX si divide in BX (16 bit), ulteriormente diviso in BH (8 bit) e BL (8 bit).

Registri generici dei dati


Tutti i seguenti registri possono essere impiegati per uso generico, ma anche per processi specializzati; ognuno di
essi può essere suddiviso in registri a 16 o 8 bit.
• EAX - accumulatore (specializzato per le istruzioni aritmetiche)
• EBX - base register (usato per indirizzare il dato nel segmento di memoria)
• ECX - contatore (specializzato per i cicli)
• EDX - data register
IA-32 10

Registri generici degli indirizzi


Usati solo per l'indirizzamento. Possono essere divisi in registri a 16 bit ma non a 8 bit.
• EBP - base pointer (contiene l'indirizzo dello stack frame attualmente impiegato)
• ESI - source index (usato per le stringhe)
• EDI - destination index (usato per le stringhe)
• ESP - stack pointer (contiene il primo indirizzo di uno stack)
• EIP - instruction pointer (contiene l'indirizzo dell'istruzione successiva)

Registri stack per la virgola mobile


Fin dall'introduzione dell'80486 sono presenti 8 registri x87 in virgola mobile, numerati da ST(0) a ST(7). Ogni
registro contiene 80 bit e immagazzina numeri nel formato "precisione doppia estesa" dello standard IEEE 754. A
questi registri non si può accedere direttamente, ma come uno stack LIFO. Il numero del registro non è fisso, ma si
riferisce alla cima dello stack: ST(0) è il registro in cima allo stack, ST(1) è quello inferiore, ST(2) è ancora inferiore
e così via. Questo significa che un dato è sempre spinto verso il basso, e che le operazioni vengono sempre effettuate
con l'operando contenuto in cima allo stack: non è possibile accedere ad un dato registro in modo casuale, ma solo in
ordine.

Registri di segmento
I registri di segmento vengono utilizzati dall' 80386 per generare un indirizzo lineare da un indirizzo logico.
L'indirizzo logico è dato dalla coppia registro di segmento:offset (l'offset può essere una costante, un registro di base,
di indice o la combinazione dei tre, con alcune regole/eccezioni). L'indirizzo lineare viene quindi trasformato in
indirizzo fisico dal meccanismo di paging del processore. I registri di segmento sono 6:
• CS - code segment (viene implicitamente utilizzato dal processore, in coppia con il registro EIP, per prelevare la
prossima istruzione)
• DS - data segment (viene utilizzato, implicitamente, nell'accesso alla memoria da parte di un'istruzione)
• SS - stack segment (utilizzato in coppia con ESP per gestire lo stack)
• ES - extra segment (utilizzato come ulteriore registro per dati, simile al data segment)
• FS - extra segment (segmento extra per i dati, ad uso generico)
• GS - extra segment (segmento extra per i dati, ad uso generico)
Nota: I registri FS e GS furono aggiunti nell' 80386 (nei processori precedenti non erano presenti) e il loro nome è
una semplice continuazione dell'alfabeto dalla E di ES.
Nota: Quando si vuole far riferimento ad un indirizzo di memoria nell'architettura IA-32, viene utilizzata la forma
<SEGMENTO>:<OFFSET>. Il segmento è espresso mediante uno dei 6 registri di segmento (anche se in alcuni casi
è possibile esprimerlo con un valore costante) mentre l'offset indica lo scostamento all'interno del segmento. Le
istruzioni, ad esempio, vengono sempre prelevate nella memoria all'indirizzo puntato dalla coppia CS:EIP.

Registro dei flag


L' 80386 dispone di un registro dei flags, chiamato EFLAG. Sebbene non sia direttamente accedibile mediante un
nome (come EAX, ad esempio) è possibile in qualche modo leggerlo e scriverlo. Sono necessarie solo un paio di
istruzioni:

/* Lettura dello stato del registro dei flags */


PUSHFD ;Salva lo stato dei flags nello stack
POP EAX ;Estrae dallo stack e salva in EAX (o qualunque altro registro generale)

Per modificare, invece, lo stato dei flags sono necessarie le seguenti due istruzioni:
IA-32 11

/* Modifica dello stato dei flags */


PUSH EAX ;Salva il registro EAX sullo stack (o qualunque altro registro generale)
POPFD ;Estrae dallo stack e memorizza nel registro dei flags

Le istruzioni precedenti salvano e ripristinano lo stato di EFLAG (versione a 32-bit dei flags del 80386). È possibile
salvare/ripristinare solo i 16 bit meno significativi utilizzando PUSHF/POP AX e PUSH AX/POPF rispettivamente.
La dimensione (16 o 32 bit) utilizzata dipende dalla dimensione dell'operando. Il prefisso di forzatura operando
(op-code 0x66) permette di variare la dimensione all'interno del contesto corrente: se utilizzato in modo 16-bit farà
trattare al microprocessore l'istruzione come a 32-bit e viceversa.
Il registro dei flags è un registro a 16 bit dove ad alcuni bit (o raggruppamento di essi) è assegnato un significato
preciso ed indica lo stato del processore. Se il bit è posto ad 1 il flag è impostato (set), se posto a 0 si dice che è
resettato (reset o clear).
I numeri indicano la posizione in bit le sigle indicano il nome simbolico del flag.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

V8 RF NT PL PL OF DF IF TF SF ZF AF PF CF

Significato dei flags:


• V8 - Virtual 86 mode (se impostato indica che si è in modalità Virtual-8086)
• RF - Resume Flag (se impostato abilita le eccezioni in modo debug)
• NT - Nested Task Flag (se impostato indica che il codice in esecuzione non deve essere interrotto dal
multi-tasking in quanto routine di un servizio di interrupt)
• PL - Priviledged Level Flag (2 bits) (se impostato permette di eseguire istruzioni di I/O, in caso è resettato,
l'esecuzione di istruzioni di I/O genera un'eccezione di protezione).
• OF - Overflow Flag (se impostato indica che l'ultima operazione aritmetica ha generato un overflow)
• DF - Direction Flag (indica alla cpu quale direzione utilizzare negli incrementi automatici delle istuzioni che
operano su stringhe.
• IF - Interrupt Flag (se impostato indica alla cpu di rispondere agli interrupt. L'NMI-Non Maskable Interrupt non
viene influenzato da questo flag)
• TF - Trap Flag (se impostato indica alla cpu di generare una INT 0 dopo ogni istruzione)
• SF - Sign Flag (se impostato indica che l'ultima istruzione aritmetica ha generato un numero negativo).
• ZF - Zero Flag (se impostato indica che l'ultima operazione logico/aritmetica ha generato uno 0)
• AF - Auxiliary Carry Flag (se impostato indica che l'ultima operazione aritmetica ha generato un riporto sui 4 bit
inferiori di AL, usato nell'aritmetica BCD)
• PF - Parity Flag (se impostato indica che l'ultima operazione aritmetica ha generato un risultato formato da un
numero dispari di bit posti ad 1)
• CF - Carry Flag (se impostato indica che l'ultima operazione aritmetica ha generato un riporto)
I restanti bit non sono utilizzati e vengono riservati ad uso futuro; il loro valore non dovrebbe essere modificato e, se
letto, non dovrebbe essere preso in considerazione.
IA-32 12

Registri SIMD
Gli instruction set MMX, 3DNow!, e SSE possiedono propri registri, in aggiunta a quelli standard IA-32.

Registri MMX
L'MMX possiede 8 registri, chiamati da MM0 a MM7 (da qui in poi MMn), che però sono fisicamente gli stessi
registri x87 per il calcolo in virgola mobile della FPU, per cui è impossibile usare contemporaneamente le istruzioni
MMX e quelle in virgola mobile: prima di usare il set di istruzioni MMX deve essere disabilitata la FPU, con una
istruzione apposita.
Ognuno dei registri MMn contiene un intero a 64 bit, ma una delle caratteristiche fondamentali di questo instruction
set è il concetto di vettore, formato da più dati simili tra loro: potevano quindi essere immagazzinate due parole di 32
bit l'una, quattro di 16 o otto di 8.
Sempre perché i registri MMn sono in "coabitazione fisica" con i registri x87, che contengono 80 bit l'uno,
nell'esecuzione delle MMX i primi 16 bit del registro vanno sprecati: vengono quindi tutti impostati a 1, in modo che
i dati presenti vengano riconosciuti come "NaN" o come infiniti da un'applicazione in virgola mobile, e rendendo
facile riconoscere se vengano usati dati in virgola mobile o MMX.

Registri 3DNow!
Il 3DNow! fu progettato come un'estensione naturale delle istruzioni MMX per il calcolo in virgola mobile; usa
quindi le stesse denominazioni dei registri MMn, ma invece di immagazzinarvi parole di 64 bit, vi introduce numeri
in virgola mobile a precisione singola.
Il vantaggio di usare i registri x87 anche in questo caso è che essi sono già dedicati al calcolo in virgola mobile, e
quindi le istruzioni x87 possono essere usate per compiere le operazioni analoghe di salvataggio dei registri anche
nel codice 3DNow!: ne consegue che non sono richieste modifiche al sistema operativo per usare questa tecnologia.

Registri SSE
Con l''SSÈ le istruzioni SIMD furono rese completamente indipendenti dai registri x87. Ma questo significò anche
allontanarsi definitivamente dagli altri instruction set SIMD, come MMX; sforzo giustificato dalla possibilità di
usare registri più grandi, liberi dai limiti della virgola mobile. Furono creati otto registri a 128 bit, chiamati da
XMM0 a XMM7 (nota: nell'architettura AMD64 i registri sono stati aumentati a 16).
Lo svantaggio consiste nel dover inserire nel sistema operativo il nuovo set di istruzioni. Intel creò quindi una nuova
versione della modalità protetta, chiamata "Enhanced mode", che permette l'utilizzo delle istruzioni SSE, disabilitate
nella normale modalità protetta: un sistema operativo che include le istruzioni SSE accede alla nuova modalità,
mentre uno più vecchio o che comunque non le includa tenterà l'accesso solo alla normale modalità protetta.
L'SSE è un instruction set che opera solo su dati in virgola mobile, come 3DNow!, ma a differenza di questo non usa
i registri stack della FPU ma un proprio set di registri separato, in grado di contenere il doppio di numeri a precisione
singola. Mentre il primo SSE era limitato ai numeri a precisione singola, con l'SSE2 fu possibile trattare anche
numeri a precisione doppia. Per il 3DNow! questo non era possibile, dato che un unico numero in questa precisione
occuperebbe l'intero registro a 64 bit, mentre i registri XMMn sono a 128 bit: l'SSE2 è quindi molto più adatto ad
applicazioni scientifiche rispetto ai due predecessori.
IA-32 13

Set di istruzioni aggiuntivi SIMD


• Le estensioni MMX furono il primo grande aggiornamento: erano istruzioni SIMD adatte solo per il calcolo
intero. Esse furono introdotte insieme da Intel e AMD nei propri Pentium MMX e K6 nel 1997. Condivideva i
registri con la FPU x87, così il sistema operativo non doveva essere modificato per adoperare queste istruzioni se
supportava il salvataggio dello stato x87.
• L'MMX fu aggiornato con le estensioni 3DNow!, che supportavano la virgola mobile, da parte di AMD nel 1999
col K6-2. Anche queste sfruttavano i registri x87. Intel non considerò mai questa tecnologia.
• Intel introdusse le istruzioni SSE, con supporto per dati in virgola mobile a precisione singola, col processore
Pentium III nel 1999. A differenza del 3DNow!, non erano un'estensione delle MMX e non sfruttavano i registri
della FPU x87, e richiedevano modifiche al sistema operativo per essere sfruttate, ma erano libere dalle
limitazioni imposte dai registri x87. Queste istruzioni e le sue successive estensioni furono adottate anche da
AMD a partire dagli Athlon XP, e questa non sviluppò ulteriormente il 3DNow!.
• L'SSE2 fu introdotto col Pentium 4 all'inizio del 2001; costituiva un ulteriore miglioramento delle SSE, con
l'aggiunta del supporto per i numeri a precisione doppia.
• L'SSE3, introdotto col Pentium 4 Prescott nel 2004, forniva aggiunte secondarie alle SSE2.

Formato delle istruzioni IA-32


La struttura di una generica istruzione IA-32 è variabile a seconda dello specifico opcode, e può essere preceduta da
dei prefissi (fino a quattro) che ne modificano il comportamento: una descrizione generale è data nella tabella qui
sotto.

PREFISSI 'ISTRUZIONE

Istruzione Dimensione Dimensione sostituzione Opcode Mode SIB Spostamento Immediato


operando indirizzo segmento R/M

1 byte 1 byte 1 byte 1 byte 1 o 2 byte 1 byte 1 1, 2 o 4 byte 1, 2 o 4


byte byte

Opz. Opz. Opz. Opz. OBBLIGATORIO Opz. Opz. Opz. Opz.

Il byte Mode R/M specifica ulteriormente l'operando dell'istruzione e può contenere un supplemento di opcode,
mentre il byte SIB (Scale Index Base) specifica sempre un registro a 32 bit (EAX, EBX ecc.) ed è caratteristico dei
processori IA-32.

Byte Mode R/M

Mode Reg/Opcode R/M

2 bit 3 bit 3 bit


IA-32 14

Byte SIB

Scale Index Base

2 bit 3 bit 3 bit

Nella tabella seguente sono elencate le istruzioni IA-32, organizzate per ordine alfabetico in base al loro codice
mnemonico Assembler. Vengono riportati anche gli opcpdes esadecimali e, in cicli di clock, i tempi di esecuzione
per un 80386. Se al posto dell'opcode c'è un asterisco è perché l'istruzione ha molti opcode diversi a seconda delle
varie forme; anche i tempi di esecuzione sono variabili a seconda dello stato in cui si trova il processore: in modo
protetto molti accessi alla memoria "costano" cicli di clock in più, e un eventuale context switch può alzare di molto
i tempi. I flag impostati a valori predefiniti sono contrassegnati con il valore 0 o 1 che assumono; se vengono
modificati in accordo con il risultato dell'operazione sono contrassegnati con un asterisco; se vengono modificati, ma
in modo non definito sono contrassegnati con un punto interrogativo.

Assembler Opcode Cicli di Flag Descrizione


(esadecimale) clock modificati

AAA 37 4 oditszapc Regolazione ASCII dopo l'addizione (per aritmetica BCD)


? ??*?*

AAD D5 0A 19 oditszapc Regolazione ASCII prima della divisione (per aritmetica BCD)
? ??*?*

AAM D4 0A 17 oditszapc Regolazione ASCII dopo la moltiplicazione (per aritmetica BCD)


? ??*?*

AAS 3F 4 oditszapc Regolazione ASCII dopo la sottrazione (per aritmetica BCD)


? ??*?*

ADC * 2-7 oditszapc Somma con carry.


* *****

ADD * 2-7 oditszapc Somma.


* *****

AND * 2-7 oditszapc Esegue l'AND logico bit a bit fra i due operandi, di cui uno può essere implicitamente il
0 **?*0 registro AL/AX/EAX.

ARPL 63 21 oditszapc Regolazione del campo RPL del selettore di segmento. Si usa nei sistemi operativi, per
* assicurarsi che un programma non chiami una subroutine che abbia un privilegio
superiore a quello del programma stesso.

BOUND 62 10 oditszapc Controlla che l'operando sia entro determinati limiti. Serve ad evitare di indirizzare per
errore zone al di fuori di un array: di solito, per motivi di efficienza, si usa soltanto nelle
versioni di debug di un programma.

BSF 0F BC * oditszapc Scansione in avanti dei bit dell'operando.


*

BSR 0F BD * oditszapc Scansione all'indietro dei bit dell'operando.


*

BT * 3-12 oditszapc Test del bit specificato dell'operando


*

BTC * 6-13 oditszapc Test del bit specificato dell'operando e sua negazione
*

BTR * 6-13 oditszapc Test del bit specificato dell'operando e sua impostazione a 0
*

BTS * 6-13 oditszapc Test del bit specificato dell'operando e sua impostazione a 1
*
IA-32 15

CALL * 7-98+ oditszapc Chiamata di procedura o subroutine


tutti

CBW 98 3 oditszapc Conversione da byte a word

CDQ 99 2 oditszapc Conversione da doubleword a quadword

CLC F8 2 oditszapc Azzeramento del flag di Carry


0

CLD FC 2 oditszapc Azzeramento del flag di Direzione


0

CLI FA 3 oditszapc Azzeramento del flag di Interrupt


0

CLTS 0F 06 5 oditszapc Azzeramento del flag di cambio task (TS) nel registro speciale CR0
(nota 1)

CMC F5 2 oditszapc Negazione del flag di Carry


*

CMP * 2-6 oditszapc Confronto fra due operandi


* *****

CMPS* * 10 oditszapc Confronto fra due stringhe di memoria i cui indirizzi relativi sono memorizzati nei
* ***** registri indice SI (o ESI) e DI (o EDI): entrambi i registri vengono decrementati di uno.
A seconda se si devono considerare byte, word o doubleword sono disponibili le varianti
CMPS, CMPSB, CMPSW e CMPSD. Molto spesso questa istruzione viene usata con
prefissi REP* in modo da confrontare automaticamente intere zone di memoria.

CWD 99 2 oditszapc Conversione da word a doubleword

CWDE 98 2 oditszapc Conversione da word a doubleword

DAA 27 4 oditszapc Regolazione decimale dopo l'addizione (per aritmetica BCD)


? *****

DAS 2F 4 oditszapc Regolazione decimale dopo la sottrazione (per aritmetica BCD)


? *****

DEC * 2-6 oditszapc Decrementa di uno l'operando specificato


* ****

DIV * 38-41 oditszapc Divisione senza segno.


? ?????

ENTER * 10- oditszapc Creazione dello stack frame necessario per le chiamate di procedura dei linguaggi ad alto
livello.

HLT F4 5 oditszapc Ferma il processore. Dopo un HLT non vengono eseguite nuove istruzioni finché non si
verifica un interrupt o un reset: in caso di interrupt, dopo la routine di servizio il
processore riprende l'esecuzione dall'istruzione successiva alla HLT. Di solito si usa
questa istruzione a fini di sincronizzazione o di risparmio energetico.

IDIV * 19-43 oditszapc Divisione con segno.


? ?????

IMUL * 9-41 oditszapc Moltiplicazione con segno


* ????*

IN * 12+ oditszapc Lettura di un byte o di una word dalla porta di I/O specificata nell'operando.

INC * 2-6 oditszapc Incrementa l'operando di uno.


* ****

INS* * 15-29 oditszapc Lettura di un byte o di una word dalla porta di I/O specificata nella stringa specificata dal
registro indice DI (o EDI). Si usa spesso con prefissi REP* per leggere automaticamente
interi vettori di dati.
IA-32 16

INT * 33-119 oditszapc Interrompe l'esecuzione corrente ed esegue la subroutine di interrupt specificata
00 dall'operando.

INTO CE 59-119 oditszapc Interrompe l'esecuzione corrente ed esegue la subroutine di interrupt dedicata agli
overflow. È sinonimo di INT 4.

IRET/IRETD CF 22-82 oditszapc Ritorno da una subroutine di interrupt.


TUTTI

Jcc * 7+ oditszapc Salto condizionato. Il salto all'indirizzo specificato viene eseguito solo se determinati
flag hanno un determinato valore: altrimenti l'esecuzione continua normalmente con
l'istruzione successiva. Esistono numerosi tipi di salti condizionati.

JMP * 7-49+ oditszapc Salto ad altra locazione. L'esecuzione del programma continua a partire dalla locazione
indicata dall'argomento del salto: se l'argomento non dovesse puntare ad una istruzione
valida, viene generata una eccezione e il programma si ferma.

LAHF 9F 2 oditszapc Copia il registro dei flag nel registro AH

LAR 0F 02 16 oditszapc Carica il byte dei diritti di accesso nel descrittore di segmento. Questa istruzione serve ad
* impostare i privilegi di un determinato segmento: è una istruzione privilegiata e viene
usata solo dal sistema operativo.

LEA 8D 2 oditszapc Caricamento dell'offset dell'indirizzo effettivo.

LEAVE C9 4 oditszapc Uscita da una procedura di un linguaggio ad alto livello: è l'istruzione simmetrica di
ENTER e provvede a distruggere lo stack frame della procedura terminata.

LGDT 0F 01 /2 11 oditszapc Caricamento del registro della tabella dei descrittori globali dei segmenti: questa
istruzione è usata soltanto dai sistemi operativi, un programma utente non ha nessun
motivo di usarla.

LIDT 0F 01 /3 11 oditszapc Caricamento del registro della tabella degli interrupt. Questa operazione viene fatta una
volta per tutte all'avvio dal sistema operativo.

L*S * 7-25 oditszapc Caricamento di un puntatore completo segmento: offset. Le varie forme dell'istruzione
(LGS, LFS, LDS, LES, LSS) specificano quale registro di segmento conterrà la parte
segmento del puntatore.

LLDT 0F 00 /2 20 oditszapc Caricamento del registro della tabella del descrittore locale. Come tutte le istruzioni sui
descrittori di segmento, anche questa è usata solo dai sistemi operativi.

LMSW 0F 01 /6 10-13 oditszapc Caricamento della parola di stato della macchina (Machine Status Word)

LODS* * 5 oditszapc Caricamento di un operando stringa. L'operando puntato dal registro SI (o ESI) viene
caricato in AL/AX/EAX, a seconda di quale versione dell'istruzione viene usata (LODS,
LODSB, LODSW, LODSD)

LOOP* * 11+ oditszapc Salto condizionato in base al valore del registro CX/ECX. Dopo il salto, CX/ECX viene
decrementato di uno: quando il registro è zero, il salto non viene più eseguito.

LSL 0F 03 20-26 oditszapc Carica il limite del segmento nel relativo descrittore, specificato nell'operando. È di
* esclusivo uso del sistema operativo.

LTR 0F 00 /3 oditszapc Carica il registro del task con il registro o locazione di memoria specificata
dall'operando. Anche questa istruzione è privilegiata e usata soltanto dai sistemi
operativi.

MOV * 2-4 oditszapc Copia il secondo operando nel primo.

MOVS* * 7 oditszapc Copia il valore corrente in una certa posizione di una stringa nella corrispondente
posizione della seconda. Si usa spesso con prefissi REP*.

MOVSX 0F BE 3-6 oditszapc Copia il secondo operando nel primo e ne estende il segno.

MOVZX * 3-6 oditszapc Copia il secondo operando nel primo e azzera il resto del primo operando.

MUL * 9-41 oditszapc Moltiplicazione senza segno di AL o AX


* ????*
IA-32 17

NEG * 2-6 oditszapc Negazione dell'operando in complemento a due


* *****

NOP 90 3 oditszapc Nessuna operazione. Sinonimo di XCHG AX, AX (vedi).

NOT * 2-6 oditszapc Negazione logica dell'operando

OR * 2-7 oditszapc Or logico inclusivo di due operandi.


0 **?*0

OUT * 10-25 oditszapc Scrittura di un byte o di una word nella porta di I/O specificata dall'operando.

OUTS* * 8-28 oditszapc Scrittura di un byte o di una word di una stringa nella porta di I/O specificata
dall'operando.

POP* * 5-24 oditszapc Caricamento dallo stack di alcuni registri. Il valore del puntatore alla cima dello stack, lo
********* Stack Pointer SP, viene decrementato di tante unità quanti byte sono stati letti.

PUSH* * 2-18 oditszapc Scrittura nello stack di alcuni registri. Il valore del puntatore alla cima dello stack, lo
Stack Pointer SP, viene decrementato di tante unità quanti byte sono stati scritti.

RCL * 9-10 oditszapc Rotazione a sinistra dell'operando con carry: tutti i bit dell'operando vengono spostati di
** una posizione a sinistra e in quella rimasta libera viene copiato il valore del flag di carry,
che assume il valore del bit uscito da destra.

RCR * 9-10 oditszapc Rotazione a destra dell'operando con carry: tutti i bit dell'operando vengono spostati di
** una posizione a destra e in quella rimasta libera viene copiato il valore del flag di carry,
che assume il valore del bit uscito da sinistra.

RET * 10-68 oditszapc Ritorno da una subroutine o da una procedura a basso livello.

ROL * 3-7 oditszapc Rotazione a sinistra dell'operando: tutti i bit dell'operando vengono spostati di una
** posizione a sinistra e quello uscito all'estrema sinistra viene copiato nella posizione
liberatasi a destra.

ROR * 3-7 oditszapc Rotazione a destra dell'operando: tutti i bit dell'operando vengono spostati di una
** posizione a destra e quello uscito all'estrema destra viene copiato nella posizione
liberatasi a sinistra.

SAHF 9E 3 oditszapc Scrittura del contenuto di AH nel registro dei flag.


*********

SAL * 3-7 oditszapc Spostamento dei bit dell'operando N volte a sinistra: i bit fuoriusciti da sinistra vengono
* **?** persi. Se nessun bit viene perso, questa operazione equivale ad una moltiplicazione per
2N.

SAR * 3-7 oditszapc Spostamento dei bit dell'operando N volte a destra: i bit fuoriusciti da destra vengono
* **?** persi. Questa operazione equivale ad una divisione per 2N senza resto.

SBB * 2-7 oditszapc Sottrazione intera con riporto.


* *****

SCAS* * 7 oditszapc Confronto di stringhe. Le posizioni di memoria puntate dai registri SI e DI (o ESI ed
* ***** EDI) vengono confrontate e i due registri incrementati/decrementati di uno a seconda del
valore del flag D. Questa istruzione si usa spesso con prefissi REP*.

SETcc * 4-5 oditszapc Impostazione del byte in base alla condizione specificata. In modo analogo alle istruzioni
Jcc, se i valori dei flag sono quelli imposti dalla particolare versione di SETcc usata, nel
byte operando viene scritto il valore 1.

SGDT 0F 01 /0 9 oditszapc Memorizzazione della tabella del descrittore globale. Ad esclusivo uso e consumo dei
sistemi operativi.

SHL * 3-7 oditszapc Spostamento a sinistra dei bit dell'operando: il bit fuoriuscito da sinistra è perso. Se era
* **?** zero, l'operazione equivale ad una moltiplicazione per 2.

SHLD * 3-7 oditszapc Spostamento a sinistra dei bit dell'operando in doppia precisione. Come SHL, ma
? **?** coinvolge anche un secondo registro, concatenato al primo.
IA-32 18

SHR * 3-7 oditszapc Spostamento a destra dei bit dell'operando: il bit fuoriuscito da destra è perso.
* **?** L'operazione equivale ad una divisione per 2 senza resto.

SIDT 0F 01 /1 9 oditszapc Memorizzazione della tabella degli interrupt in modalità protetta. Ad esclusivo uso e
consumo dei sistemi operativi.

SHRD * 3-7 oditszapc Spostamento a destra dei bit dell'operando in doppia precisione. Come SHR, ma
? **?** coinvolge anche un secondo registro, concatenato al primo.

SLDT 0F 00 /0 2 oditszapc Carica il registro della tabella del descrittore locale. Usata soltanto nei sistemi operativi.

SMSW 0F 01 /4 2-3 oditszapc Memorizzazione della parola di stato della macchina (Machine Status Word)

STC F9 2 oditszapc Imposta a uno il flag di Carry


1

STD FD 2 oditszapc Imposta a uno il flag di Direzione


1

STI FB 3 oditszapc Imposta a uno il flag di Interrupt


1

STOS* * 4 oditszapc Memorizza il valore di AL/AX/EAX nella posizione di una stringa puntata da DI (o
EDI). Dopodiché il valore di (E)DI viene incrementato/decrementato a seconda del
valore del flag D.

STR 0F 00 /1 23-27 oditszapc Memorizza il registro dei task. Utile solo ai sistemi operativi.

SUB * 2-7 oditszapc Sottrazione intera.


* *****

TEST * 2-5 oditszapc Confronto logico non distruttivo di due operandi. Viene eseguito l'AND logico fra i due,
0 **?*0 ma il risultato non viene memorizzato: vengono modificati soltanto i flag.

VERR 0F 00 /4 10-11 oditszapc Verifica di accesso in lettura di un segmento: se sì, il flag Zero viene posto a 1, altrimenti
* viene azzerato.

VERW 0F 00 /5 15-16 oditszapc Verifica di accesso in scrittura di un segmento: se sì, il flag Zero viene posto a 1,
* altrimenti viene azzerato.

WAIT 9B 6 oditszapc Il processore si ferma finché il segnale esterno BUSY# (proveniente dal coprocessore
matematico) non si disattiva: si usa per sincronizzare i calcoli del coprocessore con quelli
della CPU principale.

XCHG * 3-5 oditszapc Scambia i valori dei due operandi.

XLAT/XLATB D7 5 oditszapc Trasformazione con tabella di consultazione. Il valore corrente di AL viene sostituito con
quello nella cella di memoria della tabella puntata da DS:BX + AL stesso.

XOR * 2-7 oditszapc OR logico esclusivo fra due operandi.


0 **?*0

Questo è il set completo di istruzioni del processore 80386. La nuova architettura Intel IA-64 non è direttamente
compatibile con le istruzioni IA-32.
IA-32 19

Voci correlate
• x86 - Famiglia di processori Intel
• AMD64 - Architettura a 64 bit di AMD
• IA-64 - Architettura a 64 bit di Intel per processori Itanium
• EM64T - Architettura a 64 bit di Intel per processori x86

Registro (informatica)
Nell'architettura dei calcolatori un registro (o registro del processore) è una piccola parte di memoria utilizzata per
velocizzare l'esecuzione dei programmi fornendo un accesso rapido ai valori usati più frequentemente —
tipicamente, i valori correntemente in uso in una determinata parte di un calcolo. La maggior parte delle moderne
architetture dei computer (ma non tutte) sono basate sul principio di copiare i dati dalla memoria ai registri, operando
su questi ultimi, e poi di copiare a loro volta i risultati nella memoria — la cosiddetta architettura load-store.
I registri costituiscono il punto più alto della gerarchia della memoria, e sono il meccanismo più rapido per il sistema
di manipolare i dati. I registri sono normalmente misurati in base al numero di bit che possono contenere (ad
esempio, registri a 8 bit o registri a 32 bit). Attualmente i registri sono implementati normalmente con file dei
registri, ma in passato sono stati implementati usando flip-flop individuali, memoria a nuclei di ferrite ad alta
velocità, memoria thin film e vari altri modi.
Il termine è usato spesso per riferirsi esclusivamente al gruppo di registri che possono essere direttamente indirizzati
dalle istruzioni di input e output del microprocessore. Più propriamente, queste registri sono definiti "architected
registers". Per esempio, nell'architettura x86 è disponibile un set di otto registri utilizzabili dalle istruzioni del
linguaggio macchina, ma la CPU conterrà molti più registri per uso interno o con funzioni speciali.
Vi sono molte classi di registri:
• Registri di dati: sono usati per memorizzare numeri interi. Nelle CPU più semplici o più vecchie, uno speciale
registro per i dati è l'accumulatore, usato per calcoli aritmetici.
• Registri di indirizzo: contengono gli indirizzi e sono usati per accedere alla memoria.
• Registro generico: può contenere sia dati che indirizzi.
• Registri floating-point: sono usati per memorizzare numeri a virgola mobile.
• Registri costanti: contengono dati a sola lettura (ad esempio zero, uno, pi greco, ecc.).
• Registri vettoriali: contengono dati utilizzati dalle istruzioni SIMD (Single Instruction, Multiple Data).
• Registri speciali: contengono dati interni della CPU, come il program counter, lo stack pointer e il registro di
stato.
• Registro di istruzione: contiene l'istruzione corrente.
• Registri indice: sono usati per modificare l'indirizzo degli operandi.
• In alcune architetture, vi sono dei registri specifici del modello di processore, che memorizzano dati e
impostazioni del processore stesso. Essendo registri legati a caratteristiche peculiare di uno specifico modello,
non è garantita la presenza o lo stesso funzionamento nelle generazioni successive di quel processore.
• Vi sono inoltre registri dedicati al "fetching" (trasferimento dalla RAM verso la CPU).
I registri hardware a livello FIRMWARE sono simili ai registri dei processori, ma sono presenti esternamente alle
CPU.
Registri del microprocessore I registri del microprocessore forniscono un livello di memoria più veloce e ridotto
rispetto alla memoria principale e svolgono principalmente le seguenti due funzioni:
. registri visibili all'utente: registri ottimizzabili dal programmatore a livello di linguaggio macchina o Assembler.
Nei casi di programmazione ad alto livello il compilatore cercherà di fare scelte intelligenti riguardo alle variabili da
Registro (informatica) 20

assegnare ai registri e alla localizzazione della memoria. Esistono casi in cui è possibile con linguaggi di alto livello
(come con il C ) specificare al compilatore quali variabili si vorrebbe memorizzare nei registri.
.registri di stato e di controllo: usate dal microprocessore per controllare le sue operazioni e dal sistema operativo
per le sue routine privilegiate per il controllo esecuzione comandi.
registri visibili all'utente: Registri visibili all'utente del linguaggio macchina eseguito dal processore. Sono
tipicamente registri disponibili sia ai programmi applicativi che a quelli di sistema. Tali registri sono quello dei dati,
degli indirizzi e dei condition code. I registri dei dati possono essere destinati dal programmatore per diverse
funzioni. Solitamente sono ristretti a particolari tipi di funzione (es: registri dedicati ad operazioni in virgola mobile),
tuttavia possono essere usati in qualsiasi istruzione macchina. I registri degli indirizzi contengono gli indirizzi dei
dati e delle istruzioni contenute nella memoria. Tali registri possono essere di tipo generale o dedicati ad un
particolare modo di indirizzamento (index register, segment pointer, stack pointer).

Esempi
Il numero di registri varia significativamente tra le varie architetture in funzione dell'età dell'ISA e della tipologia di
architettura, per esempio le architetture RISC tendono a essere dotate di un elevato numero di registri mentre le
architetture CISC che sono mediamente più vecchie tendono ad avere un numero ridotto di registri anche se spesso
gli ultimi processori dispongono di un elevato numero di registri nascosti che vengono utilizzati per implementare
l'esecuzione superscalare dei programmi.

Processore Registri interi Registri FPU

Intel Core Duo 8 8

Intel Core 2 16 16

Pentium 4 8 8

Pentium 4 con EM64T 16 16

Athlon 64 16 16

Athlon MP 8 8

Opteron 240 16 16

Itanium 2 128 128

UltraSPARC IIIi 32 32

POWER3 32 32

MOS 6502 3 0

Altri progetti
• Wikimedia Commons contiene file multimediali su Registro (informatica)
Pipeline dati 21

Pipeline dati
La pipeline dati è una tecnologia
utilizzata dai microprocessori per
incrementare il throughput, ovvero la
quantità di istruzioni eseguite in una
data quantità di tempo. Esecuzione delle istruzioni in un microprocessore senza pipeline

L'elaborazione di un'istruzione da parte


di un processore si compone di cinque passaggi fondamentali:
1. IF (Instruction Fetch): Lettura dell'istruzione da memoria
2. ID (Instruction Decode): Decodifica istruzione e lettura operandi da registri
3. EX (Execution): Esecuzione dell'istruzione
4. MEM (Memory): Attivazione della memoria (solo per certe istruzioni)
5. WB (Write Back): Scrittura del risultato nel registro opportuno
Praticamente ogni CPU in commercio è gestita da un clock centrale e ogni operazione elementare richiede almeno un
ciclo di clock per poter essere eseguita. Le prime CPU erano formate da un'unità polifunzionale che svolgeva in
rigida sequenza tutti e cinque i passaggi legati all'elaborazione delle istruzioni. Una CPU classica richiedeva quindi
almeno cinque cicli di clock per eseguire una singola istruzione.
Con il progresso della tecnologia si è potuto integrare un numero maggiore di transistor in un microprocessore e
quindi si sono potute parallelizzare alcune operazioni riducendo i tempi di esecuzione. La pipeline dati è la massima
parallelizzazione del lavoro di un microprocessore.
Una CPU con pipeline è composta da cinque stadi
specializzati, capaci di eseguire ciascuno una
operazione elementare di quelle sopra descritte. La
CPU lavora come in una catena di montaggio e
quindi ogni stadio provvede a svolgere solo un
compito specifico. Quando la catena è a regime, ad Esecuzione delle istruzioni in un microprocessore con pipeline
ogni ciclo di clock esce dall'ultimo stadio
un'istruzione completata. Nello stesso istante ogni unità sta elaborando in parallelo i diversi stadi delle successive
istruzioni. In sostanza si guadagna una maggior velocità di esecuzione a prezzo di una maggior complessità circuitale
del microprocessore, che non deve essere più composto da una sola unità ma da cinque unità che devono collaborare
tra loro.

Storia
Il concetto di pipeline venne sviluppato dal ricercatore Robert Tomasulo dell'IBM, il primo sistema dotato di
pipeline fu il supercomputer IBM System 360/91 presentato nel 1966 che grazie alla pipeline otteneva un incremento
anche del 33%. La pipeline si diffuse rapidamente nei supercomputer e nei server. Il primo microprocessore a
utilizzare una pipeline fu il MOS Technology 6502 che tramite una semplice pipeline forniva prestazioni superiori a
quelli della concorrenza a una frazione del loro costo. Nel settore di microprocessori le pipeline divennero comuni
con i processori RISC che data la loro semplicità consentì di implementare un'architettura a pipeline completa fin
dalle loro prime implementazioni negli anni ottanta. I progetti Berkeley RISC e MIPS infatti avevano già una
pipeline. I processori CISC utilizzarono un'architettura a pipeline completa solamente alla fine degli anni 80 per via
delle maggiori difficoltà di implementazione. Attualmente tutti i microprocessori utilizzano una struttura a pipeline
per migliorare le loro prestazioni.
Pipeline dati 22

Problematiche
L'implementazione di una pipeline non sempre moltiplica il throughput. L'analisi delle problematiche legate alla
gestione delle pipeline per ottenere le migliori prestazioni teoriche ricadono sotto la ricerca del instruction level
parallelism, il parallelismo a livello d'istruzione, cioè le istruzioni che possono essere eseguite in parallelo senza
creare conflitti o errori di esecuzione. Comunque le singole pipeline affrontano due problemi principalmente; il
problema legato alla presenza di istruzioni che possono richiedere l'elaborazione di dati non ancora disponibili e il
problema legato alla presenza di salti condizionati.
• Il primo problema deriva dal lavoro parallelo delle unità.
Supponiamo che la CPU con pipeline debba eseguire il seguente frammento di codice:
1. C=A+B
2. D=C-1
La prima istruzione deve prelevare i numeri contenuti nelle variabili A e B, sommarli e porli nella variabile C. La
seconda istruzione deve prelevare il valore contenuto nella variabile C, sottrarlo di uno e salvare il risultato in D. Ma
la seconda istruzione non potrà essere elaborata (EX) fino a quando il dato della prima operazione non sarà
disponibile in memoria (MEM) e quindi la seconda operazione dovrà bloccarsi per attendere il completamento della
prima e quindi questo ridurrà il throughput complessivo.
• Il secondo problema consiste nei salti condizionati.
I programmi contengono delle istruzioni condizionate che se una specifica condizione è verificata provvedono a
interrompere il flusso abituale del programma e a mandare in esecuzione un altro pezzo di programma indicato
dall'istruzione di salto. Ogni volta che questo accade il microprocessore si trova a dover eseguire un nuovo flusso di
operazioni e quindi deve svuotare la pipeline del precedente flusso e caricare il nuovo flusso. Ovviamente queste
operazioni fanno sprecare cicli di clock e quindi deprimono il throughput. Per ridurre questo problema le CPU
adottano delle unità chiamate unità di predizione delle diramazioni (in inglese Branch Prediction Unit) che fanno
delle previsioni sul flusso del programma. Queste unità riducono notevolmente i cicli persi per i salti.

Evoluzioni
Per realizzare CPU con prestazioni migliori col
tempo si è affermata la strategia di integrare in un
unico microprocessore più pipeline che funzionano in
parallelo. Questi microprocessori sono definiti
superscalari dato che sono in grado di eseguire
mediamente più di un'operazione per ciclo di clock.
Queste pipeline ovviamente rendono ancora più
complessa la gestione dei problemi di coerenza e dei
salti condizionati. Nelle CPU moderne inoltre le
pipeline non sono composte da soli cinque stadi ma
CPU superscalare a doppia Pipeline
in realtà ne utilizzano molti di più (il Pentium 4 ne
utilizza da 20 fino a 30). Questo si è reso necessario
per potere innalzare la frequenza di clock. Spezzettando le singole operazioni necessarie per completare un'istruzione
in tante sotto operazioni si può elevare la frequenza della CPU dato che ogni unità deve svolgere un'operazione più
semplice e quindi può impiegare meno tempo per completare la sua operazione. Questa scelta di progettazione
consente effettivamente di aumentare la frequenza di funzionamento delle CPU ma rende critico il problema dei salti
condizionati. In caso di un salto condizionato non previsto il Pentium 4 per esempio può essere costretto a svuotare e
Pipeline dati 23

ricaricare una pipeline di 30 stadi perdendo fino a 30 cicli di clock contro una classica CPU a pipeline a 5 stadi che
avrebbe sprecato nella peggiore delle ipotesi 5 cicli di clock.
La sempre maggior richiesta di potenza
di calcolo ha spinto le industrie
produttrici di microprocessori a
integrare in un unico chip più
Pipeline del Pentium 4 a 20 stadi
microprocessori. Questo strategia
consente al computer di avere due
CPU separate dal punto di vista logico ma fisicamente risiedenti nello stesso chip. Questa strategia progettuale
attenua i problemi di coerenza e di predizione dei salti. Infatti ogni CPU logica esegue un programma separato e
quindi tra i diversi programmi non si possono avere problemi di coerenza tra le istruzioni. Questa scelta progettuale
aumenta le prestazioni solo nel caso in cui il sistema operativo sia in grado di utilizzare più programmi
contemporaneamente e i programmi siano scritti per poter utilizzare le CPU disponibili, quindi se i programmi sono
parallelizzabili.

Voci correlate
• Dual-core
• Cell
• VLIW
• Microprocessore superscalare

Altri progetti
• Wikimedia Commons contiene file multimediali su Pipeline dati

Collegamenti esterni
• Articolo sulle pipeline [1]

Note
[1] http:/ / www. appuntidigitali. it/ 3956/ pipeline-la-catena-di-montaggio-informatica/
Flip-flop 24

Flip-flop
I flip-flop (o bistabili) sono circuiti elettronici molto semplici, utilizzati nell'elettronica digitale come dispositivi di
memoria elementare. Il nome Flip-Flop deriva dal rumore che facevano i primi circuiti di questo tipo, costruiti con
relè che permettevano il cambiamento di stato.
Possono essere utilizzati anche come Circuito anti-rimbalzo per i contatti di un pulsante, un interruttore o un relè,
indispensabili per esempio nelle funzioni di START e STOP nei cronometri digitali; infatti la chiusura dei contatti
elettrici può non avvenire in modo definitivo, ma dopo una serie di rimbalzi, i quali generano altrettanti impulsi che,
interpretati erroneamente dal circuito logico, porterebbero ad errori di funzionamento. L'uso di un flip flop, di solito
SR, il quale commuta la sua uscita al primo impulso e ignora i successivi, risolve il problema. Le tabelle di verità
possono essere ricavate dalle equazioni caratteristiche.
Esistono diversi tipi: S-R, J-K, T, D-latch, D-Edge-Triggered.

Flip-flop SR
È il flip-flop più semplice dal punto di vista circuitale e fu anche il primo ad essere
realizzato. Ha due ingressi s (Set) e r (Reset, detto anche Clear) e due uscite q e q_. È
una rete sequenziale asincrona (senza clock) che si evolve in accordo alle seguenti
specifiche: quando lo stato d'ingresso è s=1 e r=0 il flip-flop si setta, cioè porta a 1 il
valore della variabile d'uscita q e a 0 la variabile d'uscita q_; quando lo stato d'ingresso è
Simbolo circuitale del
s=0 e r=1 il flip-flop si resetta cioè porta a 0 il valore della variabile d'uscita q e a 1 la flip-flop SR
variabile d'uscita q_; quando lo stato d'ingresso è s=0 e r=0 il flip-flop conserva, cioè
mantiene inalterato il valore di entrambe le variabili d'uscita.

Quando entrambi i valori R e S sono bassi, il flip-flop si trova nello stato neutro e mantiene il valore delle uscite, in
questo caso si dice che "fa memoria" (mantiene cioè in uscita il dato precedente memorizzato). Quando invece
entrambi gli ingressi hanno valore 1, si ha una condizione logicamente non definita. Elettronicamente, con gli
ingressi S e R contemporaneamente a 1, il circuito del flip-flop SR si trasforma in un oscillatore astabile la cui
frequenza dipende dal ritardo di trasmissione delle porte logiche componenti; le uscite del flip-flop SR emettono
allora due onde quadre di pari frequenza e sfasate di 180°. Questa "perdita di senso logico" che è possibile nei
flip-flop SR è il motivo principale per cui, di norma, si impiegano flip-flop JK o D nei circuiti digitali.
Tabella di verità (Q+ e Qn+ (uscita negata) indicano gli stati futuri della memoria all'istante t+1 in base agli ingressi
all'istante t):

R Q+ Descrizione
S Qn+

0 0 Q Qn memoria

0 1 0 1 reset

1 0 1 0 set

1 1 ? ? uscite non
definite
Flip-flop 25

Flip-flop T (toggle)
Ha un ingresso, due uscite complementari e un ingresso di sincronizzazione.
Ha funzioni di memoria e toggle, che consiste nella negazione del valore
precedentemente memorizzato.
Equazione caratteristica: Q+ = TnQ + TQn = T ⊕ Q
Proprietà: Se T=1 l'uscita Q ha frequenza dimezzata rispetto al clock.
Applicazioni: È il componente base dei contatori, infatti collegando a cascata
Simbolo circuitale per flip-flop di vari flip-flop T ad ogni uscita si ottiene un clock dimezzato rispetto al clock
tipo T, dove > è l'ingresso del precedente.
clock, T è l'ingresso toggle e Q è
Tabella di verità:
l'uscita del dato memorizzato.

Altro simbolo circuitale del flip-flop T


con uscita Q ed uscita complementata

T Q+ Descrizione

0 Q memoria (nessun
cambiamento)

1 Qn complemento

Flip-flop D (delay)
Ha un ingresso per il dato, un ingresso di sincronizzazione (clock) e un'uscita. In
corrispondenza del comando di clock, trasferisce l'ingresso in uscita e ve lo
mantiene fin quando non cambia il suddetto ingresso.
Equazione caratteristica: Q+ = D
Applicazioni: per le sue caratteristiche è il componente base delle memorie
(veloci) e registri (normali, a scorrimento, ad anello).
Tabella di verità: Simbolo circuitale per flip-flop di
tipo D, dove > è l'ingresso del
clock, D è l'ingresso del dato e Q è
l'uscita del dato memorizzato.
Flip-flop 26

Q+ Descrizione
D

0 0 reset

1 1 set

Circuiti integrati flip-flop


Sono disponibili circuiti integrati che contengono flip-flop singoli o multipli. Ad esempio il flip-flop di tipo D è
disponibile come integrato con otto unità logiche ma con l’ingresso di clock in comune.[1]

Bibliografia
• Sistemi digitali, G. Licata, pagg. 512, Thecna, ISBN 88-395-1377-9, ISBN 978-88-395-1377-9

Altri progetti
• Wikimedia Commons contiene file multimediali su Flip-flop
• Wikizionario contiene la voce di dizionario «Flip-flop»

Note
[1] (EN) Circuito integrato 74HC374 costituito da otto flip-flop di tipo D con ingresso di clock in comune ed in più un controllo (prioritario) di
abilitazione/disabilitazione delle uscite (http:/ / www. onsemi. com/ pub/ Collateral/ 74HC374. REV0. PDF) (PDF). ON Semiconductor Corp
(http:/ / www. onsemi. com/ ). URL consultato il 4-6-2010.

Multivibratore
I multivibratori sono una categoria di circuiti elettronici con in comune la caratteristica di potersi trovare in uno di
due stati possibili.

Categorie
I multivibratori si suddividono in tre categorie:

Astabili
Nessuno dei due stati è stabile ed il circuito passa
continuamente da uno stato all'altro. Il circuito si
comporta pertanto come un particolare oscillatore a
rilassamento, in grado di produrre onde quadre....
Si supponga che nel circuito in figura inizialmente il
transistor T1 conduca. La tensione sul collettore è
praticamente zero e si ha la carica di C1 attraverso R2.
Quando il potenziale nel punto tra C1, R2 e la base di T2
raggiunge 0,6V, T2 entra in conduzione, portando il
potenziale sul suo collettore a zero. C2 inizia a caricarsi Schema di multivibratore astabile
Multivibratore 27

provocando l'interdizione di T1 e C1 si scarica via R1-R2. Nel nuovo stato C2 si carica attraverso R3 fino a che la
tensione raggiunge 0,6V, al che T1 ritorna a condurre, caricando C1 e provocando l'interdizione di T2. C2 si scarica
via R3-R4. Il ciclo si ripete indefinitamente, con un periodo determinato dai valori dei resistori e dei condensatori. Se
i valori di R2/C1 e R3/C2 differiscono, i tempi di accensione/spegnimento dei due transistor non sono simmetrici ed
è così possibile variare il duty cycle del segnale.
Valori componenti (esempio):
R2=R3=22 KOhm
R1=R4=470 Ohm
C1=C2=47nF

Bistabili
In questi circuiti il livello cambia solo quando il sistema è sollecitato dall'esterno e mantiene tale livello per tempo
indefinito. Si realizza così un semplice dispositivo di memoria, chiamato flip-flop, in grado di immagazzinare un bit.
I multivibratori bistabili sono usati in particolare nei registri di accumulazione dei microprocessori e in alcuni tipi di
memorie per computer.

Monostabili
Il circuito ha uno stato stabile (A), se viene sollecitato a passare all'altro stato (B) allora lo mantiene per un ben
determinato periodo di tempo τ, dopodiché ritorna automaticamente allo stato stabile. Per cui è sufficiente una sola
sollecitazione esterna per realizzare un ciclo del tipo: Stato A - Stato B per un tempo τ - Stato A. Lo stato A invece
può essere mantenuto per un tempo indefinito. La particolarità di questo circuito sta nel fatto che è in grado di
produrre un impulso di durata prefissata τ.
Il circuito può essere usato come formatore di impulsi o come temporizzatore.
Per esempio nell'elettrocardiogramma si ha la produzione di un suono: il tipico "beep". La frequenza di questo
(numero di beep al secondo) indica la frequenza cardiaca, ma la durata del singolo beep è costante. Infatti la durata
del beep è regolata con un circuito monostabile.

Circuiti integrati
Nella forma più semplice il circuito multivibratore consiste di due transistor
interconnessi. Utilizzando reti di resistori e condensatori è possibile definire il periodo di
tempo degli stati instabili.
A volte per fare un circuito multivibratore si utilizzano porte logiche soprattutto in
tecnologia CMOS per il loro basso consumo e la loro alta impedenza di ingresso,
quest'ultima caratteristica permette di utilizzare resistori di valore elevato ottenendo
grandi costanti di tempo senza dover ricorrere a condensatori con valori di capacità
troppo grande.
Pinout di un integrato
Spesso i multivibratori sono incorporati in circuiti integrati. In particolare in elettronica è NE555
molto utilizzato un circuito integrato multivibratore per uso generale: il 555. Oltre al
circuito base include funzioni accessorie per ottenere una precisione superiore ad un semplice circuito a transistor.
Con l'aggiunta di pochissimi componenti esterni, tra cui la rete RC, il dispositivo può essere configurato come
multivibratore astabile, bistabile o monostabile.
Algebra di Boole 28

Algebra di Boole
In matematica, informatica ed elettronica, l'algebra di Boole, anche detta algebra booleana o reticolo booleano, è
un ramo dell'algebra astratta che comprende tutte le algebre che operano con i soli valori di verità 0 o 1, detti
variabili booleane o logiche. La struttura algebrica studiata dall'algebra booleana è finalizzata all'elaborazione di
espressioni nel'ambito del calcolo proposizionale.
Essendo un reticolo dotato di particolari proprietà, l'algebra booleana risulta criptomorfa, cioè associata
biunivocamente e in modo da risultare logicamente equivalente, ad un insieme parzialmente ordinato reticolato. Ogni
algebra booleana risulta criptomorfa ad un particolare tipo di anello, chiamato anello booleano.
Tale algebra permette di definire gli operatori logici AND, OR e NOT, la cui combinazione permette di sviluppare
qualsiasi funzione logica e consente di trattare in termini esclusivamente algebrici le operazioni insiemistiche
dell'intersezione, dell'unione e della complementazione, oltre a questioni riguardanti singoli bit 0 e 1, sequenze
binarie, matrici binarie e diverse altre funzioni binarie.
L'algebra di Boole, sviluppata nel 1854 da George Boole, un matematico inglese dell'University College di Cork,
assume un ruolo importante in vari ambiti, in particolare nella logica matematica e nell'elettronica digitale, dove
nella progettazione dei circuiti elettronici riveste grande importanza il teorema di Shannon, introdotto da Claude
Shannon intorno al 1940 e utilizzato per suddivire una funzione booleana complessa in funzioni più semplici, o per
ottenere un'espressione canonica da una tabella della verità o da un'espressione non canonica.

Definizione
L'algebra di Boole tratta l'algebra universale dell'algebra a due stati e dei modelli di tale teoria, detti algebre
booleane. L'algebra universale è la famiglia di operazioni su un insieme, detto insieme fondamentale della famiglia
algebrica, che nel caso della struttura algebrica booleana contiene i soli valori 0 e 1.
Il numero degli argomenti che richiede una funzione sull'insieme fondamentale è detto arietà: un'operazione su {0,1}
di arietà n può essere applicata ad ognuno dei 2n possibili valori dei suoi n argomenti. Per ogni scelta di argomenti
l'operazione può produrre i soli risultati 0 e 1, donde ci sono 22n operazioni di n argomenti.
L'algebra a due stati possiede due operazioni con nessun argomento, i valori 0 e 1, e quattro operazioni con un solo
argomento: due operazioni costanti, l'identità e la negazione, ques'tultima da come risultato 0 se l'argomento è 1 e
viceversa. Vi sono poi sedici operazioni binarie: due costanti, due che danno come risultato rispettivamente solo il
primo argomento e solo il secondo, la congiunzione, che produce 1 se entrambi gli argomenti sono 1 e dà 0
altrimenti; la disgiunzione, che produce 0 se entrambi gli argomenti sono 0 e dà 1 altrimenti; e così via. Il numero di
operazioni con n+1 argomenti è il quadrato del numero delle operazioni con n argomenti, sicché vi sono 162 = 256
operazioni ternarie, 2562 = 65,536 operazioni quaterniarie e così via.
Una famiglia, detta anche indice, è indicizzata da un insieme di indici, che nel caso di una famiglia di operazioni
costituenti un'algebra sono detti simboli dell'operazione e costituiscono il linguaggio dell'algebra in oggetto.
L'operazione indicizzata da un dato simbolo è detta interpretazione di tale simbolo, ed ogni simbolo definisce il
numero univoco di argomenti delle rispettive interpretazioni possibili. Nel caso considerato vi è una corrispondenza
biunivoca tra simbolo e interpretazione. L'algebra di Boole ha 22n simboli, e dunque lo stesso numero di
operazioni, detti simboli di operazione booleana; anche se poche operazioni hanno simboli convenzionali, quali ¬
per la negazione, ∧ per la congiunzione e ∨ per la disugiunzione. In generale si indica con nfi l'i-esimo simbolo di n
argomenti.
Algebra di Boole 29

Basi
Una base è un insieme di operazioni la cui composizione permette di ottenere tutte le operazioni appartenenti
all'algebra. Le tre principali basi usate nell'algebra booleana sono:
• Il reticolo, una base logica introdotta nel diciannovesimo secolo da George Boole, Charles Sanders Peirce e altri
matematici che cercavano una formalizzazione algebrica dei processi logici.
• L'anello booleano, una base aritmetica introdotta nel ventesimo secolo da Ivan Ivanovich Zhegalkin e Marshall
Stone che proviene dall'algebra astratta.
• La base Sheffer stroke, anche detta NAND, originata dal fatto che tramite l'operazione di NAND è possibile
ottenere tutte le operazioni sull'insieme {0,1}. Tale base è utilizzata in particolare nella configurazione dei circuiti
logici in elettronica digitale.
Gli elementi comuni a reticolo e anello sono le costanti 0 e 1 ed un'operazione binaria associativa e commutativa,
che nella base del reticolo è detta incontro, dal termine inglese meet, e denotata tra due elementi x e y dal simbolo
x∧y, mentre nella base dell'anello è detta moltiplicazione e denotata xy. La base del reticolo ha inoltre le operazioni
algebriche di unione x∨y e complemento ¬x, mentre la base dell'anello ha l'ulteriore operazione aritmetica di
addizione x⊕y o x+y.

Reticolo
Nella base del reticolo ad un'algebra booleana (A, , ) si associa un insieme parzialmente ordinato (A, ),
definendo:

che è anche equivalente a

È possibile anche associare un'algebra booleana ad un reticolo distributivo (A, ), considerato come insieme
parzialmente ordinato, dotato di elemento minimo 0 e di elemento massimo 1, in cui ogni elemento x ha un
complementare tale che

Qui e sono usati per denotare l'inf ed il sup di due elementi. Se i complementi esistono, allora sono unici.

Anello
La base dell'anello della generica algebra booleana (A, , ) è definita come (A, +, *), definendo a + b := (a
b) (b a ). In tale anello l'elemento neutro per la somma coincide con lo 0 dell'algebra booleana, mentre
l'elemento neutro della moltiplicazione è l'elemento 1 dell'algebra booleana. Questo anello ha la proprietà che a * a =
a per ogni a in A; gli anelli con questa proprietà sono chiamati anelli booleani.
Viceversa, assegnato un anello booleano A, possiamo trasformarlo in un'algebra booleana definendo x y=x+y−
x yex y = x y. Poiché queste due operazioni sono l'una l'inversa dell'altra, possiamo affermare che ogni
anello booleano è criptomorfo di un'algebra booleana e viceversa. Inoltre, una funzione f : A B è un
omomorfismo tra algebre booleane se e soltanto se è un omomorfismo tra anelli booleani. La categoria degli anelli
booleani e delle algebre booleane sono equivalenti.
Un anello ideale dell'algebra booleana A è un sottoinsieme I tale che per ogni x, y in I si ha x y in I e per ogni a in
Aa x in I. Questa nozione di ideale coincide con la nozione di anello ideale negli anelli booleani. Un ideale I di A
è detto primo se I A e se a b in I implica sempre a in I o b in I. Un ideale I di A è detto massimale se I Ae
se l'unico ideale proprio contenente I è A stesso. Questa notazione coincide con la notazione teorica del ideale primo
Algebra di Boole 30

e ideale massimale nell'anello booleano A.


Il duale di un ideale è un filtro. Un filtro dell'algebra booleana A è un sottoinsieme F tale che per ogni x, y in F si ha
x y in F e per ogni a in A se a x = a allora a è in F.
L'operazione di complementazione * applicata ai sottoinsiemi manda dunque gli ideali in filtri e viceversa: se B è
un'algebra booleana e un suo ideale (proprio), allora è il filtro (proprio) duale di I. Se
invece è un filtro (proprio), l'ideale (proprio) duale di F.

Sheffer stroke
La base Sheffer stroke o NAND si basa sulle operazioni NOT e AND, tramite le quali è possibile ottenere tutte le
operazioni booleane. Un'algebra booleana può essere definita sia da NOT e AND che da NOT e OR, essendo
possibile definire OR attraverso NOT e AND così come AND attraverso NOT e OR:

La collezione di tutti i sottoinsiemi di un dato insieme, ovvero l'insieme delle parti o insieme ambiente, munita delle
operazioni di unione, intersezione e complementazione di insiemi, che giocano rispettivamente il ruolo di OR, AND
e NOT, costituisce un'algebra booleana.
Più formalmente, se B è un insieme formato da almeno 2 elementi, l'algebra booleana avente B come supporto è la
struttura algebrica costituita da B, da due operazioni binarie su B, OR e AND, da un'operazione unaria NOT su B e
dall'elemento 0 di B, i quali godono delle seguenti proprietà:
• Simmetria di AND:
• Simmetria di OR:
• Involuzione di NOT:
• Leggi di De Morgan:
L'insieme B è inoltre limitato inferiormente, essendo:

L'elemento 1 è definito come la negazione, o il complementare, dello 0: 1 := NOT(0). L'insieme B è dunque limitato
superiormente, essendo:

ed in particolare
0 AND 1 = 0 ; 0 OR 1 = 1
Si definisce inoltre, come operazione derivata dalle precedenti, l'operatore binario OR esclusivo, denotato XOR:
In questa algebra all'operatore XOR corrisponde la differenza simmetrica:

In elettronica la porta logica NAND è costituita da n ingressi e un'uscita che si porta a livello 0 solo se gli n ingressi
si portano a livello 1. È corrispondente alla connessione in serie di una porta AND e di una NOT.
Algebra di Boole 31

Operatori booleani
Gli operatori dell'algebra booleana possono essere rappresentati in vari modi. Spesso sono scritti semplicemente
come AND, OR e NOT. Nella descrizione dei circuiti, possono anche essere usati NAND (NOT AND), NOR (NOT
OR) e XOR (OR esclusivo). In matematica spesso si usa + per OR e per AND, mentre si rappresenta il NOT con
una barra segnata sopra l'espressione che viene negata.
Esistono diverse altre simbologie per rappresentare gli operatori, scelte in base al campo in cui si lavora: i
matematici usano spesso il simbolo + per l'OR, e × per l'AND, in quanto per alcuni versi questi operatori lavorano in
modo analogo alla somma e alla moltiplicazione. La negazione NOT viene rappresentata spesso da una linea
disegnata sopra l'argomento della negazione, cioè dell'espressione che deve essere negata.
Nella progettazione di circuiti elettronici, vengono utilizzati anche gli operatori brevi NAND (AND negato), NOR
(OR negato) e XNOR (XOR negato): questi operatori, come XOR, sono delle combinazioni dei tre operatori base e
vengono usati solo per rendere la notazione più semplice.
Operatori:
• NOT - simboli alternativi: x, ~, ¬, !
• AND - simboli alternativi: AND: *, AND, ^, BUT (usato nella logica booleana insieme al NOT)
• OR - simboli alternativi: OR: +, OR, v
• XOR - simboli alternativi: XOR: +, ⊕, ∨, ^, EOR, orr
• NAND - simboli alternativi: NAND, ↑
• NOR - simboli alternativi: NOR, ↓
• XNOR
Valori:
• vero - simboli alternativi: true, 1, ON, SI (YES)
• falso - simboli alternativi: false, 0, OFF, NO
In elettronica digitale viene definito vero un bit 1, sia in Input che in Output, che di solito assume il valore di 5 V,
mentre viene definito falso un bit 0, sia in Input che in Output, che assume il valore di 0 V.
Di seguito sono indicati gli operatori più comuni e le rispettive porte logiche:

NOT
L'operatore NOT restituisce il valore inverso di quello in entrata. Una concatenazione di NOT è semplificabile con
un solo NOT in caso di dispari ripetizioni o con nessuno nel caso di pari.

A NOT A

1 0
0 1

Spesso, al fine di semplificare espressioni complesse, si usano operatori brevi che uniscono l'operazione di NOT ad
altre: questi operatori sono NOR (OR + NOT), NAND (AND + NOT), XNOR (XOR + NOT). La negazione, in
questi casi, viene applicata dopo il risultato dell'operatore principale (OR, AND, XOR).
Il simbolo di una porta NOT è
Algebra di Boole 32

OR
L'operazione logica OR restituisce 1 se almeno uno degli elementi è 1, mentre restituisce 0 in tutti gli altri casi. Tale
operazione è anche detta somma logica.

A B A OR B

0 0 0
0 1 1
1 0 1
1 1 1

Nella teoria degli insiemi corrisponde all'unione.


Il simbolo di una porta OR è:
Algebra di Boole 33

AND
L'operazione AND dà come valore 1 se tutti gli operandi hanno valore 1, mentre restituisce 0 in tutti gli altri casi.
Tale operazione è anche detta prodotto logico.

A B A AND B

0 0 0
0 1 0
1 0 0
1 1 1

È possibile realizzare un'operazione logica AND con un numero di proposizioni arbitrarie concatenando varie AND
a due ingressi, per esempio:
p1 AND (p2 AND (p3 AND p4))
Nei circuiti digitali, la porta logica AND è un meccanismo comune per avere un segnale di vero se un certo numero
di altri segnali sono tutti veri.
Nella teoria degli insiemi corrisponde all'intersezione.
Il simbolo di una porta AND è:

XOR
L'operatore XOR, detto anche EX-OR, OR esclusivo o somma modulo 2, restituisce 1 se e solo se uno solo dei due
operandi è 1, mentre restituisce 0 in tutti gli altri casi.
Algebra di Boole 34

A B A XOR B

0 0 0
0 1 1
1 0 1
1 1 0

Nella teoria degli insiemi corrisponde alla differenza simmetrica. Per passare nella forma canonica SP (somma di
prodotti) basta applicare la regola:
A⊕B
dove ⊕ è il simbolo di XOR.
Il simbolo di una porta XOR è:

NOR
L'operatore NOR, la negazione del risultato dell'operazione OR, restituisce 1 se e solo se tutti gli elementi sono 0,
mentre restituisce 0 in tutti gli altri casi.

A B A NOR B

0 0 1
0 1 0
1 0 0
1 1 0

Il simbolo di una porta NOR è:


Algebra di Boole 35

composta da un NOT in serie ad un OR.

NAND
L'operatore NAND, la negazione del risultato dell'operazione AND, restituisce 0 se e solo se tutti gli elementi sono
1, mentre restituisce 1 in tutti gli altri casi.

A B A NAND B

0 0 1
0 1 1
1 0 1
1 1 0

Il simbolo di una porta NAND è:

composta da un NOT in serie ad un AND.


Algebra di Boole 36

XNOR
L'operatore XNOR, detto anche EX-NOR, è la negazione del risultato dell'operazione XOR; nella sua versione a due
elementi restituisce 1 se tutti gli elementi sono uguali a 1 oppure se tutti gli elementi sono uguali a 0.

A B A XNOR B

0 0 1
0 1 0
1 0 0
1 1 1

Il simbolo di una porta XNOR è:

composta da un NOT in serie ad un XOR.

Esempi
Questa algebra ha applicazioni nella logica, dove 0 è interpretato come "falso", 1 come vero, è OR, è AND e
è "NOT". Le espressioni che coinvolgono le variabili e le operazioni booleane rappresentano forme dichiarative;
due espressioni possono essere equivalenti utilizzando i suddetti assiomi se e soltanto se le forme dichiarative
corrispondenti sono logicamente equivalenti. L'algebra booleana binaria, inoltre, è usata per il disegno di circuiti
nell'ingegneria elettronica; qui 0 e 1 rappresentano le due condizioni differenti di un bit in un circuito digitale, in
genere bassa e alta tensione . I circuiti sono descritti da espressioni che contengono delle variabili e due espressioni
sono uguali per tutti i valori delle variabili se e soltanto se i circuiti corrispondenti hanno la stessa funzione di
trasferimento. Ogni combinazione dei segnali in ingresso in uscita dal componente può essere rappresentata da
un'adeguata espressione booleana
L'algebra booleana a due stati è inoltre importante nella teoria generale delle algebre booleane, perché un'equazione
che coinvolge parecchie variabili è generalmente vera in ogni algebra booleana se e soltanto se è vera nell'algebra
booleana a due stati. Ciò può, per esempio, essere usato per indicare che le seguenti leggi ( teoremi di consenso )
sono generalmente valide in ogni algebra booleana:
Algebra di Boole 37

• Il raggruppamento di un generico insieme S, forma un'algebra booleana con le due operazioni = unione e =
intersezione. Il più piccolo elemento 0 è l' insieme vuoto ed il più grande elemento 1 è l' insieme S stesso.
• L'insieme di tutti i sottoinsiemi di un insieme S che sono limitati è un'algebra booleana.
• Per ogni numero naturale n, l'insieme di tutti i divisori positivi di n forma un reticolo distributivo se scriviamo
per a divide b. Questo reticolo è un'algebra booleana se e soltanto se per ogni n non vi sono divisori
quadrati. Il più piccolo elemento,che in generale indichiamo con lo 0, in questa algebra booleana è il numero
naturale 1; mentre l'elemento che usualmente indichiamo con l'1 in questi insiemi è l'elemento "n".
• Altri esempi di algebre booleane sono dati dagli spazi topologici: se X è uno spazio topologico, allora l'insieme di
tutti i sottoinsiemi di X che siano aperti o chiusi formano un'algebra booleana con le operazioni = unione e
= intersezione.
• Se R è un anello arbitrario dove è definito un insieme idempotente tipo:
A = { a in R : a2 = a e a x = x a per ogni x in R }
L'insieme A diventa un'algebra booleana con le operazioni a b = a + b − a b ed a b = a b.

Omomorfismi ed isomorfismi
Un omomorfismo tra due algebre booleane A e B è una funzione f: A B tale che per ogni a, b in A:
1. f( a b ) = f( a ) f( b )
2. f( a b ) = f( a ) f( b )
3. f(0) = 0
4. f(1) = 1
Da queste proprietà segue anche f( a) = f(a) per ogni a in A . Ogni algebra booleana, con la definizione di
omomorfismo, forma una categoria. Un isomorfismo da A su B è un omomorfismo da A su B che è biiettivo.
L'inverso di un isomorfismo è ancora un isomorfismo, e le due algebre booleane A e B si dicono isomorfe. Dal punto
di vista della teoria dell'algebra booleana , due algebre booleane isomorfe non sono distinguibili, ma differiscono
soltanto nella notazione dei loro elementi.

Espressioni booleane
All'interno di ciascuna algebra di Boole, dato un insieme di variabili e le operazioni correlate, è possibile definire
delle espressioni che vengono ad assumere un determinato valore ottenibile anche sotto forme diverse. Possono
esistere cioè delle espressioni che, pur essendo differenti, si rivelino equivalenti. Oltre al fatto che le espressioni
booleane assumono una particolare importanza per quanto riguarda il calcolo proposizionale, in cui le variabili sono
proposizioni legate tramite congiunzioni, disgiunzioni, negazioni ed altre operazioni più complesse, possono esistere
moltissime altre espressioni, accomunate sempre dalle proprietà e deagli assiomi booleani, nelle quali si sostituisce
spesso l'operazione + (comunemente detta somma) con ∨ e * (comunemente detta prodotto) con ∧ e in cui la
complementazione è indicata col simbolo ' .
Per poter presentare nel modo più efficiente una espressione booleana, la si riduce in somma di prodotti
fondamentali o forma normale disgiuntiva. Un prodotto fondamentale è un prodotto in cui ciascuna variabile, o il suo
complemento, appaia una sola volta e rigorosamente fuori da parentesi o complementazioni complesse.
Ad esempio, date le variabili x, y, z all'interno di un'algebra di Boole, sono prodotti fondamentali
• P(x,y,z) = xy
• P(x,y,z) = x'yz'
Mentre non sono prodotti fondamentali
• yyz
• yy'z
Algebra di Boole 38

• (xy)'
È così possibile avere una somma di prodotti fondamentali, forma in cui ogni espressione può essere ridotta, ma che
non è unica. Un esempio è: xy + xz + z'. Nel momento in cui ogni singola variabile, o il suo complemento, siano
contenuti in tutti i prodotti fondamentali della forma normale disgiuntiva, si ha allora una somma di prodotti
fondamentali completa o forma normale disgiuntiva completa. Tale scrittura è unica, pertanto se due espressioni
sono equivalenti avranno la stessa forma normale disgiuntiva completa.
Se si desidera invece che un'espressione sia scritta nel modo più corto possibile, allora la si esprime in somma di
implicanti prime o minimali (Minimizzazione di Quine-McQluskey). Un'implicante prima (o minimale) rispetto a
un'espressione è un prodotto fondamentale che non altera l'espressione se sommato per intero ad essa, cioè restituisce
un risultato equivalente a quella iniziale; sommando un prodotto strettamente contenuto nell'implicante, tuttavia, non
si ottiene un'equivalenza.
Per individuare tutte le implicanti prime, esistono varie tecniche, tra cui il metodo del consenso, che si basa
sull'applicazione ciclica delle proprietà di assorbimento, idempotenza, involuttività e di De Morgan accompagnate ad
ogni passo dall'opportuna addizione di un consenso. Dati due prodotti fondamentali, se solo e solo se una variabile
appare in uno di essi non negata e nell'altro negata chiamiamo consenso il risultato della moltiplicazione delle
restanti variabili. Ad esempio:
• dati P = xyz , Q = x'z il consenso sarà C = yzz = yz
• dati P = xy' Q= xy il consenso sarà C = xx = x
• dati P = xyz e Q = x'yz' non esiste consenso, in quanto due diverse variabili appaiono una volta negate e una volta
no.
La somma di implicanti prime è unica, pertanto due espressioni equivalenti avranno la stessa. Nel momento in cui,
completando ogni singola implicante prima, l'apporto all'espressione di una o più di esse è inutile in quanto
contenuta nelle altre, la si può eliminare ottenendo la più essenziale delle scritture, la forma minimale. Essa, pur
essendo comoda, ha l'inconveniente di non essere unica, e dunque di non consentire l'individuazione di equivalenze
tra più espressioni.

Rappresentazione delle algebre booleane


Si può dimostrare che ogni reticolo booleano finito è isomorfo al reticolo booleano di tutti i sottoinsiemi di un
insieme finito. Di conseguenza, il numero di elementi di ogni reticolo booleano finito ha un sostegno che contiene un
numero di elementi uguale ad una potenza di 2.
Marshall Stone ha enunciato il celebre teorema di rappresentazione per le algebre booleane dimostrando che ogni
algebra booleana "A" è isomorfa a tutte le algebre booleane aperte-chiuse in un certo spazio topologico, detto
compatto non connesso di Hausdorff

Voci correlate
• 06-XX, sezione primaria dello schema di classificazione MSC 2000
• Algebra di insiemi
• Diagramma di Venn
• Forma canonica
• Funzione booleana
• Mappa di Karnaugh
• Porta logica
• Sistema formale
• Sistema numerico binario
• Tabella della verità
Algebra di Boole 39

• Teorema dell'assorbimento
• Teorema di Shannon (elettronica)
• Teoremi di De Morgan
• Progetto:Matematica/Elenco di voci sull'algebra booleana

Altri progetti
• Wikimedia Commons contiene file multimediali su Algebra di Boole

Collegamenti esterni
• (IT) Panoramica ed esempi sulle Operazioni Booleane [1]

Note
[1] http:/ / portalesapere. altervista. org/ viewtopic. php?topic=Algebra-di-Boole

Multiplexer
Il termine multiplexer, o multiplatore, viene usato sia in elettronica che in telecomunicazioni con significati
diversi.

Elettronica
In elettronica, il termine può riferirsi ad una tipologia di circuiti
integrati, oppure ad una particolare apparecchiatura completa. Nel
primo caso un multiplexer o mux o selettore è un dispositivo capace
di selezionare un singolo segnale elettrico fra diversi segnali in
ingresso in base al valore degli ingressi di selezione. Esistono
multiplexer sia per segnali digitali che per segnali analogici (amux).

Per esempio, un multiplexer a 2 ingressi è una semplice porta logica la


cui uscita Y assume il valore di uno dei due ingressi A o B in base al
valore del terzo ingresso di selezione S. L'equazione booleana è:
• Y = (A and S) or (B and not S) Simbolo circuitale (IEC) del Multiplexer
Che può essere espressa dalla seguente tabella di verità:

------+--
0 0 0 | 0 (Y collegato a B)
0 0 1 | 0 (Y collegato a A)
0 1 0 | 1 (Y collegato a B)
0 1 1 | 0 (Y collegato a A)
1 0 0 | 0 (Y collegato a B)
1 0 1 | 1 (Y collegato a A)
1 1 0 | 1 (Y collegato a B)
1 1 1 | 1 (Y collegato a A)

oppure come mappa di Karnaugh:


Multiplexer 40

01

---+-----
AB 00 | 0 0
01 | 1 0
11 | 1 1
10 | 0 1

Sono di uso comune multiplexer con molte porte. Per esempio, un multiplexer a otto ingressi può smistare otto
diversi segnali, tramite tre segnali logici di selezione. I segnali di ingresso sono numerati da X0 a X7, e gli ingressi di
selezione sono numerati S2, S1 e S0. Se S2 e S0 sono a '1' e S1 è a '0', per esempio, l'uscita sarà uguale a X5. In genere
i multiplexer possono essere implementati con le porte logiche elementari, quali AND, OR, NAND ecc.
Di solito gli ingressi di selezione sono n, mentre le variabili in entrata sono o meno.

Dispositivi commerciali
TTL 74150 mux a 16 ingressi
TTL 74151 mux a 8 ingressi
TTL 74153 due mux a 4 ingressi
CMOS 4019B quattro mux a 2 ingressi
CMOS 4051B mux a 8 canali analogici
In riferimento alle apparecchiature commerciali progettate per questa funzione, può essere preso come esempio il
modello 3488A del costruttore HP definito SWITCH/CONTROL UNIT, un apparecchio piuttosto diffuso negli anni
80-90, programmabile in linguaggio BASIC, dotato di un pannello provvisto di una serie di tasti di selezione e un
display alfanumerico LCD che ne visualizza lo stato operativo. L'unità è provvista di 5 slot in cui inserire schede
opzionali in base alle proprie necessità, sono disponibili: un multiplexer a 10 canali, uno scanner per segnali a
frequenza VHF, una scheda generica a relè, una scheda a matrice, un scheda I/O digitale, e una scheda vergine, utile
nel caso di circuiti progettati in proprio, l'interfaccia di comunicazione è naturalmente la IEEE 488.

Demultiplexer
Il dispositivo complementare, il demultiplexer, ha un solo ingresso e diverse
uscite. Un demultiplexer è un circuito logico la cui principale funzione è
inversa a quella del Multiplexer. Esso è quindi una rete combinatoria con k
ingressi (di selezione) e uscite, ciascuna delle quali è attiva soltanto
in corrispondenza di uno dei valori di ingresso.I piedini in basso (che si
vedono anche in figura) sono detti di indirizzamento ( o ingresso di
selezione). In base al valore degli ingressi di selezione, l'ingresso viene
collegato a una delle uscite. Per esempio, un demux a otto uscite ha un
segnale di ingresso (X), tre ingressi di selezione (S2, S1 e S0), e otto uscite (da
A0 a A7). Se per esempio S2 e S0 sono a '1' e S1 è a '0', l'uscita A5 sarà uguale
ad X e tutte le altre uscite saranno messe a 0. Il demultiplexer ha la funzione
esattamente inversa al multiplexer: il multiplexer infatti riunisce più entrate in Schema elettrico di un demultiplexer ( o
demultiplex.
un'unica uscita mentre il demultiplexer smista un ingresso in più uscite.
Multiplexer 41

Telecomunicazioni
Nelle telecomunicazioni un multiplexer, anche detto multiplatore,
spesso abbreviato in mux o muldex, è un dispositivo che permette di
far condividere la capacità disponibile di un unico collegamento fra più
canali trasmissivi (multiplazione). Esso suddivide tra diversi circuiti la
banda disponibile di un generico mezzo trasmissivo (fibra ottica, Semplice multiplexer e demultiplexer telefonico a
divisione di tempo
doppino in rame, etc.). La sua azione infatti è svolta sul segnale e non
dipende dal particolare mezzo che esso attraversa.

In ricezione, il dispositivo complementare si chiama demultiplexer o demux e permette di separare i diversi canali
trasmissivi originali.
Il multiplexing può essere a divisione di tempo o a divisione di frequenza . Su un generico mezzo i due metodi sono
incompatibili e richiedono una scelta esclusiva, anche se in teoria possono essere combinati tra loro in modo
gerarchico (ad esempio, un segnale multiplato a divisione di tempo può essere inserito in un canale di un sistema a
divisione di frequenza, o viceversa).
Entrambe le tecniche sono abbinabili sia a un segnale analogico che a un segnale digitale. Tuttavia, storicamente
esiste un abbinamento preferenziale fra multiplexing a divisione di tempo e segnale digitale, e tra multiplexing a
divisione di frequenza e segnale analogico.
Un più moderno sistema di multiplexing è quello che si ottiene "mascherando" il segnale di ogni utente
sovrapponendogli un differente codice-chiave, rappresentato da una sequenza pseudo casuale algoritmo di Viterbi;
tale mascheratura sarà poi annullata in ricezione. Il vantaggio di questa tecnica di multiplexing, oltre alla criptatura
del messaggio, è che la soglia massima al numero di possibili utenti sulla stessa portante radio è teoricamente
illimitato (praticamente è limitato dalla soglia accettabile del degrado della qualità del segnale di tutti gli altri utenti
attivi, ma, nello stesso tempo ciò consente di accettare, in condizioni di emergenza, un numero di accessi superiore a
quello stabilito).

Tecniche di multiplexing
Le tecniche più utilizzate per ottenere il multiplexing di più canali sono la multiplazione a divisione di tempo (Time
Division Multiplexing TDM) e a divisione di frequenza (Frequency Division Multiplexing - FDM). Per trasmissioni
digitali invece si utilizza TDMA (Time Division Multiple Access), FDMA (Frequency Division Multiple Access) e
il CDMA (Code Division Multiple Access).
In una tipica applicazione telefonica digitale, con multiplexing a divisione di tempo sullo stesso mezzo vengono
trasmessi a intervalli regolari di tempo segnali di 30 canali diversi, più due canali di controllo. Tipicamente si tratta
di un MUX che trasmette 8 chiamate contemporaneamente sullo stesso doppino, elevando la banda da 64 kbit/sec. a
2 Mbit/s. Questo viene detto un "flusso primario".
Il segnale telefonico viene campionato alla frequenza di 8 KHz, quindi un singolo segnale telefonico è costituito da
un campione sonoro di 8 bit ogni 125 μs. Il segnale multiplato contiene 32 campioni da 8 bit ogni 125 μs.
Il gestore invece di posare 30 doppini dedicati, ne posa uno con caratteristiche elettriche migliori per tutti
risparmiando quasi 10 volte sui costi di cablaggio.
Nel multiplexing a divisione di frequenza si utilizzano 10 frequenze diverse in modo che la portante conduca delle
sottoportanti, ossia dove transita un segnale ne transitano 10 con frequenze abbastanza distanti da non interferire.
Questa tecnica è ormai in disuso nella telefonia, sostituita dalla multiplazione a divisione di tempo e dal segnale
digitale.
Una applicazione ancora popolare della multiplazione a divisione di frequenza è l'ADSL, dove su un doppino
vengono multiplati un segnale analogico (la conversazione telefonica tradizionale) e i due segnali digitali della
Multiplexer 42

connessione internet (l'upload e il download). Questa operazione è svolta dal modem ADSL in casa dell'utente e da
un apparato detto DSLAM installato nella centrale telefonica che, in upload, converte (modula) in segnali digitali i
segnali ADSL multiplati in analogico su doppino di più utenti e li multiplexa su un canale a gerarchia superiore
ovvero la fibra ottica e viceversa in download verso l'utente.

Multiplexer telefonico
In particolare viene detto multiplexer anche un dispositivo che veniva installato lungo le linee telefoniche per portare
fonia nelle zone a bassa densità abitativa o da poco in espansione, dove non conveniva (almeno inizialmente)
costruire una centrale telefonica. Oggi questo dispositivo risulta limitante per lo sviluppo dell'adsl. I multiplexer
vengono chiamati anche con l'abbreviazione Mux e sono di due tipi MD48 (più vecchi) e MPX1(più recenti) vi è
inoltre un terzo tipo MUX ASS [1] che a differenza dei primi due serve meno utenze variabili ma mediamente 30-60,
ed è collegato alla centrale tramite rame e non tramite fibra a differenza degli MD48 e MPX1. Attualmente i recenti
mux sono in grado di far erogare ADSL mentre per i modelli MD48 e MPX1 sono stati ideati i Minicab [2] detti in
gergo "zainetti" che permettono ad un massimo di 48 utenze servite da mux di usufruire di adsl e supportano la
tecnologia ADSL2+ anche se al momento quest'ultima non è funzionante poiché vi sono ancora problemi di
surriscaldamento. Questi zainetti sono stati installati in via sperimentale in alcune delle zone provviste di mux delle
grandi città. Si prevede che presto questi zainetti verranno installati in tutte le zone multiplate di tutti i comuni
italiani e le utenze servite saranno tutte quelle sotto MUX. Per quanto riguarda invece le zone dove sono installati
MUX ASS si prevede che verranno coperte utilizzando la stessa tecnologia usata per i concentratori (UCR) e le aeree
troppo distanti dalle centrali telefoniche, ovvero i minidslam da armadio, installabili nell'armadio accanto al MUX,
erogando un adsl di 0.640 Mb/s.

Voci correlate
• Multiplexing

Note
[1] http:/ / img142. imageshack. us/ img142/ 3849/ torrepar1. jpg
[2] http:/ / img373. imageshack. us/ img373/ 7590/ 02zh2. jpg
Full-adder 43

Full-adder
Il full-adder o sommatore completo è
un componente elettronico digitale
caratterizzato da tre ingressi e due
uscite. La sua funzionalità è quella di
eseguire una somma tra due numeri Schema circuitale di un full-adder
espressi in formato binario con
lunghezza di parola a un bit. È un
componente fondamentale
dell'elettronica digitale perché,
connesso opportunamente con altri
full-adder e porte logiche può dare
luogo alle unità di elaborazione ALU
(Arithmetic Logic Unit) dei processori.

In logica binaria esegue questa


semplice operazione:
A + B + Ri = S + Ro
dove A e B sono gli operandi, Ri il
riporto in ingresso della precedente Tabella di verità di un full-adder

somma e S e Ro sono la somma e il


riporto di uscita. Ogni variabile è un bit (0 oppure 1)
In ingresso sono inseriti i due bit da sommare e l'eventuale bit di riporto; in uscita vengono forniti la somma ed il
riporto. Ad esempio, se diamo in ingresso i valori 1 1 0 (1° numero, 2° numero, riporto), il componente restituirà il
valore 0 con riporto 1 (corrispondente al valore 10 in base binaria).

Full-adder a "n" bit


La struttura col riporto in ingresso esiste per poter eventualmente collegare un numero "n" full-adder in cascata per
poter ottenere Full-adder a "n" bit.

Voci correlate
• Tabella di verità
• Algebra di Boole
• Half-adder
Half-adder 44

Half-adder
L'half adder, detto anche semisommatore, è un componente elettronico digitale che esegue la somma di due bit A e
B e la presenta sull'uscita S; inoltre viene calcolato anche il riporto C, senza tener conto però di un riporto
precedente. La somma binaria di due bit si calcola allo stesso modo della somma di due numeri decimali, per cui il
riporto è generato se e solo se i due addendi sono pari a 1. L'insieme di due half-adder e una porta logica OR,
opportunamente collegati, restituisce un full-adder.
La seguente tabella della verità mostra la relazione tra gli ingressi e le uscite dell'unità.

Il circuito è costituito, di conseguenza, da una porta AND e una porta XOR.

Voci correlate
• Tabella di verità
• Algebra di Boole
• Full-adder
Fonti e autori delle voci 45

Fonti e autori delle voci


Architettura MIPS  Fonte:: http://it.wikipedia.org/w/index.php?oldid=34529423  Autori:: ClaudioPante, Grifone87, Hellis, Jacopo, Kronos, Loroli, Luxhacker, Maikol, Pryderi, Rollopack,
Spiderscai, VincenzoX, 24 Modifiche anonime

IA-32  Fonte:: http://it.wikipedia.org/w/index.php?oldid=34476558  Autori:: Alby128, Alessio, Alleborgo, Ary29, Avesan, Domenico De Felice, Eumolpo, F. Cosoleto, Frieda, Guidomac, Hellis,
Kormoran, Lukius, Marco C, Rosco, Stiffmaister, 21 Modifiche anonime

Registro (informatica)  Fonte:: http://it.wikipedia.org/w/index.php?oldid=34726931  Autori:: Avesan, Brownout, Camillo, Hellis, Kiado, Sesquipedale, Simondiali, Tiesse, Torredibabele,
Vulkano, Wizard, 3 Modifiche anonime

Pipeline dati  Fonte:: http://it.wikipedia.org/w/index.php?oldid=33416537  Autori:: Aker, Alfio, Dwerk, Hellis, Kronos, Lp, Marcuscalabresus, Massimiliano Lincetto, Rosco, Salvatore Ingala,
Stiffmaister, 10 Modifiche anonime

Flip-flop  Fonte:: http://it.wikipedia.org/w/index.php?oldid=34954783  Autori:: Alec, Alepolia, Amux, Axios, Bart ryker, Beta16, CavalloRazzo, Ciano, ColdShine, Cvicari, Domenicoagate,
Elwood, Francesco Betti Sorbelli, Gac, Gaetanogambilonghi, Giomini, Guidomac, Hellis, Kormoran, Limonadis, M7, Mangiucugna, Maquesta, Marcol-it, Merovingian, Mikelima, Mitchan,
Mox83, Otrebla86, Paginazero, Piero, Reptilia, Salento81, Sassospicco, Sbisolo, Scaraby100, Shivanarayana, Ticket 2010081310004741, Torsolo, Tridim, Triph, Ulisse0, Woodstock1, Zaldo,
104 Modifiche anonime

Multivibratore  Fonte:: http://it.wikipedia.org/w/index.php?oldid=33219868  Autori:: Alfio, Anassagora, Avesan, Guam, Issilac, L736E, Luisa, Remulazz, Tridim, Zaldo, 18 Modifiche anonime

Algebra di Boole  Fonte:: http://it.wikipedia.org/w/index.php?oldid=33309212  Autori:: .snoopy., Alberto da Calvairate, Alecobbe, AnyFile, Beta16, Blakwolf, Contezero, DaniDF1995, Davide,
Depagen, Digitalone, Durras, Fabexplosive, Fede Reghe, Fioravante Patrone, Francesco Betti Sorbelli, Gabstef, Gionnico, Ketersephirot, Kibira, Klemen Kocjancic, Lucat, Luigicaiffa, Marcel
Bergeret, Marius, MartinoK, Mess, Paolovenezia, Pegua, Phantomas, Piddu, Pietrodn, Pracchia-78, Qualc1, RamsesII, Red Power, Rossa1, Salvatore Ingala, SkY`, Snowdog, The Black,
TierrayLibertad, Tridim, Trovatore, Ulisse0, Woodstock1, Ylebru, ^musaz, 98 Modifiche anonime

Multiplexer  Fonte:: http://it.wikipedia.org/w/index.php?oldid=34299869  Autori:: Alez, Amux, An3, Andrea Monaco, Avesan, Basilicofresco, Biopresto, Casol, Diablo, Gionnico, Giovdi, Hce,
Hellis, Issilac, Jivemind, Lucaviolinik, Lulo, Marcel Bergeret, Moonson112, Otrebla86, Patafisik, Ripepette, Sirabder87, Sky, Ticket 2010081310004741, Tridim, Truman Burbank, Tuxx,
Woodstock1, 51 Modifiche anonime

Full-adder  Fonte:: http://it.wikipedia.org/w/index.php?oldid=31404096  Autori:: Al Pereira, Alez, Amux, Blackreef, Gac, Hellis, Issilac, Mess, Numberinn, Reptilia, Tridim, Ultramontano, 3
Modifiche anonime

Half-adder  Fonte:: http://it.wikipedia.org/w/index.php?oldid=33521896  Autori:: Blackreef, Mess, Ripepette, Tridim, 8 Modifiche anonime
Fonti, licenze e autori delle immagini 46

Fonti, licenze e autori delle immagini


File:Toshiba TC86R4400MC-200 9636YJA top.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Toshiba_TC86R4400MC-200_9636YJA_top.jpg  Licenza: GNU Free Documentation
License  Autori:: EugeneZelenko, Morkork, Qurren, Sdrtirs, 2 Modifiche anonime
File:Pipeline MIPS.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Pipeline_MIPS.png  Licenza: Public Domain  Autori:: Hellisp
File:IDT R4700 diephoto2.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:IDT_R4700_diephoto2.jpg  Licenza: Creative Commons Attribution-Sharealike 2.5  Autori:: User:Dyl
File:CXD8606BQ 02.JPG  Fonte:: http://it.wikipedia.org/w/index.php?title=File:CXD8606BQ_02.JPG  Licenza: GNU Free Documentation License  Autori:: Yaca2671
File:QED RM7000 diephoto.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:QED_RM7000_diephoto.jpg  Licenza: Creative Commons Attribution-Sharealike 2.5  Autori:: User:Dyl
File:R 10000.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:R_10000.png  Licenza: Public Domain  Autori:: Hellisp
Immagine:Commons-logo.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Commons-logo.svg  Licenza: logo  Autori:: User:3247, User:Grunt
Immagine:Nopipeline.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Nopipeline.png  Licenza: GNU Free Documentation License  Autori:: User:Poil
Immagine:Fivestagespipeline.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Fivestagespipeline.png  Licenza: GNU Free Documentation License  Autori:: User:Poil
Immagine:Superscalarpipeline.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Superscalarpipeline.png  Licenza: GNU Free Documentation License  Autori:: User:Poil
Immagine:Pentium4superpipeline.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Pentium4superpipeline.png  Licenza: GNU Free Documentation License  Autori:: User:Poil
File:Flipflop SR0.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Flipflop_SR0.svg  Licenza: sconosciuto  Autori:: MichaelFrey
File:Flipflopt.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Flipflopt.png  Licenza: GNU Free Documentation License  Autori:: User:Omegatron
File:T-Type Flip-flop.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:T-Type_Flip-flop.svg  Licenza: Public Domain  Autori:: User:Inductiveload
File:Flipflopd.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Flipflopd.png  Licenza: GNU Free Documentation License  Autori:: Glenn
Immagine:Wiktionary-ico-de.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Wiktionary-ico-de.png  Licenza: logo  Autori:: Bobit, F l a n k e r, Melancholie, Mxn, Rocket000
File:Astable multivibrator.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Astable_multivibrator.png  Licenza: GNU Free Documentation License  Autori:: EugeneZelenko, Glenn,
Ilmari Karonen, McSush, MichaelFrey, Peo, PieterJanR
File:555-schem.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:555-schem.png  Licenza: sconosciuto  Autori:: EugeneZelenko, Ilmari Karonen, Jacj, Omegatron, Shooke, Tano4595,
WikipediaMaster
File:NOT ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:NOT_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:OR ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:OR_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:AND ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:AND_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:XOR ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:XOR_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:NOR ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:NOR_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:NAND ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:NAND_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:XNOR ANSI.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:XNOR_ANSI.svg  Licenza: Public Domain  Autori:: jjbeard
File:Multiplexer.png  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Multiplexer.png  Licenza: Public Domain  Autori:: Filnik, Inductiveload, Rogerb
File:DEMUX.JPG  Fonte:: http://it.wikipedia.org/w/index.php?title=File:DEMUX.JPG  Licenza: sconosciuto  Autori:: Woodstock1
File:Telephony multiplexer system.gif  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Telephony_multiplexer_system.gif  Licenza: Creative Commons Attribution  Autori:: Tony R.
Kuphaldt
Immagine:Figura FA.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Figura_FA.jpg  Licenza: sconosciuto  Autori:: Mess, Red devil 666, Romanom, Valepert
Immagine:Tabella verita FA.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Tabella_verita_FA.jpg  Licenza: sconosciuto  Autori:: Jacopo, Mess, Romanom, Snowdog
Immagine:4-bit ripple carry adder.svg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:4-bit_ripple_carry_adder.svg  Licenza: GNU Free Documentation License  Autori:: Cburnett,
MichaelFrey, Teslaton
Immagine:Tabella_verita_HA.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Tabella_verita_HA.jpg  Licenza: sconosciuto  Autori:: Romanom, Snowdog
Immagine:Figura_HA.jpg  Fonte:: http://it.wikipedia.org/w/index.php?title=File:Figura_HA.jpg  Licenza: sconosciuto  Autori:: Red devil 666, Romanom
Licenza 47

Licenza
Creative Commons Attribution-Share Alike 3.0 Unported
http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/

You might also like