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

Q & A (5)

[ Precedente ][ Indice ][ Successivo ]

 


Date: Tue, 12 Dec 2006 18:34:30 +0100
Subject: RESET iniziale?
Sto facendo un progetto, e mi sono domandato: quando la SCA che sto realizzando viene alimentata, io progettista posso ipotizzare che abbia a disposizione un impulso di RESET che posso collegare agli ingressi CLR del FIFO, CLR dei FF, RES dei contatori prima di iniziare a fare qualsiasi operazione oppure devo realizzare uno SCO apposito? Questa seconda ipotesi mi sembra irrealistica, essendo lo SCO stesso realizzato a FF (e quindi si ripresenterebbe il quesito).

Sto sbagliando?

No, non sta sbagliando per nulla. Come giustamente osserva, l'ipotesi di una SCO di reset e' priva di fondamento.

Intanto, se il suo progetto e' un'interfaccia per microprocessore, puo' sempre utilizzare il segnale di System Reset (SYSRESET) che circola nel bus di sistema, e che consiste proprio in un impulso (tipicamente della durata di qualche centinaia di millisecondi) emesso una sola volta all'accensione dell'intero sistema, che copre il periodo di assestamento delle alimentazioni ai valori nominali, e serve appunto a garantire che il sistema inizi le operazioni partendo da uno stato predefinito.

Se invece il suo progetto e' di tipo "stand-alone", ossia non connesso ad alcun bus di microprocessore, puo' sempre ipotizzare, se necessario, la disponibilita' di un modulo "Power On Reset Generator" (dalla struttura interna non meglio specificata, perche' e' una struttura ibrida analogico/digitale, ma assunta nota) che produca un segnale Power-On Reset con le caratteristiche suindicate.

Tenga tuttavia presente che, dati i tempi contingentati della realizzazione di un progetto all'esame, quello del power-on reset e' davvero l'ultimo dei problemi di cui si deve preoccupare!

 


Date: Tue, 12 Dec 2006 18:41:16 +0100
Subject: Domanda sul progetto d'esame del 2005-01-11
In merito all'appello del prof. Chiari assegnato in data 11-1-2005. La traccia richiede di scandire la tastiera e per tale scansione ho due possibilità:

- scandire solo per colonne ma questo potrebbe creare problemi nel caso in cui mentre un tasto è premuto l'utente ne preme un'altro sulla stessa riga. Questa soluzione impiega soli 8 cicli del SYSCLK per scandire l'intera tastiera

- scandire i contatti ad uno ad uno, ciò comporta l'impiego di 2 contatori il primo sincronizzato sul SYSCLK ed il seguente che ha come CE il TC del primo. Questa soluzione impiega 128 cicli del SYSCLK per scandire l'intera tastiera

Sottintendendo che la seconda soluzione è meno complessa mi chiedevo se i 128 cicli di clock non fossero un pò troppi per una pressione di un tasto. Supponendo un clock da 250 MHz ciò significherebbe infatti 0,512 microsec per un'intera scansione

- scandire solo per colonne ma questo potrebbe creare problemi nel caso in cui mentre un tasto è premuto l'utente ne preme un'altro sulla stessa riga. Questa soluzione impiega soli 8 cicli del SYSCLK per scandire l'intera tastiera

La digitazione multipla in genere e' esclusa da questi progetti perche' piuttosto complessa. Di fatto, possono esserci varie combinazioni anche soltanto con due tasti:

1) tasto A premuto, poi tasto B premuto, poi tasto A rilasciato, poi tasto B rilasciato;

2) tasto A premuto, poi tasto B premuto, poi tasto B rilasciato, poi tasto A rilasciato;

3) tasto A premuto, poi tasto B premuto, poi tasto B rilasciato, poi tasto B ancora premuto, etc etc

(Casi di questo genere si verificano anche sulla tastiera del suo PC, quando ad esempio il tasto A coincide col tasto Ctrl oppure col tasto Shift oppure col tasto Alt.)

- scandire i contatti ad uno ad uno, ciò comporta l'impiego di 2 contatori il primo sincronizzato sul SYSCLK ed il seguente che ha come CE il TC del primo. Questa soluzione impiega 128 cicli del SYSCLK per scandire l'intera tastiera

Sottintendendo che la seconda soluzione è meno complessa mi chiedevo se i 128 cicli di clock non fossero un pò troppi per una pressione di un tasto. Supponendo un clock da 250 MHz ciò significherebbe infatti 0,512 microsec per un'intera scansione

