Università di Roma "La Sapienza" - Facoltà di Ingegneria
Laurea Specialistica in Ingegneria Informatica - Corso di Reti Logiche

Q & A (8)

[ Precedente ][ Indice ][ Successivo ]

 


Date: Tue, 26 Dec 2006 17:02:18 +0100 (CET)
Subject: Lettura da una RAM
Nel progetto d'esame del 27/06/05 si richiedeva la lettura da una RAM a partire dall'indirizzo 80000000h. Ad ogni locazione di memoria corrisponde un vettore che per il testo d'esame ha un preciso significato. Essendo la RAM di 2Megaword il numero di vettori da 16 bit nella ram sono appunto 2 mega, indirizzabili con 21 bit. Essendo inoltre le locazioni da accedere contigue, ho pensato di usare un contatore UP modulo 2^21 (inizializzato a 0) e di ottenere l'indirizzo della locazione tenendo fisse le linee più significative dell'indirizzo a (1000 0000 000) e collegando le restanti meno significative al contatore, che si incrementerà ad ogni fronte di clock. Infine (e qui sono meno sicuro sulla correttezza) ho pensato di lasciare attivo il ReadEnable della RAM durante la lettura di tutte le word, facendo variare solo gli indirizzi. Sarebbe forse opportuno salvare il contenuto della locazione in un registro in modo da evitare che impulsi spuri facciano lavorare il circuito su valori non corretti?

