Riconoscitore di Fibonacci

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.