No, non sono troppi. Un/a esperto/a dattilografo/a arriva piu' o meno ai 240 caratteri al minuto, il che significa 4 caratteri al secondo, il che significa che il tasto rimane premuto per circa 1/8 di secondo, ossia 125 millisecondi (MILLIsecondi!): in questo intervallo di tempo, con le frequenze di clock da lei stimate, riusciamo a fare circa 250.000 scansioni!

 


Date: Tue, 12 Dec 2006 20:07:06 +0100
Subject: Progetti di reti logiche
Siamo degli studenti di reti logiche, volevamo avere qualche informazione sui progetti che abbiamo svolto.

pdf32.jpg (977 bytes)
0612170013.pdf

18/7/2005
=========

(1) Mancano i circuiti di interfaccia per la scrittura nel FIFO.

(2) Il FIFO e' un dispositivo asincrono, appena scompare RD scompare anche il dato in uscita da esso, e quindi tale dato va immagazzinato in un registro se lo si vuole utilizzare anche piu' in la' nel tempo.

(3) La seconda implementazione di RUOTA e' improponibile. La prima implementazione si potrebbe semplificare facendo leggere il dato dal FIFO quando il contatore mod 8 principale raggiunge il Terminal Count, poi sommando l'uscita della ROM alle uscite del contatore stesso (modulo 8) e pilotando con questo risultato il multiplexer all'uscita del registro. In questo modo, risparmierebbe un contatore. Inoltre, si puo' risparmiare anche il multiplexer finale per la generazione dello zero, semplicemente usando opportunamente l'ingresso di Enable di cui ogni multiplexer dispone.

14/02/02
========

(1) E' vero che l'ADC non fornisce segnale di fine conversione, ma ha comunque bisogno di un segnale di inizio conversione, visto che il tempo di conversione non e' assimilabile a 0.

(2) A che serve abilitare o disabilitare lo shift register?

(3) In alternativa al contatore delle medie mobili, si poteva usare uno shift register a 8 bit sull'uscita del comparatore e testare che fossero tutte e otto a 1.

(4) Non mi e' chiara la gestione dei clock: perche' usa un clock a 10 MHz dividendolo per 8 e usando la frequenza risultante per campionare il segnale? Il clock a 10 MHz va inviato all'ADC come inizio conversione, va usato per catturare i singoli campioni, va usato per scrivere entro la RAM (che ha tempo di ciclo di 75 nsec). L'unico inghippo sta nel fatto che gli addizionatori hanno tempo di 60 nsec, quindi non e' possibile realizzare un albero di sommatori (che nel suo disegno peraltro non appare) ma va inserito un registro di pipeline tra i due livelli dell'albero.

Questo progetto va un po' rivisto, alla luce di quest'ultima considerazione.

18/10/05
========

(1) Gli impulsi di cui si parla sono generati da dispositivi elettromeccanici, quindi e' ragionevole assumere che la loro durata sia maggiore del periodo del clock. In tal caso, pero', i flip-flop in alto non generano certo un segnale largo quanto un singolo periodo di clock!

(2) Nell'accumulo dell'importo si poteva risparmiare qualche addizionatore osservando che arriva un solo impulso alla volta, e quindi sarebbe stato sufficiente un registro accumulatore su cui andava in somma solo l'uscita della ROM corrispondente all'impulso in arrivo.