Infine il testo impone di utilizzare solo blocchi di RAM da 1MByte. Ho pensato perciò di utilizzare 4 blocchi da 1Mbyte aventi 20 linee di indirizzo e 8 linee di uscita ciascuno, collegandoli in maniera opportuna per espandere sia il dato (collegando in parallelo gli indirizzi) che gli indirizzi (usando il bit più significativo per attivare o meno il CS e l' OE delle due coppie di blocchi).

Quanto scritto è corretto?

La RAM deve essere condivisa tra l'interfaccia (che vi accede in sola lettura) e la CPU (che vi deve poter accedere sia in lettura che in scrittura). Dunque, gli indirizzi al modulo RAM devono essere multiplexati tra il Memory Address Bus del PD-32 e le uscite del suo contatore. In secondo luogo, come ricordera', l'accesso alla memoria da parte del PD-32 e' piuttosto complesso, poiche' essa deve essere organizzata in quattro banchi paralleli da 8 bit ciascuno, in modo da potersi attestare sul Memory Data Bus a 32 bit; inoltre, i bit 1-0 del Memory Address Bus non sono fisicamente presenti sul System Bus, essendo decodificati nei segnali MB[0-3] (Memory Bank Enable).

In altri termini, lei deve attestare un modulo da 1 Mbyte su ciascun byte del Memory Data Bus, e multiplexare opportunamente:

(1) gli indirizzi: da MAB[2-31] lato System Bus, e dal suo contatore lato interfaccia;

(2) i dati: da MDB[0-31] lato System Bus, e su un multiplexer a due o quattro vie lato interfaccia;

(3) il segnale WE: da MEMWR lato System Bus, fisso a 0 lato interfaccia;

(4) il segnale OE: da MEMRD lato System Bus, dalla decodifica del o dei bit meno significativi (a seconda di come organizza i circuiti a valle) del suo contatore lato interfaccia;

(5) i quattro CS: dai MB[0-3] lato System Bus, fissi a 1 lato interfaccia.

 


Date: Thu, 28 Dec 2006 19:11:33 +0100
Subject: Progetto d'esame del 2006-07-06
Le invio una soluzione dell'appello di Calcolatori Elettronici del 6 luglio 2006.

NB: Ho ipotizzato che la FPMA impieghi più di un periodo di clock ma meno di 2 per effettuare il suo compito.

Domanda : E' giusto abilitare BEGIN contemporaneamente al cambiamento degli ingressi e di ADD oppure avrei dovuto attendere un altro periodo di clock?

pdf32.jpg (977 bytes)
0702032003.pdf

(1) Il flip-flop di richiesta interrupt va azzerato con IACK.

(2) Visto che in SCO lei aspetta che FPMA abbia completato le sue operazione, non ha ovviamente importanza quanti periodi di clock queste possano durare.

(3) Se ipotizziamo che BEGIN sia una semplice abilitazione all'esecuzione delle operazioni interne a FPMA, allora si puo' ammettere che esso venga attivato mentre i dati di ingresso vengono variati, nel senso che il primo cambiamento di stato interno di FPMA avverra' solo al prossimo fronte attivo di clock: e' un po' come attivare l'ingresso E di un flip-flop D nello stesso momento in cui cambia il dato D.

Per il resto, il suo svolgimento e' stato fatto abbastanza bene.

 


Date: Tue, 2 Jan 2007 10:53:20 +0100
Subject: Chiarimento sulla domanda D5 del 2006-12-18
Ho provato a risolvere la D5 del compito del 18-12-06, mi chiedevo intanto se sia corretta, poi se un implementazione Mealy/D-Mealy era preferibile in questo caso ed in generale in problemi di questo tipo come comportarsi.


0702032017.jpg

Il diagramma di stato e' corretto, come pure sembrerebbe l'implementazione. Unica osservazione (non e' un errore, per carita', visto che a lezione per mancanza di tempo non abbiamo toccato questo argomento): guardi gli stati S1 e S5, hanno le stesse uscite e a parita' di ingresso hanno gli stessi stati successivi; stati con queste proprieta' sono "equivalenti", ossia possono essere riuniti in un unico medesimo stato, e quindi la nostra macchina puo' essere ridotta ad avere solo 5 stati. Sebbene qui abbiamo individuato "ad occhio" questa particolarita', esistono tuttavia algoritmi (uno dei quali e' riportato sul libro di testo) per individuare con certezza eventuali stati equivalenti e ottenere di conseguenza una "macchina minima".

Quando al Mealy/D-Mealy, no, in questo caso si richiedeva semplicemente un diagramma di stato e una implementazione qualunque fosse, sia Moore, sia Mealy, sia D-Mealy. Quest'ultima, in particolare, si usa quando si desidera la massima prontezza di commutazione sulle uscite -- non e' certamente questo il caso!

Come comportarsi in queste circostanze. In genere, o il testo richiede esplicitamente una tipologia di soluzione, o altrimenti la soluzione e' unica e non c'e' necessita' di specificarla, o in alternativa ci si affida al "buon senso": tra le varie possibili opzioni, ce ne sara' evidentemente qualcuna che e' palesemente migliore di altre sotto uno o piu' criteri. (Il concetto che vorrei che gli studenti capissero e' che, nel mondo reale, le decisioni finali saranno lasciate a voi stessi e alla vostra responsabilita': non basta sapere, occorre anche -- e soprattutto -- sapere che cosa e' meglio.)

 


Date: Thu, 4 Jan 2007 17:57:00 +0100
Subject: Quesito D3 dell'esame del 13-09-06
Il quesito D3 dell'esame del 13-09-06 recita:

"Una rete sequenziale sincrona di tipo Mealy ha 3 variabili di ingresso, 4 di stato e 8 di uscita. Quante sono le possibili macchine sequenziali rappresentabili?"

Se la macchina è di tipo Mealy, come nel testo, il numero delle macchine è 2^1536. Ma se la macchina fosse di tipo Moore?

Ho pensato che, poichè in Moore l'uscita dipende solo dallo stato, S -> O e il "contributo" è: (2^8)^(2^4) = 2^128;
lo stato futuro, invece, dipende sia dall'ingresso che dallo stato presente, I x S -> S', e il contributo è:

             (2^4)^(2^(3+4)) = 2^512;

Le macchine rappresentabili dunque dovrebbero essere: 2^128 * 2^512 = 2^(128+512) = 2^640; è effettivamente così? Il numero delle macchine di Moore è cosi "basso" rispetto al numero nel caso Mealy?

Spero di aver almeno abbozzato il ragionamento corretto!

Il suo ragionamento e' esatto. Infatti, una macchina di Moore, a parità di parametri, ha molti meno "gradi di liberta'" rispetto a una macchina di Mealy -- tant'e' vero che, data una macchina di Mealy, una macchina di Moore equivalente deve in generale avere un maggior numero di stati.

 


Date: Thu, 4 Jan 2007 20:29:28 +0100 (GMT+01:00)
Subject: Chiarimenti su FIFO etc.
Vorrei chiederle dei chiarimenti riguardo ad alcuni argomenti del corso:

- FIFO:

1) Le uscite sono stabili solo durante il periodo in cui il RE (Read Enable) è alto e altrove sono in alta impedenza (come per le RAM)?

