Вы находитесь на странице: 1из 25

Departamento de Engenharia Eltrica

Universidade Federal do Rio Grande do Sul

Professor das Disciplinas:


Tcnicas Digitais (2000)
Sistemas Digitais (2001)
Microprocessadores II (2002)

Ronaldo Hsemann

VHDL

A POSTIL A DE

Histrico

A postila de V HDL - Pgina 2

Porto A legre, maio de 2001

Ronaldo Hsemann

objetivo desta apostila auxiliar estudantes e pesquisadores que necessitem


aprender os preceitos da linguagem V HDL para desenvolvimento e simulao de
projetos afins rea de eletrnica e sistemas digitais, mas acima de tudo procurando-se
apresentar uma viso geral da linguagem.

Em 1992 foram propostas vrias alteraes para a norma, sendo que 1993 foi
lanada a verso revisada, mais flexvel e com novos recursos. Esta norma revisada,
chamada V HDL-93, a hoje a mais amplamente utilizada e por isso a maioria dos
exemplos aqui apresentados so baseados na mesma.

Em 1981, aprimorando-se as idias do V HSIC, foi proposta uma linguagem de


descrio de hardware mais genrica e flexvel. Esta linguagem chamada V HDL
(V HSIC Hardware Description Language) foi bem aceita pela comunidade de
desenvolvedores de hardware e em 1987 se tornou um padro pela organizao
internacional IEEE.

No final dos anos 70, o Departamento de Defesa dos Estados Unidos definiu um
programa chamado V HSIC (V ery High Speed Integrated Circuit) que visava a descrio
tcnica e projeto de uma nova linha de circuitos integrados. Com o avano acelerado dos
dispositivos eletrnicos entretanto este programa apresentou-se ineficiente,
principalmente na representao de grandes e complexos projetos.

Ronaldo Hsemann

A postila de V HDL - Pgina 3

3E2 18E-6 3.229e9

23.1 0.2 34.118


Pode-se trabalhar com notao exponencial, desde que o nmero seja seguido
pela letra E ou e. Exemplos:

Os nmeros reais, por sua vez, permitem a representao de nmeros


fracionrios. Por exemplo:

23 0 146

V HDL define dois tipos bsicos de nmeros: inteiros e reais. Um nmero inteiro
consiste de um nmero sem ponto decimal. Exemplos de nmeros inteiros:

1.3 - Nmeros

\9data\ \proximo valor\ \bit#123\

No h distino entre letras maisculas e minsculas, logo valor, V alor ou


V A LOR so interpretados da mesma forma.
V HDL permite ainda a definio de identificadores estendidos que devem ser
utilizados somente para interfaceamento com outras ferramentas que usam regras
diferentes para definir seus identificadores. A definio de identificadores estendidos
feita entre \. Por exemplo:

contador data0 Novo_ valor resultado_ final_ operacao_ FFT

A lguns exemplos de identificadores:

Os identificadores so usados para se atribuir nomes a sinais ou processos. Um


identificador bsico em V HDL:
-pode conter letras do alfabeto (A a Z e a a z), digitos decimais
(0 a 9) e o caracter underline (_ );
-precisa comear com uma letra do alfabeto;
-no pode terminar com um caracter underline;
-no pode conter dois caracteres underline em sequncia.

1.2 - Identificadores

bit0 := d0; -- Esta linha atribui o valor de d0 a varivel bit0

Os comentrios em V HDL so permitidos aps dois traos - e so vlidos at o


final da linha corrente. Por exemplo:

1.1 - Comentrios

1- Elementos Bsicos em V HDL

Ronaldo Hsemann

A postila de V HDL - Pgina 4

Esta string sera interpretada como uma unica string,


& pois foi utilizado o operador de concatenacao

Se for necessrio definir-se uma string cujo comprimento seja maior que o de
uma linha deve-se utilizar o operador de concatenao (& ) para unir as substrings em
uma s. Exemplo:

O caracter faz parte da string

A utilizao de aspas dentro de um string permitida duplicando-se o caracter


de aspas ( " ). Por exemplo:

Teste de operacao
2000 iteracoes

A s strings, em V HDL, so definidas entre aspas duplas e representam uma


sequncia de caracteres, mas precisam estar inteiramente definidas em uma linha.
Exemplos de strings:

1.5 - Strings

A b

A representao de caracteres em V HDL permitida pelo uso de aspas simples


como nos exemplos:

1.4 - Caracteres

123_ 456 3.141_ 592 2#111_ 1100_ 0000_ 0000#

A fim de facilitar a interpretao de nmeros longos permitido em V HDL


utilizar-se o caracter underline (_ ) entre dgitos. Isto no altera o valor representado
pelo nmero, apenas facilita a sua identificao visual. Por exemplo:

2#11111101# 16#FD# 16#0fd# 8#0375#

A lm disso pode-se trabalhar em V HDL com bases diferentes da decimal,


bastando para isto indicar a base seguido pelo nmero entre #. Para bases maiores que
10, deve-se utilizar as letras A a F (ou a a f), indicando as bases 11 a 15. No so
permitidas bases maiores que 16. Como exemplo, tem-se o nmero 253 representado em
diversas bases distintas:

Ronaldo Hsemann

A postila de V HDL - Pgina 5

O" 740"

X D4 x0F2

e base hexadecimal:

o372

base octal:

B010001 b1001_ 1101_ 1100

A seguir alguns exemplos de strings de bit em base binria:

A ssim como strings de caracteres, possvel a definio de strings de bits ou


valores numricos especiais (como representados por outras bases). O especificador de
base pode ser:
-B para binrio
-O para octal
-X para hexadecimal

1.6 - Strings de Bit

Ronaldo Hsemann

2 - Tipos de Dados

A postila de V HDL - Pgina 6

o sinal x recebe o valor negado de y aps um atraso de 8ns. Isto especialmente


importante para se simular atrasos de portas lgicas.

x <= not y after 8ns;

Um sinal (signal) utilizado para interligao de blocos em V HDL, funcionando


de maneira similar a uma varivel. O sinal traz porm a capacidade de permitir a ligao
(ao ser ligado a uma porta de entrada e sada) ou troca de valores (quando opera com
variveis internas) entre blocos funcionais distintos.
A s atribuies de sinais em V HDL feita normalmente com o operador <=,
por ser tratado analogamente a um pino de entrada e sada. Exemplos de sua utilizao
so apresentados no captulo "Programao em V HDL" (item 5.3).
Na atribuio de sinais pode-se adicionalmente gerar de um atraso programado
atravs da palavra-chave after. No exemplo:

2.1.2 - Sinais

A s atribuies em V HDL para constantes e variveis so feitas com o operador


:=, como j pode ser visto nos exemplos anteriores.

variable numero_de_contagens : integer := 50;


variable liga_saida1 : bit := '0';
variable tempo_medida : time := 0ns;

A declarao de variveis segue a mesma estrutura, utilizando a palavra-chave


variable. Uma varivel pode ser iniciada com algum valor prvio na sua declarao, o
qual ir manter at que seja feita a primeira escrita. A seguir, alguns exemplos:

constant valor_de_pi : real := 3.141592653;


constant ativado : bit := 1;
constant atraso : time := 5ns;

A mbos os tipos constantes e variveis devem ser definidas antes de serem


utilizadas na descrio V HDL. Os elementos do tipo constante no podem ser
sobrescritos, enquanto que os do tipo varivel podem ser alterados a qualquer momento.
A declarao de uma constante feita atravs do uso da palavra-chave constant, como
nos exemplos:

2.1.1 - Constantes e V ariveis

Um objeto um modelo em V HDL que pode conter um valor de um tipo


especfico. So 4 classes de objetos: constantes, variveis, sinais e arquivos.

2.1 - Constantes e V ariveis

Ronaldo Hsemann

A postila de V HDL - Pgina 7

<=

entrada0 when a = '0' and b = '0',


entrada1 when a = '0' and b = '1',
entrada2 when a = '1' and b = '0',
entrada3;

Uma vez tendo-se declarado o tipo de arquivo deve-se declarar a arquivo de


entrada ou sada que ir ser manipulado. Isto feito atravs do uso da palavra-chave file
seguida pelo identificador do arquivo, dois pontos ':' e do tipo de arquivo declarado. A
seguir utiliza-se a palavra-chave open com o modo de abertura do arquivo. So trs os
modos possveis: modo leitura (read_ mode), escrita (write_ mode) e escrita anexada

type arq_binario is file of bits;

Um arquivo (file) uma classe de objeto em V HDL usada para armazenamento


de dados. A declarao desta classe feita definindo-se o tipo de arquivo e tipo de dados
com que se deseja trabalhar. Por se tratar de um tipo deve-se iniciar a declarao com a
palavra-chave type seguida pelo nome do arquivo. Em sequncia, as palavras-chaves is
file of e o tipo de dado a ser armazenado. Como exemplo a seguir tem-se uma definio
de um tipo de arquivo de bits, chamado arq_ binrio.

2.1.3 - A rquivos

O sinal de sada ir receber um dos pinos de entrada de acordo com a condio


dos sinais de seleo a e b. Note que a ltima atribuio (saida <= entrada3) realizada
se e somente se nenhuma das outras condies anteriores forem satisfeitas. Por isso
nenhuma condio precisou ser descrita.

saida

A estrutura flexvel do V HDL permite a atribuio de valores em processos


vinculada a uma ou mais condies, ou seja a atribuio s se efetivar se uma condio
(ou conjunto de condies) for verdadeira. Para se realizar esta operao em uma
atribuio deve-se utilizar a palavra-chave when, seguida da condio que se deseja
verificar para a validade da atribuio. Por exemplo, abaixo tem-se listada a descrio
de um multiplexador de 4 entradas utilizando-se este recurso:

Figura 2.1 : Sinal gerado em pinout

como a representao feita na figura abaixo:

pinout <= 1 after 5ns, 0 after 15ns;

possvel desta forma at mesmo construir-se um sinal como forma de onda ou


pulso varivel atravs do adequado uso dos comandos de atribuio de sinais. Por
exemplo, a sentena abaixo gera um pulso positivo com atraso de propagao de 5ns e
largura de 10ns no sinal de sada pinout:

Ronaldo Hsemann

A postila de V HDL - Pgina 8

Em uma declarao de tipo, o valor inicial de uma varivel (caso no atribudo)


ser igual ao valor mais a esquerda da faixa definida. Por exemplo uma varivel do tipo
dia_ da_ semana teria valor inicial 1 enquanto que uma do tipo valor_ contagem teria 10.

type dia_da_semana is range 1 to 31;


type valor_contagem is range 10 downto 0;

V ariveis do tipo inteiro podem variar de -2.147.483.647 a +2.147.483.647, por


serem representadas por 32 bits. A lgumas vezes entretanto til definir-se novas faixas
de operao para algumas variveis. V HDL permite a definio destas faixas a partir das
estruturas is range/to ou is range/downto, usadas para variaes ascendentes e
descendentes respectivamente. A lgumas destas estruturas pode ser observadas nos
exemplos:

2.2.1 - Tipos Inteiros

V ariveis tipo escalares so aquelas cujos valores so indivisveis.

2.2 - Tipos Escalares

Para conferncia de fim de arquivo usa-se a funo endfile(nome_arquivo), que


retorna 1 se o arquivo chegou ao fim e 0 caso no. Funes so apresentados no item
7.2.

file arquivo_saida:arq_binario open write_mode is "resultados";


write(arquivo_saida, bit_out);

A escrita feita de modo anlogo desde que claro tenha-se definido um


arquivo de escrita ou escrita anexada. Exemplo:

read(arquivo_entrada, bit_in);

Para leitura deste arquivo usa-se o procedimento read e para escrita o


procedimento write. O conceito de procedimentos apresentado no captulo de
"Subprogramas" item 7.1. Exemplificando uma leitura de dados para a varivel bit_ in
via arquivo:

file arquivo_entrada:arq_binario open read_mode is "dados.dat";

(append_ mode). Por fim acrescenta-se is seguido pelo nome de referncia do arquivo,
que pode ser o nome do mesmo em um diretrio ou simplesmente um nome usado para
interfaceamento com uma memria.
Como exemplo a seguir se define um arquivo chamado arquivo_ entrada do tipo
anteriormente declarado arq_ binario, de modo leitura e com nome "dados.dat":

Ronaldo Hsemann

A postila de V HDL - Pgina 9

Note que em V HDL a unidade de tempo fs, apesar que na maior parte das
vezes se adotam outras unidade mais comuns como ms ou ns.

type time is range implementation_defined


units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;

Existe um tipo fsico muito importante pr-definido em V HDL que o tipo time,
usado para operaes com tempo. A declarao deste tipo pode ser observada a seguir:

type resistencia is range 0 to 1E9


units
ohm;
kohm = 1000 ohm;
Mohm = 1000 kohm;
end units resistencia;

V ariveis do tipo fsico (physical) so utilizadas na representao de quantidades


fsicas do mundo real, tais como comprimento, massa, tempo e tenso. Na definio
destas variveis possvel a atribuio das unidades respectivas atravs do uso da
palavra-chave units. A baixo apresenta-se um exemplo de uma medida fsica de
resistores em V HDL:

2.2.3 - Tipos Fsicos

type valor_leitura is range -5.0 to 5.0;


type porcentagem is range 0.0 to 100.0;

V ariveis do tipo ponto flutuante so compostas por duas partes: uma mantissa e
uma parte exponencial. Existe um tipo ponto flutuante pr-definido em V HDL que o
tipo real, que varia de -1.0E+38 at +1.0E38, com pelo menos seis dgitos de preciso.
possvel a definio de outras variveis do ponto flutuante conforme a necessidade da
aplicao. A lguns exemplos so apresentados a seguir:

2.2.2 - Tipos Ponto Flutuante

Ronaldo Hsemann

A postila de V HDL - Pgina 10

A varivel do tipo character apresenta 256 possveis valores, sendo que os 128
primeiros representam a primeira metade da tabela A SCII.
A declarao do tipo character em V HDL feita conforme pode ser visto a
seguir na fig. 2.2.

- character
- boolean
- bit

Na prtica os tipos pr-definidos de enumerao mais importantes so:

type severity_level is (note, warning, error, failure);

Existe diversos tipos pr-definidos de enumerao em V HDL . Por exemplo:

type display is (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A , B, C, D, E, F);

pode assumir qualquer um dos 10 possveis valores 0 a 9. Se por acaso esta


varivel devesse representar alguns valores hexadecimais, deveria ser definida como:

type display is (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);

O tipo especial de enumerao nada mais do que uma lista ordenada de


possveis valores que uma determinada varivel pode conter. Por exemplo a varivel
display definida por

2.2.4 - Tipo Enumerao

Ronaldo Hsemann

A postila de V HDL - Pgina 11

Note que os dois possveis valores de bit so os caracteres '0' e '1' e no os


nmeros 0 e 1.

type bit is (0, 1);

A s variveis do tipo bit so utilizadas para operaes binrias em V HDL. A


definio do tipo bit :

type boolean is (false, true);

Um varivel do tipo boolean bastante usada para operaes lgicas cujo


resultado deve ser verdadeiro ou falso. A definio do tipo boolean :

Figura 2.2: Declarao em V HDL do tipo character

'', '', '', '', '', '', '', '',


'', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '' );