(3) I registri di uscita vanno opportunamente abilitati al caricamento, altrimenti cambiano di stato ad ogni clock (e' da immaginare che la stampante abbia bisogno di vedere dati stabili mentre li stampa).

(4) Come e' fatto un sommatore mod 60? e uno mod 24?

(5) A che serve il flip-flop di Interrupt Request, se non c'e' nessuna CPU nel sistema?

(6) Come ho detto ad altri suoi colleghi a proposito di questo progetto: a rigore, la stampante dovrebbe ricevere codici ASCII e non numeri binari -- ma non so se anche questo fosse nelle intenzioni di chi ha steso il testo del progetto.

 


Date: Tue, 12 Dec 2006 22:40:44 +0100
Subject: Domanda D3 del 2006-09-13
Stavo rivedendo le domande ke le ho posto oggi è mi è venuto un dubbio... Relativamente alla domanda 3 del 13/09/2006 non ho capito se è (2^7)^(2^12) oppure (2^7) x (2^12).

E comunque non capisco da dove viene quel 2^1536 nella Q & A #10 (Macchine di Mealy) ...

Stavo rivedendo le domande ke le ho posto oggi è mi è venuto un dubbio... Relativamente alla domanda 3 del 13/09/2006 non ho capito se è (2^7)^(2^12) oppure (2^7) x (2^12).

Nessuna delle due. Era (2^12)^(2^7), ossia (numero di possibili combinazioni stato/uscita)^(numero di possibili combinazioni ingresso/stato = numero di righe della tavola) = (2^(4+8)) ^ (2^(3+4)).

E comunque non capisco da dove viene quel 2^1536 nella Q & A #10 (Macchine di Mealy) ...

Sappiamo che (x^y)^z = x^(y*z). Dunque (2^12)^(2^7) = (2^12)^128 = 2^(12*128) = 2^1536.

 


Date: Tue, 12 Dec 2006 22:54:31 +0100
Subject: Progetto d'esame del 2005-01-11
Le mando la mia proposta di soluzione all'esame del 11-01-2005.

pdf32.jpg (977 bytes)
06121700275.pdf

Va rivista la logica di generazione dell'interrupt: se all'arrivo di IACK il segnale "contatto" e' ancora alto (e lo sara' sicuramente, visto che il rilascio del tasto avviene dopo tempi "umani"), il flip-flop di richiesta interrupt si setta di nuovo. Si tratta essenzialmente di trasformare la transizione 0-1 del "contatto" in un segnale che duri esattamente un clock (non e' difficile, usando qualche flip-flop) e poi usare questo per settare il flip-flop di Interrupt Request.

 


Date: Tue, 12 Dec 2006 23:33:06 +0100
Subject: Progetto d'esame del 2006-11-06
Le invio la mia soluzione del primo esercizio del tema d'esame che le mando incluso nell'allegato (che tra l'altro è stato svolto anche a lezione ma ero assente proprio quel giorno).

pdf32.jpg (977 bytes)
0612170033.pdf

(1) La CPU non da' nessuno Start: il processo di elaborazione e' continuo. Tutto cio' che c'e' nella prima pagina, salvo lo shift register, puo' essere tranquillamente eliminato. Ad ogni periodo di clock, si prendono i 32 bit che in quel momento si trovano nello shift register e li si processano.

(2) L'albero di addizionatori e' un po' pesante, non trova? Un modo semplice ed efficiente e' il seguente: si spezza ICOMPOUT in due sezioni da 16 bit ciascuna, ciascuna sezione viene mandata a una ROM in cui sono immagazzinate le somme dei bit di ingresso (risultato su 5 bit, poiche' puo' avere valore da 0 a 16 compreso), e i risultati vengono mandati a un normale addizionatore a 5 bit.

(3) Non useremo mai, se non richiesto esplicitamente, la mascheratura degli interrupt, per cui si puo' evitare di fare intervenire i segnali SETIM, CLRIM e simili.

(4) Il flip-flop di richiesta interrupt deve tener memoria che si e' verificato un superamento di soglia, ma deve restare settato fino all'IACK anche se, trascorrendo altri clock, non c'e' piu' superamento.

 


Date: Wed, 13 Dec 2006 11:34:49 +0100
Subject: Progetto d'esame del 2005-12-12
Le invio il progetto svolto del 12/12/05 Tema A.

pdf32.jpg (977 bytes)
0612170039.pdf

Ho trovato alcune sue correzioni relative a questo progetto, e ho provato a lavorare di conseguenza.

Avviso subito che nelle temporizzazioni, perché il tutto possa avere senso, è necessario ritardare visivamente SYNC_IN e D di un colpo di ck. Mi sono accorto in ritardo di questo errore.

Le descrivo il funzionamento atteso della SCA:

Non l'ho indicato, ma assumo che, una volta alimentata la SCA, nei registri, FF, contatori, SIPO, PISO, arrivi un impulso di RESET che azzeri (0 logico) il contenuto di queste componenti. L'arrivo del primo bit del byte 0 dal mondo esterno, con contemporanea salita (1 logico) del segnale di SYNC_IN, azzera per un ciclo di ck il contatore CNT0, il quale inizia a contare indefinitamente. Ad ogni istante, il suo contenuto indica quale bit del byte è contenuto nel Q7 del SIPO che riceve i dati seriali dal mondo esterno. Quando TC0 sale, viene abilitato per un ck il WE della FIFO per memorizzare il byte di dati. Questo prosegue per diversi ck, fino a quando la coda si riempie e QF sale. Fatto che, per noi, indica che è stata terminata la memorizzazione del messaggio. Da questo punto in poi, la SCA deve leggere i byte dalla FIFO, combinarli opportunamente, e inviarli serialmente. Quindi, si utilizza il fatto di aver visto QF=1 e lo si memorizza in REG, uscita del quale inibisce (tramite la porta AND) la scrittura futura di WE (fino a quando arriverà un altro messaggio da scrivere nella FIFO). Quando è arrivato l'ultimo bit del messaggio da scrivere nella FIFO (TC0 ritardato di un colpo di ck) e ho visto QF=1, inizia a leggere, memorizza il byte prelevato dalla FIFO in un registro latch, esegue la combinazione dei bit con la chiave memorizzata nel registro da parte del processore e carica nel PISO il byte da inviare serialmente (dalle temporizzazioni, si nota come QF=1 ritardato sia esattamente il segnale di SYNC_OUT). Dopo 8 colpi di ck, il PISO carica un nuovo byte e questo prosegue finché QE=0. A questo punto la SCA invia 0 logico sulla linea seriale.

Nota: nelle temporizzazioni, sulla linea Sout, D6(Bn) è in realtà D7(Bn) e significa bit 8 (ultimo bit) del Byte n-esimo (ultimo Byte), mentre n sulla linea REGFIFO significa ultimo byte.

La cosa che secondo me è poco realistica è l'assunzione di fondo che ho fatto, ovvero di ipotizzare che, dopo la corretta scrittura di un messaggio, possa stare tranquillo di non ricevere altri SYNC_IN mentre sto codificando e inviando serialmente il messaggio.

Purtroppo, mi sono reso conto che avrei dovuto pensare meglio soltanto verso la fine del compito.

Se questo dovesse capitare all'esame, non avrei probabilmente il tempo di modificare in tutto o in parte quello che ho fatto.

Le domande sono:

1) Ci sono errori macroscopici che non ho notato in quanto ho fatto in questo progetto?

2) Risulterebbe comunque sufficiente, in termini di valutazione, utilizzare una soluzione non troppo realistica, come in questo caso?