2) Quando avviene precisamente la commutazione delle uscite? Al fronte di discesa del RE? Quindi anche in corrispondenza di tale fronte il QE (Queue Empty) potrebbe andare ad 1?

3) Per ciò che riguarda il segnale di WE, quando il QF (Queue Full) può salire ad 1? Al fronte di discesa del WE?

4) Commetto un errore se decido di far durare il RE (o WE) un ciclo di clock? oppure dev'essere maggiore?

- BUFFER THREE STATE E MUX:

1) Posso sempre sostituire ad un MUX ad N ingressi, un insieme di N BTS convoglianti in un BUS il cui valore verrà ad esempio catturato come un ingresso di un circuito combinatorio (stando attenti a lasciare almeno un ingresso NON in three state)?

2) Avendo bisogno per generare i singoli segnali di abilitazione di un decoder alle uscite di un contatore, conviene effettivamente?

- LAVORO INUTILE

1) E' importante per i progetti (e in generale) cercare, ad esempio in una fase di inattività della periferica, di non far lavorare circuiti combinatori oppure commutare registri?

FIFO:

1) Le uscite sono stabili solo durante il periodo in cui il RE (Read Enable) è alto e altrove sono in alta impedenza (come per le RAM)?

In un FIFO asincrono (come quelli che noi utilizziamo nromalmente; esistono anche FIFO sincroni, ma hanno comportamento piu' complicato) le uscite sono stabili e valide solo durante RE attivo. Quando RE e' inattivo, le uscite sono sicuramente non valide; potrebbero anche essere in alta impedenza, ma la cosa avrebbe senso solo se potessimo connettere in parallelo tra loro le uscite di due o piu' FIFO, il che, se ci pensa un attimo, non ha molto significato.

2) Quando avviene precisamente la commutazione delle uscite? Al fronte di discesa del RE? Quindi anche in corrispondenza di tale fronte il QE (Queue Empty) potrebbe andare ad 1?
3) Per ciò che riguarda il segnale di WE, quando il QF (Queue Full) può salire ad 1? Al fronte di discesa del WE?

Possiamo assumere, per non complicare eccessivamente e inutilmente la descrizione del comportamento del FIFO, che il suo stato interno (e dunque in particolare anche QE e QF) cambi nell'istante in cui RE o WE passano dal livello attivo a quello inattivo.

4) Commetto un errore se decido di far durare il RE (o WE) un ciclo di clock? oppure dev'essere maggiore?

No, a meno che non sia un clock assurdamente veloce. Tanto per avere un'idea, supponga che la durata di RE o di WE sia dello stesso ordine di grandezza della durata di WE per una RAM statica. Essenzialmente si tratta di un impulso la cui durata deve essere in grado di far cambiare di stato uno o piu' flip-flop interni al FIFO, dunque pari al tempo di propagazione attraverso tre-cinque livelli di porte logiche.

BUFFER THREE STATE E MUX:

1) Posso sempre sostituire ad un MUX ad N ingressi, un insieme di N BTS convoglianti in un BUS il cui valore verrà ad esempio catturato come un ingresso di un circuito combinatorio (stando attenti a lasciare almeno un ingresso NON in three state)?

