Buscar

tutorial_fpga_vhdl

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 43 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

VII - SEMANA DA ENGENHARIA 
PUCRS 
 
 
 
 
MINICURSO 2 
 
 
 
DISPOSITIVO LÓGICOS PROGRA-
MÁVEL (FPGA) E LINGUAGEM DE 
DESCRIÇÃO DE HARDWARE (VHDL) 
 
 
 
 
 
 
 
 
ELABORADO E MINISTRADO PELO 
ENGENHEIRO ANDERSON ROYES TERROSO 
 
 
 
 
PORTO ALEGRE, SETEMBRO DE 1998 
 
1 INTRODUÇÃO ................................................................................................................................... 3 
1.1 DISPOSITIVOS LÓGICOS PROGRAMÁVEIS FPGA ............................................................... 3 
1.1.2 DEFINIÇÃO DE BLOCOS LÓGICOS:................................................................................ 4 
1.1.3 DEFINIÇÃO DE ROTEAMENTO ......................................................................................... 5 
1.1.3 DEFINIÇÃO DE IOB´S ......................................................................................................... 7 
1.2 CIRCUITOS PROGRAMÁVEIS EPLD ....................................................................................... 7 
2 LINGUAGEM DE DESCRIÇÃO DE HARDWARE (VHDL) ....................................................... 8 
2.1 O QUE É VHDL?........................................................................................................................... 8 
2.2 O QUE SIGNIFICA VHDL? ......................................................................................................... 8 
2.3 O QUE É UMA LINGUAGEM DE DESCRIÇÃO DE HARDWARE? ........................................ 8 
2.4 BREVE HISTÓRICO .................................................................................................................... 8 
2.4.1 LINHA CRONOLÓGICA....................................................................................................... 9 
2.5 VANTAGENS E DESVANTAGENS DE SE UTILIZAR VHDL............................................... 10 
3 COMPONENTES DE UM PROJETO VHDL ............................................................................... 11 
3.1 PACKAGE (PACOTES) ............................................................................................................. 13 
3.2 ENTITY (ENTIDADE) ............................................................................................................... 14 
3.2.1 TIPO DE PORTAS............................................................................................................... 14 
3.2.2 TIPOS DE SINAIS ............................................................................................................... 14 
3.3 ARCHITECTURE (ARQUITETURA) ....................................................................................... 15 
3.3.1 ARQUITETURA SIMPLES .................................................................................................. 15 
3.3.2 ARQUITETURA CONCORRENTE...................................................................................... 16 
3.4 CONFIGURATION (CONFIGURAÇÃO) ................................................................................. 18 
4 SEMÂNTICA DA LINGUAGEM VHDL....................................................................................... 19 
4.1 ELEMENTOS LÉXICOS ............................................................................................................ 19 
4.1.1 COMENTÁRIOS .................................................................................................................. 19 
4.1.2 IDENTIFICADORES ........................................................................................................... 19 
4.1.3 TIPOS DE DADOS NÃO LÓGICOS ................................................................................... 20 
4.1.4 EXPRESSÕES E OPERADORES ........................................................................................ 21 
5 COMANDOS SEQÜENCIAIS......................................................................................................... 22 
5.1 ATRIBUIÇÃO DE VARIÁVEIS ................................................................................................ 22 
5.2 ATRIBUIÇÃO DE SINAIS ......................................................................................................... 24 
5.3 COMANDO WAIT...................................................................................................................... 26 
5.4 COMANDO IF THEN ELSE....................................................................................................... 26 
5.5 COMANDO LOOP FOR - WHILE ............................................................................................. 31 
5.6 COMANDO NEXT ..................................................................................................................... 32 
5.7 COMANDO EXIT....................................................................................................................... 32 
5.8 COMANDO CASE...................................................................................................................... 33 
5.9 COMANDO NULL ..................................................................................................................... 34 
5.10 COMANDO RETURN .............................................................................................................. 34 
6 ESPECIFICANDO A ESTRUTURA DE UM SISTEMA ............................................................. 35 
7 ALGUNS EXEMPLOS DE IMPLEMENTAÇÕES EM VHDL................................................... 38 
8 BIBLIOGRAFIA ............................................................................................................................... 43 
 
1 INTRODUÇÃO 
 
 
 O rápido desenvolvimento dos recursos de concepção de circuitos in-
tegrados, tanto na área de processos quanto na área de CAD, tornou possí-
vel o aparecimento de dispositivos com Lógica Programável. Tais dispositivos 
permitem aos usuários implementar circuitos complexos sem a necessidade 
do uso de onerosos recursos de fundição em sílicio. 
 A primeira utilização destes circuitos é naturalmente nos projetos de 
prototipagem. Tendo em vista que grande parte destes circuitos podem ser 
reprogramados, o seu uso nas fases preliminares de projeto possibilita uma 
grande economia de tempo e dinheiro. 
 A medida em que os dispositivos de Lógica Programável tornam-se 
cada vez mais densos e rápido, o processo de concepção de projetos eletrô-
nicos se beneficia destes circuitos fazendo com que o tempo de projeto seja 
reduzido em muitos dias. Assim sendo, devido à grande complexidade dos 
projetos capazes de ser implementados em lógica programável, tais circuitos 
passam a ser utilizados em projetos industriais como substituto dos circuitos 
ASIC (Application Specific Integrated Circuits). 
 
1.1 DISPOSITIVOS LÓGICOS PROGRAMÁVEIS FPGA 
 
 FPGA (Field Programmable Gate Array) são circuitos programáveis 
compostos por um conjunto de células lógicas ou blocos lógicos alocados 
em forma de uma matriz. Em geral, a funcionalidade destes blocos assim 
como o seu roteamento, são configuráveis por software. A palavra Field indi-
ca que a configuração do circuito pode ser feita pelo usuário final sem a ne-
cessidade da utilização de recursos de foundries. Na Figura 1.1, está de-
monstrado a estrutura de uma FPGA. 
 
FIGURA 1.1: A estrutura de uma FPGA. 
 
1.1.2 DEFINIÇÃO DE BLOCOS LÓGICOS: 
 
As funções lógicas são implementadas no interior dos Blocos Lógicos. 
Em algumas arquiteturas os Blocos Lógicos possuem recursos seqüenciais 
tais como flip-flop ou registradores. O fabricante Xilinx chama seu Bloco Lógi-
co de CLB (Configurable Logic Block), conforme a Figura 1.2. Enquanto que a 
Actel usa o termo LM (Logic Modules), já a Altera utiliza o termo LE (Logic 
Element) para as séries 8000 e 10000 e Macrocell paraas séries 5000, 7000 
e 9000. 
 
FIGURA 1.2: A estrutura de uma FPGA. 
 
1.1.3 DEFINIÇÃO DE ROTEAMENTO 
 
