Calcolatori Elettronici T Ing. Informatica Traccia soluzione 8 Gennaio 2015
Esercizio 1 Nel sistema è presente una periferica a 8 bit in grado di leggere dati da una unità esterna mediante il protocollo di handshake. RESET CS_INPUT_PORT MEMRD INT_INPUT_PORT BD[23..16] CS RD INT_INPUT D[7..0] RESET INPUT PORT STB IBF DATA_IN[7..0] UNITA ESTERNA #1 Il DLX riceve sul proprio pin di interrupt mascherabile il segnale INT generato dalla rete seguente che, in base alle specifiche, blocca le richieste di interruzione dalla porta in input fino a che non è posto a zero il segnale RIC_DISPARI_E_PARI, definito nella pagina successiva, che codifica l avvenuta ricezione di una sequenza dispari-pari. INT_INPUT_PORT RIC_DISPARI_E_PARI* RIC_DISPARI_E_PARI INT (to DLX)
La rete seguente consente di soddisfare le specifiche del testo mediante l utilizzo di un contatore modulo 4. Il contatore sarà azzerato in modo asincrono all avvio e in modo sincrono mediante un opportuno comando software (lettura all indirizzo CS_RESET_COUNTER). Questa ultima modalità di reset sarà utilizzata dall interrupt handler, una volta terminato l incrementato del valore di conteggio in memoria, al fine di poter riabilitare le interruzioni dalla porta in input e riprendere l analisi dei valori letti dalla periferica. La rete logica seguente consente di determinare, mediante una lettura a CS_READ_STATUS, se è asserito un interrupt causato dalla ricezione di un valore dispari seguito da uno pari dalla porta in input. Tale bit sarà utilizzato dall interrupt handler per determinare se è asserito un interrupt corrispondente alla ricezione di una sequenza dispari-pari. RESET CS_READ_STATUS BD0 ENABLE_COUNTER CS_RESET_COUNTER MEMRD* EN A_RES Q1 RES Q0 Counter COUNTER X4 DEC 2:4 3 2 1 0 RIC_DISPARI_E_PARI RIC_DISPARI RIC_NESSUNO ENABLE_COUNTER = RIC_NESSUNO CS_INPUT_PORT IBF BD16 + RIC_DISPARI CS_INPUT_PORT IBF BD16*
Dispositivi e segnali presenti nel sistema RAM_H mappata da FFE00000h:FFFFFFFFh, 4 banchi da 512 KB RAM_L mappata da FFC00000h:FFDFFFFFh, 4 banchi da 512 KB EPROM mappata da 00000000h:003FFFFFh, 4 banchi da 1 MB CS_READ_STATUS mappato a 80000000h CS_RESET_COUNTER mappato a 80000001h CS_PORTA_INPUT mappato a 80000002h Segnali di decodifica memorie, segnali e dispositivi di I/O CS_RAM_H_0 = BA31 BA30 BA21 BE0 CS_RAM_H_1 = BA31 BA30 BA21 BE1 CS_RAM_H_2 = BA31 BA30 BA21 BE2 CS_RAM_H_3 = BA31 BA30 BA21 BE3 CS_RAM_L_0 = BA31 BA30 BA21* BE0 CS_RAM_L_1 = BA31 BA30 BA21* BE1 CS_RAM_L_2 = BA31 BA30 BA21* BE2 CS_RAM_L_3 = BA31 BA30 BA21* BE3 CS_READ_STATUS = BA31 BA30* BE0 MEMRD CS_RESET_COUNTER = BA31 BA30* BE1 CS_INPUT_PORT = BA31 BA30* BE2 CS_EPROM_0 = BA31* BE0 CS_EPROM_1 = BA31* BE1 CS_EPROM_2 = BA31* BE2 CS_EPROM_3 = BA31* BE3
Codice dell interrupt handler: LHI R20,8000 ; prepara indirizzo 8000000h corrispondente ; a CS_READ_STATUS LBU R21,0(R20) ; legge un byte a CS_READ_STATUS ANDI R21,R21,0001 ; pone a zero tutti i bit escluso il LSb BEQZ R21,no_sequenza ; se R21==0 significa che NON è stata ricevuta una ; sequenza dispari-pari e pertanto si salta a ; PC + 4 + no_sequenza con no_sequenza pari a 24 10 = 18h ; altrimenti (R21==1) si gestisce la sequenza dispari ; pari incrementando il contatore in memoria ; gestisce interrrupt relativo a RIC_DISPARI_E_PARI LHI R22,FFFF ; prepara indirizzo contatore in memoria FFFF0000h LW R21,0(R22) ; legge valore di conteggio in memoria a FFFF0000h ADDI R21,R21,1 ; incrementa il valore di conteggio R21 = R21 + 1 SW R21,0(R22) ; aggiorna contatore R21 in memoria a FFFF0000h LB R23,1(R20) ; lettura dummy a CS_RESET_COUNTER mappato a 80000001h ; per resettare il contatore e di conseguenza il segnale ; RIC_DISPARI_E_PARI RFE ; fine gestione sequenza e ritorno dall interruzione ; gestisce interrupt relativo a lettura da porta in ; input mappata a CS_INPUT_PORT (indirizzo 80000002h) no_sequenza: LBU R23,2(R20) ; legge il byte dalla porta in input a 80000002h in R23 RFE ; fine lettura da porta input ritorno dall interruzione
Interfacciamento RAM_H CS_RAM_H_3 CS_RAM_H_2 CS_RAM_H_1 CS_RAM_H_0 MEMWR MEMRD BA[20..2] RAM_H_3 RAM_H_2 RAM_H_1 RAM_H_0 BD[31..24] BD[23..16] BD[15..8] BD[7..0] A[18..0]
Interfacciamento RAM_L CS_RAM_L_3 CS_RAM_L_2 CS_RAM_L_1 CS_RAM_L_0 MEMWR MEMRD BA[20..2] RAM_L_3 RAM_L_2 RAM_L_1 RAM_L_0 BD[31..24] BD[23..16] BD[15..8] BD[7..0] A[18..0]
Interfacciamento EPROM CS_EPROM_3 CS_EPROM_2 CS_EPROM_1 CS_EPROM_0 MEMRD BA[21..2] RD CS RD CS RD CS RD CS EPROM_3 EPROM_2 EPROM_1 EPROM_0 BD[31..24] BD[23..16] BD[15..8] BD[7..0] A[19..0]
a) senza forwarding unit: Esercizio 2 ADD R1,R0,R0 ADDI R2,R0,1 SW 10(R1),R2 SW 14(R1),R2 IF ID ID ID ID EX MEM WB b) con forwarding unit: ADD R1,R0,R0 ADDI R2,R0,1 R1 R2 SW 10(R1),R2 SW 14(R1),R2
Rif. lucidi/lezioni. Esercizio 3