In linea di principio si'. Nella pratica poi sopravvengono altre considerazioni relative alla lunghezza dei conduttori, al percorso che essi devono seguire, e cosi' via -- ma sono tutte considerazioni di tipo elettrico, non logico.

2) Avendo bisogno per generare i singoli segnali di abilitazione di un decoder alle uscite di un contatore, conviene effettivamente?

Anche qui, sono considerazioni di tipo elettrico, non logico. La vera distinzione tra il multiplexer classico e quello relaizzato con tri-state e' che il primo e' "concentrato", mentre il secondo e' "distribuito". Se dobbiamo multiplexare ad esempio 8 gruppi da 32 bit ciascuno, nel primo caso far arrivare ad una singola area localizzata del circuito 8x32 conduttori, nel secondo caso possiamo invece semplicemente far girare per i vari circuiti un solo gruppo di 32 conduttori, piu' altri 8 per le singole abilitazioni. Diminuisce cosi' quantita' di rumore generato (alle alte velocita', un conduttore si comporta come un'antenna) e la possibilita' di mutue interferenze tra segnali diversi.

LAVORO INUTILE

1) E' importante per i progetti (e in generale) cercare, ad esempio in una fase di inattività della periferica, di non far lavorare circuiti combinatori oppure commutare registri?

Dal punto di vista logico, quasi mai. Dal punto di vista elettrico, si' sempre e senz'altro: circuiti che non commutano non consumano energia (e questo vale massimamente per la logica CMOS, dove in regime statico l'uno o l'altro dei due transistori dello stadio di uscita e' interdetto, ma in commutazione c'e' sempre un attimo di tempo in cui entrambi si trovano a condurre, con conseguente passaggio di corrente dall'alimentazione a massa), e di conseguenza circuiti che commutano inutilmente consumano inutilmente energia.

 


Date: Fri, 5 Jan 2007 18:40:26 +0100 (GMT+01:00)
Subject: Progetto d'esame del 2005-07-18
Le invio un progetto di Reti Logiche tenuto dal professor Chiari dell'appello del 18/07/2005.

Vorrei inoltre chiederle se il procedimento effettuato è corretto, e se occorre sempre cercare di implementare lo SCO nei progetti d'esame.

pdf32.jpg (977 bytes)
0702032038.pdf

(1) Manca la logica per la scrittura nel FIFO da parte della CPU: si tratta solo di utilizzare le linee dati in ingresso al FIFO e il WE come porta di output attestata al bus.

(2) Ricordare sempre che i multiplexer (come altri dispositivi analoghi) possono disporre di un ingresso di Enable, la cui inattivita' provoca l'inattivita' dell'uscita. Il secondo multiplexer in basso a sinistra e' superfluo, basta usare al suo posto l'ingresso di Enable del primo multiplexer. Inoltre: che senso ha un multiplexer a due vie in cui uno degli ingressi e' fisso a zero? Non puo' essere semplicemente sostituito da una porta And?

(3) Lei ha usato due contatori mod 8, uno che conta i bit avviati all'uscita e l'altro che, tramite il multiplexer, decide qual e' il bit da avviare all'uscita. Una soluzione alternativa, che avrebbe comportato forse meno logica di controllo, poteva essere quella di usare un solo contatore (il primo dei due) e poi selezionare il bit da avviare all'uscita con un addizionatore mod 8: ad ogni byte da emettere, il contatore conta 0, 1, 2, ..., leggiamo H dalla ROM, il bit da emettere sara' allora quello di indice 0+H, 1+H, 2+H, ...

Vorrei inoltre chiederle se il procedimento effettuato è corretto, e se occorre sempre cercare di implementare lo SCO nei progetti d'esame.

Si', e' del tutto corretto.

In linea di principio, un progetto non puo' dirsi completo se necessita di uno SCO e questo non c'e'. In ogni caso, almeno un abbozzo di SCO, se non altro in termini di diagramma di stato, deve essere sempre presente. Il livello di dettaglio a cui occorrera' poi scendere nel compito d'esame, dipende dal "peso", in termini di complessita', dello SCO nell'ambito dell'intero progetto.

 