A interconexão entre os blocos é feita através de uma rede de duas 
camadas de metal. A conexões físicas entre os fios são feitas ora com tran-
sistores de passagem controlados por bits de memória (PIP) ora com chaves 
de interconexão (Switch Matrix). 
Os recursos de roteamento da série XC3000 da Xilinx possuem: 
• Conexões Globais: formam uma rede de interconexão em linha e 
colunas de cinco fios de metal cada, que se ligam através de chaves 
de interconexão. Esta rede circunda os blocos lógicos (CLB´s) e os 
blocos de E/S (IOB´s); 
• Matrizes de Conexão (Switch Matrix): são chaves de interconexão 
que permitem o roteamento entre os Blocos Lógicos através das 
Conexões Globais (Figura 1.3). Estas conexões são programáveis 
na fase de roteamento automático, executada pelo software de pro-
jeto do fabricante ou manualmente com o uso de uma ferramenta de 
software chamada Edinet. 
 
CLB
SB
SBSB
SB 1 2
3
4
56
7
8
Switch Box
 
FIGURA 1.3:Representação de um Switch Box. 
 
• Conexões Diretas: são conexões entre CLB´s vizinhos e permitem 
conectar blocos com menor atraso, pois não utilizam os recursos 
globais de roteamento. 
• Linhas Longas: são conexões que atravessam todo o circuito sem 
passar pelas switch matrix e são utilizadas para conectar sinais lon-
gos e com restrições de skew entre múltiplos destinos (Figura 1.4) 
 
 
FIGURA 1.4: Roteamento de uma FPGA. 
 
1.1.3 DEFINIÇÃO DE IOB´S 
 
Os blocos de E/S possuem buffer tristate e um flip-flop para os sinais 
da saída. O sinal de saída pode ser invertido por programa assim como o si-
nal de controle do tristate (Figura 1.5) 
 
FIGURA 1.5: Representação de um IOB da família XC 3000 da XILINX 
 
1.2 CIRCUITOS PROGRAMÁVEIS EPLD 
 
EPLD (EPROM Programmable Logic Devices) são componentes que 
possuem transistores EPROM para possibilitar sua programação. Os transis-
tores EPROM são usados para forçar valores nas entradas dos blocos lógi-
cos, ou seja, enquanto eles não são programados em seu estado OFF, a 
word line pode forçar valores para o bit line, ora fechando o circuito entre o 
dreno e a fonte do transistor, ora abrindo o circuito entre dreno e a fonte. 
 
 
2 LINGUAGEM DE DESCRIÇÃO DE HARDWARE 
(VHDL) 
 
2.1 O QUE É VHDL? 
 
VHDL é uma forma de se descrever, através de um programa, o comporta-
mento de um circuito ou componente digital. 
 
2.2 O QUE SIGNIFICA VHDL? 
 
Very Hight Speed Integrated Circuit 
Hardware 
Description 
Language 
 
Linguagem de Descrição de Hardware com ênfase em Circuitos Integra-
dos de altíssima velocidade. 
 
2.3 O QUE É UMA LINGUAGEM DE DESCRIÇÃO DE HARD-
WARE? 
 
Uma linguagem de descrição de hardware descreve o que um sistema 
faz e como. Esta descrição é um modelo do sistema hardware, que será exe-
cutado em um software chamado simulador. Um sistema descrito em lingua-
gem de hardware pode ser implementado em um dispositivo programável 
(FPGA - Field Program Gate Array), permitindo assim o uso em campo do 
seu sistema, tendo a grande vantagem da alteração do código a qualquer 
momento. 
 
2.4 BREVE HISTÓRICO 
 
A idéia da criação de uma linguagem de descrição de hardware partiu 
do Departamento de Defesa dos Estados Unidos da América (DoD). As for-
ças armadas americanas, compravam grande quantidade de placas de circui-
tos impressos, sendo que muitas delas compostas de circuitos integrados de 
aplicação específica (ASIC - Application Specific Integrated Circuits). 
Como era comum, empresas da área de eletrônica, mudarem de área ou tro-
car de ramo, necessitava-se garantir a reposição das peças durante a vida 
útil das placas, com isso o DoD iniciou o desenvolvimento de uma linguagem 
padrão de descrição de hardware. 
 
2.4.1 LINHA CRONOLÓGICA 
 
1968: foram desenvolvidas as primeiras linguagens de descrição de hardwa-
re, porém em 1970 tinha-se inúmeras linguagens com sintaxe e semântica 
incompatíveis; 
1973: surge o primeiro esforço de padronização da linguagem, comandado 
pelo projeto CONLAN (CONsensus LANguage), cujo o objetivo principal era: 
definir formalmente uma linguagem de multi-nível com sintaxe única e semân-
tica igual. Paralelamente, iniciou-se outro projeto financiado pelo DoD cujo o 
objetivo era criar uma linguagem de programação. 
1983: em janeiro de 1983, foi publicado o relatório final do projeto CONLAN. 
Neste mesmo ano, também foi publicado o relatório final do projeto DoD, que 
deu origem a linguagem ADA. Em março de 83, o DoD começou o programa 
VHSIC, afim de melhorar a tecnologia de concepção, engenharia e constru-
ção nos EUA. Participaram deste projeto a IBM, Intermetrics e Texas Instru-
ments. 
1986: a Intermetrics desenvolveu um compilador e um simulador. Além disso 
foi criado um grupo de padronização da IEEE para VHDL. 
1988: primeiros softwares são comercializados. 
1991: recomeçou-se um novo processo de padronização, cujo o objetivo era 
a coleta e análise de requisitos, definição dos objetivos e a especificação das 
modificações à linguagem. 
1992: as modificações propostas foram avaliadas e votadas. 
1993: um novo padrão é publicado, chamado VHDL-93, padronizado IEEE 
Std 1164-1993. 
1997: em dezembro de 97 foi publicado o manual de referência da linguagem 
VHDL. 
 
2.5 VANTAGENS E DESVANTAGENS DE SE UTILIZAR VHDL 
 
A descrição de um sistema em VHDL apresenta inúmeras vantagens, tais 
como: 
• Intercâmbio de projetos entre grupos de pesquisa sem a necessidade 
de alteração; 
• Permite ao projetista considerar no seu projeto os delay´s comuns aos 
circuitos digitais; 
• A linguagem independe da tecnologia atual, ou seja, você pode desen-
volver um sistema hoje e implementá-lo depois; 
• Os projetos são fáceis de serem modificados; 
• O custo de produção de um circuito dedicado é elevado, enquanto que 
usando VHDL e Dispositivos Programáveis, isto passa a ser muito me-
nor; 
• Reduz consideravelmente o tempo de projeto e implementação. 
 
Quanto as desvantagens, apenas uma é relevante: 
• VHDL não gera um hardware otimizado; 
3 COMPONENTES DE UM PROJETO VHDL 
 
A estrutura de um programa VHDL, baseia-se em 4 blocos: 
 
PACKAGE 
ENTITY 
ARCHITECTURE 
CONFIGURATION 
 
• PACKAGE são declarados as constantes, tipos de dados, sub-programas; 
• ENTITY declaração dos pinos de entrada e saída; 
• ARCHITECTURE define as implementações do projeto; 
• CONFIGURATION define as arquiteturas que serão utilizadas. 
 
 Abaixo está representado a estrutura de um programa descrito em 
