Operazioni aritmetiche e introduzione al VHDL
Sottrazione
Section titled “Sottrazione”La sottrazione funziona in modo simile alla somma; l’unico problema è rappresentare i numeri negativi. Si può realizzare una cella sottrattore a 1 bit con un input di prestito.
Codifica in complemento a 2
Section titled “Codifica in complemento a 2”Il complemento a 2 di un numero è dato da , dove è il numero di bit usati per rappresentare il numero.
Vantaggi della codifica in complemento a 2:
- se sommo 2 numeri positivi ottengo il risultato corretto;
- se sommo un positivo con un negativo ottengo la differenza;
- se sommo 2 negativi ottengo di nuovo il risultato corretto;
- c’è una sola rappresentazione per lo zero (niente zero positivo e zero negativo).
Per fare il complemento a 2 di un numero basterebbe fare . Però ci troviamo a dover eseguire un’altra sottrazione.
Possiamo raggirare il problema calcolando il complemento a 1: . Notiamo che è un numero con tutti , quindi il risultato della sottrazione con è semplicemente il complemento bit a bit di .
Per ottenere il complemento a 2 basta poi sommare al complemento a 1.
Realizzazione
Section titled “Realizzazione”Posso semplicemente usare un sommatore che prende in input il complemento a 2 del sottraendo.

Quindi posso aggiungere un XOR sui bit in entrata del sommatore, che si attiverà quando immetto un numero negativo. Inoltre per aggiungere 1 basta dare un segnale 1 al primo input del prestito.
Moltiplicazione
Section titled “Moltiplicazione”Il moltiplicatore a 1 bit funziona esattamente come una AND.

Per avere una moltiplicazione tra 2 moltiplicandi, uno da bit e l’altro da bit:
- Prendo il moltiplicando con bit.
- Per ogni suo -esimo bit faccio un AND tra quel bit e l’altro moltiplicando. Quindi ottengo o tutti 0 o il valore del moltiplicando.
- Sommo tutti gli risultati di ogni bit, traslati di bit a seconda del bit preso.
Quindi per fare la moltiplicazione di 2 numeri con bit servono fino a bit per il risultato.
Altre operazioni
Section titled “Altre operazioni”- divisione;
- radice quadrata;
- comparatori;
- rotazioni e shift (di bit);
- funzioni trigonometriche;
Possono tutte essere realizzate con porte logiche (almeno in maniera approssimata).
Linguaggi di descrizione dell’hardware
Section titled “Linguaggi di descrizione dell’hardware”A differenza dei linguaggi software (come il C compilato da gcc), non si ottimizza il codice per le prestazioni: bisogna ottimizzare il numero di porte utilizzate.
Concetti base di VHDL
Section titled “Concetti base di VHDL”L’entità è l’oggetto base del VHDL, corrisponde ad un blocco del circuito. Ogni entità è identificata da un nome e dispone di un certo numero di ingressi ed uscite.
-- entity entity_name is-- [port (interface_signal_declaration);]-- end [entity] entity_name;
entity full_adder is port ( a, b, cin : in bit; s, cout : out bit );end;L’architettura definisce il comportamento di un blocco. Ne descrive il funzionamento tramite equazioni, connessioni di altri blocchi o tramite un algoritmo.
Ogni entità può avere più architetture diverse.
-- architecture architecture_name of entity_name is-- [declarations]-- begin-- [architecture body]-- end [architecture] [architecture_name];
architecture componenti of full_adder is -- dichiarazioni di variabili, etc...begin -- descrizione dell'architetturaend;Se vogliamo fare un paragone con il C, l’entità è la dichiarazione di una funzione, mentre l’architettura ne è la definizione.
Stili di descrizione
Section titled “Stili di descrizione”- data flow o equazioni: descrivono il funzionamento tramite equazioni booleane
- esprimono la dipendenza delle uscite in funzione degli ingressi;
- vengono descritte tramite sistemi di equazioni;
- strutturale: collegamento di componenti in una gerarchia;
- behavioral (comportamentale): descrive il funzionamento tramite un algoritmo;
Esempio: porta AND a 2 ingressi:
entity And2 is port ( x,y : in bit; z : out bit; );end;
architecture ex1 of And2 isbegin z <= x and y;end;Operatori
Section titled “Operatori”<= è l’operatore di assegnazione.
VHDL dispone di tutti gli operatori dell’algebra booleana:
notandornandnorxorxnor
not ha la precedenza su tutti, mentre gli altri vengono applicati da sinistra
verso destra.
Identificatori
Section titled “Identificatori”Vengono utilizzati per nomi di entità, architetture e segnali. VHDL è case
insensitive quindi x e X sono la stessa cosa.
Testbench
Section titled “Testbench”Il testbench è una tipologia di blocchi che si usa per testare il funzionamento di altri blocchi. Con il testbench si decide il valore da dare agli ingressi del blocco da testare.
entity TestAnd2 isend;
architecture simple of TestAnd2 is -- Segnali interni al componente. signal a, b, c : bit;begin -- Istanza del modulo da testare. g1: And2 port map (x => a, y => b, z => c); -- Definizione degli stimoli sugli ingressi. a <= '0', '1' after 100ns, '0' after 200ns; b <= '0', '1' after 150ns, '0' after 200ns;end;