'', '', '', '', '', '', ' ', ' ',
' ', ' ', ' ', ' ', '', '', '', '',
'', '', ' ', ' ', ' ', ' ', ' ', '',
' ', '', '', '', '', ' ', ' ', '',

' ', '', '', '', '', '', '', ' ',
'', '', '', '', '', '-', '', ' ',
'', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', ' ',

-- the character code for 160 is there (NBS P ),


-- but prints as no char

c128, c129, c130, c131, c132, c133, c134, c135,


c136, c137, c138, c139, c140, c141, c142, c143,
c144, c145, c146, c147, c148, c149, c150, c151,
c152, c153, c154, c155, c156, c157, c158, c159,

'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',


'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', del,

'@ ', 'A', 'B', 'C ', 'D', 'E ', 'F ', 'G ',
'H', 'I', 'J ', 'K ', 'L', 'M', 'N', 'O ',
'P ', 'Q ', 'R ', 'S ', 'T ', 'U', 'V', 'W ',
'X', 'Y ', 'Z', '[', '\', ']', '^', '_ ',

' ', '!', '"', '#', '$', '%', '&', ''',


'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '? ',

nul, soh, stx, etx, eot, enq, ack, bel,


bs, ht, lf, vt, ff, cr, so, si,
dle, dc1, dc2, dc3, dc4, nak, syn, etb,
can, em, sub, esc, fsp, gsp, rsp, usp,

type character is (

Ronaldo Hsemann

A postila de V HDL - Pgina 12

type matriz is array (natural range <>) of integer;

que define uma matriz de bits, cujas dimenses so dadas por tipos distintos.
V HDL permite ainda a construo de arrays sem definio de limites atravs dos
smbolos <>, como pode ser visto a seguir:

type estado is (ativado, desativado, falha);


type conjunto_processos is array (0 to 10, estado) of bit;

Note que, no exemplo, imagem inicia da posio 1. No necessrio se iniciar


sempre do valor 0. Da mesma forma no h a obrigao de que os tipos definidos para
cada dimenso de um array sejam iguais. possvel por isso construir-se arrays multidimensionais de tipos distintos como no exemplo:

type imagem is array (1 to 10, 1 to 20) of integer;

onde se define um array chamado dias_ uteis que contm somente um conjunto
dos cinco dias da semana de SEG a SEX a partir do conjunto dias_ semana.
Em muitos casos arrays de uma nica dimenso no so suficientes para as
operaes que se deseja. V HDL permite a definio de arrays multi-dimensionais de
forma facilitada. Por exemplo, pode-se definir o array que representa uma imagem
bidimensional de 10x20 da seguinte forma:

type dias_semana is (DOM, SEG, TER, QUA , QUI, SEX , SA B);


type dias_uteis is array (SEG to SEX ) of dias_semana;

est-se definindo uma matriz de 10 elementos de tipo inteiro (integer) chamada


matriz_ entrada. A ssim como em outras estruturas V HDL possvel o uso da palavrachave downto para ordenao descendente, o que, em alguns casos, bem til. Por ser
um arranjo mais genrico a declarao de arrays pode conter tambm valores no
numricos, como no exemplo a seguir:

type matriz_entrada is array (0 to 9) of integer;

De uma forma geral, arrays so conjuntos de valores de um determinado tipo. O


agrupamento de determinado tipo em um conjunto especialmente importante para
operaes com tratamento de memria ou manipulao de matrizes.
A declarao de um array deve obrigatoriamente conter alm do nome do array,
o tipo de varivel (ou variveis) que dever comportar e normalmente a faixa de
validade (dimenso) do array. A forma mais simples de compreender a forma de
declarao de arrays atravs de exemplos prticos. Na declarao abaixo, por exemplo:

2.3.1 - A rrays

V ariveis de tipo composto so montadas com um agrupamento de variveis de


tipos j conhecidos.

2.3 - Tipos Compostos

Ronaldo Hsemann

A postila de V HDL - Pgina 13

realiza a cpia de todos os elementos do array matriz1 para a matriz2.

matriz2 := matriz1;

so definidos 4 variveis de display de 7 segmentos que recebem os mesmos


valores iniciais. Note que a palavra-chave to agrupa elementos consecutivos enquanto
que o smbolo | utilizado para agrupar elementos separados. A lm disso, a palavrachave others vlida aqui para se permitir a atribuio de todos os elementos no
referenciados anteriormente.
Operaes lgicas (ver item 3.3) com arrays so permitidas, desde que os arrays
contenham variveis do tipo bit ou boolean.
A cpia de arrays possvel desde que sejam arrays de mesmo tipo. Por
exemplo:

type 7_segm is (1 to 7) of bit;


variable display1: 7_segm := (1 =>1, 2 =>0, 3 =>0, 4 =>0, 5 =>0, 6 =>1,7 =>1);
variable display2: 7_segm := ( 1 =>1, 2 to 5 => 0; 6 to 7 =>1);
variable display3: 7_segm := ( 1 | 6 | 7 => 1, 2 to 5 => 0);
variable display4: 7_segm := ( 1 | 6 | 7 => 1, others => 0);

A primeira linha permite o preenchimento de todo array com valores iniciais. A s


demais linhas acessam cada uma das posies colocando os valores apropriados,
respectivamente. Para arrays muito grandes entretanto alguns recursos so
especialmente teis. Por exemplo para o caso a seguir:

type medidor is array (1 to 3) of integer := (0.0, 0.0, 0.0);


medidor(1) := entrada1;
medidor(2) := entrada2;
medidor(3) := (entrada1 + entrada2)/2;

define uma varivel do tipo matriz (sem definio de limite) chamada matriz1
que tem 5 posies. A atribuio de valores a arrays merecem alguns comentrios, pois
em V HDL so disponibilizados alguns formatos especiais.
A atribuio mais simples j foi mostrada e trata do preenchimento direto dos
valores de um array ou de um elemento, como na listagem a seguir:

variable matriz1 : matriz := (0.0, 0.0, 0.0, 0.0, 0.0);

que define um array chamado matriz de inteiros, cuja dimenso no foi


especificada, mas que deve estar contida dentro do espao de nmeros naturais
(natural). Normalmente o tamanho de um array deste tipo definido quando se atribui
no programa uma constante ou varivel que ir utilizar este tipo de array. Por exemplo:

Ronaldo Hsemann

A postila de V HDL - Pgina 14

que realiza a cpia de todos elementos do record estrutura1 para a estrutura2.

estrutura2 := estrutura1;

Similarmente ao caso de arrays, so permitidos os usos dos recursos |' e others


para atribuio de um conjunto de variveis ao mesmo tempo. Tambm possvel a
cpia de records como em:

horario_atual := (hora => 10, minuto => 42, segundo => 23);

ajusta o horario atual do sistema para 10:42:23. Outra maneira de se realizar esta
atribuio :

variable horario_atual: horario;


horrio_atual.segundo := 23;
horrio_atual.minuto := 42;
horrio_atual.hora := 10;

declara-se uma estrutura de horrio composta por 3 inteiros segundo, minuto e


hora, com as respectivas faixas de operao.
A atribuio de valores para um elemento especfico feito a partir do nome do
record seguido de . e o nome da varivel que se pretende acessar. Por exemplo:

type horario is record


segundo : integer range 0 to 59;
minuto : integer range 0 to 59;
hora : integer range 0 to 23;
end record horario;

Records, assim como arrays, so conjuntos de variveis, permitindo porm o


agrupamento de variveis de tipos diferentes. Cada elemento de um determinado tipo
dentro desta estrutura possui um nome prprio, que utilizado para referenci-lo dentro
do record. Na sua declarao todos os elementos constituintes de uma estrutura do tipo
record devem ser declarados em sequncia com seus nomes prprios. A ps o final da
declarao da estrutura record seu nome deve ser repetido. Para ilustrar o uso deste tipo,
no exemplo abaixo:

2.3.2 - Records

Ronaldo Hsemann

A postila de V HDL - Pgina 15

gera o nmero em ponto flutuante 123.0;

real(123);

produz o nmero inteiro mais prximo (no caso, 39). Enquanto que:

integer(39.382)

A converso, ou seja a transformao de um tipo de varivel para outro


permitido em V HDL. Para implementar isto deve-se descrever o tipo de varivel que se
deseja obter seguido pelo valor entre parnteses. Por exemplo a converso:

2.5 - Converso de Tipos

subtype natural is integer range 0 to highest_integer;


subtype positive is integer range 1 to highest_integer;
subtype delay_length is integer range 0 to highest_time;

Uma vez tendo-se definido um tipo de varivel, em V HDL, possvel se definir


um subtipo ou seja um tipo de varivel que seja um subset do tipo j definido atravs do
uso da palavra-chave subtype. Como exemplo so apresentados 3 subtipos prdefinidos em V HDL para nmeros naturais, positivos e atraso de tempo,
respectivamente:

2.4 - Subtipos

Ronaldo Hsemann

A postila de V HDL - Pgina 16

Figura 2.3: Hierarquia dos tipos de dados em V HDL

2.6 -Diagrama Completo de Tipos de Dados em V HDL

Ronaldo Hsemann

Mdulo
Resto da
diviso
Potenciao

V alor absoluto
Negao

mod
rem

abs
not

Operador

=
/=
<
<=
>
>=

Inteiro ou ponto
flutuante

fsico
inteiro
inteiro

inteiro ou ponto
flutuante
inteiro ou ponto
flutuante
fsico

numrico
numrico
array 1 dimenso
inteiro ou ponto
flutuante
fsico

Tipo do operador
da esquerda

Igualdade
Desigualdade
Menor que
Menor ou igual
Maior que
Maior ou igual

Operao

qualquer
qualquer
escalar ou array
escalar ou array
escalar ou array
escalar ou array

Tipo do operador
da esquerda

3.2 - Operaes de Comparao

Diviso

**

A dio
Subtrao
Concatenao
Multiplicao

Operao

+
&
*

Operador

fsico

inteiro ou ponto
flutuante
fsico

inteiro
igual aos operandos
igual aos operandos

fsico

mesmo do anterior
mesmo do anterior
mesmo do anterior
mesmo do anterior
mesmo do anterior
mesmo do anterior

Tipo do operador
da direita

boolean
boolean
boolean
boolean
boolean
boolean

Tipo do resultado

igual ao operador
da esquerda
numrico
numrico
bit, boolean ou
igual ao operador
array (bit, boolean) da direita

inteiro

inteiro ou ponto
flutuante
fsico
mesmo do anterior
mesmo do anterior

mesmo do anterior igual aos operandos

fsico

igual aos operandos


igual aos operandos
igual aos operandos
igual aos operandos

mesmo do anterior
mesmo do anterior
mesmo do anterior
mesmo do anterior

Tipo do resultado

A postila de V HDL - Pgina 17

Tipo do operador
da direita

3 - Expresses e Operadores

3.1 - Operaes A ritmticas

Ronaldo Hsemann

Lgica E
negada
Lgica OR
Negada
Lgica OR
exclusivo
Lgica X OR
negada

nand

ror

rol

sra

sla

srl

sll

Operador

xnor

xor

bit, boolean ou
array(bit,boolean)
bit, boolean
array(bit,boolean)
bit, boolean
array(bit,boolean)
bit, boolean
array(bit,boolean)
bit, boolean
array(bit,boolean)
bit, boolean
array(bit,boolean)

Tipo do operador
da esquerda

desloc. lgico
para esquerda
desloc. lgico
para direita
desl. aritmtico
para esquerda
desl. aritmtico
para direita
rotao para a
esquerda
rotao para a
direita

Operao

array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean

Tipo do operador
da esquerda

inteiro

inteiro

inteiro

inteiro

inteiro

inteiro

Tipo do operador
da direita

array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean
array de bit ou
boolean

Tipo do resultado

mesmo do anterior boolean

mesmo do anterior boolean

mesmo do anterior boolean

mesmo do anterior boolean

mesmo do anterior boolean

mesmo do anterior boolean

Tipo do resultado

A postila de V HDL - Pgina 18

Tipo do operador
da direita

3.4 - Operaes de Deslocamento e Rotao

Lgica OR

or

nor

Lgica E

Operao

and

Operador

3.3 - Operaes L gicas

Ronaldo Hsemann

A postila de V HDL - Pgina 19

onde os valores de sada led1 e led2 so vinculados aos valores da varivel de


entrada leitura. Se leitura for igual a 1 ou 3 (atravs do uso do operador or) a sada led1
ativada. Se leitura for igual a 2 ou 4 a sada led2 ativada. Isto claro somente se a
condio painel = OFF for falsa, ou seja a chave de entrada do painel estiver ligada.

if painel = OFF then


led1 := OFF;
led2 := OFF;
elseif leitura = 1 or leitura = 3 then
led1 := ON;
led2 := OFF;
elseif leitura = 2 or leitura = 4 then
led1 := OFF;
led2 := ON
endif

Este caso idntico ao caso anterior s que quando a condio chave = 1 for
falsa so executadas as linhas saida1 := 255 e registrador := valor_saida.
Uma outra variao desta estrutura permitida atravs da utilizao da palavrachave elseif, que funciona como uma nova estrutura de comparao dentro da estrutura
if corrente. So possveis tantos elseif quantos forem necessrios para refinar as
comparaes. A seguir tem-se um exemplo:

if chave = 1 then
saida1 := valor_saida;
else
saida1 := 255;
registrador := valor_saida
endif

onde a condio (chave = 1) testada para permitir a operao necessria. Se a


condio for verdadeira, valor_ saida atribudo varivel saida1, caso no nada
feito.
Em alguns casos desejado realizar-se uma operao (ou sequncia de
operaes) para quando a condio for verdadeira e outra quando a condio for falsa.
V er exemplo de uma estrutura if-then-else-endif:

if chave = 1 then
saida1 := valor_saida;
endif

Em aplicaes onde o estado de alguma varivel (ou conjunto de variveis)


determina as operaes que devem ser tomadas muito comum o uso da estrutura IF. A
forma mais simples de utilizao atravs da estrutura if-then-endif como apresentado
a seguir:

4.1 - Estrutura IF

4 - Estruturas e Comandos em V HDL

Ronaldo Hsemann

A postila de V HDL - Pgina 20

case estado is
when estado_A =>
saida <='0';
if entrada = '1' then estado := estado_B;
end if;
when estado_B =>
if entrada = '0' then estado := estado_C;
end if;
when estado_C =>
estado := estado_A ;
saida <= '1';
end case;

Para a rea de sistemas digitais a grande utilidade da estrutura CA SE na


implementao de mquinas de estado. No exemplo a seguir:

case leitura is
when 1 | 3 =>
led1 := ON;
led2 := OFF;
when 2 | 4 =>
led1 := OFF;
led2 := ON
endcase

Para se implementar a funo OU em estruturas CA SE usa-se o caracter |.


Como exemplo apresenta-se uma forma alternativa de implementar a funo de
acionamento das sadas led1 e led2 de acordo com a varivel leitura (aplicao
apresentada no item 4.1):

case seletor is
when 0 =>
sada <= entrada0;
when 1 =>
sada <= entrada1;
when 2 =>
sada <= entrada2;
when 3 =>
sada <= entrada3;
endcase;

Uma outra estrutura de comparao de valores para seleo de operaes a


estrutura case-is-when-endcase. Esta estrutura mais utilizada para aplicaes onde
uma determinada varivel pode assumir um nmero limitado de valores, cada qual
associado a um conjunto de operaes. A seguir tem-se o exemplo de um multiplexador
implementado com esta estrutura:

4.2 - Estrutura CA SE

Ronaldo Hsemann

A postila de V HDL - Pgina 21

que tenta manter o nvel em um valor desejado em um sistema ON/OFF com


uma histerese de largura 4.

if nivel_atual < nivel_desejado -2 then


valvula_entrada := ON;
elseif nivel_atual > nivel_desejado +2 then
valvula_entrada := OFF;
endif
endloop

loop

A forma mais simples de uma estrutura for chamada desta forma por no
apresentar condio de sada. Esta estrutura particularmente til para aplicaes de
sistemas simples que s executam uma tarefa, como por exemplo um controle de nvel a
seguir:

4.3.1 - Estrutura L oop Infinito

A s estruturas de loop em V HDL so bastante usadas principalmente para a


execuo repetitiva de uma determinada sequncia de operaes. Existe um srie de
variaes de estruturas de loop possveis em V HDL, de acordo com a finalidade do
software. Estas estruturas sero a seguir apresentadas em sequncia para melhor
entendimento.

4.3 - Estrutura L OOP

Figura 4.1: Mquina de estados implementada no exemplo

implementa-se a mquina de estados da figura 4.1. Note que, apesar de no


indicado, a estrutura apresentada deveria estar dentro de um processo sincronizado com
o clock, o que normalmente subentendido em sistemas de mquinas de estados.

Ronaldo Hsemann

A postila de V HDL - Pgina 22

loop

Esta estrutura similar ao caso de sada anterior, s que a palavra-chave next


serve para reiniciar a sequncia de operaes do loop. Na descrio a seguir tem-se um
monitor de temperatura, que s executa as medidas de emergncia (aquecedor:= OFF e

4.3.3 - Estrutura L oop com Reincio Forado por Next

onde existem duas condies de sada. A primeira testa se a contagem est


desabilitada (contagem_habilitada = '0'), quando ento sai do loop_ interno para
proceder uma nova contagem. A segunda condio de sada testa se reset_ contador = '1'
e caso for, salta para fora do loop_ intermediario, resetando o contador.

loop_externo : loop
contador := 0;
loop_intermediario : loop
loop_interno : loop
saida := contador;
exit when contagem_habilitada = '0';
exit loop_intermediario when reset_contador = '1';
endloop loop_interno
contador := contador +1;
endloop loop_intermediario
endloop loop_externo

A estrutura acima implementa um contador que reseta sua contagem se a


condio reset_contador = '1' for verdadeira. Note que possvel o encadeamento de
loops, ou seja a montagem de um loop dentro de outro. A linguagem V HDL permite a
atribuio de nomes a loops e a seleo de qual sada ser forada a partir destes nomes.
Um exemplo de uso de estrutura for com diversos loops encadeados descrito a
seguir:

exit when reset_contador = '1';


contador := contador +1;
saida := contador;
endloop
contador := 0;
endloop

loop

Um estrutura LOOP pode entretanto precisar de uma condio de sada. Isto


previsto em V HDL pela palavra-chave exit, que fora a sada do loop quando uma
determinada condio for atendida. Por exemplo:

4.3.2 - Estrutura L oop com Sada Forada por Exit

Ronaldo Hsemann

A postila de V HDL - Pgina 23

resultado := 1;
for n in 1 to 10 loop
resultado := resultado *n;
end loop;

O uso de estrutura de for-loop utilizado principalmente para execuo de


operaes a serem repetidas por um nmero determinado de vezes. Por exemplo a
sequncia abaixo descreve o clculo do fatorial do nmero 10.

4.3.5 - Estrutura L oop com Contagem Tipo For

onde o clculo simples de uma raiz quadrada feito at que se encontre o valor
mais prximo. Note que se o valor de entrada for zero, a condio do loop no
satisfeita e o mesmo no executado, resultando no valor raiz_quadrada := 0 que o
valor correto.

numero := valor_entrada;
raiz_quadrada := 0;
while raiz_quadrada*raiz_quadrada < numero loop
raiz_quadrada := raiz_quadrada + 0.1;
end loop;

A estrutura while-loop um caso especial de estrutura de loop, onde uma


condio testada inicialmente antes de qualquer operao do loop e caso seja
verdadeira, o loop executado. Se a condio no for satisfeita, o loop pra de ser
executado, seguindo-se alm deste.
Um exemplo desta estrutura apresentada a seguir:

4.3.4 - Estrutura W HIL E-L OOP

...
next nome_loop when condicao = true
...

A ssim como no caso do exit, tambm possvel com next, a definio de qual
loop deve ser iniciado quando se estiver trabalhando com loops encadeados. O formato
de utilizao o seguinte:

medida_temperatura = entrada_medidor;
next when medida_temperatura < temperatura_maxima;
aquecedor := OFF;
alarme := ON;
endloop

loop

alarme:=ON) se a temperatura medida exceder o limite. Note que com o uso de next a
execuo no sai fora do loop

Ronaldo Hsemann

A postila de V HDL - Pgina 24

onde a sequncia de operao suspensa at que haja uma variao em qualquer


dos sinais a ou b.

a sequncia de operao ir ser suspensa na linha apresentada at que o sinal a


mude de valor, quando ento ir seguir em execuo normal. possvel a combinao
de mais de um sinal de entrada como no caso abaixo:
...
wait on a, b;
...

...
wait on a;
...

O modo mais simples de utilizao do comando wait para se aguardar uma


mudana qualquer de estado em um determinado sinal. Isto feito com a palavra-chave
on seguido pelo sinal que se deseja monitorar. Por exemplo, na execuo de uma
descrio em V HDL que contenha:

4.4.1 - Espera por uma V ariao Qualquer

A operao ou comando de espera (wait) tem como finalidade suspender a


execuo da sequncia corrente at que uma determinada condio ocorra.
A sua utilizao feita a partir da palavra-chave wait. Este comando pode ser
empregado para esperar-se simplesmente a mudana de estado de um sinal ou aguardarse por uma variao especfica.

4.4 - Comando W A IT

interessante notar que a varivel utilizada para as contagens da estrutura


for-loop mascara dentro do loop uma outra varivel externa com o mesmo nome, mas
quando for finalizado a varivel externa ter seu valor intacto. No caso acima, por
exemplo, ao final desta execuo a varivel contador ter valor 5 e a varivel resultado
ter o valor 1.

contador := 5;
resultado := 0;
for contador in 10 downto 1 loop
resultado := contador;
end loop;

A estrutura for-loop permite tambm a realizao de iteraes em ordem


decrescente. Neste caso basta utilizar-se a palavra-chave downto no lugar de to, como
em:

Ronaldo Hsemann

A postila de V HDL - Pgina 25

Por exemplo, a descrio a seguir:

O comando de gerao (generate) usado para gerar rplicas de uma dada parte
da descrio V HDL. De forma simples este comando permite a realizao de uma cpia
dos comandos ou componentes inseridos entre as palavras-chaves generate e end
generate. A forma clssica de uso deste comando est na rplica de componentes,
quando se deseja montar um projeto que apresenta blocos que devem ser repetidos
vrias vezes.

4.4 - Comando G ENERA TE

implementa a espera de um sinal de nvel lgico '1' com durao de 1ms na porta
int_in para dar continuidade sequncia de operao.

...
wait until int_in = '1' for 1ms;
...

Em alguns casos, a funo que se deseja sintetizada deve ser sensvel no a


borda, mas sim a um nvel de sinal. Para tanto deve-se especificar alm dos parmetros
vistos no item anterior a informao de tempo de persistncia da condio.
A grega-se ento estrutura de comando de espera visto anteriormente a palavrachave for seguida pelo tempo que a condio deve ser mantida verdadeira para que o
programa saia do modo suspenso. Por exemplo:

4.4.3 - Espera por Nvel

...
wait until clk = '1';
...

Para a programao da sensibilidade para um nico tipo de variao deve-se


utilizar a palavra-chave until seguida pelo sinal e a condio que se deseja aguardar.
Este formato de comando de espera especialmente importante para a sntese de
componentes sensveis a um tipo de borda, como latches e flip-flops.
O exemplo abaixo ilustra a utilizao deste comando para a implementao de
um componente sensvel a borda positiva do sinal clk:

4.4.2 - Espera por uma V ariao Especfica

Ronaldo Hsemann

A postila de V HDL - Pgina 26

assert ponteiro_buffer /= 0
report Buffer de mensagens ocupado!
severity warning;

Observe que a linha que contm o comando report no finalizada com ';'. Isto
s permitido para uma sentena de comando report seguida de um comando severity.
Se no houver esta segunda linha a finalizao com ';' obrigatria.
O valor warning normalmente utilizado para casos em que o modelo pode
continuar rodando, mas em que se deve fazer uma advertncia ao programador.

assert valor_inicial = 0
report V alor inicial indefinido!
severity note;

confere a validade da varivel valor_ entrada e quando muito grande sinaliza


com erro escrevendo a mensagem "V alor de entrada excede valor maximo!".
A lm disso possvel trata-se com at quatro tipos de violao de regras de
projeto, a partir do uso de severity: note, warning, error e failure. O valor note
utilizado simplesmente para a passagem de mensagens informativas.

assert valor_entrada < valor_maximo


report V alor de entrada excede valor maximo!;

Existe uma forma de se interagir com a simulao de um programa em V HDL a


fim de permitir ao programador checar algumas condies que julgue necessrias ao seu
projeto.
So basicamente dois comandos: assert para checagem e report para exibio de
mensagens.
A conferncia de alguma anormalidade feita pela palavra-chave assert, seguida
pela condio a ser checada. Normalmente esta checagem seguida pela operao de
envio de mensagem de aviso. O envio de mensagens durante o perodo de simulao
feito pelo uso da palavra-chave report, seguida pela mensagem desejada. Por exemplo:

4.5 - Comandos de Compilao: Checagens e Mensagens

realiza uma operao de mascaramento, ou seja de acordo com uma palavra de


configurao (mascara_ conf) se ativa ou no os bits de um dado registrador para a
sada.
A operao deve ser feita bit a bit e para tanto foi replicada 8 vezes pelo
comando generate.

architecture mascaramento of processa_registrador


begin
for n in 0 to 7 generate
resultado(n) <= registrador(n) and mascara_config(n);
end generate;
end architecture mascaramento;

Ronaldo Hsemann

A postila de V HDL - Pgina 27

Se no for definida nenhuma mensagem por report, o padro ser a mensagem


A ssertion violation. e se no for utilizado a sinalizao por severity, o nvel de erro
padro ser error.

assert numero_contagens <= 0


report Parmetro de contagens imprprio!
severity failure;

Por fim o valor failure que o erro mais grave que poderia ocorrer. Indica um
erro extremo.

assert pulso_entrada >= largura_clock_minima


report Sinal pulso_entrada excede largura maxima!
severity error;

O valor error indica que uma condio de falha ocorreu e que deve-se corrigi-la
antes de se prosseguir com os trabalhos.

Ronaldo Hsemann

5 - Programao em V HDL

A postila de V HDL - Pgina 28

chamada modelo que possui duas portas de entrada (in) do tipo bit, declaradas
como a e b e uma porta de sada (out) tambm deste tipo, declarada como c.
Normalmente as portas de entrada de uma entidade so declaradas antes das de sada.
Cada declarao de interface seguido por ponto e vrgula ';', exceto a ltima. Tambm
necessrio colocar-se ponto e vrgula no final da definio de porta.
Conforme apresentado no item 2.2.4, bit um tipo pr-definido em V HDL, que
pode ter dois valores de representao '0' e '1'. Este tipo usado para representar dois
nveis lgicos de sinal.

entity modelo is
port ( a, b : in bit;
c : out bit);
end entity modelo;

Declarao de uma entidade (entity declaration) a definio de uma estrutura


funcional (que pode ser um componente completo ou s parte de um sistema), com a
identificao apropriada, de modo a permitir que a mesma seja posteriormente utilizada.
Normalmente o nome da entidade declarado aps a palavra-chave entity e repetido
aps a palavra-chave end entity. Dentro da declarao da entidade definida a interface
do componente de forma similar a definio de pinos de um componente. Isto feito
atravs da declarao das suas portas (ports) de interface, que alm de um nome prprio
devem conter um modo, que indica se um sinal de entrada (in), sada (out) ou
bidirecional (inout), e um tipo, que determina o tipo de informao que ir trafegar pela
porta. Inicialmente so apresentados os nomes dos sinais e a seguir, separados por dois
pontos ':', o modo e tipo dos mesmos. Na definio das portas de uma entidade, pode-se
definir sinais que comportem no somente bits, mas tambm tipos complexos como
bytes (8 bits), words (16 bits) e at tipos compostos como arrays de variveis, conforme
necessidade do projeto.
A seguir tem-se o exemplo de uma declarao de entidade bem simples:

5.1 - Declarao de Entidade

-Declarao de entidade;
-Corpo de arquitetura

A fim de se compreender a estrutura de programao V HDL deve-se


inicialmente estudar a forma com a qual esta linguagem define os diferentes processos e
componentes que compem um sistema.
Todo componente V HDL tem que ser definido como uma entidade (entity), o
que nada mais do que uma representao formal de um componente ou de um
processo. Em descries mais simples uma entidade pode ser o prprio projeto, mas em
implementaes de grandes sistemas, o projeto composto por diversas entidades
distintas.
O modelo de definio de uma entidade em V HDL segue uma estrutura bem
especfica, composta por duas partes, que sero apresentadas a seguir:

Ronaldo Hsemann

A postila de V HDL - Pgina 29

architecture opera of latch is


begin
q <= r nor nq;
nq <= s nor q;
end dataflow;

-- Sadas q e nq recebem resultado de


-- operacao NOR com as entradas r e s

-- Declarao de arquitetura dataflow

Pode-se montar um corpo de arquitetura comportamental descrevendo sua


funo a partir sentenas de processo (process statements), que so conjuntos de aes a
serem executadas. Os tipos de aes que podem ser realizadas incluem expresses de
avaliao, atribuio de valores a variveis, execuo condicional, expresses
repetitivas e chamadas de subprogramas.
A declarao do comportamento de uma entidade feito atravs da programao
de seus algoritmos com base nos diversos comandos e estruturas da linguagem. A seguir
tem-se um exemplo de uma declarao de arquitetura para a entidade latch.

5.2.1 - Modelo Comportamental

- Modelo comportamental
- Modelo estrutural

O corpo de arquitetura (architecture body) de uma entidade define o seu


funcionamento interno, a partir de uma srie de comandos de operao em um ou mais
processos (process). Um processo como uma unidade bsica descritiva de um
comportamento. Um processo executado normalmente em resposta a mudana de
valores de sinais e usa os valores correntes de sinais e variveis para determinar os
novos valores de sada.
Em V HDL existem dois conceitos de modelamento da descrio funcional de
uma entidade. So eles:

5.2 - Corpo de A rquitetura

onde as entradas de modelo so iniciadas com nvel lgico '1'.

entity modelo is
port ( a, b : in bit := '1';
c : out bit);
end entity modelo;

Um tipo mais complexo poderia manter '0', '1' e 'Z' e talvez at 'X '. Na prtica
para representar valores digitais reais algumas vezes so utilizadas bibliotecas definidas
pela organizao IEEE ou por um vendedor de componentes. comum se encontrar os
tipos STD_LOGIC ou V L_BIT, que so representaes de circuito bem mais prximas
da realidade que os simples valores '0' e '1'.
possvel, em V HDL, a definio de valores iniciais para portas, durante a
definio da entidade, como no exemplo abaixo:

Ronaldo Hsemann

A postila de V HDL - Pgina 30

Neste corpo de arquitetura, a parte aps a diretiva begin inclui a descrio de


como o registrador se comporta. Inicia com a definio do nome do processo, chamado
carga, e termina com a diretiva end process.
Na primeira parte da descrio testada a condio de que ambos os sinais en e
clk sejam iguais a 1. Se eles so, as sentenas entre as diretivas then e end if so
executadas, atualizando as variveis do processo com os valores dos sinais de entrada.
A ps a estrutura if os quatro sinais de sada so atualizados com um atraso de 5ns.
O processo carga sensvel ao sinal clock, o que indicado entre parnteses na
declarao do mesmo. Quando uma mudana no sinal clock ocorre, o processo
novamente executado.

if clk = '1' then


if en = '1' then
d0_temp := d0;
d1_temp := d1;
d2_temp := d2;
d3_temp := d3;
end if;
end if;
q0 <= d0_temp after 5ns;
q1 <= d1_temp after 5ns;
q2 <= d2_temp after 5ns;
q3 <= d3_temp after 5ns;
end process carga;
end architecture comportamento;

begin

architecture comportamento of reg4 is


begin
carga: process (clock)
variable d0_temp, d1_temp, d2_temp, d3temp : bit;

A primeira linha da declarao indica que esta a definio de uma nova


estrutura chamada opera, que pertence entidade chamada latch. A ssim esta arquitetura
descreve a operao da entidade latch. A s linhas entre as diretivas de comeo (begin) e
fim (end) descrevem o operao do latch.
A ssim como em outras linguagens de programao, variveis internas so
definidas tambm em V HDL, com o detalhe de que estas podem somente ser utilizadas
dentro de seus respectivos processos, procedimentos ou funes. Para troca de dados
entre processos deve-se utilizar sinais (signal) ao invs de variveis.
Outro exemplo possvel de um corpo de arquitetura comportamental
apresentado a seguir para a entidade reg4, registrador de 4 bits:

Ronaldo Hsemann

A postila de V HDL - Pgina 31

Figura 5.2: Representao de reg_ 2bits a partir de entidades d_ latch

pode-se utilizar esta estrutura para se compor sistemas mais complexos, como
registradores de um nmero qualquer de bits. Para ilustrar isto a seguir apresentada a
descrio de um registrador de 2 bits, chamado reg_ 2bits, construdo a partir do
flip_flop d_ latch, como na figura:

entity d_latch is
port ( d, clk : in bit;
q : out bit);
end entity d_latch;

cuja declarao encontra-se a seguir:

Figura 5.1: Representao da entidade d_ latch

Existem vrias formas pelas quais um modelo estrutural pode ser expresso. Uma
forma comum o esquemtico de circuito. Smbolos grficos so usados para
representar subsistemas que so conectados usando linhas representando fios. Esta
forma grfica geralmente uma das preferidas pelos projetistas. Entretanto a mesma
forma estrutural pode ser representada textualmente na forma de uma lista de conexes.
Uma descrio estrutural de um sistema expressa portanto em termos de
subsistemas interconectados por sinais.
O mapeamento de portas (port map) especifica que portas da entidade so
conectadas para que sinais do sistema que se est montando.
Por exemplo, tomando-se como base a entidade um flip-flop tipo D simples:

5.2.1 - Modelo Estrutural

Ronaldo Hsemann

A postila de V HDL - Pgina 32

entity reg_2bits is
port ( d0, d1, clk : in bit;
q0, q1 : out bit);
end entity reg_2bits;
architecture estrutura of reg_2bits is
begin:
bit0: entity work.d_latch(behavioral)
port map (d => d0, clk => clk, q => q0)
bit1: entity work.d_latch(behavioral)
port map (d => d1, clk => clk, q => q1)
end architecture estrutura;

Note que, neste caso, na prpria indicao dos componentes que constituem o
sistema reg_ 2bits j feito o mapeamento de pinos desejado, ou seja d0 associado ao
pino d do primeiro flip-flop, assim como o pino clk ao sinal de porta de mesmo nome e
q0 ao bit q, conforme a estruturao bit0. A estrutura bit1 descrita de forma anloga
somente que uma nova entidade d_ latch (uma cpia deste componente) ser criada para
a realizao de suas ligaes.
Entretanto, apesar da forma apresentada ser funcional, muitas vezes na prtica se
costuma descrever formalmente o mapeamento de portas desejado. Isso torna o esquema
de ligaes implementado mais visual e intuitivo. O mapeamento ento se caracteriza
pela indicao dos sinais de origem e destino para cada uma das conexes (ou tambm
chamadas de instncias). Como exemplo, apresentada a seguir a mesma entidade
reg_ 2bits, descrita anteriormente, porm neste formato mais claro:

entity reg_2bits is
port ( d0, d1, clk : in bit;
q0, q1 : out bit);
end entity reg_2bits;
architecture estrutura of reg_2bits is
begin:
bit0: entity work.d_latch(behavioral)
port map (d0, clk, q0)
bit1: entity work.d_latch(behavioral)
port map (d1, clk, q1)
end architecture estrutura;

A descrio V HDL desta estrutura apresentada abaixo:

Ronaldo Hsemann

A postila de V HDL - Pgina 33

se monta um registrador de 8 bits (registrador_ 8bits) a partir e registradores de 4


bits (registrador_ 4bits) operando com sinais tipo bit_ vector, o que simplifica a
indicao das ligaes.
Muitas vezes, como em alguns esquemticos de circuitos feitos componentes
discretos, deseja-se conectar sinais a valores fixos ou at mesmo deslig-los do circuito
final. Isto tambm possvel em V HDL pela adequada atribuio de valores no
mapeamento de conexes.

entity registrador_4bits is
port ( d : in bit_vector (0 to 3);
clk : in bit;
q : out bit_vector (0 to 3);
end entity registrador_4bits;
...
entity registrador_8bits is
port ( din : in bit_vector (0 to 7);
clk : in bit;
dout : out bit_vector (0 to 7));
end entity registrador_8bits;
architecture estrutura of registrador_8bits is
begin:
estrutura: entity work.registrador_4bits
port map ( d (0 to 3) => din (0 to 3),
clk => clk,
q (0 to 3) => dout (0 to 3))
port map ( d (0 to 3) => din (4 to 7),
clk => clk,
q (0 to 3) => dout (4 to 7))
end architecture estrutura;

Este formato traz por si s uma maior flexibilidade do projeto na manipulao de


sinais. Pode-se assim trabalhar com arranjos mais flexveis como quando se utilizam
variveis de tipo composto. Na descrio a seguir por exemplo:

Ronaldo Hsemann

A postila de V HDL - Pgina 34

onde monta-se um registrador de 2 bits (reg_ 2bits) a partir de um registrador


tipo D completo (FF_ D ). Os pinos de reset (rs) e preset (pr) dos flip-flops no so teis
para o registrador de 2 bits e ento so fixados para lgica '1'. A s sadas nq (sada
negada) dos flip-flops tambm no tem aplicao por isso so deixadas abertas (open).

entity FF_D is
port ( d, clk, rs, pr : in bit;
q, nq : out bit);
end entity FF_D;
...
entity reg_2bits is
port ( d0, d1, clk : in bit;
q0, q1 : out bit);
end entity reg_2bits;
architecture estrutura of reg_2bits is
begin:
bit0: entity work.FF_D(behavioral)
port map (d => d0, clk => clk,
rs => '1', pr => '1',
q => q0, nq => open)
bit1: entity work.FF_D(behavioral)
port map (d => d1, clk => clk,
rs => '1', pr => '1',
q => q1, nq => open)
end architecture estrutura;

que pode ser descrito em V HDL como:

Figura 5.3: Representao de reg_ 2bits a partir de entidades FF_ D

V eja-se por exemplo a o diagrama a seguir:

Ronaldo Hsemann

A postila de V HDL - Pgina 35

wait on clk, reset;


end process secao_controle;
end architecture prj_completo;

...

architecture prj_completo of multiplicador is


signal produto_parcial, produto_final: integer;
signal controle_aritmet, result_en, mult_bit, mult_load: bit;
begin
unid_aritmet: entity work.shift_adder(behavior)
port map (somador => multiplicador, augend => produto_final,
sum => produto_parcial,
add_control => controle_ aritmet);
resultado: entity work.reg(behavior)
port map ( d => produto_parcial, q => produto_final,
en => result_en, reset => reset);
multiplicador_rs: entity work.shift_reg(behavior)
port map (d => multiplicador, q => mult_bit,
load => mult_load, clk => clk);
produto <= produto_final;
secao_controle : process is

entity multiplicador is
port ( clk, reset, multiplicando, multiplicador: in integer;
produto: out integer);
end entity multiplicador;

Modelos no precisam ser puramente estruturais ou puramente comportamentais.


Frequentemente til especificar um modelo com algumas partes compostas de
instncias de componentes interconectados e outras partes descritas usando processos.
Utilizam-se sinais (palavra-chave signal) no sentido de interligar instncias de
componentes e processos. Um sinal pode ser associado com uma porta de uma instncia
de componente e pode tambm ser assinalado para ser lido ou escrito em um processo.
Pode-se escrever um projeto com um modelo hbrido que inclua ambos as
abordagens atravs de instncias de componentes e sentenas de processo em um
mesmo corpo de arquitetura. Estas sentenas so coletivamente chamadas de sentenas
concorrentes, uma vez que todos seus correspondentes processos so executados
concorrentemente quando o modelo simulado.
Uma demonstrao disto pode ser observada no prximo exemplo. Este modelo
descreve um multiplicador que consiste de uma parte de tratamento de dados e uma
seo de controle.
A parte de tratamento de dados descrita estruturalmente, usando um nmero de
instncias de componentes.
A seo de controle pode ser descrita comportamentalmente usando um processo
que liga os sinais de controle com a parte de tratamento de dados.

5.3 - Interligao de Modelos com Sinais

Ronaldo Hsemann

6 - Bibliotecas

A postila de V HDL - Pgina 36

inclui todos os elementos que compem a biblioteca new_ lib. Note que no caso
de duas ou mais bibliotecas possurem componentes com o mesmo nome, quando se
necessitar utilizar um especfico necessrio referenciar o nome da biblioteca correta.

use new_lib.all;

torna o componente reg32 conhecido pelo projeto. A ssim no mais necessrio


referenciar a biblioteca macro_ cells, quando se precisar utiliz-lo.
Pode-se tambm incluir todos os componentes de uma biblioteca usando a
diretiva use em conjunto com a palavra-chave all (esta deve ser colocada no lugar do
nome do componente). A linha abaixo ento:

library macro_cel;
use macro_cel.reg32;
...
architecture registradores of somador32 is
begin:
entrada1: entity reg32
port map ( en => habilita, clk => clock,
d => entrada1, q => dado1);
...

Se o uso de um dado componente da biblioteca se tornar muito frequente devese utilizar a palavra-chave use seguida do nome da biblioteca e do componente
(separados pelo caracter .). Isto torna este componente globalmente visvel pelo
projeto. Por exemplo a descrio abaixo:

library macro_cel;
...
architecture registradores of somador32 is
begin:
entrada1: entity macro_cel.reg32
port map ( en => habilita, clk => clock,
d => entrada1, q => dado1);
...

Bibliotecas (libraries) so arquivos especiais que contm um conjunto de


descries e definies em V HDL disponibilizadas para uso por outros programas.
Normalmente, em descries V HDL, utiliza-se a biblioteca de trabalho work (que fica
no diretrio de trabalho vigente). Para incluir outras bibliotecas que no a work, deve-se
utilizar a palavra-chave library seguida pelo nome da biblioteca desejada. Para se
incluir um componente desta biblioteca deve-se acrescer aps o nome da biblioteca o
caracter ponto (.) e o nome do componente. Como ilustrao, a seguir tem-se
apresentada uma descrio que faz uso de um registrador de 32 bits (entidade reg32)
que se encontra na biblioteca macro_ cell:

Ronaldo Hsemann

7 - Subprogramas

A postila de V HDL - Pgina 37

Para ser mais completa, a utilizao de procedimentos em V HDL deveria


permitir a passagem de parmetros quando de sua chamada. Isto tambm previsto pela
linguagem. Para tanto deve-se inicialmente prever na declarao do procedimento o
parmetro (ou parmetros) que poder ser passado, descrevendo-se o mesmo entre
parnteses. Na sua descrio, o parmetro composto por um identificador, um modo
(in, out ou inout) e o tipo. A lgumas vezes utiliza-se a palavra-chave func_ code na
especificao de tipo, quando deseja-se que o tipo do parmetro seja dado pelo
programa que chama o procedimento.
No exemplo a seguir tem-se uma descrio do uso de um procedimento de envio,
por um pino serial chamado dout, de um caracter (dado) passado como parmetro:

7.1.1 - Procedimento com Parmetros

implementa um procedimento de atraso de (n_ delay*10ns). Note que n_ delay


deve ser uma constante global.

...
procedure delay is
begin
for n in 1 to n_delay loop
wait for 10ns;
end loop;
end procedure delay;
...
delay;
-- chamada do procedimento de atraso
...

Um procedimento (procedure) em V HDL um conjunto de operaes que


executa uma determinada finalidade. Este procedimento pode ser chamado de qualquer
parte do programa V HDL, de forma similar chamada de funes feita em vrias outras
linguagens.
Para a chamada de um procedimento em uma descrio V HDL basta escrever-se
o nome do procedimento seguido de ponto-e-vrgula (;). Por exemplo:

7.1 -Procedimentos

-Procedimentos;
-Funes.

Subprogramas em V HDL so conjuntos de comandos ou algoritmos que


desempenhem uma determinada operao que necessria muitas vezes no projeto.
A ssim esta sequncia de comandos montada e disponibilizada globalmente de forma
que o projeto possa acess-la quando for necessrio.
Basicamente so dois os tipos de sub-programas em V HDL:

Ronaldo Hsemann

A postila de V HDL - Pgina 38

if numero > 39 then return;


elsif numero >= 30 then
mais_sig := 3;
menos_sig := numero - 30;
elsif numero >= 20 then
mais_sig := 2;
menos_sig := numero - 20;
elsif numero >= 10 then
mais_sig := 1;
menos_sig := numero - 10;
else mais_sig := 0;
menos_sig := numero;

converte_para_BCD (dado_lido, dezena, unidade);

...

end if;
end procedure converte_para_BCD;

begin

procedure converte_para_BCD (numero: in integer range 0 to 39;


mais_sig, menos_sig : out integer range 0 to 9) is

...

Para ilustrar que procedimentos tambm poder retornar valores a seguir


apresenta-se um exemplo de um algoritmo para converso de valor decimal para BCD:

...

dado := 34;
envia_serial(dado);

...

procedure envia_serial (dado : in func_ code) is


variable indice : dado_ serial := 0;
variable teste : positive := 0;
variable temp : bit := start_bit ;
begin
if (clock='1') then
if teste >1 and teste < (tamanho_dado_serial + 1) then
teste := teste +1;
if indice <= tamanho_dado_serial then
temp := dado(indice);
indice := indice +1;
end if;
end if;
end if;
if teste = (tamanho_dado_serial +1) then
temp := stop_bit;
dout <= temp;
return;
end if
dout <= temp;
end procedure envia_serial;

Ronaldo Hsemann

A postila de V HDL - Pgina 39

A funo usada para ajustar o formato de uma varivel chamada


valor_ entrada, retornando na prpria linha de chamada o valor da converso. Note que a
varivel (ou variveis) de entrada de uma funo no precisa conter o modo (como in ou
inout), uma vez que isto subentendido. A varivel de sada declarada fora dos
parnteses e no precisa identificador, apenas o tipo.

function bcd_para_decimal (valor_bcd : integer 0 to 255) return integer is


variable resultado : integer range 0 to 99;
variable valor_temp : integer range 0 to 255;
variable nibble: integer range 0 to 15;
begin
nibble := valor_bcd;
valor_temp := (dado - nibble)/2;
if valor_bcd > 9 then
resultado := valor_temp + valor_temp/4 + nibble;
else
resultado := valor_bcd;
end if;
return resultado;
end function bcd_para_decimal;
...
if bcd_para_decimal(valor_entrada) > valor_limite then
atuador <= OFF;
else
atuador <= ON;
end if;
...

Uma funo (function) em V HDL similar a um procedimento (descrito no


item 7.1) exceto que permite o retorno de um resultado na prpria linha de execuo.
Este tipo de recurso bastante til para uso em expresses.
No exemplo a seguir, tem-se implementada uma funo que realiza a converso
de um nmero em formato BCD para decimal.:

7.2 - Funes

procedure envia_serial (dado : in func_ code


signal dout: out bit) is

Observe que possvel ter mais de um ponto de sada de um procedimento. No


modelo apresentado, por exemplo, se o valor da varivel for maior que 39 o
procedimento abortado. Finalizaes de procedimentos so possveis atravs da
palavra-chave return.
A lm da passagem de valores como parmetros, um procedimento permite a
passagem de sinais, o que na verdade se constitui pela ligao de um pino de entrada (ou
sada) de um mdulo com a interface do procedimento que est sendo chamado. A ssim,
se fosse desejado, por exemplo, para o procedimento apresentado anteriormente deixar a
atribuio do pino de sada serial a critrio do programa que fosse utiliz-lo, poderia-se
alterar a declarao do procedimento para:

Ronaldo Hsemann

8 - Blocos Externos

A postila de V HDL - Pgina 40

Note que no exemplo se define um valor inicial de 3ns, o qual ser utilizado caso
o parmetro no seja alterado externamente.

entity FF is
generic (tpd : time := 3ns)
port ( d, clk : in bit;
q : out bit);
end entity FF;
architecture carga_FF of FF is
begin
wait until clk =1;
q <= d after tpd;
end architecture carga_FF;

A lgumas vezes quando se definem entidades, mdulos ou componentes em


V HDL tem-se a inteno de reutiliz-las para outras aplicaes e at mesmo outras
tecnologias. A ssim, em alguns casos, para aplicaes distintas, as entidades deveriam ter
caractersticas diferentes, como por exemplo nos atrasos de propagao. Isto sem alterar
o funcionamento da entidade. Deve-se lembrar que descries em V HDL so descries
de hardware genricas no dependendo das tecnologias atuais no campo de eletrnica
digital ou lgicas programveis.
A fim de se permitir a mudana de parmetros de entidades deve-se utilizar
constantes genricas. Este tipo de elemento apesar de se comportar como uma constante
dentro do corpo da entidade pode ser alterado externamente pelo programa que pretende
utiliz-la.
Para a criao deste elemento deve-se fazer uso da palavra-chave generic
seguido da declarao da(s) constante(s) que se pretende definir entre parnteses. Como
exemplo apresenta-se um modelo de um flip-flop simples, chamado FF, que permite
mudana de seu tempo de propagao, tpd:

8.1 - Parmetros G enricos

A ntes porm de se apresentar estes blocos ir-se introduzir o tema parmetros


genricos, que trata da forma como se pode estar ou definir informaes prprias para o
bloco que se pretende utilizar. Isto especialmente importante para blocos muito
completos que devem ser configurados para as caractersticas de uma dada aplicao
antes de ser utilizado.

-Mdulo (package);
-Componentes.

A lm da opo de criao de subprogramas em V HDL possvel tambm a


criao e uso de blocos operacionais globais. A finalidade neste caso de se montar um
projeto que fique disponvel para reuso no formato de um elemento ou componente
fechado. Outros programas podem utilizar estes blocos como "caixas pretas" que so
interligadas a sinais ou portas conforme necessrio.
Normalmente os tipos de blocos disponveis em V HDL, so dois:

Ronaldo Hsemann

A postila de V HDL - Pgina 41

A traduo literal para package empacotamento, que entretanto no muito difundida. Ir-se utilizar
neste texto package associada ao termo mdulo, mais acessvel e que mantem a idia original.

A declarao do mdulo (package declaration) deve conter todas as informaes


necessrias para que um usurio possa import-lo e trabalhar com ele. Normalmente o
uso de mdulos packages til para a composio de bibliotecas de funes e
componentes que podem ser incorporadas a programas distintos.
Na declarao deve-se dar o nome do mdulo package, o qual usado para
referenci-lo no projeto, bem como da declarao das variveis utilizadas pelo mdulo.
Para ilustrar isso a seguir descreve-se um mdulo de UA RT, que apresenta como
parmetros sua frequncia base de operao (frequencia_ base), um registrador de
caracter recebido (caracter_ rx), um de caracter a ser transmitido (caracter_ tx) e um bit
para informar se um novo dado foi recebido (caracter_ recebido):

8.2.1 - Declarao do Mdulo

Mdulos packages1 em V HDL so conjuntos de declaraes usadas para um


determinado fim. Pode ser um conjunto de sub-programas (contendo bibliotecas ou
funes) que operem com um tipo de dado assim como pode ser um conjunto de
declaraes necessrias para modelar um determinado projeto.
Um mdulo package composto por duas descries isoladas. A primeira uma
viso externa do mdulo, chamada declarao do mdulo. A segunda a implementao
propriamente dita das funes que o mdulo exerce, chamada de corpo do mdulo.

8.2 - Mdulos (Packages)

onde o primeiro flip-flop definido no projeto, flipflop1, tem tempo de


propagao de 5ns enquanto que o segundo, flipflop2, tem tempo de propagao de
10ns.

flipflop1: entity work.FF


generic map (tpd => 5ns);
port map ( d=> d1, clk => clock, q => q1);
flipflop2: entity work.FF
generic map (tpd => 10ns);
port map ( d=> d1, clk => clock, q => q1);

Para a alterao dos valores destas constantes genricas deve-se utilizar uma
estrutura de mapeamento onde se atribuem os valores desejados a cada constante
genrica. Este mapeamento de constantes genricas deve ser feito atravs das palavraschaves generic map.
A seguir apresenta-se um exemplo de uso do flip-flop FF apresentado
anteriormente (supondo-o dentro da biblioteca de trabalho work):

Ronaldo Hsemann

A postila de V HDL - Pgina 42

Para este exemplo supe-se que o mdulo UA RT esteja incluso na biblioteca de


trabalho serial_ lib. No incio da descrio da entidade interface_ serial realiza-se um
mapeamento das variveis do mdulo UA RT para que sejam utilizados posteriormente.
Note as variveis do mdulo package podem ser associadas nesta etapa a outras
variveis definidas no projeto com identificadores distintos. A varivel
caracter_ recebido do mdulo package, por exemplo, foi associada a outra local
chamada byte_ recebido. Este recurso possibilita, independentemente da declarao do
mdulo package, trabalhar-se no projeto com identificadores definidos a critrio do
usurio, tornando o cdigo mais compreensvel.

architecture recepcao_serial of interface_serial is


type buffer_serial is array (0 to15) of byte;
variable buffer_cheio : bit := '0';
variable buffer_vazio : bit := '1';
variable apontador_buffer : byte := 0;
begin
while apontador_buffer < 16 loop
if byte_recebido = 1
buffer_serial (apontador_buffer) := novo_byte;
apontador_buffer := apontador_buffer + 1;
byte_recebido := '0';
buffer_vazio := '0';
end if;
end loop;
buffer_cheio := 1;
end architecture recepcao_serial;

...
entity interface _serial is
port (byte_ recebido : in serial_lib.caracter_recebido;
novo_byte : in serial_lib.caracter_rx);
end entity interface_serial;

Uma vez que uma declarao de mdulo seja compartilhada por um projeto,
todas as variveis declaradas podem ser livremente acessadas.
A seguir ir-se apresentar um exemplo de uso de um mdulo package tomandose como base o mdulo UA RT definido anteriormente:

package UA RT is
constant frequencia_base : positive :=19200;
variable caracter_rx : byte;
variable caracter_tx : byte;
variable caracter_recebido : bit :='0';
end package UA RT;

Ronaldo Hsemann

A postila de V HDL - Pgina 43

Este exemplo monta um mdulo conversor, que contm uma funo chamada
converte_ 7seg, a qual realiza a converso de um nmero do tipo byte para um conjunto
de bits segundo padro de acionamento usado para displays de 7 segmentos;
Dentro de um corpo de mdulo package pode-se definir novos tipos, variveis e
constantes que sero utilizados localmente (como no exemplo acima a varivel
valor_ inteiro). A lm disso pode-se definir funes locais que sero teis para o corpo
do mdulo.

end package body conversor;

package body conversor is


begin
function converte_7seg (byte_entrada : byte) return bit_vector (0 to 7) is
begin
case byte_entrada is
when 0 => convertido := B"11111100";
when 1 => convertido := B"01100000";
when 2 => convertido := B"11011010";
when 3 => convertido := B"11111000";
when 4 => convertido := B"01100110";
when 5 => convertido := B"10100110";
when 6 => convertido := B"10111110";
when 7 => convertido := B"11100000";
when 8 => convertido := B"11111110";
when 9 => convertido := B"11110110";
end case;
return convertido;
end function converte_7seg;

package conversor is
function converte_7seg (byte_entrada : byte) return bit_vector (0 to 7);
end package conversor;

O corpo do mdulo (package body) deve conter o comportamento do mdulo


package, a partir das variveis e funes definidas na declarao do mdulo.
Existe uma situao onde o corpo do mdulo package no precisa ser definido,
que no caso de mdulos que so utilizados apenas para definio de tipos, variveis e
constantes globalmente.
A s variveis e constantes definidas na declarao de mdulo package no
precisam ser reescritas, uma vez que o corpo do mdulo j as reconhece
automaticamente.
Todos os itens tipo funes contidos na declarao do mdulo package devem
ser repetidos no corpo do mdulo. importante principalmente notar que a declarao
destas funes devem estar coincidindo integralmente, ou seja contendo suas variveis
de entrada e sada, na mesma ordem, com os mesmos identificadores e tipos.
A seguir um exemplo completo de mdulo package:

8.2.2 - Corpo do Mdulo

Ronaldo Hsemann

A postila de V HDL - Pgina 44

A declarao de componente (component declaration) especifica a viso externa


do componente em termos de constantes e portas de interface. Uma declarao de
componente e bastante similar a uma declarao de entidade, somente desta vez
utilizando a palavra-chave component. Normalmente em componentes mais genricos
comum o uso de constantes genricas a fim de possibilitar a melhor adequao do
componente a diferentes tecnologias.
Para exemplificar, a seguir descreve-se a declarao de um componente chamado
flipflop:

8.3.1 - Declarao do Componente

Componentes (component) em V HDL, como o prprio nome diz, so conjuntos


de funes que ditam o comportamento de um dado bloco funcional. Este componente,
apropriado para uma dada aplicao, disponibilizado para uso por outros mdulos.
Em itens anteriores foi apresentado um subsistema em V HDL como descrito por
duas partes: a primeira a declarao da entidade e a segunda, o corpo de arquitetura.
Para a descrio de um componente procede-se de uma forma similar, exceto que em
vez de declarao de entidade se faz uma declarao de componente. O corpo de
arquitetura deste deve descrever as instncias do componente.

8.3 - Componentes

...
architecture gera_leitura of msg_lcd is
begin
conversao: process is
use string_lib.conversor.all;
variable byte_lido : byte;
variable string_lcd : byte_string;
begin
wait until flag_entrada = '1';
byte_lido := valor_entrada;
string_lcd := byte_para_string(byte_lido);
end process conversao;
end architecture gera_leitura;

A palavra-chave use recomendada para as descries de projetos que devam


incluir mdulos packages. A ssim pode-se importar bibliotecas que contenham mdulos
packages, selecionando quais mdulos dentro desta biblioteca e at mesmo quais
funes dentro de cada mdulo sero utilizadas.
A baixo apresenta-se um exemplo utilizando uma funo byte_ para_ string,
localizada na biblioteca string_ lib, para exibio de mensagens em um display de cristal
lquido (LCD):

Ronaldo Hsemann

A postila de V HDL - Pgina 45

A representao em diagrama de componentes deste sistema divisor por 16 est


ilustrado na figura 8.1.

architecture divisao of contador is


component flipflop is
port (clk : in bit; clr : in bit; d : in bit;
q : out bit);
end component flipflop;
signal dout , ndout: bit_ vector (0 to 3);
begin
conta1 : component flipflop
port map (clk => clk, d => ndout(1),
q => dout(1), nq => ndout(1));
conta2 : component flipflop
port map (clk => dout (1), d => ndout(2),
q => dout(2), nq => ndout(2));
conta3 : component flipflop
port map (clk => dout (2), d => ndout(3),
q => dout(3), nq => ndout(3));
conta4 : component flipflop
port map (clk => dout (3), d => ndout(4),
q => sada, nq => ndout(4));
...
end architecture modelo;

A s instncias do componente (component instances) definem a forma de


utilizao do componente em um projeto. Nesta descrio pode-se atribuir valores s
constantes genricas bem como conectar sinais s portas do componentes.
Sua utilizada feita de modo anlogo a componentes discretos atravs de
ligaes de
sinais com suas portas.
Como exemplo ir-se tomar um sistema divisor por 16, baseado em 4 flipflops.
Para tanto tem-se a seguinte descrio em V HDL abaixo apresentada. Note a
necessidade de se utilizar vrios sinais para esta implementao.

8.3.2 - Instncia do Componente

component flipflop is
generic (Tprop, Tsetup, Thold : delay_length);
port (clk : in bit; d : in bit;
q , nq : out bit);
end component flipflop;

Ronaldo Hsemann

Figura 8.1: Representao do divisor por 16

A postila de V HDL - Pgina 46

Uma configurao feita pode ser compartilhada atravs do emprego do comando


use configuration seguida pelo nome da configurao desejada. Isto permite que outras
instncias possam seguir uma mesma configurao definida anteriormente. Como
ilustrao, observe a estrutura a seguir:

define duas configuraes para o projeto reg2. A primeira que descreve o


elemento bit0 utiliza um flip-flop definido pela entidade edge_ triggered_ D ff com
modelo hi_ fanout. A segunda que descreve os demais (others) elementos utiliza flipflops definidos pela entidade edge_ triggered_ D ff com modelo basic. Para a definio de
uma configurao global para o projeto pode-se utilizar a palavra-chave all.

configuration reg2_gate_level of reg2


for estrutura
for bit0: flipflop
use entity edge_triggered_Dff (hi_fanout);
end for;
for others : flipflop
use entity edge_triggered_Dff(basic);
end for;
end for;
end configuration reg2_gate_level;

A fim de especificar a tecnologia real que ser utilizada no projeto pode-se fazer
uso de uma declarao de configurao (configuration declaration). Para tanto monta-se
uma estrutura de configurao em que pode-se definir para cada instncia, quais
entidades e modelos de corpo de arquitetura sero utilizados.
Deve-se utilizar a palavra-chave for seguida pela instncia (ou instncias
separadas por vrgula), o caracter dois pontos (:) e o nome do componente. A seguir
descrita a entidade que ser utilizada atravs da palavra-chave use. Caso a entidade
possua mais de um modelo comportamental, o modelo selecionado deve ser indicado
entre parnteses. Por exemplo, a estrutura a seguir:

8.3.3 - Configurao de Componentes

Ronaldo Hsemann

A postila de V HDL - Pgina 47

architecture modelo of counter is


use work. counter_types.digit
signal segundos_clk , reset_meia_noite: bit;
signal unid_segundos, dez_segundos : digit;
begin
segundos :
configuration work.counter_down_to_gate_level
port map (clk => segundos_clk, clr => reset_meia_noite,
q0 => unid_segundos, q1 => dez_segundos);
...
end architecture modelo;

que utiliza a mesma configurao definida anteriormente reg2_ gate_ level, agora
para o elemento flag_ reg.
possvel ainda efetuar-se a configurao de um componente no seu prprio
corpo de arquitetura, usando as estruturas apresentadas logo no incio das suas
declaraes. Isto pode ser melhor visto no exemplo abaixo:

for flag_reg : reg2


use configuration reg2_gate_level;
end for;

Ronaldo Hsemann

Declarao de configurao 46
Declarao do componente 44
Declarao do mdulo 41

Caracteres 4
CA SE , estrutura 20
Character, tipo 11
Characters ver caracteres
Comentrios 3
Component declaration ver declarao
de componente
Component instance ver instncia do
componente
Component ver componente
Componente 44
Composite types ver tipos compostos
Configurao de Componentes 46
Configuration
declaration
ver
declarao de configurao
Constantes 6
Constants ver constantes
Converso de tipos 15
Corpo de arquitetura 29
Corpo do Mdulo 43

Bibliotecas 36
Bit string ver string de bit
Bit, tipo 11
Blocos Externos 40
Boolean, tipo 11

de

A postila de V HDL - Pgina 48

ponto

Modelo comportamental de uma


entidade 29
Modelo estrutural de uma entidade
31
Mdulos (packages) 41

L ibraries ver bibliotecas


L OOP, estrutura 21

Identificador 3
Identifier ver identificador
IF, estrutura 19
Instncia do componente 45
Integer type ver inteiros, tipos
Inteiros, tipos 8

GENERA TE, estrutura 25


G eneric parameters ver parmetros
genricos

File type ver arquivo, tipo


Fsico, tipo 9
Floating pointer type ver
flutuante, tipo
FOR-L OOP, estrutura 23
Funo 39
Function ver funo

Entidade, declarao 28
Entity declaration ver entidade,
declarao
Enumerao, tipo 10
Enumeration type ver enumerao,
tipo

NDICE REMISSIV O
A rchitecture body ver corpo
arquitetura
A rquivo, tipo 7
A rray 12
A SSERT, comando 26

Ronaldo Hsemann

Record 14
REPORT, comando 26

Package body ver corpo do mdulo


Package declaration ver declarao do
mdulo
Packages ver mdulos (packages)
Parmetros genricos 40
Physical type ver fsico, tipo
Ponto flutuante, tipo 9
Procedimento 37
Procedure ver procedimento

Operaes aritmticas 17
Operaes de comparao 17
Operaes de
deslocamento
rotao 18
Operaes lgicas 18

Nmeros em V HDL 4

Ronaldo Hsemann

W A IT, estrutura 24
W HIL E-L OOP, estrutura 23

V ariables ver variveis


V ariveis 6

Tipos compostos 12
Tipos de dados 6
Tipos escalares 8

Scalar types ver tipos escalares


SEV ERITY , comando 26
Signals ver sinais
Sinais 6
String 4
String de bit 5
Subprogramas 37
Subtipos 15
Subtypes ver subtipos

A postila de V HDL - Pgina 49

Вам также может понравиться