Date: Sun, 07 Jan 2007 23:45:11 +0100
Subject: Domanda D2 dell'appello del 2000-06-14
La soluzione proposta dal professor Chiari circa la domanda D2 dell'appello del 14-6-2000 indica che ogni cella dello shifter necessita di 8 transistor (per via dei 4 interruttori cmos). Non dovremmo prendere in considerazione anche i due invertitore necessari a complementare le variabili di controllo del multiplexer per un totale di 12 transistor? Se la mia intuizione è esatta il tempo di calcolo della rete non dovrebbe comprendere il anche il livello di inversione e quindi dovrebbe essere 4T + T?
La sua osservazione e' corretta, tuttavia gli invertitori di cui lei parla, in una rete iterativa non vengono posti in ogni cella ma vengono piazzati a parte e servono tutte le celle in parallelo. Di conseguenza, non intervengono nel computo dle numero di transistori per cella -- in realta', se vogliamo, dovrebbero intervenire ma solo con un valore frazionario.

Quanto al tempo di calcolo, occorre intendersi. Cosi' come in un multiplexer generico possiamo parlare del tempo di propagazione da un ingresso dati all'uscita o da un ingresso di controllo all'uscita (tempi che in generale sono diversi tra loro), allo stesso modo, nella fattispecie, per "tempo di calcolo" si intende evidentemente il tempo di propagazione tra ingresso dati e uscita.

 


Date: Mon, 8 Jan 2007 10:12:32 +0100
Subject: Domanda sul FIFO
Per leggere i dati da una FIFO, va bene se all'ingresso RD della FIFO ci colleghiamo (XCLK*(QE negato))?

Altrimenti gentilmente mi suggerirebbe la soluzione?

Non e' molto pulita come soluzione (la lettura cessa nel momento in cui il clock torna basso, e non abbiamo alcun controllo sulla sequenza delle letture), ma in alcuni casi potrebbe essere accettabile. L'ideale sarebbe poter abiltare le letture tramite SCO: in determinati stati si abilita RD per un intero periodo di XCLK, in tal modo il dato puo' essere catturato in corrispondenza al normale fronte di salita del clock.

 


Date: Mon, 8 Jan 2007 18:52:44 +0100
Subject: IRQ generati senza richiesta da parte della CPU
Avrei un dubbio generale che rigurda più o meno tutti i progetti che incontro. Lo espongo prendendo ad esempio il gettonatissimo progetto IFKEY, una soluzione del quale è presente nella sezione Q&A nel suo sito alla voce "Esercitazione IFKEY" (30-11-2006). Il mio dubbio è che, a mio avviso, la periferica genera degli IRQ anche se da parte della CPU non è stato mandato nessuno STARD. Ho pensato a due situazioni:

1) All'avvio del sistema tutti i registri ed i flip-flop vengono forzati a zero da un ipotetico segnale di SYSRES. Questo vuol dire che anche il registro di output (input per la periferica IFKEY) conterrà tutti zeri. Anche il contatore viene resettato, ma poi inizierà a contare generando indirizzi per le ROM. In linea di principio sarebbe possibile che una comparazione della chiave "0.....0" proveniente dal registro di output dia esito positivo, generando una interruzione per la CPU.

2)Caso analogo al precedente ma con i flip-flop ed i registri "sporchi" con dati precedentemente caricati.

L'unica soluzione che ho trovato al problema è presente nello svolgimento della periferica IFMAX, ovvero progettare una SCO, specificando la presenza, oltre ai flip-flop necessari per mantenere informazione dello stato, di un ulteriore flip-flop che generi un segnale di IRES, che forza tutti i flip-flop di stato allo stato di riposo, e dunque, essendo il segnale di COMPLETE generato solo nello stato di completamento, non c'è problema per la CPU di ricevere "falsi" IRQ. In questo modo però è praticamewnte SEMPRE necessaria una SCO ed un flip-flop che generi IRES. Nel caso di IFKEY, dove la SCO non è necessaria, potrebbe andare bene una soluzione nella quale il segnale di COMPLETE è il risultato di un AND tra il segnale di chiave trovata (proveniente dal comparatore) e IRES negato? In questo modo il COMPLETE verrebbe generato solo dopo una richiesta della CPU tramite STARD.

