Esercizio 6descrizione VHDL di una macchina di Moore con uscita a due bit (tema d'esame luglio 2022)
In questa pagina 4
Testo (tema d'esame luglio 2022, secondo appello, esercizio 3). Descrivere in VHDL la macchina a stati finiti con ingressi e e uscita , avente il seguente diagramma degli stati. In tutti i casi non indicati, il sistema non cambia stato. Separare nel codice gli elementi di memoria dalle parti puramente combinatorie.
Diagramma (dalla figura del tema): stati (), (), (), (), con stato iniziale (reset );
- se and ;
- se and ;
- se ;
- se or ;
- (arco senza etichetta: nessuna condizione).
Teoria usata: VHDL - macchine a stati finiti e testbench sequenzialeUna macchina a stati finiti (FSM) si descrive in VHDL, in stile behavioral, con un tipo enumerato per gli stati e tre process: (1) registro di stato con reset (asincrono) e aggiornamento state<=next_state sul fronte; (2) stato futuro come funzione combinatoria di stato e ingresso (case state, default next_state<=state); (3) uscita come funzione combinatoria di stato (Moore) o di stato e ingresso (Mealy). Il testbench ha il process del clock e il process degli ingressi (reset iniziale, sequenza di test che percorre tutti gli stati).VHDL - macchine a stati finiti e testbench sequenziale →, VHDL - latch, flip-flop e reset sincrono e asincronoIn VHDL un elemento di memoria si descrive con un process il cui ramo non assegna sempre il segnale: latch D = process(D,C) con if C='1' then Q<=D; flip-flop positive-edge-triggered = process(CLK) con if CLK'event and CLK='1'. Reset asincrono: RST nella sensitivity list e testato per primo (if RST='1' ... elsif fronte); reset sincrono: solo CLK in lista e RST testato dentro al ramo del fronte (serve un fronte per averne effetto). Il testbench di un circuito sincrono ha un process che genera il clock e uno che applica gli ingressi lontano dal fronte attivo.VHDL - latch, flip-flop e reset sincrono e asincrono →.
Passo 1: Moore, uscite e tabella
Il valore di è scritto dentro lo stato: macchina di Moore, quindi dipende solo dallo stato e il process dell'uscita ha nella lista di sensibilità solo state. Uscita a due bit: std_logic_vector(1 downto 0).
| stato | |||||
|---|---|---|---|---|---|
| 00 | |||||
| 01 | |||||
| 11 | |||||
| 10 |
( se , cioè per e . se o : tutte le combinazioni tranne .)
Passo 2: codice
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm_moore is
port ( clk, rst : in std_logic;
x, y : in std_logic;
w : out std_logic_vector(1 downto 0) );
end fsm_moore;
architecture beh of fsm_moore is
type state_type is (S0, SA, S2, SB);
signal state, next_state : state_type;
begin
-- memoria: registro di stato con reset asincrono
state_register : process (clk, rst)
begin
if rst = '1' then
state <= S0;
elsif clk'event and clk = '1' then
state <= next_state;
end if;
end process;
-- combinatoria: stato futuro
next_state_comb : process (state, x, y)
begin
next_state <= state; -- default: non cambia stato
case state is
when S0 =>
if x = '1' and y = '0' then
next_state <= SA;
elsif x = '0' and y = '1' then
next_state <= SB;
end if;
when SA =>
if x = '1' then next_state <= S2; end if;
when SB =>
if x = '0' or y = '1' then next_state <= S2; end if;
when S2 =>
next_state <= S0;
end case;
end process;
-- combinatoria: uscita di Moore (solo lo stato)
output_comb : process (state)
begin
case state is
when S0 => w <= "00";
when SA => w <= "01";
when S2 => w <= "11";
when SB => w <= "10";
end case;
end process;
end beh;Il case dell'uscita elenca tutti e quattro gli stati: nessuna memoria involontaria. Un'alternativa compatta è un with state select w <= "00" when S0, "01" when SA, "11" when S2, "10" when SB; fuori da un process.
Passo 3: comportamento atteso (per un eventuale testbench)
Il testo qui non chiede il testbench, ma conviene sapere la sequenza che percorre tutte le 8 transizioni, con ingressi applicati ai fronti di discesa dopo il reset:
| ciclo | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 10 | 00 | 10 | 00 | 01 | 10 | 01 | 11 | 00 | |
| stato presente | |||||||||
| (stato presente) | 00 | 01 | 01 | 11 | 00 | 10 | 10 | 11 | 00 |
| stato futuro |
Essendo Moore, cambia solo sul fronte di salita, con la sequenza (nell'ordine in cui si attraversano gli stati). Rispetto a una macchina di Mealy non ci sono variazioni di tra due fronti.
Errori comuni
- Mettere
xeynella lista di sensibilità del process dell'uscita (o usarli): la renderebbe una Mealy. - Dimenticare l'arco non condizionato.
- Confondere le condizioni di : si esce con oppure , non con entrambe.
- Scrivere
w <= 01;senza virgolette: un vettore di bit va tra doppi apici.
Versione ripasso
- Testo. FSM con ingressi e uscita (2 bit): ; ; altrove resta. VHDL con memoria separata.
- Moore: uscita dipende solo dallo stato
process (state)concase. Tabella: , , , per . - Codice: tipo
(S0,SA,S2,SB); process 1 reset asincrono; process 2 con defaultnext_state <= state;; process 3w <= "00"/"01"/"11"/"10". - Testbench di riferimento:
10,00,10,00,01,10,01,11,00visita tutti gli stati; (VHDL - macchine a stati finiti e testbench sequenzialeUna macchina a stati finiti (FSM) si descrive in VHDL, in stile behavioral, con un tipo enumerato per gli stati e tre process: (1) registro di stato con reset (asincrono) e aggiornamento state<=next_state sul fronte; (2) stato futuro come funzione combinatoria di stato e ingresso (case state, default next_state<=state); (3) uscita come funzione combinatoria di stato (Moore) o di stato e ingresso (Mealy). Il testbench ha il process del clock e il process degli ingressi (reset iniziale, sequenza di test che percorre tutti gli stati).VHDL - macchine a stati finiti e testbench sequenziale →). - Errori: Moore con ingressi; arco mancante; apici sbagliati.