Você está na página 1de 8

Introducao a` linguagem VHDL

Gustavo G. Parma
Revisao 1.0 - Julio C. D. de Melo
Assunto: Introducao `a VHDL.
Objetivos: O aluno devera ser capaz de compreender os conceitos basicos de VHDL.

Introduc
ao Te
orica

A linguagem VHDL acronimo em ingles para VHSIC (Very High Speed Integrated Circuits) Hardware
Description Language, foi desenvolvido como um padrao de linguagem de programacao que descreve a
estrutura e o funcionamento de circuitos integrados digitais. Sendo um padrao desenvolvido pelo IEEE,
a cada cinco anos e feita uma revisao do assunto podendo haver modificacoes no padrao inicialmente
proposto.
A utilizacao do VHDL possibilita o desenvolvimento metodologico de sistemas complexos. Inicialmente ele permite a descricao do sistema em partes, ou seja, ele permite a decomposicao de um grande
sistema em subsistemas indicando como estes subsistemas estao conectados. Em segundo lugar, ele
permite a utilizacao de formas padroes de programacao no desenvolvimento de um sistema digital e,
como conseq
uencia, ele permite a simulacao do sistema digital antes de sua implementacao. Alem
disto, por ser uma linguagem padrao de programacao de circuitos digitais, o codigo VHDL e desenvolvido independentemente do CI a ser utilizado permitindo, desta forma, uma grande flexibilidade
no instante da implementacao do sistema.
Por se tratar de uma linguagem de programacao, VHDL segue alguns preceitos basicos de um
linguagem estruturada.
Em VHDL um elemento que executa uma funcao digital qualquer e chamado de entidade (entity)
e os pinos de entrada ou sada deste componente estao listados na secao de portas (port). A primeira
etapa no desenvolvimento de um sistema digital utilizando VHDL e a definicao da entidade e seus
pinos de entrada e sada, que funciona como a interface entre o que o componente realmente faz e o
mundo exterior a ele. A declaracao utiliza o seguinte formato:
entity nome-do-elemento is
port (NPI1,NPI2,NPI3 : in tipo-variavel;
NPI4,NPI5 : in tipo-variavel;
NPO1,NPO2 : out tipo-variavel;
NPO3,NPO4 : out tipo-variavel);
end nome-do-elemento;
onde:
NPI1, NPI2, NPI3, NPI4 e NPI5 sao os nomes dos sinais de entrada;
NPO1, NPO2, NPO3 e NPO4 sao os nomes dos sinais de sada;
As palavras em negrito sao palavras reservadas, nao podendo ser usadas em nomes criados pelo
usuario;
tipo-variavel indica qual o tipo da variavel de entrada/sada do sinal. Este tipo define quais
operacoes podem ser executadas com um determinado sinal. Os seguintes tipos sao suportados pelas

ferramentas de desenvolvimento da Altera e da Xilinx, dois dos maiores fabricantes de EPLDs e


