in grado di effettuare molte azioni elementari indipendenti automa universale generatore di sequenze riconoscitore di sequenze circuiti sequenziali sommatore sottrattore circuiti combinatori in grado di eseguire una sequenza di azioni elementari automa universale programmabile ESECUZIONE l’automa legge la prima istruzione del programma, la esegue, poi legge la seconda, la esegue, e così via PROGRAMMAZIONE Il programmatore riporta le istruzioni che il calcolatore dovrà eseguire, in un programma calcolatore
STORIA John V. Atanasoff inventore del calcolatore 1946 IBM realizza il MARK I 1946 Moore School dela University of Pennsylvania (Eckert e Mauckly) ENIAC 1946 John von Neumann (e altri) calcolatore automatico La CPU (Central Process Unit) è suddivisa in parte operativa (Data Path) parte di controllo (Control Path) Per tutto il tempo che rimane alimentata, la CPU esegue alternativamente due fasi: fetch per caricare l’istruzione da eseguire execute per eseguire l’istruzione appena caricata
CPU tastiera mouse floppy hard disk I/O xx xx xx xx O U T P U T I N P U T video stampante floppy hard disk xx xx xx xx DB xx Architettura di von Neumann 1. L’interfaccia di I/O
xxxx xx Architettura di von Neumann 2. Address Bus e Data Bus
xx IR xxxx xx xx AL ALU xxxx T xxxx SI Architettura di von Neumann 3. La CPU
xx IR xxxx xx xx FFF RAM :::: 04FF xx xx xx :: xx xx AL ALU xxxx T xxxx SI R/W x Architettura di von Neumann 4. La memoria dati
xx tastiera mouse floppy hard disk xxxx R/W 0100 IP xx IR xx FFF RAM CPU :::: 04FF xx xx xx :: xx ROM BE FF :::: 03FF B0 :: xx I/O xx xx xx xx [81] [80] [83] [82] O U T P U T F F [01] [00] [03] [02] I N P U T F x AB DB xx AL ALU xxxx T xxxx SI video stampante floppy hard disk xx xx xx xx Architettura di von Neumann 5. La memoria programmi
moduloCPU { while (true){ fetch(); execute(); } moduloCPU { while (true){ fetch(); execute(); } fetch(void) { AB=ip; RW=READ; dato=DB; ir=dato; AB=NULL; ip++; } fetch(void) { AB=ip; RW=READ; dato=DB; ir=dato; AB=NULL; ip++; } execute(void) { unsigned char dato; unsigned int indirizzo; switch(ir) { case NOP : wait(1); break; case INC_AL : al++; break; :::: } execute(void) { unsigned char dato; unsigned int indirizzo; switch(ir) { case NOP : wait(1); break; case INC_AL : al++; break; :::: } fino a che la CPU viene alimentata effettua alternativamente le due fasi emette il valore del registro IP nell’Address Bus specifica che l’operazione è una lettura legge il codice operativo nel Data Bus e lo pone nell’Instruction Register svuota l’Address Bus incrementa IP variabili di appoggio per ogni tipo di istruzione
moduloIO { unsigned char dato; static unsigned char io[RangeIoMax-RangeIoMin]; while (true){ while ((AB =RangeIOmin)) { if (RW==READ) { dato=io[AB-RangeIOmin]; DB=dato; } else { dato=DB; io[AB-RangeIOmin]=dato; } moduloIO { unsigned char dato; static unsigned char io[RangeIoMax-RangeIoMin]; while (true){ while ((AB =RangeIOmin)) { if (RW==READ) { dato=io[AB-RangeIOmin]; DB=dato; } else { dato=DB; io[AB-RangeIOmin]=dato; }
moduloRAM { unsigned char dato; static unsigned char ram[RangeRamMax-RangeRamMin]; while (true){ while ((AB =RangeRamMin)) { if (RW==READ) { dato=ram[AB-RangeRamMin]; DB=dato; } else { dato=DB; ram[AB-RangeRamMin]=dato; } moduloRAM { unsigned char dato; static unsigned char ram[RangeRamMax-RangeRamMin]; while (true){ while ((AB =RangeRamMin)) { if (RW==READ) { dato=ram[AB-RangeRamMin]; DB=dato; } else { dato=DB; ram[AB-RangeRamMin]=dato; }
moduloROM { unsigned char dato; static unsigned char rom[RangeRomMax-RangeRomMin]; while (true){ while ((AB =RangeMemMin)) { dato=rom[AB-RangeRomMin]; DB=dato; } moduloROM { unsigned char dato; static unsigned char rom[RangeRomMax-RangeRomMin]; while (true){ while ((AB =RangeMemMin)) { dato=rom[AB-RangeRomMin]; DB=dato; }
CPU: registro Instruction Pointer IP, registro generale AL (8 bit), registro indice SI (16 bit), registri interni IR e T, ALU RAM: capacità di 3072 celle di memoria da 1 byte ciascuna, da 0400 a 0FFF ROM: capacità di 768 celle di memoria da 1 byte, da 0100 a 03FF I/O: 128 indirizzi di input, da 00 a 7F, e 128 indirizzi di output, da 80 a FF analizziamo il seguente esempio di programma: 0100BE 00 01MOV SI, B0 00MOV AL, MOV [SI+0500],AL 01094EDEC SI 010A75 F9JNZ CCD 20INT 20