VHDL. 
 
LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.all; 
USE IEEE.STD_LOGIC_UNSIGNED.all; 
 
 
 
PACKAGE 
(BIBLIOTECAS) 
 
ENTITY exemplo IS 
PORT ( 
 
 < descrição dos pinos de entrada e saída > 
 
 ); 
END exemplo; 
 
 
 
 
 
ENTITY 
(PINOS DE I/O) 
ARCHITECTURE teste OF exemplo IS 
BEGIN 
 PROCESS( <pinos de entrada e signal > ) 
 
 BEGIN 
 
< descrição do circuito integrado > 
 
 END PROCESS; 
END teste; 
 
 
 
 
ARCHITECTURE 
(ARQUITETURA) 
 
 
LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.all; 
USE IEEE.STD_LOGIC_UNSIGNED.all; 
entity placa is 
port ( 
a : in bit_vector( 6 downto 0); 
b : out bit_vector( 6 downto 0) 
 ); 
end placa; 
architecture TTL of placa is 
signal pino_1 bit; 
signal pino_2 bit; 
signal pino_3 bit; 
signal pino_4 bit; 
 
begin 
CI_X : process( a ) 
begin 
<descrição do processo> 
end process CI_Y; 
 
CI_Y : process( a ) 
begin 
<descrição do processo> 
end process CI_Z; 
end TTL; 
 
 
 
 
 
FIGURA 2.1: Apresentação de um programa em VHDL e o sua representação 
em hardware.3.1 PACKAGE (PACOTES) 
 
Os pacotes (biblioteca) contém uma coleção de elementos incluindo 
descrição do tipos de dados (relacione com os includes da Linguagem C). 
Pacotes usados normalmente: 
IEEE.std_logic_arith – funções aritméticas 
IEEE.std_logic_signed – funções aritméticas com sinal 
IEEE.std_logic_unsigned – funções aritméticas sem sinal 
IEEE.std_logic_1164 – std_logic e funções relacionadas 
ALTERA.maxplus2 – declaração de todas as macro-funções e mega-
funções. 
 
Como utilizá-los: 
LIBRARY <nome_da_biblioteca> e/ou 
USE <nome_da_biblioteca>.all 
 
OBS. 1: .all significa que todos os elementos da bibliotecas devem ser 
utilizados, caso não seja acrescentado .all deve-se especificar os ele-
mentos que serão utilizados. 
REGRA GERAL => COLOQUE SEMPRE .all 
 
3.2 ENTITY (ENTIDADE) 
 
3.2.1 TIPO DE PORTAS 
 
IN = porta de entrada; 
OBS.: não pode receber atribuição de valor dentro do programa. 
OUT = porta de saída; 
OBS.: não pode ser utilizado como entrada para outro circuito. 
INOUT = porta de entrada e saída; 
BUFFER = porta de saída que pode ser atualizada por mais de uma fonte; 
LINKAGE = o valor da porta pode ser lido e atualizado. 
EX.: 
Entity <nome> is 
port ( 
 sinal_controle : in <tipo>; 
 parcela_1 : in <tipo>; 
 parcela_2 : out <tipo> 
 ); 
end <nome>; 
 
3.2.2 TIPOS DE SINAIS 
 
<tipo> => bit, bit_vector, std_logic, std_logic_vector, boolean, real, 
bit assume valor ‘0’ ou ‘1’ x : in bit; 
bit_vector vetor de bits. x : in bit_vector(7 downto 0); ou x : in bit_vector(0 to 7);
std_logic 
std_logic_vector vetor de bits. x : in std_logic_vector(7 downto 0); 
Boolean assume valores true ou false (verdadeiro ou falso) 
Real 
 
3.3 ARCHITECTURE (ARQUITETURA) 
 
 Arquitetura pode ser definida como sendo a(s) implementação(ões) do 
projeto. Na figura 3.1, temos uma placa mãe de um PC, por exemplo, onde 
está faltando o chip, considere que a interface entre o chip e o meio externo 
seja idêntica. Na figura 3.2, foi colocado um chip, com toda a arquitetura do 
projeto. 
 
Figura 3.1 Figura 3.2 
 
 
3.3.1 ARQUITETURA SIMPLES 
 
 A arquitetura simples contém apenas um processo, ou seja, apenas 
um bloco. 
Architecture topologia_arquitetura of teste is 
 
begin 
 process ( a, b) 
 
 variable temp : bit; 
 
 begin 
 
 temp := a and b; 
 z <= temp xor a; 
 
 end process; 
end topologia_arquitetura; 
 
 
 
3.3.2 ARQUITETURA CONCORRENTE 
 
 A arquitetura concorrente é uma forma mais complexa de descrever 
um sistema, geralmente apresenta várias processos dentro de uma arquitetu-
ra. 
 No programa 1 e 2, temos uma arquitetura com três processos, po-
dendo ser ou não idependentes. Estes processos são executados em parale-
lo, porém os processos só serão executados se algum sinal (A, B ou C) tiver 
seu estado alterado. Novamente tem-se um ganho de processamento. 
 
Programa 1 Programa 2 
 
 
Architecture topologia_arquitetura of teste is 
 
begin 
 
signal temp1 : bit; 
signal temp2 : bit; 
 
 processo_1 : process ( a, b, temp1 ) 
 
 variable temp3 : bit; 
 
 begin 
 
 temp1 <= ‘0’; 
 temp2 := a and b; 
 z <= temp1 xor temp2; 
 
 end process process_1; 
 
 processo_2 : process ( a, b, temp1, temp2 ) 
 
 variable temp3 : bit; 
 
 begin 
 
 temp2 <= ‘1’; 
 temp3 := a and temp1; 
 w <= temp3 xor temp2; 
 
 end process process_2; 
end topologia_arquitetura; 
 
O exemplo acima, apresenta algumas características, tais como: 
1. Uma arquitetura com dois processos, que serão executados 
2. paralelamente; 
2. Os dois processos possuem variáveis com mesmo nome, mas is-
to não influência no processamento; 
 
 
 
3.4 CONFIGURATION (CONFIGURAÇÃO) 
 
uma mesma entity pode ter várias arquiteturas. 
Exemplo: 
configuration nome_da_config of contador is 
for estrutural 
for all: Tflip_flop 
use entity work.Tflip_flop(comp); 
end for; 
for all: inversor 
use entity work.Tflip_flop(comp); 
end for; 
end for 
end nome_da_config 
4 SEMÂNTICA DA LINGUAGEM VHDL 
 
 
4.1 ELEMENTOS LÉXICOS 
 
4.1.1 COMENTÁRIOS 
 
Comentários em VHDL são iniciados por dois hífens adjacentes (--), podendo 
ser estendido até o final da linha. 
Exemplo 1: 
 
-- a linha que você colocar como comentário, deverá colocar antes de 
-- iniciá-la dois hífens adjacentes. 
 
