Percorso S Una rete sequenziale asincrona ha il compito di gestire il comportamento di un cursore che si muove in un percorso ad S. Tramite due segnali di ingresso X0 e X1 l’utente indica in quale direzione vuole muovere il cursore: X1 X0 Il sistema da uscita positiva quando il cursore giunge alla fine del suo percorso. Il cursore non può mai muoversi di più di una casella nella stessa direzione, né muoversi in direzione opposta a quella da cui proviene. Se l’utente sceglie la direzione sbagliata il cursore viene riportato nella posizione iniziale. Una volta che il cursore è giunto a fine percorso, qualsiasi direzione consentita viene scelta, il cursore viene riportato nella posizione iniziale. Il sistema è dotato anche di un segnale di reset, che quando è a ‘1’ riporta il cursore nella posizione iniziale. Reti Logiche – Galassi Andrea – Prof. Neri Giovanni Diagramma degli stati (Moore) Lo stato A è lo stato iniziale, corrisponde alla posizione 1 nel percorso Gli stati B, C, D ed E sono gli stati intermedi del percorso, corrispondono rispettivamente alle posizioni 2, 3, 4 e 5 del percorso. Lo stato F è lo stato finale del percorso, l’unico che da uscita positiva. Corrisponde alla posizione 6. Gli stati G, H, I e L sono gli stati intermedi che riportano il cursore nella posizione iniziale se il percorso è finito o se è stata scelta la direzione sbagliata. Corrispondono alle posizioni 5, 4, 3, e 2. Tabella delle transizioni X1 X0 A, 0 B, 0 C, 0 D, 0 E, 0 F, 1 G, 0 H, 0 I, 0 L, 0 00 01 11 10 A B A A A B C - - L C D I - E D - F E H G F G - H H H H I I I I L L L L A A A A In verde gli stati stabili. In grigio le indifferenze. Gli stati transitori G, H, I e L non sono stabili per nessuna configurazione degli ingressi Tabella Triangolare Non vi sono stati compatibili Variabili di stato Poiché abbiamo 10 stati dovremo usare 4 variabili di stato. Dopo un’analisi del comportamento del circuito attribuiamo un valore binario ad ogni stato in modo che non vi siano corse critiche: ogni stato differisce dal precedente solo per il valore di una variabile di stato A B C D E F G H I L 1000 0000 0001 0011 0010 0110 1110 1010 1011 1001 Tabella delle Transizioni 2 X1 X0 00 01 11 10 A 1000, 0 1000 0000 1000 1000 B 0000, 0 1000 0000 0001 C 0001, 0 - D 0011, 0 1011 E 0010, 0 - - 1001 0001 0011 - 0010 0011 0110 0010 1010 F 0110, 1 1110 0110 1110 G 1110, 0 1010 1010 1010 1010 H 1010, 0 1011 1011 1011 1011 I 1011, 0 1001 1001 1001 1001 L 1001, 0 1000 1000 1000 1000 - In verde gli stati stabili In grigio le indifferenze Gli stati G, H, I e L non sono stabili per nessun ingresso, essi infatti sono stati transitori che servono esclusivamente per riportare il cursore allo stato A Per essi e per A non sono previste indifferenze poiché sono raggiungibili con tutti e 4 le configurazioni di ingresso Mappe di Karnaugh Y3=0 Y2=0 Y3=0 Y2=1 X1 X0 y1 y0 00 B 0 0 C 0 1 - D 1 1 1011 E 1 0 - 01 11 1000 0000 0001 Y3=1 Y2=0 10 y1 y0 00 01 11 10 - 0 0 - - - - 0 1 - - - - 1 1 - - - - 1 0 1001 0001 0011 - X1 X0 0010 0011 0110 0010 1010 F X1 X0 Y3=1 Y2=1 1110 0110 1110 - X1 X0 y1 y0 00 01 11 10 1000 0000 1000 1000 0 0 - - - - 1 1000 1000 1000 1000 0 1 - - - - 1 1 1001 1001 1001 1001 1 1 - - - - 1 0 1011 1011 1011 1011 1 0 y1 y0 A 0 0 L 0 I H 00 01 11 10 G 1010 1010 1010 1010 Formule Y0= !R*(!Y3*!Y1*X1 + !Y3*Y0*!X0 + !Y3*Y0*!X1 + Y3*!Y2*Y1) Y1= !R*(Y1*!Y0 + !Y3*X1*!X0 + !Y3*Y1) Y2= !R*(!Y3*Y1*!Y0*!X1 + !Y3*Y2) = !R*!Y3*(Y1*!Y0*!X1 + Y2) Y3= R+(Y0*!X1 + !Y0*!X0 + Y2*X1 + Y3*Y1 + Y3*X1) Z= !R*!Y3*Y2 R è il segnale di RESET. Se positivo il sistema deve tornare nello stato A (1000) con uscita 0. VHDL Testbench Per verificare il corretto funzionamento del circuito, prima lo resettiamo, poi simuliamo 3 diverse eventualità: 1. Un reset durante il percorso 2. Un errore durante il percorso 3. Un percorso che giunge fino alla fine Test Reset e Percorso Errato --verifico il funzionamento del reset X<="01"; --Input corretto -> Stato B:0000 wait for CK_period*10; X<="11"; --Input corretto -> Stato C:0001 wait for CK_period*10; Reset <='1'; --Resetto -> Stato A:1000 wait for CK_period*10; Reset <='0'; wait for CK_period*10; --Simulo un percorso errato (A->B->C->A) X<="01"; --Input corretto -> Stato B:0000 wait for CK_period*10; X<="11"; --Input corretto -> Stato C:0001 wait for CK_period*10; X<="10"; --Input corretto -> Stato D:0011 wait for CK_period*10; X<="00"; --Input errato --Torno al punto di partenza: Stati I->L->A wait for CK_period*10; Test Percorso Corretto --simulo un percorso corretto --A->B->C->D->E->F X<="01"; --Input corretto -> Stato B:0000 wait for CK_period*10; X<="11"; --Input corretto -> Stato C:0001 wait for CK_period*10; X<="10"; --Input corretto -> Stato D:0011 wait for CK_period*10; X<="11"; --Input corretto -> Stato E:0010 wait for CK_period*10; X<="01"; --Input corretto -> Stato F:0110, Uscita 1 wait for CK_period*10; --percorso corretto terminato --torno nella posizione iniziale X<="11"; --Stati G->H->I->L->A wait for CK_period*10; Simulazione Behavioral Simulazione Post Route Il comportamento è lo stesso della simulazione behavioral, fatta eccezione per i ritardi e le corse che si verificano quando il circuito deve tornare nello stato A