Una rete sequenziale asincrona e' caratterizzata da due segnali di ingresso X1, X2 (i quali non cambiano mai contemporaneamente) e da un segnale di uscita Z. Quando il segnale X1 e' attivo (livello logico 1), Z deve assumere il valore 0. Quando il segnale X1 e' disattivo (livello logico 0), Z deve assumere il valore 1 se e soltanto se il segnale X2 ha presentato nel precedente intervallo di attivazione di X1 un numero pari (0, 2, 4,...) di variazioni.
Codice VHDL library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ex_7_asincrone is Port (reset : in STD_LOGIC; X1 : in STD_LOGIC; X2 : in STD_LOGIC; Z : out STD_LOGIC); end ex_7_asincrone; architecture Behavioral of ex_7_asincrone is signal start_X2 : STD_LOGIC := '0'; signal previous_X1 : STD_LOGIC := '0'; begin program: process(X1, X2, previous_X1, start_X2, reset) is begin if (reset = '1') then previous_X1 <= '0'; start_X2 <= '0'; Z <= '0'; else if (X1 /= previous_X1) then previous_X1 <= X1; if (X1 = '1') then start_X2 <= X2; Z <= '0'; else if (X2 /= start_X2) then Z <= '0'; else Z <= '1'; end if; end process program; end Behavioral; Si utilizza un unico processo ("program") per controllare il funzionamento della rete. Massima priorità è data al reset, che se attivo azzera i valori dei segnali interni e dell'uscita. Per limitare l'azione della sensitivity list, che scatenerebbe l'attivazione del process ad una qualunque variazione di un qualunque segnale, si utilizza il segnale interno previous_X1 per memorizzare l'ultimo valore assunto da X1 in modo da poter essere confrontato con l'attuale e consentire l'esecuzione del processo solo quando c'è un reale cambiamento dell'ingresso X1. Individuato il cambiamento di X1, si verifica se questo corrisponde a un fronte di salita o a uno di discesa del segnale stesso: nel caso sia di salita, si pone Z = '0' e si memorizza l'attuale valore di X2 sul segnale interno start_X2. Nel caso sia di discesa, si controlla se vi e' stato un numero pari o dispari di variazioni di X2 durante il periodo di attivazione di X1 effettuando un confronto tra il segnale interno start_X2 e l'attuale valore di X2, e si imposta l'uscita Z di conseguenza: se i due valori sono diversi tra di loro è evidente che il numero di variazioni è dispari. Segnali interni start_X2 e previous_X1 Si controlla se è avvenuto un cambiamento di X1 Si imposta Z in base al numero di variazioni di X2 (pari o dispari) Discrimina tra fronte di salita e fronte di discesa di X1
Simulazione behavioral Segnale di reset Segnale di uscita Segnali di ingresso 0 variazioni di X2 durante l'attivazione di X1 1 variazione 2 variazioni 3 variazioni 4 variazioni
Simulazione post-route Segnale di reset Segnale di uscita Segnali di ingresso 0 variazioni di X2 durante l'attivazione di X1 1 variazione 2 variazioni 3 variazioni 4 variazioni Ritardi sull'uscita