Exemplo 2: 
 
A <= B and C; -- esta operação realiza a and de B com C e o resultado é 
 -- colocado em A 
 
 
4.1.2 IDENTIFICADORES 
 
Quando se escreve um programa em VHDL, deve-se tomar certos cui-
dados, com os identificadores, abaixo segue uma tabela apresentando alguns 
identificadores válidos e inválidos. 
 
 
IDENTIFICADORES VÁLIDOS 
 
• palavras seguidas do caracter underline _ Ex.: teste_padrao, input_1_x 
• não é sensivel a LETRA MAIÚSCULA e minúscula Ex.: SOMA = soma 
• nome com underline são diferentes de nomes sem underline. Ex.: Teste_Padrao 
≠ TestePadrao 
 
 
IDENTIFICADORES INVÁLIDOS 
 
• uso de palavras reservadas da linguagem com outras finalidades 
identificador começando com número => 7AB 
• uso do caracter @ Ex.: A@B 
• o caracter underline no fim de um identificador Ex.: soma_ 
• o uso de dois caracteres underlines seguidos Ex.: IN__1 
 
 
 
4.1.3 TIPOS DE DADOS NÃO LÓGICOS 
 
• BIT: assume valores ‘0’ e ‘1’, bit_vector é um conjunto de bits. Ex.: 
“010001” 
• Boolean: assume valores true ou false 
• Real: sempre com ponto decimal. Ex.: -3.2, 4.56, 6.0, -2.3E+2 
• Inteiros: não é possível realizar conversão sobre inteiros. Ex.: 3, 546, -349 
• Physical: representam uma medida física: voltagem, capacitância, tempo 
Tipos pré-definidos: fs, ps, ns, um, ms, sec, min, hr. 
• Intervalos: permite determinar um intervalo de utilização dentro de um de-
terminado tipo. 
range <valor_menor> to <valor_maior> 
range <valor_maior> downto <valor_menor> 
• Array: em VHDL um array é definido como uma coleção de elementos to-
dos do mesmo tipo. 
Abaixo seguem alguns exemplos de array: 
 
type word is array (31 downto 0) of bit; 
type memory is array (address) of word; 
type transform is array (1 to 4, 1 to 4) of real; 
type vector is array (integer range<>) of real; 
type string is array (positive range<>) of character 
 
Ex.: 
type b is array (1 to 5) of character; 
(‘t’, ‘e’,’s’,’t’,’e’) 
(1 =>’t’, 5 => ‘e’, 2 => ’e’, 3 => ‘s’, 4 => ‘t’) 
(3 => ‘s’, 2 => ‘e’, 5 => ‘e’, others => ‘t’) 
 
• Record: semelhante a “struct” da Linguagem C, ou seja, é uma coleção 
de elementos de tipos diferentes. 
 
type instruction is record 
Mneumonico : String; 
Code : Bit_vector( 3 downto 0);; 
Ciclos : integer; 
end record; 
 
signal Instr1: instruction; 
 
Instr1.Mneumonico : “or reg1, reg2” 
Instr1. Code : “0010” 
Instr1.Ciclos : 3 
 
4.1.4 EXPRESSÕES E OPERADORES 
 
4.1.4.1 OPERADORES LÓGICOS 
 
 Os operadores lógicos são: and, or, nand, nor, xor, xnor e not. 
 
4.1.4.2 OPERADORES NUMÉRICOS 
 
 Os operadores numéricos são: soma (+), subtração (-), multiplica-
ção (*), divisão (/), módulo (mod), remanescente (rem - ex.: 6 rem 4 = 2), 
expoente (**), valor absoluto (abs). 
 
4.1.4.3 OPERADORES RELACIONAIS 
 
 Os operadores relacionais são; igual (=), diferente (/=), menor do 
que (<), menor ou igual (<=), maior do que (>), maior ou igual (>=). 
 
4.1.4.4 OPERADORES DE DESLOCAMENTO 
 
OperadoresExemplo 
sll - shift left logical 01101001 => 11010010 (acrescenta 0 no bit - sign.) 
srl - shift right logical 01101001 => 01101001 (acrescenta 0 no bit + sign.) 
sla - shift left arithmetic 01101001 => 11010011 (repete o bit - sign.) 
sra - shift right arithmetic 01101001 => 00110100 (repete o bit + sign.) 
rol - rotate left logical 01101001 => 11010010 (desloca todos bits para esq.) 
ror - rotate right logical 01101001 => 10110100 (desloca todos bits para dir.) 
 
4.1.4.5 OPERADOR DE CONCATENAÇÃO 
 
 Esta operação consiste em criar um novo vetor a partir de dois vetores 
já existentes, por exemplo: 
dado1 : bit_vector(0 to 7); 
 [01011011] 
dado2 : bit_vector(0 to 7); 
 [11010010] 
novo_dado : bit_vector(0 to 7); 
novo_dado <= (dado1(0 to 1) & dado2(2 to 5) & dado1(6 to 7)); 
 [01010011] 
 
5 COMANDOS SEQÜENCIAIS 
 
Nesta seção será apresentado alguns comandos sequenciais que o VHDL 
dispõe, são eles: 
atribuição à variáveis comando next 
atribuição à sinais comando exit 
comando wait comando null 
comando if-then-else comando return 
comando loop for- while comando case 
 
5.1 ATRIBUIÇÃO DE VARIÁVEIS 
 
Note que a passagem de parâmetros é realizada utilizando :=. 
Interpretação do programa abaixo: 
Na linha 15 o bit menos significativo do vetor C receberá “um” e o outro “ze-
ro”, 
Nas linhas 16 e 17 foram utilizados operadores booleanos; 
Nas linhas 18 e 19, utilizou-se o operador & para realizar a concatenação (vi-
de SEMÂNTICA DA LINGUAGEM); 
Na linha 20, o bit menos significativo do vetor D será igual a “0” enquanto que 
o outro “1”; 
Na linha 21 o vetor W teria os seguintes valores após a operação: [1G00], 
onde G é o valor dele mesmo. 
Na linha 22, DATA será todo preenchido com 0’s. 
1 architecture topologia_arquitetura of teste is 
2 signal A, B, J : bit_vector(1 downto 0); 
3 signal E, F, G : bit; 
4 begin 
5 
6 process ( A, B, E, F, G, J) 
7 
8 variable C, D, H, Y : bit_vector(1 downto 0); 
9 variable W, Q : bit_vector(3 downto 0); 
10 variable Z : bit_vector(7 to 0); 
11 variable X : bit; 
12 variable DATA : bit_vector(31 downto 0); 
13 
14 begin 
15 C := “01”; 
16 X := E nand F; 
17 Y := H or J; 
18 Z(0 to 3) := C & D; 
19 Z(4 to 0) := (not A) & (A nor B); 
20 D := (‘1’, ‘0’); 
21 W := (2 downto 1 => G, 3 => ‘1’, others => ‘0’); 
22 DATA := (others => ‘0’); 
23 end process; 
24 end topologia_arquitetura; 
 
