Esercizio 18quesiti rapidi sul VHDL (temi d'esame 2024-2026)
In questa pagina 11
Quesiti a risposta multipla sul VHDL dai temi di giugno 2024 (e luglio 2025), settembre 2024 (e settembre 2026), giugno 2025 e luglio 2026. Chiave ufficiale solo per giugno 2024 / luglio 2025.
Teoria usata: VHDL - struttura, tipi di dato e processiVHDL è un linguaggio di descrizione dell'hardware: un listato non è una sequenza di istruzioni eseguite da un processore ma la descrizione di un circuito, che la sintesi traduce in uno schema (LUT, flip-flop, multiplexer). Ogni modulo ha una entity (interfaccia: port con modo in, out, inout e tipo; eventuali generic) e una architecture (parte dichiarativa: segnali, costanti, componenti; parte assertiva dopo begin: assegnazioni concorrenti e processi). Le istruzioni nell'architecture sono concorrenti: l'ordine in cui sono scritte non conta. Un process esegue le proprie istruzioni in modo sequenziale quando un segnale della lista di sensibilità cambia. Segnali (<=, aggiornati alla fine del delta cycle, definiti nella parte dichiarativa) e variabili (:=, immediate, solo dentro il processo) hanno semantica diversa. Tipi: bit, boolean, integer, std_logic (a 9 valori, tra cui 'Z', 'X', 'U'), std_logic_vector, unsigned e signed (numeric_std).VHDL - struttura, tipi di dato e processi →, VHDL - logica sequenziale e registriIn VHDL la logica sequenziale si descrive con processi sensibili al clock. Un registro D (flip-flop sul fronte) si scrive process(clk) con if rising_edge(clk); un latch è un processo sensibile al livello (if clk='1' then q<=d) senza altri rami. Il reset è sincrono se testato dentro rising_edge(clk) (la lista di sensibilità contiene solo clk), asincrono se testato prima, con RST nella lista di sensibilità (if rst='1' then ... elsif rising_edge(clk)). Registri a n bit con generic, registri a scorrimento (con load), contatori (up/down, con enable) si ottengono con la stessa struttura. In un progetto sincrono tutti i registri usano lo stesso clock (nessun clock generato da logica: si usano abilitazioni), i segnali esterni asincroni come i pulsanti si campionano con uno o più flip-flop (debouncing) e le cifre di un display si multiplexano con un contatore.VHDL - logica sequenziale e registri →, VHDL - logica combinatoriaUna logica combinatoria in VHDL si descrive con assegnazioni concorrenti (semplici, condizionate when-else con priorità, selezionate with-select senza priorità) o con processi sensibili a tutti gli ingressi (if/elsif, case). Nel processo ogni uscita va assegnata in tutti i rami e la lista di sensibilità deve contenere tutti i segnali letti: altrimenti la sintesi inferisce un latch (memoria). L'aritmetica si fa con unsigned/signed di numeric_std (to_unsigned, to_integer, resize, conversioni di tipo) e con un bit in più per il riporto. Cicli for e istruzioni generate creano hardware replicato (non cicli nel tempo). La descrizione strutturale istanzia componenti con component e port map (per posizione o per nome, anche con generic map), e permette di costruire sistemi gerarchici.VHDL - logica combinatoria →, Macchine a stati finiti in VHDLUna macchina a stati finiti (FSM) ha uno stato S(k) che evolve secondo la funzione di stato prossimo S(k+1) = F(S(k), X(k)) e produce uscite Y(k) = G(S(k), X(k)) (modello di Mealy: dipendono anche dall'ingresso, possono cambiare subito) oppure Y(k) = G(S(k)) (modello di Moore: dipendono solo dallo stato, cambiano solo ai fronti di clock). In VHDL si definisce un tipo enumerato per gli stati e si scrive in due processi: uno sequenziale (registro di stato con reset: state_reg <= state_next al fronte) e uno combinatorio (case sullo stato che assegna state_next, con un valore di default, e le uscite); lo stile a processo singolo registra anche le uscite. La progettazione parte dal diagramma degli stati, passa alla tabella di transizione e al codice.Macchine a stati finiti in VHDL →.
1. Tipo di reset (giugno 2024, luglio 2025)
Che tipo di reset implementa il codice?
process (CLK)
begin
if rising_edge(CLK) then
if RST = '1' then A <= '0';
else A <= B;
end if;
end if;
end process;a. sincrono; b. asincrono; c. il codice è errato e non implementa alcun reset.
Risposta: a. Il reset è testato dentro rising_edge(CLK) e la lista di sensibilità contiene solo CLK: ha effetto solo al fronte di clock. Un reset asincrono sarebbe if RST='1' then A<='0'; elsif rising_edge(CLK) then A<=B; end if; con RST nella lista di sensibilità.
2. Macchina a stati finiti (giugno 2024, luglio 2025, giugno 2025)
Il codice: un tipo FSM_type is (idle, counting); un processo (RST, CLK) con if RST='1' then state_reg<=idle; elsif rising_edge(CLK) then state_reg<=state_next;; un secondo processo (state_reg, START) con state_next<=state_reg; e case state_reg is when idle => CHECK<='0'; if START='1' then state_next<=counting; ... when counting => CHECK<='1'; if START='0' then state_next<=idle; ... implementa: a. una FSM di Mealy a doppio processo; b. una FSM di Moore a doppio processo; c. una FSM di Moore a singolo processo.
Risposta: b. Ci sono due processi (registro di stato e logica combinatoria). CHECK è assegnata in funzione del solo state_reg ('0' in idle, '1' in counting; START determina solo state_next): macchina di Moore (Macchine a stati finiti in VHDLUna macchina a stati finiti (FSM) ha uno stato S(k) che evolve secondo la funzione di stato prossimo S(k+1) = F(S(k), X(k)) e produce uscite Y(k) = G(S(k), X(k)) (modello di Mealy: dipendono anche dall'ingresso, possono cambiare subito) oppure Y(k) = G(S(k)) (modello di Moore: dipendono solo dallo stato, cambiano solo ai fronti di clock). In VHDL si definisce un tipo enumerato per gli stati e si scrive in due processi: uno sequenziale (registro di stato con reset: state_reg <= state_next al fronte) e uno combinatorio (case sullo stato che assegna state_next, con un valore di default, e le uscite); lo stile a processo singolo registra anche le uscite. La progettazione parte dal diagramma degli stati, passa alla tabella di transizione e al codice.Macchine a stati finiti in VHDL →).
3. Segnali e processi (settembre 2024, giugno 2025, settembre 2026)
Nel VHDL un segnale: a. può essere definito all'interno di un processo; b. può essere usato all'interno di un processo; c. può essere usato solo all'esterno di un processo.
Risposta: b. I segnali si dichiarano nella parte dichiarativa dell'architecture (non nel processo, dove si dichiarano le variabili) e si usano (letti e assegnati) sia nelle istruzioni concorrenti sia nei processi.
4. Parte dichiarativa (settembre 2024, giugno 2025, settembre 2026)
La parte dichiarativa di un'architecture può essere utilizzata per: a. definire un segnale; b. definire un'assegnazione in logica combinatoria; c. definire un'assegnazione in logica sequenziale (dentro un processo).
Risposta: a. Prima di begin si dichiarano segnali, costanti, tipi e componenti; le assegnazioni sono nella parte assertiva (dopo begin).
5. Che cosa descrive un listato VHDL (settembre 2024, settembre 2026)
Un listato VHDL: a. rappresenta la sequenza delle istruzioni che un FPGA deve eseguire; b. descrive un apposito hardware che può essere convertito in uno schema circuitale con un processo di sintesi; c. definisce una funzionalità hardware senza mai descriverne l'architettura.
Risposta: b. VHDL è un linguaggio di descrizione dell'hardware: la sintesi lo traduce in LUT, flip-flop, multiplexer; non si esegue come un programma e descrive anche l'architettura (entity e architecture).
6. Processo con if/else e valore 'Z' (settembre 2024, settembre 2026)
Il processo: if sel='1' then oA<=iA; oB<=iB; oC<=iC; else oA<=iB; oB<='Z'; end if; descrive: a. mux ; b. porta AND, mux , NOT; c. buffer tri-state, mux , latch D.
Risposta: c. oA riceve iA o iB secondo sel: mux 2-1; oB riceve iB se sel='1', 'Z' altrimenti: buffer tri-state abilitato da sel; oC non è assegnato nel ramo else: mantiene il valore, quindi latch D (con enable sel).
7. Ordine dei processi (luglio 2026)
All'interno dell'architecture l'ordine con cui sono scritti i processi: a. determina la priorità di esecuzione; b. non modifica il comportamento del circuito; c. modifica il ritardo della sintesi.
Risposta: b. I processi sono istruzioni concorrenti: rappresentano blocchi hardware che lavorano in parallelo.
8. Latch inferito (luglio 2026)
Il codice: process(A,B) begin if A='1' then Y<=B; else null; end if; end process; : a. descrive una porta AND; b. può inferire memoria/latch perché mantiene il valore precedente; c. descrive un registro con enable.
Risposta: b. Per non è assegnata: mantiene il valore. È un latch trasparente per (non una AND, che richiederebbe else Y<='0', e non un registro: manca rising_edge).
9. Hardware di laboratorio (giugno 2024, luglio 2025)
- Gli otto display a 7 segmenti della scheda condividono i catodi: come visualizzare cifre diverse? b. Accendere ciclicamente un display alla volta con la cifra corretta (tecnica stroboscopica; per ciclo completo).
- Debouncing: a. campionare il segnale del pulsante con un opportuno segnale di clock e uno o più flip-flop (rimbalzi ).
Verifica
Le risposte sono ricavate dall'analisi dei codici (i listati sono quelli dei temi); la risposta ai punti 1, 2, 9 è confermata dalla chiave ufficiale.
Errori comuni
- Scambiare reset sincrono e asincrono (basta guardare dove si trova
RSTe la lista di sensibilità). - Chiamare Mealy una macchina la cui uscita dipende solo dallo stato.
- Dichiarare un segnale dentro un processo.
- Aspettarsi un'AND dal codice con
else null.
Versione ripasso
- Tipo di reset:
RSTè testato dentrorising_edge(CLK)e la sensibilità contiene soloCLK: reset sincrono (risposta a). L'asincrono avrebbeRSTnella sensibilità e il test prima del fronte (VHDL - logica sequenziale e registriIn VHDL la logica sequenziale si descrive con processi sensibili al clock. Un registro D (flip-flop sul fronte) si scrive process(clk) con if rising_edge(clk); un latch è un processo sensibile al livello (if clk='1' then q<=d) senza altri rami. Il reset è sincrono se testato dentro rising_edge(clk) (la lista di sensibilità contiene solo clk), asincrono se testato prima, con RST nella lista di sensibilità (if rst='1' then ... elsif rising_edge(clk)). Registri a n bit con generic, registri a scorrimento (con load), contatori (up/down, con enable) si ottengono con la stessa struttura. In un progetto sincrono tutti i registri usano lo stesso clock (nessun clock generato da logica: si usano abilitazioni), i segnali esterni asincroni come i pulsanti si campionano con uno o più flip-flop (debouncing) e le cifre di un display si multiplexano con un contatore.VHDL - logica sequenziale e registri →). - FSM con
idleecounting: due processi, registro di stato e logica combinatoria;CHECKdipende solo dastate_reg, quindi è una macchina di Moore a doppio processo (risposta b) (Macchine a stati finiti in VHDLUna macchina a stati finiti (FSM) ha uno stato S(k) che evolve secondo la funzione di stato prossimo S(k+1) = F(S(k), X(k)) e produce uscite Y(k) = G(S(k), X(k)) (modello di Mealy: dipendono anche dall'ingresso, possono cambiare subito) oppure Y(k) = G(S(k)) (modello di Moore: dipendono solo dallo stato, cambiano solo ai fronti di clock). In VHDL si definisce un tipo enumerato per gli stati e si scrive in due processi: uno sequenziale (registro di stato con reset: state_reg <= state_next al fronte) e uno combinatorio (case sullo stato che assegna state_next, con un valore di default, e le uscite); lo stile a processo singolo registra anche le uscite. La progettazione parte dal diagramma degli stati, passa alla tabella di transizione e al codice.Macchine a stati finiti in VHDL →). - Segnali e processi: un segnale si dichiara nella parte dichiarativa dell'architecture e si può usare sia nei processi sia nelle istruzioni concorrenti (risposta b). Le variabili invece si dichiarano dentro il processo.
- Parte dichiarativa: serve a definire segnali, costanti, tipi e componenti; le assegnazioni vanno nella parte assertiva dopo
begin(risposta a). - Listato VHDL: descrive un hardware che la sintesi traduce in uno schema circuitale; non è una sequenza di istruzioni eseguite dalla FPGA (risposta b) (VHDL - struttura, tipi di dato e processiVHDL è un linguaggio di descrizione dell'hardware: un listato non è una sequenza di istruzioni eseguite da un processore ma la descrizione di un circuito, che la sintesi traduce in uno schema (LUT, flip-flop, multiplexer). Ogni modulo ha una entity (interfaccia: port con modo in, out, inout e tipo; eventuali generic) e una architecture (parte dichiarativa: segnali, costanti, componenti; parte assertiva dopo begin: assegnazioni concorrenti e processi). Le istruzioni nell'architecture sono concorrenti: l'ordine in cui sono scritte non conta. Un process esegue le proprie istruzioni in modo sequenziale quando un segnale della lista di sensibilità cambia. Segnali (<=, aggiornati alla fine del delta cycle, definiti nella parte dichiarativa) e variabili (:=, immediate, solo dentro il processo) hanno semantica diversa. Tipi: bit, boolean, integer, std_logic (a 9 valori, tra cui 'Z', 'X', 'U'), std_logic_vector, unsigned e signed (numeric_std).VHDL - struttura, tipi di dato e processi →).
- Processo con
if sel='1' ... else oB<='Z':oAè un mux ,oBun buffer tri-state,oCnon assegnata nel ramoelseè un latch D (risposta c) (VHDL - logica combinatoriaUna logica combinatoria in VHDL si descrive con assegnazioni concorrenti (semplici, condizionate when-else con priorità, selezionate with-select senza priorità) o con processi sensibili a tutti gli ingressi (if/elsif, case). Nel processo ogni uscita va assegnata in tutti i rami e la lista di sensibilità deve contenere tutti i segnali letti: altrimenti la sintesi inferisce un latch (memoria). L'aritmetica si fa con unsigned/signed di numeric_std (to_unsigned, to_integer, resize, conversioni di tipo) e con un bit in più per il riporto. Cicli for e istruzioni generate creano hardware replicato (non cicli nel tempo). La descrizione strutturale istanzia componenti con component e port map (per posizione o per nome, anche con generic map), e permette di costruire sistemi gerarchici.VHDL - logica combinatoria →). - Ordine dei processi: le istruzioni dell'architecture sono concorrenti, quindi l'ordine non cambia il comportamento (risposta b).
- Latch inferito: con
if A='1' then Y<=B; else null;mantiene il valore per : è un latch, non una AND (risposta b). - Laboratorio: gli otto display si accendono uno alla volta (tecnica stroboscopica, ciclo di – ms); il debouncing campiona il pulsante con un clock e uno o più flip-flop.
- Errori: scambiare reset sincrono e asincrono; chiamare Mealy una macchina con uscita dipendente solo dallo stato; dichiarare un segnale dentro un processo; aspettarsi un'AND da
else null.