Salta al contenuto
Note per Studenti Esercizio 23 · quiz su VHDL, assegnazioni, process e flip-flop (temi d'esame 2022-2026)

Esercizio 23quiz su VHDL, assegnazioni, process e flip-flop (temi d'esame 2022-2026)

Esame
In questa pagina 5

Testo (domande a risposta multipla dei temi d'esame giugno 2022, luglio 2022, settembre 2022, febbraio 2023, settembre 2025 e giugno 2026 sul linguaggio VHDL: frammenti di codice da interpretare e stili di descrizione). Nelle prove scritte ce ne sono da due a quattro su venti. Per ogni domanda: risposta e motivo. Le risposte sono ricavate dalla teoria del corso.


Teoria usata: 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 →, VHDL - istruzioni concorrenti, process e testbenchLe istruzioni concorrenti VHDL sono l'assegnazione di segnale, when-else (logica prioritaria, condizioni valutate in ordine) e with-select (logica parallela: tutti i casi coperti da una sola scelta, others obbligatorio). Un process è un'istruzione concorrente il cui corpo è sequenziale (if, case, loop); parte quando cambia un segnale della sensitivity list (per la logica combinatoria: tutti gli ingressi); i segnali si aggiornano alla sospensione e vince l'ultima assegnazione. Un if senza else (o un caso non coperto) crea memoria non voluta. Il testbench è codice di simulazione con entity vuota, DUT istanziato e un process di stimoli con wait.VHDL - istruzioni concorrenti, process e testbench →, 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 →.

Come si legge un frammento: due regole

  1. Fuori da un process (nel corpo dell'architecture) le istruzioni sono concorrenti: sono tutte attive insieme. Due assegnazioni allo stesso segnale sono due driver che pilotano lo stesso filo: se i valori sono diversi il segnale vale 'X' (conflitto), e il sintetizzatore dà errore.
  2. Dentro un process le istruzioni sono sequenziali e il segnale si aggiorna solo quando il process si sospende (fine del corpo o wait): se è assegnato più volte vale l'ultima assegnazione.

Frammenti di codice

tema domanda risposta motivo
giu 2022 (11) Nel corpo di un'architecture: a <= '1'; a <= '0'; con a uscita std_logic nessuna delle precedenti sono istruzioni concorrenti: due driver con valori diversi, il segnale diventa 'X'; non è vero che "non genera errori" e non vale solo in un testbench
feb 2023 (12) Nel corpo di un'architecture: a <= (others => '0'); a <= X"01"; con a vettore a 8 bit è errato X"01" ha 8 bit e sarebbe lecito, ma le due assegnazioni concorrenti sono due driver: il bit 0 vale '0' per una e '1' per l'altra, quindi 'X'
feb 2023 (11) Dentro un process: a <= (others => '0'); a <= '1'; wait; con a vettore a 8 bit è errato '1' è un std_logic, non un std_logic_vector: il tipo non è compatibile con a. Per assegnare un vettore serve una stringa di 8 bit o un aggregato ((others => '1'))
set 2022 (11) Dentro un process: a(3 downto 0) <= "1111"; a <= (others => '0'); wait; con a vettore a 8 bit pone a=0a=0 per la stessa uscita vince l'ultima assegnazione, che azzera tutti gli 8 bit; la prima è sovrascritta
giu 2026 (11) process(b) begin a <= b; a <= not b; end process; crea logica combinatoria vale l'ultima assegnazione: a=b‾a=\overline b, un inverter. Non c'è clock né if che ricordi un valore: nessun elemento di memoria, e il segnale non alterna a ogni ciclo

Flip-flop e latch nel codice

tema domanda risposta motivo
lug 2022 (11) process(clk, rst): if rst = '1' then a <= '0'; else if clk'event and clk = '0' then a <= b; ... flip-flop negative edge-triggered con reset asincrono rst è nella sensitivity list e viene controllato fuori dal test sul fronte: agisce a prescindere dal clock (asincrono). Il fronte è clk = '0' dopo clk'event: discendente
set 2025 (19) process(CLK) if CLK'event and CLK = '0' then if RST = '1' then Q <= '0'; else Q <= D; flip-flop negative edge triggered con reset attivo alto RST è controllato dentro il test del fronte: reset sincrono. Il reset a '1' azzera: attivo alto. Con RST nella lista di sensibilità sarebbe asincrono; qui la lista contiene solo CLK

Schema per riconoscere il tipo. Fronte: clk'event and clk = '1' (o rising_edge) →\to positivo, '0' →\to negativo. Il reset è asincrono se sta nella lista di sensibilità e viene testato prima (fuori) del fronte, sincrono se è testato dentro il ramo del fronte. Un if senza else fuori dal fronte e senza clock descrive un latch.

Stili di descrizione

tema domanda risposta motivo
giu 2022 (12), set 2022 (12), giu 2026 (12) Una descrizione dataflow: (sintesi sempre più ottimizzata / solo istanziazioni / usa soprattutto if e case / solo equazioni booleane / simulabile ma mai sintetizzabile / definisce la struttura fisica) nessuna delle precedenti il dataflow descrive il flusso dei dati con assegnazioni concorrenti: equazioni booleane, ma anche when-else e with-select; è sintetizzabile; if e case sono del behavioral, le istanziazioni dello structural; il risultato in sintesi non è "sempre più ottimizzato"
lug 2022 (12) Una descrizione structural: (sempre più ottimizzata del behavioral / solo equazioni booleane) nessuna delle altre lo structural elenca componenti e collegamenti (istanziazioni); la qualità della sintesi dipende dal sintetizzatore, non dallo stile
set 2025 (17) La descrizione VHDL di un encoder: può usare uno stile structural, dataflow o behavioral (o una combinazione) lo stile non è obbligato; un'entity può avere più architecture e i component si possono usare
set 2025 (18) Descrizione VHDL di un blocco sequenziale sincrono: nessuna delle precedenti il clock deve comparire nella entity come ingresso (in), dichiarato nella port: non come uscita e non come segnale interno
set 2025 (20) case S is when "00" => Y <= D0; ... when "11" => Y <= D3; con S a 2 bit e quattro dati un multiplexer SS sceglie quale dei quattro ingressi arriva all'uscita unica: MUX 4-to-1 (Multiplexer e funzioni logiche realizzate con decoder e multiplexerIl multiplexer (MUX) $2^n$-to-1 ha $2^n$ ingressi dati, $n$ ingressi di selezione e un'uscita che copia l'ingresso selezionato: $Y=\sum_i m_i(S),I_i$. Si realizza con decoder + AND di enable + OR (costo 22 per il 4-to-1) o direttamente (costo 18). Un MUX $2^n$-to-1 realizza qualunque funzione di $n$ variabili (ingressi dati = colonna della tabella di verità); con un MUX $2^{n-1}$-to-1 si usano le $n-1$ variabili come selezione e gli ingressi dati valgono $0$, $1$, $X$ o $\overline X$ (l'ultima variabile). I MUX a vettori selezionano gruppi di bit.Multiplexer e funzioni logiche realizzate con decoder e multiplexer →). Un decoder avrebbe più uscite, un encoder più ingressi che indicano un indice

Errori comuni

  • Credere che un process sia sequenziale "in tempo": le istruzioni sono sequenziali, ma i segnali si aggiornano solo alla fine (conta l'ultima assegnazione).
  • Pensare che, di due assegnazioni concorrenti allo stesso segnale, valga l'ultima: fuori dal process sono due driver in conflitto.
  • Scambiare reset sincrono e asincrono: guardare la sensitivity list e dove è il test del reset rispetto al fronte.
  • Confondere stile dataflow (equazioni concorrenti) con behavioral (process con if e case) e structural (componenti).
  • Assegnare un '1' a un vettore senza aggregato (others) o una stringa.

Versione ripasso

Teoria collegata