Esercizio 23quiz su VHDL, assegnazioni, process e flip-flop (temi d'esame 2022-2026)
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
- 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. - 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 | 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: , 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) positivo, '0' 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 | 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
ifecase) e structural (componenti). - Assegnare un
'1'a un vettore senza aggregato (others) o una stringa.
Versione ripasso
- Concorrenti (nell'architecture): due assegnazioni allo stesso segnale due driver, conflitto
'X'. Process: sequenziale, aggiornamento alla sospensione, vince l'ultima assegnazione (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 →). process(b) a<=b; a<=not b;combinatorio, .a(3 downto 0)<="1111"; a<=(others=>'0').'1'a un vettore: errore di tipo.- Flip-flop: fronte
clk='1'positivo /'0'negativo; reset asincrono se in lista e testato fuori dal fronte, sincrono se dentro (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 →). Lug 2022: negativo, reset asincrono. Set 2025: negativo, reset sincrono attivo alto. - Stili: dataflow = assegnazioni concorrenti (non solo equazioni), structural = componenti, behavioral = process; l'encoder può usare qualunque stile; il clock è ingresso nell'
entity. case Sa 2 bit su multiplexer.- Errori: ultima assegnazione, driver doppi, reset sincrono/asincrono, tipi.