3) Questa domanda esula dal progetto specifico. Ho notato che, a volte, si preferiscono usare i buffer tri-state al posto dei MUX. Non è stupefacente, considerando che si sta parlando di una porta contro, solitamente, più porte in cascata. Allora la domanda è, perché non usare sempre buffer tri-state? Spero non sia una domanda sciocca.

Le invio il progetto svolto del 12/12/05 Tema A.
[...]

Direi che, a parte le considerazioni che lei stesso fa subito dopo, non ci sono grossi problemi. Non si capisce da dove venga il segnale QREG che concorre ad abilitare il contatore in basso a sinistra, ma immagino che sia l'uscita del flip-flop che memorizza l'evento di coda piena.

La cosa che secondo me è poco realistica è l'assunzione di fondo che ho fatto, ovvero di ipotizzare che, dopo la corretta scrittura di un messaggio, possa stare tranquillo di non ricevere altri SYNC_IN mentre sto codificando e inviando serialmente il messaggio.

Purtroppo, mi sono reso conto che avrei dovuto pensare meglio soltanto verso la fine del compito.

Se questo dovesse capitare all'esame, non avrei probabilmente il tempo di modificare in tutto o in parte quello che ho fatto.

Esatto.

1) Ci sono errori macroscopici che non ho notato in quanto ho fatto in questo progetto?

No, a parte la considerazione di fondo.

2) Risulterebbe comunque sufficiente, in termini di valutazione, utilizzare una soluzione non troppo realistica, come in questo caso?

Sicuramente sufficiente, almeno in questo caso.

3) Questa domanda esula dal progetto specifico. Ho notato che, a volte, si preferiscono usare i buffer tri-state al posto dei MUX. Non è stupefacente, considerando che si sta parlando di una porta contro, solitamente, più porte in cascata. Allora la domanda è, perché non usare sempre buffer tri-state? Spero non sia una domanda sciocca.

Qualcuno disse una volta: "Non esistono domande sciocche, solo le risposte talvolta possono esserlo." Al di la' delle corrette considerazioni che lei stesso fa sul numero di porte nell'uno e nell'altro caso, occorre considerare che al multiplexer standard si invia un codice di selezione binario, mentre al multiplexer realizzato con tri-state occorre inviare un codice 1-su-N gia' decodificato: se tale codice non e' gia' pronto in qualche modo, occorrera' usare un decoder, il che probabilmente vanifica il risparmio sul numero di porte. Un'altra considerazione spesso importante e' il numero di collegamenti e il percorso ("routing") che essi devono fare: in un multiplexer standard (che diremo "concentrato") gli N segnali di ingresso devono tutti viaggiare lungo il sistema fino a raggiungere il multiplexer, nel caso di porte tri-state (multiplexer "distribuito") l'unico segnale che viaggia su grande scala e' l'uscita del multiplexer. In quest'ultimo caso, tuttavia, un percorso altrettanto lungo deve essere seguito dai segnali di abilitazione, il che ci potrebbe riportare al punto di partenza; tuttavia, se essi possono essere generati localmente, come nel caso delle combinazioni IORD*SEL nelle porte di input, allora il vantaggio e' indiscutibile. Un'ultima considerazione: mentre un multiplexer classico ha sempre un numero di ingressi pari a una potenza di 2 (numero che peraltro deve essere definito anzitempo), il multiplexer a porte tri-state puo' facilmente essere realizzato per un numero qualunque di ingressi, senza conseguente spreco di porte inutilizzate. (Quest'ultima considerazione tuttavia, alla luce delle moderne tecniche di realizzazione mediante "gate array", va presa con le molle, perche' i "compilatori" di circuiti sono solitamente in grado di identificare le porte non usate o comunque ridondanti e di renderle di conseguenza riutilizzabili.)

 


