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
Uso della libreria IEEE.NUMERIC_STD
Grazie a questa libreria è possibile svolgere operazioni
matematiche (quali la somma) e operazioni di
confronto su vettori logici.
Essa introduce il tipo UNSIGNED che corrisponde a
uno STD_LOGIC_VECTOR trattato come numero
binario senza segno.
All’interno del circuito useremo perciò questo tipo di
segnali per tenere in memoria i numeri immessi e
calcolare le somme.
I numeri in input vengono immediatamente convertiti
in UNSIGNED, mentre quelli in output vengono
riconvertiti in STD_LOGIC_VECTOR.
Descrizione Rete
La rete è descritta in parte in maniera strutturale e in parte in
maniera comportamentale
La descrizione strutturale comprende:
• Conversione dei numeri in memoria per gli output di debug
• Controllo delle proprietà della sequenza (T2>=T3, T1=T3+T2)
• Calcolo della somma tra il secondo e il terzo numero in memoria
• Selezione dell’output ed eventuale conversione
La descrizione comportamentale comprende:
• Reset del sistema
• Aggiornamento dei numeri in memoria
• Aggiornamento del contatore
VHDL 1
VHDL 2
Descrizione Strutturale
VHDL 3
Descrizione Comportamentale
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';
numin <="0010"; --immetto il numero 2
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 3-clock <= '0';
numin <="0100"; --immetto il numero 4
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 5-clock <= '0';
numin<="1101"; --immetto il numero 13
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 2-clock <= '0';
numin <="0011"; --immetto il numero 3
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 4-clock <= '0';
numin <="1000"; --immetto il numero 8
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 6-clock <= '0';
numin <="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';
numin<="0010"; --immetto il numero 2
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--poiché ho proseguito la sequenza mi
--aspetto al prossimo fronte positivo
--di clock il numero 21 in uscita
--ciclo 4-clock <= '0';
numin <="1000"; --immetto il numero 8
--ciclo 6-wait for clock_period/2;
clock <= '0';
clock <= '1';
numin <="0101"; --immetto il numero 5
wait for clock_period/2;
wait for clock_period/2;
--ciclo 2-clock <= '1'; --mi aspetto in uscita 21
clock <= '0';
--poiché ho immesso 4 numeri della
numin <="0011"; --immetto il numero 3 --sequenza, al prossimo fronte positivo wait for clock_period/2;
--del clock mi aspetto in uscita il
wait for clock_period/2;
--numero 13
--anche se 5 e 21 differiscono solo per il
clock <= '1';
--bit più significativo, se la rete funziona
wait for clock_period/2;
--ciclo 5---l’uscita sarà comunque 0
clock <= '0';
--ciclo 3-numin <="1101"; --immetto il numero
--ciclo 7-clock <= '0';
13
clock <= '0';
numin <="0101"; --immetto il numero 5 wait for clock_period/2;
numin <="0000"; --immetto il numero 0
wait for clock_period/2;
clock <= '1'; --mi aspetto in uscita 13
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
clock <= '1'; --mi aspetto in uscita 0
wait for clock_period/2;
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';
numin<="0011"; --immetto il numero 3
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 3-clock <= '0';
numin <="0101"; --immetto il numero 5
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 2-clock <= '0';
numin <="0010"; --immetto il numero 2
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 4-clock <= '0';
numin <=“0111"; --immetto il numero 7
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
--ciclo 5-clock <= '0';
numin <=“0000"; --immetto il numero 0
wait for clock_period/2;
clock <= '1';
wait for clock_period/2;
Simulazione Behavioral
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 è
inferiore a due nanosecondi