FPGAs do mercado mundial:
1. BOOLEAN: o mais abstrato dos tipos de variavel. Uma variavel booleana pode ser verdadeira
ou falsa;
2. INTEGER: A variavel inteira permite operacoes matematicas basicas com os sinais, devendo ser
especificados os limites desta variavel. Os limites maximos para uma variavel do tipo integer
sao: (231 ) ate (231 1). Nao se pode ter acesso direto aos bits de uma variavel do tipo inteiro.
3. BIT: pode assumir dois valores logicos, 0 ou 1;
4. BIT VECTOR (3 downto 0): vetor de bits, no caso um vetor de quatro elementos;
5. STD LOGIC; Este tipo e pre-definido em uma biblioteca do software. Esta biblioteca permite,
dentre outras coisas, o acesso aos bits de uma variavel do tipo inteiro.
6. STD LOGIC VECTOR (3 downto 0): similar ao tipo anterior, porem definindo um vetor de 4
elementos.
VHDL nao e sensvel a` caixa (mai
uscula ou min
uscula) do texto que representa um programa.
Assim, BITou bitsao formas validas para se definir o tipo de uma variavel, bem como entityou ENTITYpara se definir uma entidade. Nos exemplos dados no texto, foram utilizadas letras
mai
usculas para se destacar as palavras-chave mas, visando aumentar a legibilidade dos programas, e
sugerido que sejam sempre usadas letras min
usculas.
Apos a definicao da entidade, e necessario a definicao da arquitetura desta entidade. A arquitetura determina o comportamento da entidade, em funcao dos sinais de entrada/sada. A arquitetura
e definida utilizando a seguinte sintaxe:
architecture nome-da-arquitetura of nome-da-entidade is
begin
nesta parte entra o corpo da arquitetura, ou seja, as equacoes logicas que descrevem o comportamento esperado do modulo
end nome-da-arquitetura;
O corpo da arquitetura e composto dos seguintes elementos:
1. Declaracao de sinais, tipos, constantes, componentes ou sub-programas. Um sinal (signal) e
uma variavel local a` arquitetura ou ao bloco onde ela e definida, podendo, tambem, ser definido
na arquitetura da entidade, antes do begin;
2. Definicao dos blocos concorrentes (executados paralelamente), logo apos o begin, os quais podem
ser:
(a) associacao de valores a sinais;
(b) chamadas de procedimentos: chamadas a algoritmos que executam uma determinada funcao
(c) Processos: Algoritmos executados sequencialmente, podendo ler ou escrever sinais definidos no resto da arquitetura;
A atribuicao de valores a`s variaveis pode ser executada de duas formas distintas, em funcao do
tipo da variavel e da forma como a variavel foi definida (variable ou signal).
A := 1; - - para variaveis do tipo variable usa-se :=
B <= 1; - - para variaveis do tipo signal usa-se <=
C <= 1; - - para variaveis de apenas um bit usa-se (apostrofo)
2

D <= 0101; - - para vetores de variaveis (BIT vector ou STD logic vector) usa-se (aspas)
Nos exemplos acima, foi usado o duplo traco (- -) para se adicionar um comentario ao programa.
Essa e a u
nica forma de comentar um programa em VHDL.
A diferenca de uma variavel signal - definida na arquitetura - para uma variavel variable - definida dentro do processo - e que a primeira tem o seu valor associado apenas quando o processo
termina, enquanto o valor da segunda e associado a cada passo de execucao do processo. Alem disto,
uma variavel signal possui escopo global, ou seja, se a arquitetura possui mais de um processo, todos
os processos tem acesso `a variavel signal, enquanto que o escopo da variavel variable e local, somente
o processo no qual ela foi definida tem acesso a ela.
variable A, B: BIT;
signal C: BIT VECTOR (4 downto 1);
A := 1; - - a variavel A possui o valor 1
B := 0; - - a variavel B possui o valor 0
C <= 1100; - - a variavel C possui o valor 1100
Em funcao do tipo da variavel, pode-se executar operacoes matematicas ou logicas com a variavel
criada. Os operadores em VHDL podem ser logicos, relacionais, unarios, soma, multiplicadores ou
outros.
1. Operadores logicos: AND, OR, NAND, NOR, XOR e NOT, podendo ser aplicados a variaveis
importante ressaltar que a precedencia de
do tipo BIT, BOOLEAN ou vetores destes tipos. E
execucao do AND e igual `a do OR, desta forma e importante separar os termos com parenteses
para que a implementacao de uma dada funcao logica nao ocorra de forma erronea.
signal A, B, C: BIT VECTOR (3 downto 0);
signal D, E, F, G: BIT VECTOR (1 downto 0);
signal H, I, J, K: BIT;
signal L, M, N, O, P: BOOLEAN;
A <= B and C;
D <= E or F or G;
H <= (I nand J) nand K;
L <= (M xor N) and (O xor P);
2. Operadores relacionais: = (igual), / = (diferente), < (menor), <= (menor ou igual), > (maior),
e >= (maior ou igual). Os dois primeiros operadores (igual e diferente) podem ser aplicados a
qualquer tipo de variavel. Os demais podem ser aplicados a variaveis com sinal ou inteiros. O
resultado de uma operacao relacional e do tipo BOOLEAN. A comparacao de vetores e feita bit
a bit, da esquerda para a direita, independentemente do n
umero de elementos em cada um dos
vetores a serem comparados. Desta forma,o vetor 101011 e menor do que o vetor 1011, porque
o quarto bit (da esquerda para a direita) do primeiro vetor e igual `a 0 e o quarto bit do segundo
vetor e igual `a 1.
signal A, B: BIT VECTOR (3 downto 0);
signal C, D: BIT VECTOR (1 downto 0);
signal E, F, G, H, I, J: BOOLEAN;
G <= (A = B);
H <= (C < D);
3

I <= (C >= D);


J <= (E > F);
3. Operador unario: (menos), utilizado para variaveis do tipo inteiro.
signal A, B: INTEGER range -8 to 7;
A <= -B;
4. Operador de soma: podendo ser soma aritmetica ou concatenacao. Os operadores + e sao
utilizados para operacao aritmetica entre variaveis do tipo inteiro e o operador & e utilizado
para a concatenacao de todo os tipos de variaveis unidimensionais e e utilizado na a construcao
de vetores.
signal A, D: BIT VECTOR (3 downto 0);
signal B, C, G: BIT VECTOR (1 downto 0);
signal E: BIT VECTOR (2 downto 0);
signal F, H, I: BIT;
signal J, K, L: INTEGER range 0 to 3;
A <= not B & not C; - - vetor & vetor
D <= not E & not F; - - vetor & elemento
G <= not H & not I; - - elemento & elemento
J <= K + L; - - adicao simples
Existem ainda operadores de multiplicacao, divisao, modulo, resto, exponenciacao e valor absoluto
mas eles tem aplicacoes muito especficas, nao sendo abordados nesta introducao.
Como mencionado, um processo e um algoritmo executado sequencialmente pelo dispositivo. Desta
forma, todo comando que tiver uma origem sequencial (desvio de fluxo de programa), tais como IF,
CASE e LOOPS precisam, necessariamente, ser inseridos dentro de um processo. A declaracao de um
processo segue as seguintes diretrizes:
[ label: ] process [ ( sensitivity list ) ]
{ process declarative item }
begin
{ sequential statement }
end process [ label ] ;
Onde:
sensitivity list e a lista das variaveis (SIGNALs e PORTs) que serao acessveis ao processo, separados por vrgula;
process declarative item e o espaco no qual sao feitas as declaracoes de sub-programas, tipos,
constantes e variaveis locais ao processo;
sequential statement e o espaco no qual e feita a programacao sequencial, propriamente dita.
Pode-se utilizar os seguintes codigos de programa nos processos:
1. Comando IF THEN
if condition then
{ sequential statement }

{ elseif condition then


{ sequential statement } }
[ else
{ sequential statement } ]
end if;
Exemplo:
signal A, B, C, P1, P2, Z: BIT;
if (P1 = 1) then
Z <= A;
elseif (P2 = 0) then
Z <= B;
else
Z <= C;
end if;
2. Comando CASE
case expression is
when choices =>
{ sequential statement }
{ when choices =>
{ sequential statement } }
end case;
exemplo:
signal VALUE is INTEGER range 0 to 15;
signal Z1, Z2, Z3, Z4: BIT;
Z1 <= 0;
Z2 <= 0;
Z3 <= 0;
Z4 <= 0;
case VALUE is
when 0 => - - verifica o 0
Z1 <= 1;
when 1 | 3 => - - verifica o 1 ou 3
Z2 <= 1;
when 4 to 7 | 2 => - - verifica o 2, 4, 5, 6 ou 7
Z3 <= 1;
5

when others => - - verifica os valores restantes, 8 ate 15


Z4 <= 1;
end case;
3. Comandos LOOP
Existem ao menos tres tipos de iteracao para enlaces
(a) Loop: Esquema basico sem criterio de parada pre-definido. O processo e executado ao
encontrar um comando NEXT ou um comando EXIT. Este esquema deve conter ao menos
uma linha de comando de espera.
[label :] loop
{ sequential statement }
end loop [label];
(b) while...loop: Este esquema de enlace possui um sistema de iteracao booleana. Se a condicao
da iteracao for avaliada como TRUE, a sequencia e executada uma vez. A condicao e, entao,
reavaliada. O enlace so ira terminar quando a condicao for avaliada como FALSE. Este
esquema deve conter ao menos uma linha de comando de espera.
[label :] while condition loop
{ sequential statement }
end loop [label];
(c) for...loop: Este esquema possui um sistema de iteracao do tipo inteiro, onde o n
umero de
repeticoes e determinado pelo limite do inteiro.Este esquema nao deve conter um comando
de espera.
[label :] for identifier
in range loop
{ sequential statement }
end loop [label];
O seguinte exemplo mostra dois codigos equivalentes:
variable A, B: BIT VECTOR(1 to 3);
- - primeiro codigo, utilizando loop
for I in 1 to 3 loop
A(I) <= B(I);
end loop;
- - segundo codigo, utilizando associacao direta
A(1) <= B(1);
A(2) <= B(2);
A(3) <= B(3);
4. Comando WAIT
Uma linha de espera suspende a execucao de um processo ate que seja detectada uma transicao
positiva ou negativa em um determinado sinal, podendo-se utilizar as seguintes sintaxes:
(a) wait until signal = value ;
(b) wait until signalevent and signal = value ;
6

(c) wait until not signalstable


(d) and signal = value ;
5. Comando NEXT
Este comando termina a iteracao corrente de um e nlacee muda para o primeiro comando dentro
dele.
next [ label ] [ when condition ] ;
onde label pode ser o nome do enlace
exemplo:
signal A, B, COPY ENABLE: BIT VECTOR (1 to 8);
...
A <= 00000000;
...
- - Assumindo que B possua o valor 01011011
- - Assumindo que COPY ENABLE possua o valor 11010011
. . .
for I in 1 to 8 loop
next when COPY ENABLE(I) = 0;
A(I) <= B(I);
end loop;
6. Comando EXIT
Este comando termina a iteracao corrente de um enlace e continua a execucao do processo no
primeiro comando depois do comando loop.
exit [ label ] [ when condition ] ;
onde label pode ser o nome do enlace que se deseja terminar.
exemplo:
signal A, B: BIT VECTOR(1 downto 0);
signal A LESS THAN B: Boolean;
. . .
A LESS THAN B <= FALSE;
for I in 1 downto 0 loop
if (A(I) = 1 and B(I) = 0) then
A LESS THAN B <= FALSE;
exit;
elsif (A(I) = 0 and B(I) = 1) then

A LESS THAN B <= TRUE;


exit;
else
null; - - continua a comparacao
end if;
end loop;

Parte Experimental :

Objetivo: Implementar um decodificador de BCD para 7-segmentos.


O visor de 7-segmentos deve visualizar os dgitos de 0 a 9, de acordo com a tabela abaixo.
ENTRADAS
IN3 IN2 IN1 IN0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
0
1
0
0
0
1
0
1
0
1
1
0
0
1
1
1
1
0
0
0
1
0
0
1
1
X
1
X
1
1
X
X

a
1
0
1
1
1
0
1
1
1
1
1
1

SAIDAS
c d e
1 1 1
1 0 0
0 1 1
1 1 0
1 1 1
1 0 0
0 1 1
1 1 0
0 1 1
1 1 0
0 1 1
0 1 1

b
1
1
1
1
1
1
1
1
1
1
0
0

f g
VISOR
1 0
0
0 0
1
0 1
2
0 1
3
1 0
4
0 0
5
0 1
6
0 1
7
0 1
8
0 1
9
1 1 APAGADO
1 1 APAGADO

As entradas devem ser declaradas com STD LOGIC VECTOR e as sadas como STD LOGIC.
As sadas dos segmentos devem ser calculadas como equacoes logicas em funcao das entradas BCD.
Para isso, use mapas de Karnaugh para deduzir cada equacao.

Você também pode gostar