Questo dubbio dei risultati generati dalle periferiche senza richiesta dalla CPU ricorre un pò in tutti i progetti. E' dunque sempre sottinteso un meccanismo che genera il segnale IRES oppure ho un approccio del tutto sbagliato al problema?

Un'altra soluzione potrebbe anche essere quella di impedire la generazione di qualunque interrupt (per esempio, inizializzando opportunamente il flip-flop di Interrupt Mask) prima che il software decida che l'interfaccia puo' iniziare a lavorare normalmente. Non dimentichi che la CPU, al reset, ha gli interrupt disabilitati (proprio per ovviare a questi inconvenienti), e quindi il software di controllo, nella fase di inizializzazione "una tantum", puo' sempre sistemare in qualche modo lo stato dell'interfaccia prima di resettare l'Interrupt Mask e di abilitare gli interrupt.

Ho afferrato comunque la sostanza delle sue perplessita', e va osservato che in molti progetti effettivamente non ci preoccupiamo molto di cio' che accade al momento in cui il circuito viene acceso la priam volta. Questo non perche' la cosa non abbia importanza, ma perche' sicuramente ha molta piu' importanza il corretto funzionamento a regime (d'altra parte, e' ben inutile resettare correttamente un circuito che a regime si comporta in maniera non corretta!). Il segnale di System Reset e' in realta' un segnale di bus come tutti gli altri, e tra le altre cose serve anche a resettare la CPU e a far cosi' partire il software dalla locazione prescritta; inoltre, esso dovrebbe anche essere utilizzato per forzare una "partenza a freddo" (cold start) di tutte le interfacce periferiche. Se il circuito e' di tipo stand-alone, ossia non connesso ad alcuna CPU, e' sempre possibile supporre l'esistenza di un blocco "Reset Generator" che all'accensione del sistema produce un impulso (tipicamente attivo basso) della durata di parecchi millisecondi, avente proprio le stesse funzioni del System Reset nei sistemi privi di CPU.

Se lei ha dato un'occhiata allo sviluppo del progetto BINBCD che ho pubblicato recentemente, scoprira' facilmente che anche li' questo problema non viene affrontato, sebbene non vi siano interrupt di mezzo. In realta', conviene affrontarlo un volta che sia ben chiaro quali e quante sono le variabili di stato (flip-flop, registri, contatori, etc) del circuito che hanno bisogno di essere in qualche modo inizializzati. Mi ripromettevo di completare in questo senso il progetto non appena ci libereremo di questo secondo appello.

 


Date: Mon, 08 Jan 2007 18:59:28 +-100
Subject: Sommatori
Per realizzare un sommatore per un numero di bit n che non sia potenza di 2, posso assumere di collegare n sommatori ad 1 bit in catena (con ciascun sommatore che prende il Cin dal modulo precedente)? Oppure quale altra soluzione potrei adottare?
Non vedo motivo per non poter usare questa struttura anche quando n non e' una potenza di 2. Perche' mai puo' usare 7 o 9 sommatori in cascata e non 8?

Non vi sono molte altre alternative: se n e' piccolo, possiamo pensare a un circuito combinatorio progettato ad hoc per avere massima velocita', oppure a una ROM (evitare pero' sempre, quando possibile, le ROM). Ci sono poi delle strutture speciali (una delle quali e' il carry lookahead) mirate a ottenere la massima velocita' anche da reti iterative, ma esse vanno largamente al di la' degli scopi e dei limiti del nostro corso.

 

[ Precedente ][ Indice ][ Successivo ]


Last update 2007-04-29 20:53