A função de uma variável dentro de um processo serve para intermediar valo-
res. 
OBS. 1: A variável (VARIABLE) só pode ser utilizada dentro do processo em que foi 
criada; 
OBS. 2: Ela poderá assumir os mesmo tipos descritos anteriormente; 
OBS. 3: Sempre que for passado algum parâmetro para uma variável, estes devem 
ser do mesmo tipo. 
OBS. 4: Note que a passagem de valores para uma variável é através de := e para 
pinos de saída a atribuição é feita com <= 
Outro exemplo: Note que a atualização da variável é automática. Este exem-
plo apresenta as etapas de simulação de um programa em VHDL, acompanhe cada 
bloco (horizontalmente). 
D <= 2; 
process (C, D) 
variable Av, Bv, Ev : integer := 0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 
B = 1 
C = 1 
D = 2 
E = 1 
 
process (C, D) 
variable Av, Bv, Ev : integer :=0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 Av = 0
B = 1 Bv = 0
C = 1 
D = 2 
E = 1 Ev = 0
 
process (C, D) 
variable Av, Bv, Ev : integer := 0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 Av = 2
B = 1 Bv = 0 
C = 1 
D = 2 
E = 1 Ev = 0
process (C, D) 
variable Av, Bv, Ev : integer := 0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 Av = 2 
B = 1 Bv = 3 
C = 1 
D = 2 
E = 1 Ev = 0 
process (C, D) 
variable Av, Bv, Ev : integer := 0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 Av = 3
B = 1 Bv = 3 
C = 1 
D = 2 
E = 1 Ev = 0
process (C, D) 
variable Av, Bv, Ev : integer := 0; 
begin 
Av := 2; 
Bv := Av + C; 
Av := D +1; 
Ev := Av * 2; 
A <= Av; 
B <= Bv; 
E <= Ev; 
end process; 
A = 1 Av = 3 
B = 1 Bv = 3 
C = 1 
D = 2 
E = 1 Ev = 6
 
5.2 ATRIBUIÇÃO DE SINAIS 
 
A passagem de parâmetros para sinais se dá com o uso de <=. 
Interpretação do programa abaixo: 
Na linha 11, inicialmente A vale 0, após 20ns o valor de A é alterado para 1 e 
após 40ns, retorna a ser 0; 
Na linha 12 e linha 13, são operações lógicas; 
Na linha 14, o processo é semelhante ao da linha 11, entretanto os dados 
agora são do tipo inteiro. 
1 architecture teste of topologia_arquitetura is 
2 signal A, B, C : bit; 
3 signal D: integer; 
4 begin 
5 
6 process ( A, B, C, D) 
7 
8 variable L, M, N, Q bit; 
9 
10 begin 
11 A <= ‘0’, ‘1’ after 20ns, ‘0’ after 40ns 
12 B <= not L; 
13 C <= ((L andM) xor (N nand Q)); 
14 D <= 3, 5 after 20ns, 7 after 40ns, 9 after 60ns; 
16 
17 end process; 
18 end topologia_arquitetura; 
 
OBS. 1: Note que a atribuição a um sinal é feita através de <=; 
OBS. 2: Houve uma atribuição ao SIGNAL dentro do processo, isto não 
implica em dizer que em outro processo eu possa utilizá-lo atribuindo 
outro valor, ou seja, ele poderá ser utilizado por outro processo, mas 
não poderá receber uma atribuição de valores; 
OBS. 3: O signal deve ser passado ao processo, como mostra o exem-
plo. 
 
Outro exemplo: Neste exemplo, fica bem claro a diferença entre uma variável 
e um sinal, ou seja, todos os sinais só serão atualizados no final do processo, 
enquanto que a variável é atualizada sempre que usada. Novamente, acom-
panhe a simulação do programa passo-a-passo (horizontalmente). 
 
D <= 2; 
 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 
B = 1 
C = 1 
D = 1 
E = 1 
 
 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 
B = 1 
C = 1 
D = 2 
E = 1 
 
 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 A <= 2 
B = 1 
C = 1 
D = 2 
E = 1 
 
 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 A <= 2 
B = 1 B <= A + C
C = 1 
D = 2 
E = 1 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 A <= D + 1 
B = 1 B <= A + C 
C = 1 
D = 2 
E = 1 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 A <= D + 1 
B = 1 B <= A + C
C = 1 
D = 2 
E = 1 E <= A * 2; 
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 1 A <= 3 
B = 1 B <= 2 
C = 1 
D = 2 
E = 1 E <= 2;
process (C, D) 
begin 
A <= 2; 
B <= A + C; 
A <= D +1; 
E <= A * 2; 
end process; 
 
 
A = 3 
B = 2 e não 3 
C = 1 
D = 2 
E = 2 e não 6 
 
 
Qual a diferença entre o SIGNAL e a VARIABLE? 
1. O signal pode ser utilizado por qualquer processo pertencente aquela 
arquitetura, enquanto que a variável é interna ao processoe, 
2. A atualização da variável é imediata, enquanto que o signal só é atuali-
zado no final do processo. 
 
 
5.3 COMANDO WAIT 
 
Este comando tem a finalidade de causar uma suspensão do processo 
declarado ou procedimento. O comando wait pode ser utilizado de quatro 
formas diferentes, são elas: 
1 wait until <conditional>; wait until CLK’event and CLK = ‘1’; 
2 wait on <signal_list>; wait on a, b; 
3 wait for <time>; wait for 10ns; 
4 wait; wait; 
 
Interpretação da tabela acima: 
Na linha 1, o comando wait until implica que a operação está suspensa até 
(until) que haja uma transição (‘event) e (and) o CLK seja igual a 1, ou seja, 
está aguardando uma borda de subida; 
Na linha 2, o comando wait on suspende a operação até que a e b sejam i-
gual a 1; 
Na linha 3, suspende a operação por 10ns; 
Na linha 4, suspende a operação. 
 
5.4 COMANDO IF THEN ELSE 
 
Existem inúmeras formas de se utilizar if-then-else(elsif), abaixo se-
gue um quadro explicativo do if-then-else e ao lado dois exemplos simples. 
O próximo quadro apresenta um exemplo usando este comando e o comando 
anterior (wait). 
MODELO 
if condição_1 then 
 <comandos> 
elsif condição_2 then 
 <comandos> 
else 
<comandos> 
end if; 
exemplo 1: 
if ( A = ‘0’) then 
 B <= “00”; 
else 
 B <= “11”; 
end if; 
exemplo 2: 
if (CLK’event and CLK =’1’) then 
 FF <= ‘0’; 
elsif (CLK’event and CLK =’0’) then 
 FF <= ‘1’; 
elsif (J = ‘1’) and (K=’1’) then 
 FM <= ‘1’; 
