Esercizio 9descrizione VHDL con ingresso a due bit x1x0 (tema d'esame settembre 2022)
In questa pagina 4
Testo (tema d'esame settembre 2022, terzo appello, esercizio 3). Descrivere in VHDL la macchina a stati finiti con ingresso 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): ingresso a due bit, uscita a due bit; stati (, stato iniziale con ), (), (), ();
- se ;
- se ;
- senza condizione (arco senza etichetta);
- se or ;
- senza 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 →, Introduzione al VHDL - entity, architecture, tipi e livelli di descrizioneVHDL è un linguaggio di descrizione dell'hardware (HDL), non di programmazione: le dichiarazioni sono concorrenti e descrivono blocchi di circuito; serve per documentare, simulare e sintetizzare. Un blocco ha una entity (nome e porte in/out) e almeno una architecture (cosa c'è dentro: structural con component e port map, dataflow con equazioni booleane, behavioral con comportamento). Tipi: std_logic (da 1164: '0','1','X','Z','U','-',...), std_logic_vector, bit, boolean, integer. Signal per i collegamenti interni, constant per i valori fissi.Introduzione al VHDL - entity, architecture, tipi e livelli di descrizione → (vettori e confronti).
Passo 1: analisi
È una macchina di Moore (uscita nello stato). L'ingresso è un vettore a due bit x(1 downto 0), con il bit più significativo: i confronti si fanno con valori tra virgolette, x = "10". Rispetto all'esercizio gemello di luglio (Esercizio 6 · descrizione VHDL di una macchina di Moore con uscita a due bit (tema d'esame luglio 2022)) cambiano le condizioni e va in sempre.
| stato | |||||
|---|---|---|---|---|---|
| 00 | |||||
| 01 | |||||
| 11 | |||||
| 10 |
( se o , cioè se non vale : l'unico caso in cui resta in .)
Passo 2: codice VHDL
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm_x2 is
port ( clk, rst : in std_logic;
x : in std_logic_vector(1 downto 0); -- x(1) = x1, x(0) = x0
y : out std_logic_vector(1 downto 0) );
end fsm_x2;
architecture beh of fsm_x2 is
type state_type is (S0, SA, S2, SB);
signal state, next_state : state_type;
begin
-- memoria
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;
-- stato futuro (logica combinatoria)
next_state_comb : process (state, x)
begin
next_state <= state; -- default
case state is
when S0 =>
if x = "10" then next_state <= SA;
elsif x = "01" then next_state <= SB;
end if;
when SA =>
next_state <= S2; -- senza condizione
when SB =>
if x(0) = '0' or x(1) = '0' then next_state <= S2; end if;
when S2 =>
next_state <= S0;
end case;
end process;
-- uscita (Moore)
output_comb : process (state)
begin
case state is
when S0 => y <= "00";
when SA => y <= "01";
when S2 => y <= "11";
when SB => y <= "10";
end case;
end process;
end beh;La condizione di si può scrivere anche if x /= "11" then .... Per non c'è nessun if: l'arco senza etichetta si traduce in un'assegnazione incondizionata.
Passo 3: sequenza di verifica
Per un eventuale testbench: dopo il reset, la sequenza di ingressi = 10, 00, 11, 01, 11, 10, 00, 11 percorre tutte le 7 transizioni del diagramma:
| ciclo | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 10 | 00 | 11 | 01 | 11 | 10 | 00 | 11 | |
| stato presente | ||||||||
| 00 | 01 | 11 | 00 | 10 | 10 | 11 | 00 | |
| stato futuro |
(Ciclo 4: in , resta; ciclo 5: , , va in .)
Errori comuni
- Confondere l'ordine dei bit:
x = "10"significa (constd_logic_vector(1 downto 0)). - Mettere una condizione sull'arco che nel testo non c'è.
- Confondere "or" e "and" nella condizione di : si esce se almeno uno dei bit vale 0.
Versione ripasso
- Testo. FSM Moore con ingresso e uscita (2 bit): ; ; altrove resta.
- VHDL:
x : in std_logic_vector(1 downto 0); confrontix = "10"; :if x(0)='0' or x(1)='0'(equivale ax /= "11"); incondizionato; Mooreprocess(state). - Tabella: per ; ; ; .
- Testbench:
10,00,11,01,11,10,00,11percorre tutte le transizioni (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: ordine dei bit; condizione inventata su ; and/or scambiati.