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