Rete Sincrona Una rete sequenziale sincrona, è dotata di un ingresso E, di un segnale di Clock e uno di reset. Ad ogni fronte del Clock, deve essere campionato il segnale presente sull'ingresso E. Ogni 4 bit ricevuti in ingresso bisogna verificare che tale sequenza rispetti il codice di parità (numeri di 1 pari). Se così avviene, il numero deve essere moltiplicato per 2 e salvato in un registro parallelo, altrimenti deve essere diviso per 2, ne deve essere fatto il complemento a 2 e inviato in uscita parallelamente. Codice VHDL Questo è il port, dove si possono notare i segnali di ingresso e quelli di uscita Process 1°parte Variabili interne al process Il Reset è sincrono, infatti è stato inserito dentro la condizione che si è verificato un fronte positivo del Clock Process 2°parte Spiegazione Come si può notare inizialmente, il reset è sincrono. Infatti prima deve scattare il fronte positivo del Clock, poi si valuta immediatamente il Reset, che porta tutto nello stato iniziale. Internamente al process è presente una variabile count che oltre a fungere da indice nell'inserimento dei bit in ingresso in un vettore interno, mi è utile per vedere quando devo andare a verificare la mia condizione. Si noti infatti la presenza di if (count=4) … Un altro fattore importante è l'altra variabile int che ogni volta che ricevo un bit in ingresso se era un 1 mi viene incrementata, altrimenti no. Infine dopo che ho ripetuto diverse volte il processo, almeno 4 volte (si veda count) guarda se il numero rispettava il codice grazie alla mia variabile e quindi prendo la mia scelta grazie al costrutto if (…) then …. else … end if ... Schematico Spiegazione Il numero entra dall'ingresso E dal bit meno significativo, ed ad ogni fronte di Clock viene inserito nel Flip Flop. Intanto mentre vengono inseriti i bit nel registro, vengono passati anche a questa rete, che ha il compito di contare gli 1, per vedere se il numero rispetterà il codice di parità. Funziona come un Half Adder retro azionato: entra il bit, se è un 1 viene sommato con il Numero precedente. Il riporto non viene contato per un semplice motivo, Se il numero finale (ovvero dopo aver ricevuto tutti i bit) è 0 allora il numero rispetta il codice, altrimenti no. Contatore a due bit, dotato di comando di Reset sincrono e di Clock Enable (posto sempre a 1 grazie ad una costante). Se il numero non rispetta il codice di parità, esso viene diviso per 2, mediante uno shift dei suoi bit verso destra, e ne viene fatto il complemento a 2. Per fare ciò i suoi bit devono essere tutti invertiti, e deve essergli sommato “0001” Il tutto viene salvato in un registro parallelo, a condizione che abbiamo ricevuto i 4 bit e che il numero non rispetti il codice. Questo controllo è effettuato grazie all'And a 2 ingressi posto davanti i vari Flip Flop. N.B. Ho utilizzato quindi il fatto che A and 1 = A ovvero se l'ingresso dell'And è 1, viene “lasciato passare” l'altro segnale di ingresso. Il Mux davanti i Flip-Flop serve per re-iscrivere il numero al suo interno per 4 volte (il segnale di controllo del Mux è il Carry del contatore) Se il numero rispetta invece il codice, esso viene semplicemente moltiplicato per 2, grazie ad uno shift dei sui bit a sinistra, di una posizione. Verrà quindi salvato nel registro solo se ho contato 4 bit e se esso rispetta il codice di parità, altrimenti verrà caricato uno 0, grazie alla proprietà della porta And citata nella slide precedente. Anche in questo caso, il numero viene re-iscritto 4 volte dentro i Flip-Flop