Progetto Sincrono Schematico Specifiche • Una rete sequenziale sincrona riceve in ingresso seriale 2 sequenze di 8 bit (a partire dal bit meno significativo) attraverso i due segnali di input X1 e X2. Le sequenze di 8 bit sono intervallate da 8 periodi di clock. Tali sequenze dovranno essere prese in considerazione solo mentre il segnale di input E è a 1. Viceversa, per E = 0 i bit in entrata verranno scartati. La rete dovrà elaborare le sequenze in entrata in modo che se presentano lo stesso numero di ‘1’ esse siano sommate e il risultato della somma mandato in output in modo seriale (a partire dal bit meno significativo) negli 8 periodi di clock successivi alla lettura. Se ciò non è verificato, le due sequenze dovranno essere divise per 2, sommate e mandate in output parallelo nel periodo di clock subito successivo alla lettura. Schematico (1) La rete è stata realizzata con sintesi diretta. Lo schematico a lato è stato suddiviso in 8 blocchi funzionali: In blu : lettura In rosso : conteggio degli ‘1’ In verde : confronto dei conteggi In magenta : selezione delle sequenze da sommare In azzurro : somma delle sequenze In viola : uscita parallela In arancio : uscita seriale In giallo : contatore Schematico (2) La lettura delle due sequenze in seriale è realizzata con 2 shift register a 8 bit con reset sincrono. Il CE è attivo se E = ‘1’, cioè nella fase di input appunto. Schematico (3) Mediante 2 accumulatori, viene conteggiato il numero di ‘1’ per ogni sequenza. Il Carry In degli accumulatori è caricato con il primo pin out degli shift register, in questo modo il conteggio verrà incrementato se si incontrerà un ‘1’ appunto. Il CE, come per gli shift register, è caricato con il valore di E. ADD è tenuto a ‘1’ per far si che l’accumulatore continui a conteggiare, mentre il LOAD è tenuto a ‘0’ per non influenzare il conteggio. Gli accumulatori vengono resettati in modo sincrono se il reset è a ‘1’ oppure se l’output è terminato (vedere contatore). Schematico (4) Con 3 XNOR messi in AND si verifica se i due conteggi sono uguali. Schematico (5) Le uscite degli shift register vengono multiplexate in modo da scegliere le sequenze stesse oppure il loro valore dimezzato, in base al risultato del controllo sui conteggi. Il controllo dei multiplexer è infatti assegnato all’uscita dell’AND degli XNOR, così da lasciar passare le sequenze di partenza se il controllo ha restituito ‘1’ oppure le sequenze dimezzate se il controllo risulta ‘0’. Schematico (6) Mediante un FULL ADDER a 8 bit vengono sommate le sequenze opportune, provenienti dalle uscite dei multiplexer. Il risultato della somma viene mandato ad entrambe le uscite, che saranno discriminate sempre in base al risultato del controllo. Schematico (7) L’uscita parallela è realizzata mediante un registro parallelo a 8 bit, sempre attivo e resettato in modo sincrono dal reset, da E (fase di lettura) oppure dal controllo positivo del conteggio (si attiva l’uscita seriale). Schematico (8) Anche in questo caso, l’uscita seriale è realizzata mediante un FlipFlop Delay resettato in modo sincrono dal reset, da E (fase di lettura) oppure dal controllo negativo dei conteggi (si attiva l’uscita parallela). Per fare in modo che dall’uscita seriale esca la somma delle sequenze a partire dal bit meno significativo, le uscite del FULL ADDER sono multiplexate e controllate dal contatore: ad ogni ciclo di clock verrà lasciato passare il bit opportuno, a cominciare, appunto, da quello meno significativo. Schematico (9) E’ stato utilizzato un contatore a 4 bit per realizzarne uno x8. Il contatore a 4 bit sarà dunque resettato dopo la fine del conteggio (Q3 = 1, reset sincrono). Il contatore è resettato anche dal reset oppure da E (fase di lettura). L’OR in alto a sinistra tra il segnale di reset e il raggiungimento di ‘7’ nelle uscite del contatore va a resettare gli accumulatori per il conteggio degli ‘1’. Testbench VHDL (1) Librerie ed entity Architecture: component Segnali Port Map Testbench VHDL (2) Clock_process per la gestione del clock e Reading_process per la gestione del segnale E Testbench VHDL (3) Prima lettura: X1 = «00001101» X2 = «00100110» Testbench VHDL (4) Seconda lettura: X1 = «00100111» X2 = «01001100» Simulazione behavioral <<<<< Nella zona in arancio vediamo che si attiva l’uscita seriale, come da specifiche (X1 = «00001101» e X2 = «00100110» hanno lo stesso numero di ‘1’). Negli 8 clock successivi alla fine della lettura l’uscita seriale porta in output la sequenza «11001100». Le specifiche parlavano di uscita seriale dal bit meno significativo, dunque la nostra sequenza di uscita sarà «00110011», cioè la somma tra X1 e X2. Nella zona in giallo si attiva invece l’uscita parallela (X1 = «00100111» e X2 = «01001100» non hanno lo stesso numero di ‘1’). Per 8 clock successivi alla fine della lettura l’uscita parallela porta in output la sequenza «00111001». Essendo X1 / 2 = «00010011» e X2 / 2 = «00100110», la sequenza in output è uguale alla somma di X1 e X2 dimezzati, come da specifiche. Simulazione post-route (1) Comportamento analogo alla behavioral, con introduzione dei ritardi. Simulazione post-route (2) Si può notare un ritardo di 7,702 ns tra il fronte del clock e l’attivazione dell’uscita seriale. Per quanto riguarda l’uscita parallela, prima di una configurazione stabile abbiamo un ritardo di 7,736 ns. Troviamo una differenza di 34 ps trai due ritardi.