Riconoscitore di Fibonacci Un circuito sincrono è in grado di riconoscere delle sequenze di Fibonacci e di calcolare il successivo numero della sequenza. Esso prende in ingresso a ogni ciclo di clock un numero a 4 bit positivo senza segno. Se vengono inseriti consecutivamente 4 numeri ognuno maggiore o uguale del precedente ed ognuno uguale alla somma dei precedenti 2, allora al ciclo di clock successivo a quello in cui è stato inserito il 4° numero, il circuito restituirà in uscita un numero a 5 bit che sia il risultato della somma del terzo e del quarto. Se i numeri inseriti non rispettano questi criteri l’uscita rimarrà a 00000. Il circuito è dotato anche di un ingresso per il clock, un ingresso di CLEAR che resetta tutta la rete e un ingresso di ENABLE che abilita il circuito. Reti Logiche – Galassi Andrea – Prof. Neri Giovanni Struttura Rete La rete si divide principalmente in 4 sezioni: • I registri 3 registri a 4 bit per tenere in memoria 3 numeri • Le reti per le operazioni matematiche e di confronto Un full adder e due blocchi di confronto ("=" e ">=" ) a 4 bit • Il contatore Un contatore a 2 bit che verifica il numero minimo di numeri che appartengono alla sequenza (2) e una volta raggiunto tale numero non incrementa più • Il blocco AND finale Abilita come uscita il risultato del full adder solo nel caso il sistema riconosca la sequenza, in ogni altro caso l’uscita rimane "00000" Schematico Comparatore T2>=T3 Il comparatore T2>=T3 verifica che i numeri inseriti siano in ordine crescente o al più uguali tra loro ComparatoreMaggioreUguale O = A>=B Funzionamento Contatore Il contatore riceve come segnale CLOCK ENABLE il prodotto del risultato due comparatori, della negazione del CARRY OUT del FULL ADDER, dell’ingresso ENABLE, e dell’uscita Q1 del contatore stesso. Come segnale di RESET sincrono riceve il prodotto dei primi 3 fattori del CLOCK ENABLE sommato al segnale di CLEAR. Il contatore si fermerà qualora i comparatori diano risultato negativo, il segnale ENABLE sia negativo, oppure il contatore stesso sia nello stato 2 ("10") Se i comparatori daranno risultato negativo non solo il contatore si fermerà, ma si resetterà anche. Testbench Per verificare il corretto funzionamento del circuito, testiamo 3 diverse sequenze di ingresso, resettandolo prima di ogni test: 1. Una sequenza errata 2. Una sequenza corretta di più di 4 elementi 3. Una sequenza con gli elementi corretti ma ordine errato Test Sequenza Non Corretta Immetto la sequenza 2-3-4-8-13-0. Mi aspetto un output costante a 0 --ciclo 1-clock <= '0'; I<="0010"; --immetto il numero 2 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 3-clock <= '0'; I<="0100"; --immetto il numero 4 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 5-clock <= '0'; I<="1101"; --immetto il numero 13 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 2-clock <= '0'; I<="0011"; --immetto il numero 3 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 4-clock <= '0'; I<="1000"; --immetto il numero 8 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 6-clock <= '0'; I<="0000"; --immetto il numero 0 wait for clock_period/2; clock <= '1'; wait for clock_period/2; Test Sequenza Corretta Immetto la sequenza 2-3-5-8-13-5-0. Mi aspetto in output la sequenza 0-0-0-0-8-13-0 --ciclo 1-clock <= '0'; I<="0010"; --immetto il numero 2 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 2-clock <= '0'; I<="0011"; --immetto il numero 3 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 3-clock <= '0'; I<="0101"; --immetto il numero 5 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 4-clock <= '0'; I<="1000"; --immetto il numero 8 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --poiché ho immesso 4 numeri della --sequenza, al prossimo fronte positivo --del clock mi aspetto in uscita il --numero 13 --ciclo 5-clock <= '0'; I<="1101"; --immetto il numero 13 wait for clock_period/2; clock <= '1'; --mi aspetto in uscita 13 wait for clock_period/2; --poiché ho proseguito la sequenza mi --aspetto al prossimo fronte positivo --di clock il numero 21 in uscita --ciclo 6-clock <= '0'; I<="0101"; --immetto il numero 5 wait for clock_period/2; clock <= '1'; --mi aspetto in uscita 21 wait for clock_period/2; --anche se 5 e 21 differiscono solo per il --bit più significativo, se la rete funziona --l’uscita sarà comunque 0 --ciclo 7-clock <= '0'; I<="0000"; --immetto il numero 0 wait for clock_period/2; clock <= '1'; --mi aspetto in uscita 0 wait for clock_period/2; Test Sequenza in Ordine Sbagliato Immetto la sequenza 3-2-5-7-0. Mi aspetto un output costante a 0 --ciclo 1-clock <= '0'; I<="0011"; --immetto il numero 3 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 3-clock <= '0'; I<="0101"; --immetto il numero 5 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 2-clock <= '0'; I<="0010"; --immetto il numero 2 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 4-clock <= '0'; I<=“0111"; --immetto il numero 7 wait for clock_period/2; clock <= '1'; wait for clock_period/2; --ciclo 5-clock <= '0'; I<=“0000"; --immetto il numero 0 wait for clock_period/2; clock <= '1'; wait for clock_period/2; Simulazione Behavioral 1 Simulazione Behavioral 2 Simulazione Post Route Il comportamento della rete è del tutto similare alla simulazione Behavioral Sono però presenti leggeri ritardi e dei glitch sull’uscita, ma la loro durata è dell’ordine di qualche nanosecondo.