Testo Esercitazione_1
Transcript
Testo Esercitazione_1
APSI 04-05 ESERCITAZIONE 1 SEQUENZA DELLE ATTIVITA’ PARTE 1: Simulazione dell’algoritmo MU0_S2 (visto a lezione) 1. Copiare la cartella MU0_S2 in un’altra cartella sempre sul desktop con nome a vostro piacimento, (tale cartella nel seguito sarà indicata come cartella1). N.B. Possibilmente evitare di modificare la cartella originale. 2. Aprire Modelsim ed eseguire la simulazione del programma MU0_S2 come visto a lezione. Il programma è specificato nel seguito. 3. Verificare che l’esecuzione di ciascuna istruzione modifichi il contenuto dei registri interni del processore e delle locazioni di memoria interessate secondo la specifica dell’instruction set del processore. PROGRAMMA MU0_S2: CONTENUTO DELLA MEMORIA @000 0100 //load M[12'h100] @001 2101 //add M[12'h101] @002 1102 //sto M[12'h102] @003 4005 //j M[12'h005] @004 1103 //sto M[12'h103] @005 1104 //sto M[12'h104] @006 5008 //jge M[12'h008] @007 1103 //sto M[12'h103] @008 0100 //load M[12'h100] @009 3100 //sub M[12'h100] @00A 3100 //sub M[12'h100] @00B 5012 //jge M[12'h0D] @00C 1105 //sto M[12'h105] @00D 7000 //stop @100 0005 // A = 16'h5 @101 0003 // B = 16'h3 Salto incondizionato: scrive M[100]+M[101] alla loc. 104 ma non alla 103 Salto condizionato eseguito (ACC>0) : non scrive alla loc 103 Salto condizionato non eseguito: scrive alla loc. 105 PARTE 2: Traduzione in linguaggio macchina e simulazione dell’algoritmo MU0_S3 (visto a lezione) 1. Copiare la cartella MU0_S2 in un’altra cartella sempre sul desktop con nome a vostro piacimento, (tale cartella nel seguito sarà indicata come cartella2). N.B. Possibilmente evitare di modificare la cartella originale. 2. Aprire un editor di testo (ad esempio notepad) e codificare il programma MU0_S3 (descritto nel seguito) in linguaggio macchina usando la definizione dell’IS (descritta nel seguito), secondo le modalità viste a lezione. Salvare il file con il nome MU0_S3.hex nella directory /HEX della cartella2. Contenuto della memoria all’istante 0 // Codice C S = 0; for( i=0; i<5;i++ ) if (a[i] >= 0) S = S + a[i]; S = 2*S; a[0] @ Mem[12’h100] a[1] @ Mem[12’h101] …. a[4] @ Mem[12’h104] 0 @Mem[12’h200] Contenuto richiesto della memoria alla fine della simulazione S -> @ Mem[12’h200] @000 LDA 100; // carica a[0] nell’accumulatore @001 JGE 003; // se a[0] >= 0 salta all’istruz che scrive a[0] nella loc di mem sulla // quale accumulo il risultato parziale @002 J 004; // altrimenti salta all’istruz che carica a[1] nell’acc @003 STO 200; // scrive a[0] nella loc di mem sulla quale accumulo il risultato parziale (0x200) @004 LDA 101; // carica a[1] nell’acc @005 JGE 007; // se a[1] >= 0 salta all’istruz che lo addiziona al ris parziale @006 J 009; // altrimenti salta all’istruz che carica a[2] @007 ADD 200; // addiziona il ris parziale ad a[1] @008 STO 200; // scrive il nuovo risultato parziale nella loc di mem 0x200 @009 LDA 102; // carica a[2] nell’acc @00A JGE 00C; // se a[2] >= 0 salta all’istruz che lo addiziona al ris parziale @00B J 00E; // altrimenti salta all’istruz che carica a[3] @00C ADD 200; // addiziona il ris parziale ad a[2] @00D STO 200; // scrive il nuovo risultato parziale nella loc di mem 0x200 @00E LDA 103; // carica a[3] nell’acc @00F JGE 011; // se a[3] >= 0 salta all’istruz che lo addiziona al ris parziale @010 J 013; // altrimenti salta all’istruz che carica a[4] @011 ADD 200; // addiziona il ris parziale ad a[3] @012 STO 200; // scrive il nuovo risultato parziale nella loc di mem 0x200 @013 LDA 104; // carica a[4] nell’acc @014 JGE 016; // se a[4] >= 0 salta all’istruz che lo addiziona al ris parziale @015 J 018; // altrimenti salta all’istruz che carica il risultato finale della somma nell’acc @016 ADD 200; // addiziona il ris parziale ad a[4] @017 STO 200; // scrive il risultato finale della somma nella loc di mem 0x200 @018 LDA 200; // carica il risultato finale della somma nell’accumulatore @019 ADD 200; // addiziona il risultato finale della somma a se stesso @01A STO 200; // scrive il valore finale di S nella loc di mem 0x200 @01B STP; // stoppa la simulazione Istruzione LDA S Opcode Opcode (HEX) (BIN) 0 0000 Descrizione ACC = mem[S] STO S 1 0001 mem[S] = ACC ADD S 2 0010 ACC = ACC + mem[S] SUB S 3 0011 ACC = ACC - mem[S] JMP S 4 0100 PC = S JGE S 5 0101 if (ACC >= 0) PC = S JNE S 6 0110 if (ACC != 0) PC = S STP 7 0111 stop 3. Aprire Modelsim, modificare opportunamente il testbench ed eseguire la simulazione del programma MU0_S3. 4. Verificare che l’esecuzione di ciascuna istruzione modifichi il contenuto dei registri interni del processore e delle locazioni di memoria interessate secondo la specifica dell’instruction set del processore. PARTE 3: Codifica assembly, traduzione in linguaggio macchina e simulazione dell’algoritmo MU0_S4 1. Copiare la cartella MU0_S2 in un’altra cartella sempre sul desktop con nome a vostro piacimento, (tale cartella nel seguito sarà indicata come cartella3). N.B. Possibilmente evitare di modificare la cartella originale. 2. Codificare in assembly il programma MU0_S4 specificato nel seguito // Codice C S1 = 0; S2 = 0; for( i=0; i<5;i++ ) if (a[i] >= 0) S1 = S1 + a[i]; S1 = 2*S1; for( i=0; i<3;i++ ) if (b[i] >= S1) S2 = S2 + b[i] - a[i]; Contenuto della memoria all’istante 0 a[0] @ Mem[12’h100] a[1] @ Mem[12’h101] a[2] @ Mem[12’h102] a[3] @ Mem[12’h103] a[4] @ Mem[12’h104] b[0] @ Mem[12’h105] b[1] @ Mem[12’h106] b[2] @ Mem[12’h107] 0 @Mem[12’h200] Contenuto richiesto della memoria alla fine della simulazione S1 -> @ Mem[12’h201] S2 -> @ Mem[12’h202] 3. Aprire un editor di testo (ad esempio notepad) e codificare il programma MU0_S4 in linguaggio macchina usando la definizione dell’IS, secondo le modalità viste a lezione. Salvare il file con il nome MU0_S4.hex nella directory /HEX della cartella3. 5. Aprire Modelsim, modificare opportunamente il testbench ed eseguire la simulazione del programma MU0_S3. 6. Verificare che l’esecuzione di ciascuna istruzione modifichi il contenuto dei registri interni del processore e delle locazioni di memoria interessate secondo la specifica dell’instruction set del processore.