VLSI Design - Introduzione a VHDL

VHDL sta per linguaggio di descrizione hardware di circuiti integrati ad altissima velocità. È un linguaggio di programmazione utilizzato per modellare un sistema digitale in base al flusso di dati, allo stile comportamentale e strutturale di modellazione. Questo linguaggio è stato introdotto per la prima volta nel 1981 per il Dipartimento della Difesa (DoD) nell'ambito del programma VHSIC.

Descrivere un design

In VHDL viene utilizzata un'entità per descrivere un modulo hardware. Un'entità può essere descritta utilizzando,

  • Dichiarazione di entità
  • Architecture
  • Configuration
  • Dichiarazione del pacchetto
  • Corpo del pacchetto

Vediamo cosa sono questi?

Dichiarazione di entità

Definisce i nomi, i segnali di ingresso e uscita e le modalità di un modulo hardware.

Syntax -

entity entity_name is
   Port declaration;
end entity_name;

Una dichiarazione di entità dovrebbe iniziare con "entity" e terminare con le parole chiave "end". La direzione sarà input, output o inout.

In La porta può essere letta
Su La porta può essere scritta
Dentro fuori La porta può essere letta e scritta
Buffer La porta può essere letta e scritta, può avere una sola sorgente.

Architecture -

L'architettura può essere descritta utilizzando uno stile strutturale, di flusso di dati, comportamentale o misto.

Syntax -

architecture architecture_name of entity_name 
architecture_declarative_part;

begin
   Statements;
end architecture_name;

Qui, dovremmo specificare il nome dell'entità per cui stiamo scrivendo il corpo dell'architettura. Le istruzioni dell'architettura dovrebbero essere all'interno delle parole chiave "begin" e "énd". La parte dichiarativa dell'architettura può contenere variabili, costanti o dichiarazioni di componenti.

Modellazione del flusso di dati

In questo stile di modellazione, il flusso di dati attraverso l'entità viene espresso utilizzando il segnale simultaneo (parallelo). Le istruzioni simultanee in VHDL sono WHEN e GENERATE.

Oltre a questi, per costruire codice possono essere utilizzati anche assegnazioni che utilizzano solo operatori (AND, NOT, +, *, sll, ecc.).

Infine, un tipo speciale di assegnazione, chiamato BLOCK, può essere impiegato anche in questo tipo di codice.

Nel codice simultaneo, è possibile utilizzare quanto segue:

  • Operators
  • L'istruzione WHEN (WHEN / ELSE o WITH / SELECT / WHEN);
  • L'istruzione GENERATE;
  • L'istruzione BLOCK

Modellazione comportamentale

In questo stile di modellazione, il comportamento di un'entità come insieme di istruzioni viene eseguito sequenzialmente nell'ordine specificato. Solo le istruzioni inserite in PROCESS, FUNCTION o PROCEDURE sono sequenziali.

PROCESSI, FUNZIONI e PROCEDURE sono le uniche sezioni di codice che vengono eseguite in sequenza.

Tuttavia, nel complesso, uno qualsiasi di questi blocchi è ancora concorrente con qualsiasi altra istruzione posta all'esterno di esso.

Un aspetto importante del codice di comportamento è che non è limitato alla logica sequenziale. In effetti, con esso, possiamo costruire circuiti sequenziali così come circuiti combinatori.

Le istruzioni di comportamento sono IF, WAIT, CASE e LOOP. Anche le VARIABILI sono limitate e dovrebbero essere utilizzate solo in codice sequenziale. VARIABILE non può mai essere globale, quindi il suo valore non può essere distribuito direttamente.

Modellazione strutturale

In questa modellazione, un'entità è descritta come un insieme di componenti interconnessi. Un'istruzione di istanziazione di un componente è un'istruzione simultanea. Pertanto, l'ordine di queste affermazioni non è importante. Lo stile strutturale di modellazione descrive solo un'interconnessione di componenti (visti come scatole nere), senza implicare alcun comportamento dei componenti stessi né dell'entità che collettivamente rappresentano.

Nella modellazione strutturale, il corpo dell'architettura è composto da due parti: la parte dichiarativa (prima dell'inizio della parola chiave) e la parte dell'istruzione (dopo l'inizio della parola chiave).

Operazione logica - AND GATE

X Y Z
0 0 0
0 1 0
1 0 0
1 1 1

VHDL Code:
Library ieee;
use ieee.std_logic_1164.all;

entity and1 is
   port(x,y:in bit ; z:out bit);
end and1;

architecture virat of and1 is
begin
   z<=x and y; 
end virat;

Forme d'onda

Operazione logica - Porta OR

X Y Z
0 0 0
0 1 1
1 0 1
1 1 1

VHDL Code: 
Library ieee; 
use ieee.std_logic_1164.all;  

entity or1 is
   port(x,y:in bit ; z:out bit); 
end or1; 
 
architecture virat of or1 is
begin
   z<=x or y; 
end virat;

Forme d'onda

Operazione logica - NOT Gate

X Y
0 1
1 0

VHDL Code:
  
Library ieee; 
use ieee.std_logic_1164.all; 
 
entity not1 is
   port(x:in bit ; y:out bit); 
end not1; 
 
architecture virat of not1 is
begin
   y<=not x;
end virat;

Forme d'onda

Operazione logica - Porta NAND

X Y z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code:
  
Library ieee; 
use ieee.std_logic_1164.all; 

entity nand1 is
   port(a,b:in bit ; c:out bit); 
end nand1; 
 
architecture virat of nand1 is
begin
   c<=a nand b; 
end virat;

Forme d'onda

Operazione logica - NOR Gate

X Y z
0 0 1
0 1 0
1 0 0
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all; 
 
entity nor1 is
   port(a,b:in bit ; c:out bit); 
end nor1; 
 
architecture virat of nor1 is
begin
   c<=a nor b;
end virat;

Forme d'onda

Operazione logica - XOR Gate

X Y Z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all;
  
entity xor1 is
   port(a,b:in bit ; c:out bit); 
end xor1;
  
architecture virat of xor1 is
begin
   c<=a xor b; 
end virat;

Forme d'onda

Operazione logica - X-NOR Gate

X Y Z
0 0 1
0 1 1
1 0 1
1 1 0

VHDL Code: 
 
Library ieee; 
use ieee.std_logic_1164.all; 

entity xnor1 is
   port(a,b:in bit ; c:out bit); 
end xnor1; 
 
architecture virat of xnor1 is
begin
   c<=not(a xor b); 
end virat;

Forme d'onda