end if; 
 
 
1 architecture topologia_arquitetura of teste is 
2 signal CLK : bit; 
3 signal SEL : bit_vector(1 downto 0); 
4 begin 
5 process 
6 begin 
7 if (SEL = “00”) then 
8 wait until CLK’event and CLK = ‘1’; 
9 elsif SEL = “01” then 
10 wait for 60ns; 
11 else 
12 null; 
13 end if; 
14 end process; 
15 end topologia_arquitetura; 
 
-----------------------------------------------------------------------------------------------------------
- 
-- * * * * * Comentários * * * * * 
-- O programa deve receber o nome de lab1.vhd 
-----------------------------------------------------------------------------------------------------------
- 
 
library IEEE; 
use ieee.std_logic_1164.all; 
 
entity lab1 is 
port ( controle : in bit; 
 parcela_1 : in bit_vector( 3 downto 0); 
 parcela_2 : in bit_vector( 3 downto 0); 
 soma_total : out bit_vector( 4 downto 0); 
 mult_total : out bit_vector( 7 downto 0) 
 ); 
end lab1; 
 
architecture logica of lab1 is 
 
begin 
 process ( controle, parcela_1, parcela_2) 
 begin 
 
 if (controle = ‘1’ ) then 
 soma_total <= parcela_1 + parcela_2; 
 else 
 mult_total <= parcela_1 * parcela_2; 
 end if; 
 
 end process; 
end logica; 
 
 
-----------------------------------------------------------------------------------------------------------
- 
-- * * * * * Comentários * * * * * 
-- O programa deve receber o nome de lab2.vhd 
-----------------------------------------------------------------------------------------------------------
- 
 
library IEEE; 
use ieee.std_logic_1164.all; 
 
entity lab2 is 
port ( controle : in bit; 
 parcela_1 : in bit_vector( 3 downto 0); 
 parcela_2 : in bit_vector( 3 downto 0); 
 soma_total : out bit_vector ( 4 downto 0); 
 mult_total : out bit_vector ( 7 downto 0); 
 operacao_and : out bit_vector ( 3 downto 0); 
 operacao_xor : out bit_vector ( 3 downto 0) 
 ); 
end lab2; 
 
architecture logica of lab2 is 
 
begin 
 
soma : process ( controle, parcela_1, parcela_2 ) 
 begin 
 
 if (controle = ‘1’ ) then 
 soma_total <= parcela_1 + parcela_2; 
 else 
 mult_total <= parcela_1 * parcela_2; 
 end if; 
 
 
 end process soma; 
 
operacao_logica : process ( controle, parcela_1, parcela_2 ) 
 begin 
 
 if ( controle = ‘1’ ) then 
 operacao_and <= parcela_1 and parcela_2; 
 else 
 operacao_xor <= parcela_1 xor parcela_2; 
 end if; 
 
 end process operacao_logica; 
end logica; 
 
-----------------------------------------------------------------------------------------------------------
- 
-- * * * * * Comentários * * * * * 
-- O programa deve receber o nome de lab3.vhd 
-----------------------------------------------------------------------------------------------------------
- 
 
library IEEE; 
use ieee.std_logic_1164.all; 
 
entity lab3 is 
port ( controle : in bit; 
 parcela_1 : in bit_vector( 3 downto 0); 
 parcela_2 : in bit_vector( 3 downto 0); 
 soma : out bit_vector( 4 downto 0); 
 multiplicacao : out bit_vector( 7 downto 0) 
 ); 
end lab3; 
 
architecture logica of lab3 is 
 
signal soma_total : bit_vector ( 4 downto 0); 
signal mult_total : bit_vector ( 7 downto 0); 
 
begin 
 process ( controle, parcela_1, parcela_2) 
 begin 
 
 if (controle = ‘1’ ) then 
 soma_total := parcela_1 + parcela_2; 
 else 
 mult_total := parcela_1 * parcela_2; 
 end if; 
 
 soma <= soma_total; 
 multiplicacao <= mult_total; 
 
 end process; 
 
end logica; 
 
5.5 COMANDO LOOP FOR - WHILE 
 
<label opcional>: for <parâmetros> in <valor_final> loop 
<seqüência de comandos> 
end loop <label opcional>; 
 
 
OBS.: O PARÂMETRO NÃO PODE TER SEU VALOR ALTERADO EM HIPÓ-
TESE ALGUMA DENTRO DO LOOP FOR 
 
 O exemplo abaixo, apresenta de que forma pode ser utilizado o co-
mando LOOP-FOR. 
 
1 process (A) 
2 
3 begin 
4 variable Z : bit_vector( 3 downto 0); 
5 A <= 2; 
6 Z := “0000”; 
7 for i in 0 to 3 loop 
8 if(A = i) then 
9 Z(i) := ‘1’; 
10 end if; 
11 end loop; 
12 end process; 
 
Note que este loop será realizado 4 vezes, independentemente da 
condição IF-THEN. O funcionamento deste programa baseia-se na atribuição 
de 1 na posição Z(2) quando i for igual a A, ou seja, 2.. 
 
 Usando o loop While 
 
1 2 
 
 Na figura 1, o processo aguarda até que clk seja igual a 1, enquanto 
isso ele fica parado. Quando o clk for igual a 1 (figura 2), então o processo 
entra no loop while. Este loop aguarda até que o Level seja igual 1, enquanto 
isso ele fica no loop while Level = ‘1’ loop => end loop (figura 3). 
 
3 4 
 
Quando Level for igual a 1, então ele incrementa o contador (figura 4). 
 
 
5.6 COMANDO NEXT 
 
O comando NEXT é utilizado para terminar prematuramente execução 
de uma iteração do tipo while, for ou um loop infinito. 
 
process(A) 
begin 
Z <= “0000”; 
for i in 0 to 3 loop 
next when A/=i; 
Z(I) <= ‘1’; 
end loop; 
end process; 
 
 
5.7 COMANDO EXIT 
 
exit => utilizado para terminar um while, for; 
exit <label_loop> => termina o laço e desloca para o label; 
exit <label_loop> when <condição> => termina o laço quando (when) condi- 
 ção é satisfeita; 
 
 
5.8 COMANDO CASE 
 
 O comando case seleciona a execução que ocorrerá de uma lista de 
alternativas. 
 
porta_programável : process (Mode, PrGIn1, PrGIn2) 
 begin 
 case Mode is 
when “000” => PrGOut <= PrGIn1 and PrGIn2; 
when “001” => PrGOut <= PrGIn1 or PrGIn2; 
when “010” => PrGOut <= PrGIn1 nand PrGIn2; 
when “011” => PrGOut <= PrGIn1 nor PrGIn2; 
when “100” => PrGOut <= not PrGIn1; 
when “101” => PrGOut <= not PrGIn2; 
when others => PrGOut <= ‘0’ 
end case; 
end process porta_programavel; 
porta_programável : process (Mode, PrGIn1, PrGIn2) 
 begin 
 case Mode is 