Date: Wed, 13 Dec 2006 15:48:48 +0100
Subject: Progetto d'esame del 2005-01-11
Le invio questa soluzione all'appello del 2005-1-11, grazie per la disponibilità.

Manca la realizzazione del circuito combinatorio interno alla macchina sequenziale che costituisce la sco. Ma è molto semplice, le invio la tavola di transizione.

pdf32.jpg (977 bytes)
0612170051.pdf

(1) Il decoder a centro pagina poteva essere sostituito con un multiplexer a quattro ingressi a cui confluivano le uscite dei multiplexer superiori, in tal modo avrebbe potuto fare a meno dell'Or a quattro ingressi.

(2) Non vedo necessita' di una SCO esplicita. Se P e IRQ sono contemporaneamente alti, i contatori rimangono bloccati, e tanto basta. D'altra parte, lei gia' converte la transizione 0-1 di P in un impulso da un singolo clock (secondo flip-flop in basso da destra), quindi di cos'altro dobbiamo tenere memoria? Diverso sarebbe stato se, magari, avesse inglobato anche questo flip-flop, o addirittura tutti e due, nella SCO, che allora avrebbe avuto un senso.

(3) Il registro in basso a sinistra che fa da porta di input e' connesso male: se (evento altamente improbabile, ma non impossibile) il tasto viene rilasciato dopo IACK e prima che venga emesso IORD, i contatori sono ripartiti e il dato letto da ROM non e' piu' valido. Invece, basta catturare il dato da ROM ad esempio con l'impulso di cui al punto (2).

 


Date: Wed, 13 Dec 2006 15:58:43 +0100
Subject: Progetto d'esame del 2006-11-06: Traccia di soluzione
Volevo solo inviarle una traccia di soluzione dell'appello del 06/11/2006 Esercizio D1. Una semplice trascrizione del progetto.

Ho pensato di utilizzate un registro a scalamento a 32 bit. Ogni bit che arriva va a memorizzarsi nel registro con perdita del bit meno significativo. Prendo l'uscita del registro a 32 bit e vado a compararlo con la stringa di riferimento M anch'essa a 32 bit.

Per la comparazione ho pensato di utilizzare dei comparatori bit a bit, quindi 32 comparatori, la cui uscita mi pilota un contatore che andrò ad incrementare ogni volta che i due bit sono uguali.

Terminata la comparazione delle 2 stringhe prelevo il valore di riferimento Y e lo comparo con il valore y del contatore.

Nel caso quest'ultimo sia maggiore genero un interrupt.

Nel caso la traccia dovesse andare bene mi trovo in difficoltà nella generazione del terminal count del contatore. Potrebbe cortesemente darmi qualche suggerimento?

Non puo' usare un contatore per contare i bit 1 dell'uscita del comparatore, perche' questa operazione va risolta in un singolo periodo di clock (tutto il complesso di operazioni va eseguito in un solo periodo!). Dunque ha bisogno di uno speciale addizionatore in grado di sommare tra di loro 32 operandi da 1 bit ciascuno. Ci pensi un po' su, a come realizzarlo.

 


Date: Wed, 13 Dec 2006 18:09:17 +0100
Subject: Quale reset?
Le volevo chiedere come mai nel progetto ifmax per resettare il contatore viene utilizzato un segnale ires derivato da stard, complete e reset mentre invece nel progetto ifrange viene usato direttamente lo stard?
Perche' in IFMAX il contatore puo' essere resettato anche al momento del Complete, mentre in IFRANGE, poiche' il contatore deve essere letto dalla CPU dopo il Complete, esso deve restare integro fino al successivo Start.

 

[ Precedente ][ Indice ][ Successivo ]


Last update 2006-12-17 17:19