Salta al contenuto
Note per Studenti Esercizio 9 · descrizione VHDL con ingresso a due bit x1x0 (tema d'esame settembre 2022)

Esercizio 9descrizione VHDL con ingresso a due bit x1x0 (tema d'esame settembre 2022)

Esame
In questa pagina 4

Testo (tema d'esame settembre 2022, terzo appello, esercizio 3). Descrivere in VHDL la macchina a stati finiti con ingresso xx e uscita yy, 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 x=x1x0x=x_1x_0 a due bit, uscita yy a due bit; stati S0S_0 (y=00y=00, stato iniziale con rst=1rst=1), SAS_A (y=01y=01), S2S_2 (y=11y=11), SBS_B (y=10y=10);

  • S0→SAS_0\to S_A se x1x0=10x_1x_0=10;
  • S0→SBS_0\to S_B se x1x0=01x_1x_0=01;
  • SA→S2S_A\to S_2 senza condizione (arco senza etichetta);
  • SB→S2S_B\to S_2 se x0=0x_0=0 or x1=0x_1=0;
  • S2→S0S_2\to S_0 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 yy nello stato). L'ingresso è un vettore a due bit x(1 downto 0), con x1x_1 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 SAS_A va in S2S_2 sempre.

stato yy x=00x=00 0101 1010 1111
S0S_0 00 S0S_0 SBS_B SAS_A S0S_0
SAS_A 01 S2S_2 S2S_2 S2S_2 S2S_2
S2S_2 11 S0S_0 S0S_0 S0S_0 S0S_0
SBS_B 10 S2S_2 S2S_2 S2S_2 SBS_B

(SB→S2S_B\to S_2 se x0=0x_0=0 o x1=0x_1=0, cioè se non vale x=11x=11: l'unico caso in cui resta in SBS_B.)

Passo 2: codice VHDL

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 SBS_B si può scrivere anche if x /= "11" then .... Per SAS_A 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 x1x0x_1x_0 = 10, 00, 11, 01, 11, 10, 00, 11 percorre tutte le 7 transizioni del diagramma:

ciclo 0 1 2 3 4 5 6 7
x1x0x_1x_0 10 00 11 01 11 10 00 11
stato presente S0S_0 SAS_A S2S_2 S0S_0 SBS_B SBS_B S2S_2 S0S_0
yy 00 01 11 00 10 10 11 00
stato futuro SAS_A S2S_2 S0S_0 SBS_B SBS_B S2S_2 S0S_0 S0S_0

(Ciclo 4: x=11x=11 in SBS_B, resta; ciclo 5: x=10x=10, x0=0x_0=0, va in S2S_2.)

Errori comuni

  • Confondere l'ordine dei bit: x = "10" significa x1=1,x0=0x_1=1,x_0=0 (con std_logic_vector(1 downto 0)).
  • Mettere una condizione sull'arco SA→S2S_A\to S_2 che nel testo non c'è.
  • Confondere "or" e "and" nella condizione di SBS_B: si esce se almeno uno dei bit vale 0.

Versione ripasso

Teoria collegata