when “000” => PrGOut<= PrGIn1 and PrGIn2; 
when “001” => PrGOut <= PrGIn1 or PrGIn2; 
when “010” => PrGOut <= PrGIn1 nand PrGIn2; 
when “011” => PrGOut <= PrGIn1 nor PrGIn2; 
when “100” => PrGOut <= not PrGIn1; 
when “101” => PrGOut <= not PrGIn2; 
when others => PrGOut <= ‘0’ 
end case; 
end process porta_programavel; 
porta_programável : process (Mode, PrGIn1, PrGIn2) 
 begin 
 case Mode is 
when “000” => PrGOut <= PrGIn1 and PrGIn2; 
when “001” => PrGOut <= PrGIn1 or PrGIn2; 
when “010” => PrGOut <= PrGIn1 nand PrGIn2; 
when “011” => PrGOut <= PrGIn1 nor PrGIn2; 
when “100” => PrGOut <= not PrGIn1; 
when “101” => PrGOut <= not PrGIn2; 
when others => PrGOut <= ‘0’ 
end case; 
end process porta_programavel; 
 
5.9 COMANDO NULL 
 
 O comando null é frequentemente utilizado com o comando case, a 
última opção do case ficaria com null. Similar ao null da Linguagem C. 
 
 
5.10 COMANDO RETURN 
 
 Utilizado em funções, tem a finalidade de retornar um valor. 
 
6 ESPECIFICANDO A ESTRUTURA DE UM SISTE-
MA 
 
 Neste capítulo será apresentado uma outra forma de detalhamento de 
um sistema, visando obter um sistema compacto, sem a necessidade de re-
petição de processos. Para isso, é necessário o uso de component e port 
map. 
 O component é exatamente a descrição de um componente, ou seja, 
define-se anteriormente sua topologia, permitindo assim o uso repetidas ve-
zes. 
 O port map é um mapeamento deste componente em um sistema 
maior. 
 
EX.: Suponha que você tenha um sistema composto por cinco compo-
nentes, mas de dois tipos diferentes, por exemplo 7408 e 7404. A Figura 
6.1, apresenta esta situação, porém ao invés de um CI completo, vamos 
supor que tenha somente uma porta lógica. 
 
 
 
 
FIGURA 6.1: Exemplo de um sistema 
 
Note que a placa acima possui cinco blocos internos, que são representados 
por dois componentes. O primeiro passo é modelar estes componentes, o 
programa 1 apresenta esta modelagem e o programa 2 modela o segundo 
componente. 
Já o programa 3, modela os cinco blocos dentro da placa. Note que a instru-
ção 
 
component componente_and 
 port( a: in bit; b : in bit; c : out bit); 
end component; 
 
está chamando o componente and anteriormente modelado. Já a instrução 
 
 and1 : componente_and port map (a => in1, b => in2, c => s1); 
 
mapeia o bloco (componente and) na placa. Todos os blocos precisam ser 
nomeados na placa dentro da placa. 
 
Programa 1: descreve o componente inversor; 
Programa 2: descreve o componente and; 
Programa 3: descreve um sistema utilizando estes dois componentes; 
 
 
 
Programa 1 Programa 2 
--------------------------------------------------------- 
-- Arquivo componente_inv.vhd 
-- Modelo do inversor 
--------------------------------------------------------- 
 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity componente_inv is 
port( 
 x : in bit; 
 y : out bit 
 ); 
end componente_inv; 
 
architecture arquitetura_inv of componen-
te_inv is 
 
 begin 
 y <= not x; 
end arquitetura_inv; 
 
--------------------------------------------------------- 
-- Arquivo componente_and.vhd 
-- Modelo da porta AND 
--------------------------------------------------------- 
 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity componente_and is 
port( 
 a : in bit; 
 b : in bit; 
 c : out bit 
 ); 
end componente_and; 
 
architecture arquitetura_and of com-
ponete_and is 
 
 begin 
 c <= a and b; 
end arquitetura_and; 
 
 
Programa 3 
------------------------------------------------------ 
-- Arquivo componente_sistema.vhd 
-- Modelo da porta AND 
------------------------------------------------------ 
 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity componente_sistema is 
port( 
 in1 : in bit; 
 in2 : in bit; 
 in3 : in bit; 
 in4 : in bit; 
 out1 : out bit 
 ); 
end componente_sistema; 
 
architecture arquitetura_sistema of componente_sistema is 
 
component componente_and 
 port( a: in bit; b : in bit; c : out bit); 
end component; 
 
component componente_inv 
 port( x: in bit; y : out bit); 
end component; 
 
signal s1, s2, s3, s4 : bit; 
 
 begin 
 and1 : componente_and port map (a => in1, b => in2, c => s1); 
 and2 : componente_and port map (a => in3, b => in4, c => s2); 
 and3 : componente_and port map (a => s3, b => s4, c => out1); 
 inv1 : componente_inv port map (x => s1, y => s3); 
 inv2 : componente_inv port map (x => s2, y => s4); 
end arquitetura_sistema; 
 
 
7 ALGUNS EXEMPLOS DE IMPLEMENTAÇÕES EM 
VHDL 
 
 
 A seguir são apresentado três exemplos utilizando a Linguagem de 
Descrição de Hardware (VHDL). 
 O primeiro deles é a implementação de uma ULA (Unidade Lógica A-
ritmética). A estrutura é igual aos exemplos anteriores, na entity foi declarado 
4 sinais: controle, operando_a, operando_b e saída. Então, a interface do sis-
tema é definida por estes pinos de I/O . 
 Logo a seguir, está estruturada a arquitetura da ULA, de forma que a 
palavra de controle seleciona o tipo de operação que será realizada, para is-
so foi utilizado if-then-else. 
 A Figura 7.1, apresenta a simulação feita no MAXPLUX II. Note que a 
saída está atrasada em relação ao sinal de controle, justificando o atraso ine-
rente as portas lógicas. 
 
---------------------------------------------------------------- 
-- Implementação de uma ULA. 
---------------------------------------------------------------- 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity ula is 
port( 
 controle : in bit_vector(2 downto 0); 
 operando_a : in bit_vector(7 downto 0); 
 operando_b : in bit_vector(7 downto 0); 
 saida : out bit_vector(7 downto 0) 
 ); 
end ula; 
 
architecture estrutura of ula is 
 
begin 
 
 process (controle, operando_a, operando_b) 
 begin 
 if (controle = "000") then 
 saida <= operando_a and operando_b; 
 elsif (controle = "001") then 
 saida <= operando_a or operando_b; 
 elsif (controle = "010") then 
 saida <= operando_a xor operando_b; 
 elsif (controle = "011") then 
 saida <= operando_a nor operando_b; 
 elsif (controle = "100") then 
 saida <= not(operando_a); 
 elsif (controle = "101") then 
 saida <= not(operando_b); 
 elsif (controle = "110") then 
 saida <= operando_a nand operando_b; 
 elsif (controle = "111") then 
 saida <= not(operando_a xor operando_b); 
 end if; 
 end process; 
end estrutura; 
 
 
FIGURA 7.1: Simulação da ULA. 
O próximo exemplo apresenta a implementação de um decodificador 3x8. Como no e-
xemplo anterior, a estrutura é a mesma, na entity são declarados os pinos de entrada e 
saída. Neste exemplo, utilizou-se o comando case para a implementação do decodifica-
dor. A Figura 7.2 apresenta a simulação do decodificador 3x8. 
 
--------------------------------------------------------------------- 
-- Implementação de um decodificador 3x8. 
--------------------------------------------------------------------- 
 
 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity decodificador is 
port( 
 controle : in bit_vector(2 downto 0); 
 saida : out bit_vector(7 downto 0) 
 ); 
end decodificador; 
 
architecture estrutura of decodificador is 
 begin 
 process (controle) 
 begin 
 case controle is 
 when "000" => saida <= "00000001"; 
 when "001" => saida <= "00000010"; 
 when "010" => saida <= "00000100"; 
 when "011" => saida <= "00001000"; 
 when "100" => saida <= "00010000"; 
 when "101" => saida <= "00100000"; 
 when "110" => saida <= "01000000"; 
 when "111" => saida <= "10000000"; 
 end case; 
 end process;end estrutura; 
 
 
 
 
 
FIGURA 7.2: Simulação do decodificador 
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL) 
 
 
 Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso 41
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL) 
O próximo exemplo é bem simples, apresenta a implementação de um registrador 
de 12 bits, note que o processo só enviará os dados da entrada para a saída 
quando o clock for nível lógico um. A Figura 7.3, apresenta a simulação deste 
programa. 
 
----------------------------------------------------------------------- 
-- Implementação de um registrador de 12 bits. 
----------------------------------------------------------------------- 
 
library IEEE; 
use IEEE.std_logic_1164.all; 
 
entity reg12 is 
 port( 
 d : in bit_vector(11 downto 0); 
 clk : in bit; 
 q : out bit_vector(11 downto 0)); 
end reg12; 
 
architecture estrutura of reg12 is 
begin 
 process 
 begin 
 wait until clk = '1'; 
 q <= d; 
 end process; 
end estrutura; 
 
 
 
 
FIGURA 7.3: Simulação do registrador de 12 bits. 
 Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso 42
Dispositvos Programáveis (FPGA) e Linguagem de Descrição de Hardware (VHDL) 
8 BIBLIOGRAFIA 
 
 
Bostock, Geoff, FPGAs and programmable LSI : a designer's handbook. 
Oxford : Butterworth-Heinemann, 1996. 216p. 
 
Hachtel, Gary D. ; Somenzi, Fabio, Logic synthesis and verification algori-
thms. Boston : Kluwer Academic, 1996. 564p. 
 
Brown, Stephen D. et al. Field-programmable gate arrays. Boston : Kluwer 
Academic, 1992. 206p. 
 
Trimberger, Stephen M. (Ed). Field-programmable gate array technology. 
Boston : Kluwer Academic, 1994. 258p. 
 
Grünbacher, Herbert ; Hartenstein, Reiner W. (Ed.).Field-programmable gate 
arrays : architectures and tools for rapid prototyping. Berlin : Springer, 1993. 
220p. 
 
IEEE Workshop on FPGAs for Custom Computing Machines (1993 : 
Napa) Proceedings. ; Buell, Duncan A. ; Pocek, Kenneth L. (Ed.).Los Alami-
tos, CA : IEEE Computer Society Press, 1993. 212p. 
 
CHANG, K. C., Digital Design and Modeling with VHDL and Synthesis.IEEE 
Computer Society Press, 1997 
 
AIRIAU, R. et all. VHDL du langage à la modélisation. Presses Polytechni-
ques Universitaires Romandes, 1990. 
 
MAX+PLUS II & VHDL, Customer Training - ALTERA. 
 
MAX+PLUS II, Programmable Logic Development System - Getting Started. 
ALTERA, Version 6.0, 1995. 
 
VHDL Reference Guide, ACTIVE-VHDL Series Book1. ALDEC, 1998. 
 
 
INTERNET: 
 
ftp://ftp.cs.adelaide.edu.au/pub/VHDL 
http://www.altera.com 
http://www.aldec.com 
 
 Eng. Anderson Royes Terroso http://www.ee.pucrs.br/~terroso 43
	1 INTRODUÇÃO
	1.1 DISPOSITIVOS LÓGICOS PROGRAMÁVEIS FPGA
	1.1.2 DEFINIÇÃO DE BLOCOS LÓGICOS:
	1.1.3 DEFINIÇÃO DE ROTEAMENTO
	1.1.3 DEFINIÇÃO DE IOB´S
	1.2 CIRCUITOS PROGRAMÁVEIS EPLD
	2 LINGUAGEM DE DESCRIÇÃO DE HARDWARE (VHDL)
	2.1 O QUE É VHDL?
	2.2 O QUE SIGNIFICA VHDL?
	2.3 O QUE É UMA LINGUAGEM DE DESCRIÇÃO DE HARDWARE?
	2.4 BREVE HISTÓRICO
	2.4.1 LINHA CRONOLÓGICA
	2.5 VANTAGENS E DESVANTAGENS DE SE UTILIZAR VHDL
	3 COMPONENTES DE UM PROJETO VHDL
	3.1 PACKAGE (PACOTES)
	3.2 ENTITY (ENTIDADE)
	3.2.1 TIPO DE PORTAS
	EX.:
	3.2.2 TIPOS DE SINAIS
	3.3 ARCHITECTURE (ARQUITETURA)
	3.3.1 ARQUITETURA SIMPLES
	3.3.2 ARQUITETURA CONCORRENTE
	3.4 CONFIGURATION (CONFIGURAÇÃO)
	4 SEMÂNTICA DA LINGUAGEM VHDL
	4.1 ELEMENTOS LÉXICOS
	4.1.1 COMENTÁRIOS
	4.1.2 IDENTIFICADORES
	4.1.3 TIPOS DE DADOS NÃO LÓGICOS
	4.1.4 EXPRESSÕES E OPERADORES
	4.1.4.1 OPERADORES LÓGICOS
	4.1.4.2 OPERADORES NUMÉRICOS
	4.1.4.3 OPERADORES RELACIONAIS
	4.1.4.4 OPERADORES DE DESLOCAMENTO
	4.1.4.5 OPERADOR DE CONCATENAÇÃO
	5 COMANDOS SEQÜENCIAIS
	5.1 ATRIBUIÇÃO DE VARIÁVEIS
	5.2 ATRIBUIÇÃO DE SINAIS
	5.3 COMANDO WAIT
	5.4 COMANDO IF THEN ELSE
	5.5 COMANDO LOOP FOR - WHILE
	5.6 COMANDO NEXT
	5.7 COMANDO EXIT
	5.8 COMANDO CASE
	5.9 COMANDO NULL
	5.10 COMANDO RETURN
	6 ESPECIFICANDO A ESTRUTURA DE UM SISTEMA
	7 ALGUNS EXEMPLOS DE IMPLEMENTAÇÕES EM VHDL
	8 BIBLIOGRAFIA

Outros materiais

Outros materiais