Vous êtes sur la page 1sur 21

UNIVERSIDADE DE BRASLIA

Apostila de VHDL
Traduo livre do material "The Low-Carb VHDL
Tutorial"
Copyright: 2004 por Bryan Mealy (27 - 08 - 2004)
Tradutor: Francisco Frantz
07/10/2011





Introduo
VHDL uma abreviao para "Very high-speed integrated circuit Hardware Description
Language". Como hoje em dia se utiliza basicamente circuitos integrados para design de hardware,
suprimiu-se uma parte da sigla para simplificao.
H dois principais motivos para descrever hardware usando VHDL. Primeiramente, o VHDL
pode ser usado para modelar circuitos digitais. Isso permite fazer simulaes e testes, e, talvez mais
importante, criar um modelo na linguagem VHDL uma tima forma de aprendizado. Outro uso do
VHDL (ou outras linguagens de descrio de hardware) um dos primeiros passos na criao de
complexos circuitos digitais, podendo test-los sem a necessidade de constru-los fisicamente.
H outros simuladores lgicos disponveis que permitem modelar o comportamento de circuitos
digitais, que possuem uma abordagem grfica para descrever os circuitos. Pode ser um mtodo melhor
para o aprendizado, mas, quanto mais complexos forem os circuitos digitais, mais tedioso e confuso fica
esse mtodo, uma vez que se baseia na interconexo de linhas e portas lgicas. O VHDL propicia uma
descrio exata como o circuito digital funciona, sem ter de se preocupar com os detalhes das muitas
conexes internas ao mesmo. O conhecimento de VHDL ser uma ferramenta para modelar circuitos
digitais de uma maneira inteligente.
Finalmente, possvel criar circuitos funcionais usando o VHDL, o que permite implementar
rapidamente circuitos relativamente complexos. A metodologia usada permite dedicar mais tempo ao
projeto dos circuitos e menos a realmente constru-los em uma proto-board. Agora, deve-se descrever o
circuito usando uma linguagem como o VHDL. Para fazer isso, fundamental aprender a linguagem e
dominar suas ferramentas envolvidas no processo.

Sintaxe do VHDL
H diversos aspectos da linguagem VHDL que deve-se saber antes de prosseguir. Essa seo
detalha a sintaxe bsica de um cdigo em VHDL, como o uso de parntese e a atribuio de valores. So
aspectos caractersticos da linguagem de programao, assim como existem em C, C++, Matlab e todas as
outras. interessante memorizar o que ser abordado nessa seo, mas isso s possvel com a prtica.
Sensibilidade a letras maisculas
O VHDL no diferencia caracteres maisculos e minsculos. Isso quer dizer que ambas as
sentenas na figura 1 tem o mesmo sentido para o compilador. O objetivo agora no entender o que cada
sentena executa: isso ser visto na prxima seo.
Dout <= A and B; doUt <= a AND b;
Figura 1: exemplo da indiferena ent re mai sculas e minsculas
Espaos em branco
O VHDL no sensvel a espaos em branco (espao e "tab") no documento fonte. As linhas de
cdigo da figura 2 tem o mesmo significado.
nQ <= In_a or In_b;
nQ <= in_a OR in_b;
Figure 2: Exemplo da indiferena para espaos em branco
Comentrios
Isso vlido para todas as linguagens de programao: um uso adequado de comentrios melhora
a leitura e o entendimento de qualquer cdigo. A regra geral comentar toda linha ou seo de cdigo que
possa no ser bvia para outro leitor. Isso pode parecer tolo, uma vez que o cdigo executa com ou sem
os comentrios, mas de fundamental importncia, no apenas para outros leitores. Muitas vezes, faz-se
um cdigo em um dia e s se trabalha nele novamente depois de muito tempo. Na hora que o cdigo
feito, se entende tudo ele contm. Mas depois, h a necessidade de parar e pensar o que cada linha est
fazendo, o que poderia ser evitado com comentrios bem colocados. Em empresas que trabalham com
programao, h sempre uma poltica muito rgida em como devem ser comentados os cdigos. ,
portanto, uma boa prtica j comear a treinar.
No VHDL, os comentrios comeam com dois hfens ("--"), e o compilador ignora tudo que os
seguem na linha. No existe caractere que implemente comentrios de mais de uma linha. A figura 3
mostra alguns tipos de comentrios.
---------------------------Commentary example--------------------------------

-- This next section of code is used to blah-blah
-- blah-blah blah-blah. This type of comment is the best
-- fake for block-style commenting.

PS <= NS_reg; -- Assign next_state value to present_state
Figura 3 - t rs tipos tpicos de comentrio
Parnteses
O VHDL relativamente frouxo no uso de parnteses. Como em outras linguagens, h ordens de
procedncia associadas com os vrios operadores em VHDL. Mesmo sendo possvel escrever um cdigo
que segue essa ordem, uma boa prtica colocar alguns parnteses para melhorar a leitura do cdigo. As
duas sentenas da figura 4 possuem o mesmo significado para o compilador.
if x = `0' and y = `0' or z = `1' then
blah;
blah;
blah;
end if;

if ( ((x = `0') and (y = `0')) or (z = `1') ) then
blah;
blah;
blah;
end if;

Figura 4 - uso de parnteses e espaos para mel hor leitura
Sentenas
Como em outras linguagens, toda sentena de cdigo em VHDL deve ser terminada com ponto e
vrgula (";"). Isso ajuda a remover eventuais erros de compilao do cdigo, uma vez que recorrente o
erro de esquecer o ponto e vrgula. Entretanto, deve-se entender o que constitui uma sentena em VHDL
para us-los corretamente: o VHDL no to flexvel quanto o Matlab, por exemplo, com colocaes a
mais ou a menos de pontos e vrgulas.
Declaraes if, case e loop
Uma fonte comum de frustrao enquanto se desenvolve um cdigo em VHDL o clssico erro
bobo envolvendo essas declaraes. As regras abaixo devem ser memorizadas para evitar esse tipo de
erro, evitando assim, perder tempo procurando os erros. altamente recomendvel marcar esta seo para
releitura quando estas declaraes forem melhor detalhadas.
x Todo if tem de ter um correspondente then (se .... ento)
x Todo if deve ser terminada por "end if"
x Caso se queira usar um "else", a forma correta de faz-lo com "elsif"
x Todo case terminado com "end case"
x Todo loop tem um "end loop" correspondente
I dentificadores
Identificador se refere ao nome dado aos itens em VHDL para discerni-los uns dos outros. Em
linguagens como C e Matlab, os nomes de variveis e de funes so identificadores. Em VHDL, h os
nomes de variveis, de sinais e de portas lgicas (sero discutidos em breve). H regras rgidas (precisam
ser seguidas) e regras flexveis ( bom serem seguidas) para usar identificadores, que podem tornar o
cdigo mais legvel, compreensvel e elegante se forem escolhidos apropriadamente. A lista e a tabela a
seguir mostram regras gerais para escolha de identificadores.


BONS I DENTI F I CADORES I DENTI F I CADORES RUI NS
data_bus_val
Nome descritivo
3Bus_val
Comea com nmero
WE
Clssica sigla para
"write enable"
DDD
Provavelmente no
auto-comentativo
div_flag

mid_$num
H caractere ilegal ($)
port_A

last__value
H dois underlines
consecutivos
in_bus
Provavelmente "input
bus"
start_val_
Termina em underline
clk
Clssico nome para
"system clock"
in
Palavra reservada do
compilador

@#$%%$
Lixo completo

this_sucks
Talvez seja verdade,
mas melhor evitar

Big_vAlUe
Vlido, mas ruim para
leitura

pa
Provavelmente no
possui sentido

sim-val
Caractere ilegal (hfen)
Tabela 1: Identificadores desej veis e indesej veis
x Identificadores devem realmente identificar o que representam, ou seja, ao olhar um identificador,
deve-se ter uma ideia da sua informao e do seu propsito
x Identificadores podem ter quantos caracteres se desejar. Quanto mais curto, mais legvel; quanto
mais longo, mais informao ele possui. Deve-se levar isso em conta na hora de programar.
x Identificadores s podem conter combinaes de letras (A-Z ou a-z), dgitos (0-9) e underlines
('_')
x Identificadores s podem comear com caractere alfabtico
x Identificadores no podem terminar em underline nem possuir dois deles consecutivos
Palavras reservadas
H uma lista de palavras s quais foi atribudo algum significado pela linguagem VHDL. Essas
palavras, chamadas palavras reservadas, no podem ser usadas como identificadores por programadores.
H uma pequena lista mostrada a seguir, e a lista completa se encontra no apndice A.
access exit mod return while NOR
after file new signal with XNOR
alias for next shared constant NAND
all function null then loop
attribute generic of to rem
block group on type wait
body in open until AND
buffer is out use OR
bus label range variable XOR
Tabela 2: Lista resumida de palavras reservadas em VHDL
Estilo de programao
J falou-se disso neste material, mas deve-se reforar esse ponto. O estilo de programao de
refere aparncia do cdigo escrito em VHDL. Com a liberdade dada pela indiferena entre maisculas e
minsculas e quanto a espaos em branco, h a tendncia de se pensar no VHDL como uma linguagem
prxima da anarquia. Entretanto, deve-se sempre pensar na legibilidade do cdigo. Isso primordialmente
feito a parir dos identificadores, comentrios, espaos em branco e parnteses desnecessrios. Abaixo,
lista-se boas prticas para chegar ao objetivo da legibilidade.
x Se o cdigo for legvel para o programador, provavelmente ser legvel para outras pessoas que
precisem ver o documento. Essas pessoas podem ser um colega do grupo de laboratrio, um
professor que avaliar o trabalho ou a pessoa que paga seu salrio ao final do ms. No primeiro
caso, pode no ser to motivante fazer um cdigo legvel; nos outros dois, altamente
recomendvel.
x O cdigo pode ser modelado a partir de algum outro cdigo que se considere organizado e
legvel. Procurar um cdigo na internet e seguir seu estilo uma boa prtica para programadores
iniciantes.
x Boas prticas durante a elaborao do cdigo propiciam uma melhor depurao de erros, caso
existam. O compilador de VHDL eficiente na deteco de erros, mas geralmente no diz onde
esses erros se encontram. Um cdigo organizado reduz o tempo de procura desses erros.


Unidades bsicas do VHDL
O VHDL descreve circuitos utilizando a abordagem das "caixas pretas". O circuito (e partes dele)
podem ser representados como caixas, que possuem entradas e sadas. Considere o seguinte exemplo:

Nesse caso, os pontos de interesse so as entradas (A,B e C) e a sada (F). No interessa, ainda, o
que acontece dentro da caixa preta para converter as entradas na sada. Essa parte da descrio do
circuito, ou seja, a caixa preta que indica as entradas e sadas (interface), chamada, em VHDL, de
entidade (entity).
Para saber como acontece essa medio da corrente, h diversas possibilidades de descrever o
problema. Por exemplo, supondo que F = A.B + B.C, as figuras a seguir descrevem formas de descrever o
que ocorre dentro da caixa preta:

Nesse caso, detalhe-se como a sada obtida a partir da entrada As interaes que ocorrem dentro
da caixa preta so definidos, em VHDL, como arquitetura (architecture). na arquitetura que so
definidos os parmetros da caixa preta (resistncia R) e os processos para a sada ser obtida.
interessante notar que, para uma mesma entidade, podem existir vrias arquiteturas.
Em VHDL, a entidade e a arquitetura so as unidades fundamentais para o projeto. Defini-se a
"caixa preta" e as "coisas que vo dentro da caixa preta". Ser sempre assim quando se trabalha com
VHDL. A criao da entidade, como se pode imaginar, muito simples, enquanto a arquitetura a parte
mais trabalhosa do projeto. Hoje em dia, na melhoria da arquitetura de circuitos que se concentra grande
parte dos esforos de engenheiros, e o VHDL uma plataforma interessante para simular diversos tipos
de arquitetura.
A entidade
Como foi dito, a entidade a verso em VHDL da caixa preta. Ela propicia um mtodo de
abstrair a funcionalidade de um circuito. A entidade simplesmente lista as entradas e sadas de um circuito
digital. Em termos de VHDL, a caixa preta descrita por uma declarao de entidade. A figura a seguir
mostra como essa declarao feita.
entity entity_name is
[port_clause]
end entity_name;

Figura 5: Forma genrica de uma declarao de entidade
O identificador entity_name serve para fazer referncia a entidade. A parte em colchetes,
[port_clause] realmente especifica a interface (entradas e sadas) da entidade. Sua sintaxe est
detalhada na figura abaixo.
port (
port_name : mode data_type;
port_name : mode data_type;
port_name : mode data_type
);

Figura 6: Detalhamento de [port clause]
Uma "port" essencialmente um sinal que interage com o "mundo" fora da caixa preta. Pode ser
tanto um sinal de entrada na caixa preta quanto um sinal de sada dela. Colocando o cdigo da figura 6 no
lugar de [port_clause] na figura 5, a entidade est declarada por completo, ou seja,
[port_clause] nada mais do que uma lista de sinais do circuito que esto disponveis ao "mundo".
O port_name um identificador usado para diferenciar os diversos sinais. Onde se encontra "mode"
especifica-se a direo do sinal em relao caixa preta: pode ser input (entrada) ou output (sada). Para
os sinais de entrada, mode deve ser substitudo por in; para os de sada, por out. O "data_type" se refere
ao tipo de dados que a "port" possui. Em VHDL, h diversos tipos de dados, mas trabalharemos
primeiramente com o tipo std_logic; os diversos tipos de dados sero discutidos mais tarde.
A figura 7 mostra um exemplo de uma caixa preta e o cdigo VHDL que a descreve. Abaixo se
encontram algumas coisas importantes de se notar na figura; a maioria delas se refere a legibilidade e
clareza do cdigo. As palavras em negrito so apenas para lembrar as palavras-chave e no possuem
funo diferente no cdigo por estarem assim escritas.
x Cada "port" possui nome nico e tem "mode" e "type" associados
x O compilador do VHDL permite diversas ports em uma mesma linha, e elas so separadas por
vrgulas. type e mode so definidos no final da linha
x A listagem de entradas e sadas feita de forma consecutiva
x H uma tentativa de alinhar as colunas do nome da port, mode e type para melhor legibilidade:
vale lembrar que espaos em branco so ignorados pelo compilador
x Um comentrio que diz coisas quase inteligentes foi adicionado


Figura 7: Caixa preta exemplo e seu cdigo
A figura 8 apresenta outra entidade em VHDL. Tudo que se foi dito sobre a figura 7 vlido
tambm para esta figura.


Figura 8: Outro exemplo de declarao de entidade
Pode ser que no esteja claro o que cada circuito acima faz, mas o importante entender como
feita a declarao da entidade.
A maior parte dos circuitos que sero projetados, analisados e testados usando VHDL tero
diversas entradas tendo similaridades entre as mesmas. Para no ser necessrio escrever cada entrada com
um nome diferente, pode-se agrup-las em "bus". Um bus ser um agrupamento de entradas, que diferem
entre si apenas por um caractere numrico que caracteriza a posio da respectiva entrada no bus. Cada
sinal do bus chamado de elemento. Pode-se fazer uma analogia: em um nibus, h diversos passageiros
sentados. O motorista no precisa saber o nome de cada passageiro para cham-lo, basta saber o nmero
do seu assento.
O uso de buses sintetiza muito o cdigo VHDL. Eles so usados frequentemente, e so facilmente
descritos no cdigo. Alguns exemplos constam na figura 9, onde deve-se notar que o mode permanece o
mesmo, enquanto o type mudou: o std_logic agora inclui a palavra vector para indicar que cada
identificador de sinal possui, na realidade, mais de um sinal. A forma de referenciar cada elemento do bus
ser detalhada mais adiante.
magic_in_bus : in std_logic_vector(0 to 3);
big_magic_in_bus : in std_logic_vector(7 downto 0);
tragic_in_bus : in std_logic_vector(16 downto 1);
data_bus_in_32 : in std_logic_vector(0 to 31);
mux_out_bus_16 : out std_logic_vector(0 to 15);
addr_out_bus_16 : out std_logic_vector(15 downto 0);
Figura 9: Alguns exemplos de sinais bus
Note que h duas maneiras possveis de se descrever sinais em um bus, que so mostrados nos
termos entre parnteses (lista de argumentos) que seguem a declarao de type. Os sinais podem ser
descritos em duas ordens: crescente (to) ou decrescente (downto). No existe um mtodo melhor que
outro, a escolha entre eles baseada na clareza do cdigo. O importante no esquecer como foi feita
essa definio.
Vamos analisar a notao para descrever os bus em uma caixa preta. A figura 10 mostra uma
caixa preta seguida da sua declarao de entidade. Note que usado um sinal de uma barra com um
nmero em cima, para indicar que a entrada ou sada um bus e quantos elementos ele possui.
importante notar que os sinais de entrada sel1 e sel0 poderiam ser descritos em um bus de dois elementos,
tendo em vista que ambos possuem mesmo type.

Figura 10: uma caixa preta contendo ent radas e sadas bus, e sua respectiva declarao de entidade
A arquitetura
Enquanto a entidade descreve a interface ou a representao externa do circuito, a arquitetura
descreve o que o circuito realmente faz. Em outras palavras, a arquitetura descreve a implementao
interna da entidade associada. Como de se imaginar, descrever a entidade geralmente bem mais fcil
que descrever como o circuito deve operar. Isso cada vez mais verdade quanto mais complexos forem os
circuitos que se pretende projetar.
A parte mais desafiadora do VHDL aprender as inumerveis maneiras de se descrever um
circuito. A maior parte dessa apostila exatamente discutir os diferentes mtodos de descrever circuitos
lgicos, ento no ser feita uma discusso prolongada de arquiteturas nesse ponto. Entretanto, algumas
noes gerais so dadas seguir:
x Podem existir diversas arquiteturas para descrever uma nica entidade. O estilo de cdigo na
arquitetura tem efeitos significativos no circuito sintetizado, ou seja, se o circuito for fisicamente
produzido, cada arquitetura ter um impacto diferente no resultado final. Uma pode proporcionar
maior velocidade, enquanto outra melhora o consumo de energia, por exemplo.
x Os modelos bsicos para descrio de arquitetura so fluxo de dados, estrutural e
comportamental, bem como verses hbridas desses modelos, que sero descritos nas prximas
sees desse material.


O paradigma de programao em VHDL
A ltima seo foi uma breve introduo das unidades bsicas do VHDL: entidade e arquitetura.
A entidade est praticamente definida por completo, dada a sua simplicidade quando comparada com a
arquitetura. essencial lembrar que a entidade descreve a interface do circuito com o mundo, enquanto a
arquitetura descreve o funcionamento do circuito. Isso tem de estar claro nesse ponto.
Antes de entrar em detalhes das especificaes da arquitetura, devemos dar um passo atrs e
lembrar o que estamos fazendo com VHDL: estamos descrevendo um circuito digital. importantssimo
pensar nisso. A tendncia de alunos com alguma experincia em programao ver o VHDL apenas
como outra linguagem que devem aprender para passar em outra matria. Isso pode at funcionar para
esse propsito, mas isso uma m abordagem. O VHDL uma abordagem completamente difenrente
programao, mas como se assemelha em alguns aspectos a outras linguagens, h a tendncia de v-lo
como tal. Deve-se ter em mente que, para toda abstrao vlida na programao em outras linguagens, no
VHDL se est implementando algo fisicamente. Essa a diferena fundamental entre linguagens de
programao comuns e as que descrevem hardware.
Declaraes si multneas
As declaraes so o corao da maioria das linguagens de programao. Elas representam
quantidades finitas de "aes" a serem feitas. Em linguagens algortmicas, como C ou Java, elas
representam aes a serem feitas no processador, e, assim que terminada a ao, o processador comea a
ao seguinte, especificada em algum lugar do cdigo fonte associado. Isso faz sentido, e de certa forma
confortvel para humanos que, como o processador, costumam fazer uma ao por vez.
Por sua vez, o VHDL no funciona dessa maneira: tm-se a capacidade de executar um nmero
(virtualmente) infinito de aes ao mesmo tempo. Isso possvel quando pensamos que fazemos um
projeto de hardware com o VHDL, onde vrias coisas acontecem paralelamente, ou seja,
simultaneamente.
A figura 11 a seguir mostra um exemplo simples de um circuito que executa mltiplas aes
simultaneamente. A qualquer momento que uma entrada mudar, h a possibilidade da sada tambm
mudar, o que verdade para todos circuitos digitais em geral.
Figura 11: Ci rcuito que executa aes simultaneamente
Aqui est a complicao: como somos humanos, somos capazes apenas de ler uma linha do
cdigo por vez de uma maneira sequencial, ento como podemos descrever alguma coisa que
inerentemente paralela? Esse problema no aparece quando se discute algo inerentemente sequencial,
como um algoritmo em linguagem de programao comum.
O paradigma da programao em VHDL se concentra no conceito de paralelismo de expresses e
simultaneidade de descries textuais de circuitos. A alma do VHDL so as declaraes simultneas, que
se assemelham a declaraes em linguagens algortmicas comuns mas so significativamente diferentes
porque executam mais de uma ao ao mesmo tempo.
Para ilustrar, a figura 12 mostra o cdigo que implementa o circuito da figura 11, que mostra quatro
declaraes de atribuio de sinal simultneas (concurrent signal assignement statements). O smbolo
"<=" o operador de atribuio de sinal. A verdade que no podemos escrever todas essas operaes de
uma s vez, mas devemos interpret-las como se estivessem ocorrendo simultaneamente. Novamente,
esse o principal ponto a ser entendido at aqui. Se o pensamento algortmico (sequencial) comear se
sobressair, tente cont-lo imediatamente. A prxima seo trar mais detalhes sobre atribuio simultnea
de sinais.
G <= A AND B;
H <= C AND D;
I <= E AND F;
J <= G OR H OR I;
Figura 12: Cdigo VHDL para o ci rcuito da figura 11.
A figura 13 mostra um cdigo "C" que similar ao cdigo da figura 12. Nesse caso, as funes
lgicas foram substitudas operadores matemticos, e os operadores de atribuio de sinal por operadores
de atribuio. Nesse cdigo, cada linha executada por vez, ao contrrio do VHDL da figura 12.
importante ressaltar que a figura 13 NO um cdigo VHDL vlido.
G = A + B;
H = C + D;
I = E + F;
J = G + H + I;
Figura 13: cdigo algortmico SI MI L AR ao da figura 12 (no VHDL).
O operador de atribuio de sinal " <= "
Todas linguagens algortmicas tem um tipo de operador de atribuio, por exemplo, Em "C" e
Matlab, o "=", enquanto em Pascal ":=". Esses operadores indicam uma transferncia de informaes
do lado direito para o lado esquerdo. Em VHDL, usa-se "<=", e conhecido oficialmente como operador
de atribuio de sinal, para deixar evidente o seu verdadeiro propsito. Ele especifica uma relao entre
os sinais, ou seja, o sinal esquerda do operador depende dos sinais direita do mesmo.
Sendo assim, voc j deve entender o cdigo da figura 12 e sua relao com a figura 11. A
declarao "G = A AND B;" indica que o valor do sinal "G" representa a operao AND, com entradas
A e B. J no caso da programao algortmica, "G = A + B;" indica que o valor representado pela
varivel A adicionado ao valor representado pela varivel B e o resultado da adio atribudo
varivel G. A distino entre as declaraes deve estar ficando mais clara agora.
H quatro tipos de declaraes simultneas que so examinadas nesse material. J foi examinado
brevemente a declarao simultnea de atribuio de sinal, e em breve ela ser analisada mais a fundo e
colocado no contexto de um circuito verdadeiro. Os outro trs tipos de declaraes simultneas so
declaraes de processo, atribuio condicional de sinais e atribuio seletiva de sinais.
Os 4 tipos de declaraes so ferramentas que podem ser utilizadas para implementar circuitos
digitais, e em breve, veremos a versatilidade desses tipos de declarao. Entretanto, deve-se ter em mente
que, devido essa versatilidade, h diversas maneiras de lidar com um mesmo problema. Assim, quando
se analisar um exemplo deste material, importante saber que este corresponde a uma soluo de um
conjunto muito grande delas, ento uma boa prtica tentar resolv-los de outra maneira, como exerccio.
Atribuies de sinal simultneas
A forma geral de uma atribuio simultnea apresentada na figura 14, onde target um sinal
que recebe o valor de expression, que pode ser uma constante, um sinal ou um conjunto de operadores
que operam em outros sinais e retornam algum valor.
target <= expression;
Figura 14: sitaxe da declarao de at ribuio simultnea de sinal

EXAMPLO 1
Escreva um cdigo em VHDL para implementar uma porta lgica NAND de trs entradas. As entradas
devem ser nomeadas como A,B e C, e a sada como F.
Soluo: boa prtica sempre desenhar o diagrama do que se est projetando. Poderamos ter mostrado
diretamente o sinal da porta lgica NAND, mas usaremos uma caixa preta para no perder a generalidade.
Assim, a entidade j est praticamente declarada.

-- cabealho e bibliotecas
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity my_nand3 is -- define o nome da entidade
port ( A,B,C : in std_logic;
F : out std_logic);
end my_nand3;

architecture ex_nand3 of my_nand3 is
begin
F <= NOT (A AND B AND C);
--
-- Uma outra forma de se fazer:
-- F <= A NAND B NAND C;
--
end ex_nand3;
Figura 15: resoluo do exemplo 1
Esse exemplo contm alguns detalhes que devem ser comentados:
x Deve-se inserir arquivos de cabealho (header files) e bibliotecas (library files) para que o cdigo
compile de maneira correta. As linhas que descrevem essa insero esto descritas no topo do
cdigo da figura 15. As linhas aqui utilizadas possuem mais itens do que necessrio para este
exemplo, mas alguns exemplos subsequentes precisaro de todas elas.
x O exemplo destaca o uso de diversos operadores lgicos. Os operadores disponveis em VHDL
so AND, OR, NAND, NOR, XOR e XNOR. O operador NOT no tecnicamente lgico mas
tambm est disponvel.
O exemplo 1 demonstra o uso da declarao de atribuio de sinal simultnea em um programa
VHDL, mas como s h uma declarao desse tipo, o conceito de simultaneidade no est evidente. A
ideia por trs dessa declarao que a sada muda sempre que um dos sinais de entrada mudar. Em outras
palavras, a sada F reavaliada sempre que um sinal na entrada muda. O exemplo a seguir ilustra melhor
a ideia de simultaneidade.
EXEMPLO 2
Escreva um cdigo em VHDL que implemente a funo descrita na tabela verdade a seguir:

L M N F
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1


Soluo: O primeiro passo no processo reduzir a funo dada. Apesar de no ser obrigatrio, pode
ajudar a diminuir o tempo usado para escrever o cdigo VHDL. Espera-se que o compilador em reduziria
o cdigo forma mnima em algum ponto, mas isso pode ser um desejo frustrado. O diagrama da caixa
preta e o cdigo VHDL associado so mostrados na figura 16.
F3 = not(L).not(M).N + L.M





-------------------------------------------------------------------------------------
-- cabealho e bibliotecas devem ser aqui inseridos: no o foram para poupar espao
-------------------------------------------------------------------------------------

entity my_ckt_f3 is
port ( L,M,N : in std_logic;
F3 : out std_logic);
end my_ckt_f3;

architecture f3_1 of my_ckt_f3 is
signal A1, A2 : std_logic; -- sinais intermedirios (esto dentro da caixa preta)
begin
A1 <= ((NOT L) AND (NOT M) AND N);
A2 <= L AND M;
F3 <= A1 OR A2;
end f3_1;
Figura 16: soluo do exemplo 2
Esse exmplo contm novos conceitos e ideias. importante notar que as informaes de
cabealho e bibliotecas foram suprimidas, e isso vai acontecer em todos os exemplos subsequentes desse
material. Ento, para implementar os cdigos de exemplos, deve-se sempre inserir o cabealho e as
bibliotecas, como no exemplo 1. O mais importante, entretanto, notar que esse cdigo demonstra a
utilizao de declaraes de sinal (abaixo da declarao da arquitetura), que so usadas para declarar
sinais intermedirios. Essa abordagem anloga a declarar variveis extras em linguagens de
programao algortmica, onde pode-se utiliz-las para salvar resultados intermedirios que, no geral, no
so o ponto de interesse de um determinado programa. A declarao desses sinais feita de maneira
anloga declarao de ports na entidade. A figura 17 ilustra outra arquitetura que implementa a tabela-
verdade, onde no necessrio fazer a declarao desses sinais.

architecture f3_2 of my_ckt_f3 is
begin
F3 <= ((NOT L) AND (NOT M) AND N) OR (L AND M);
end f3_2;
Figura 17: arquitetura alternativa f3_1
Apesar de as arquiteturas f3_1 e f3_2 das figuras 16 e 17 serem diferentes, elas funcionam da
mesma maneira. Isso porque todas as declaraes so de atribuies simultneas de sinal, porque, mesmo
f3_1 tendo trs declaraes desse tipo e f3_2 apenas uma, as declaraes em f3_1 so executadas
simultaneamente.
O exemplo 2 demonstra que pode-se facilmente converter uma funo em formato de tabela-
verdade para cdigo VHDL. A converso da funo simplificada para declaraes de atribuio
simultneas de sinal foi de certa forma bem direta. A facilidade para se implementar ambas as
arquiteturas quase a mesma, mas deve-se notar que o exemplo 2 bem simples, tinha o objetivo de
ilustrar as atribuies simultneas de sinal. Para circuitos muito complexos, entretanto, essa abordagem
fica tediosa, e uma alternativa mostrada na seo a seguir.
Atribuio condicional de sinal
As declaraes de atribuio simultnea relacionam um alvo com uma expresso. O termo
atribuio condicional de sinal usado para descrever declaraes que tenham apenas um alvo mas
podem ter diversas expresses associadas, cada qual com uma determinada condio. Cada condio
avaliada sequencialmente at a primeira delas ser verdadeira (TRUE), onde a expresso associada a esta
condio avaliada e atribuda ao alvo. Apenas uma atribuio usada.
A sintaxe de atribuio condicional de sinal mostrada abaixo. O alvo nesse caso o
identificador de um sinal, e a condio baseada no estado de outros sinais no circuito. importante
notar que h apenas um operador de atribuio de sinal ("<=") com a declarao de atribuio
condicional.
target <= expression when condition else
expression when condition else
expression;
Figura 18: sintaxe da declarao de at ribuio condicional de sinal
Essa talvez a forma mais fcil de entender no contexto de um circuito. Por exemplo, pode-se
refazer o exemplo 2 usando a atribuio condicional de sinal:
EXEMPLO 3
Escreva um cdigo em VHDL que implemente a funo descrita na tabela verdade a seguir:

L M N F
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1


Soluo: A entidade no muda do exemplo 2, ento a resposta ser simplificada como apenas a
arquitetura.
architecture f3_3 of my_ckt_f3 is
begin
F3 <= `1' when (L = `0' AND M = `0' AND N = `1') else
`1' when (L = `1' AND M = `1') else
`0';
end f3_3;
Figura 19: Soluo do exemplo 3
Alguns pontos interessantes:
x Essa arquitetura parece dar mais trabalho que as anteriores, por ter mais entradas.
x De fato, percebe-se que h apenas um alvo e diversas condies e expresses. A ltima expresso
a exceo s outras, ou seja, ela s executada se nenhuma outra for TRUE.
H razes mais fortes para se utilizar a atribuio condicional de sinal, e a mais clssica a
implementao de um multiplexador (MUX), descrita no exemplo a seguir.

EXEMPLO 4
Escreva um cdigo VHDL que implemente um multiplexador 4:1 usando uma nica declarao de atribuio
condicional de sinal. As entradas devem ser os dados D3, D2, D1, D0 e um bus de controle de duas entradas SEL. A
sada deve ser nica, e MX_OUT.
Soluo: Nesse exemplo deve-se recomear a descrio do problema. Isso inclu o diagrama de caixa
preta e a entidade associada. A figura 20 mostra a soluo completa.

-----------------------------------------------------------------
--entidade e arquitetura do multiplexador 4:1 implementado usando
--atribuio condicional de sinal
--(no esquecer cabealho e bibliotecas se for compilar)
-----------------------------------------------------------------
entity my_4t1_mux is
port ( D3,D2,D1,D0 : in std_logic;
SEL : in std_logic_vector(1 downto 0);
MX_OUT : out std_logic);
end my_4t1_mux;

architecture mux4t1 of my_4t1_mux is
begin
MX_OUT <= D3 when (SEL = 11) else
D2 when (SEL = 10) else
D1 when (SEL = 01) else
D0 when (SEL = 00) else
`0';
end mux4t1;
Figura 20: soluo do exemplo 4: 4:1 MUX usando at ribuio condicional de sinal
Pontos interessantes:
x A soluo parece eficiente se comparada quantidade de lgica que seria necessria caso fossem
utilizadas atribuies simultneas de sinal. Alm disso, o cdigo est bem legvel.
x O operador relacional "=" usado em conjunto com um bus de sinais. Nesse caso, os valores do
bus SEL so acessados usando aspas, e no apstrofes.
x Apenas para ser mais completo, foram includas todas as possibilidades do sinal SEL alm de um
else. Poderamos ter mudado a linha contendo '0' para D0 e removido a linha associada
condio SEL = "00", sendo assim, um descrio mas elegante da soluo.
importante ressaltar que, sempre que se fazemos uma atribuio condicional de sinal,
fisicamente temos um multiplexador implementado. Para fins de projeto, muito importante ter
conscincia disso.
Lembre-se que a atribuio condicional um tipo de declarao simultnea, onde a declarao
executada sempre que ocorrer uma mudana nos sinais da condio. Esse fato se assemelha declarao
de atribuio simultnea, onde a declarao executada sempre que um dos sinais direita do operador
<= muda.
A atribuio condicional de sinal um pouco menos intuitiva que a atribuio simultnea, mas
pode-se pensar nela de outra forma: ela se assemelha, em funo, s construes if-else das linguagens de
programao comuns. Essa relao ser melhor explorada quando falarmos de declaraes sequenciais.
Atribuio seletiva de sinal
A atribuio seletiva de sinal a terceira forma de declaraes simultneas que ser explorada.
Essas declaraes podem ter apenas um sinal alvo, e uma expresso determina em que so baseadas as
escolhas. Isso ficar mais claro a seguir. A sintaxe desse tipo de declarao mostrada abaixo.
with chooser_expression select
target <= {expression when choices, }
expression when choices;
Figura 21: sintaxe da at ribuio seletiva de sinal

EXEMPLO 5
Escreva um cdigo em VHDL que implemente a funo descrita na tabela verdade a seguir, usando apenas a
atribuio seletiva de sinal.

L M N F
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 1
1 1 1 1


Soluo: Esse outra verso do exemplo 2. O diagrama de caixa preta e a declarao de entidade desse
exemplo continuam as mesmas da figura 16, e a soluo est na figura 22.
architecture f3_4 of my_ckt_f3 is
begin
with ( (L = '0' AND M = '0' and N = '1') or
(L = '1' AND M = '1') ) select
F3 <= `1' when `1',
`0' when `0',
`0' when others;
end f3_4;
Figura 22: soluo ao exemplo 5

EXEMPLO 6
Escreva um cdigo VHDL que implemente um multiplexador 4:1 usando uma nica declarao de atribuio
seletiva de sinal. As entradas devem ser os dados D3, D2, D1, D0 e um bus de controle de duas entradas SEL. A
sada deve ser nica, e MX_OUT.
Soluo: Essa uma repetio do exemplo 4, exceto que a atribuio deve ser seletiva, no condicional.
A declarao de entidade no muda, mas ela repetida na figura 23. O diagrama de caixa preta o
mesmo da figura 20, e no repetido.
-----------------------------------------------------------------
-- Entidade e arquitetura do MUX 4:1 do exemplo 6
-- Adicionar cabealho e bibliotecas caso queira compilar
-----------------------------------------------------------------
entity my_4t1_mux is
port ( D3,D2,D1,D0 : in std_logic;
SEL : in std_logic_vector(1 downto 0);
MX_OUT : out std_logic);
end my_4t1_mux;

architecture mux4t1_2 of my_4t1_mux is
begin
with SEL select
MX_OUT <= D3 when 11,
D2 when 10,
D1 when 01,
D0 when 00,
`0' when others;
end mux4t1_2;
Figura 23: Soluo do exemplo 6
Novamente, h pontos a se destacar no exemplo 6, listados abaixo:
x O cdigo possui diversas semelhanas com o da soluo do exemplo 4. A aparncia geral a
mesma. Ambas as solues so bem mais eficientes que se fosse usada atribuio simultnea de
sinal de maneira direta.
x Ao invs de usar else, como na atribuio condicional, usa-se when others, para tratar dos casos
no abordados pelas condies listadas.
x O circuito do exemplo um MUX 4:1, onde cada possvel condio da chooser_expression
(figura 21) - expresso de escolha - tem uma expresso correspondente nas atribuies de sinal.
Isso no necessrio, mas essencial que haja uma linha com when others no final da
declarao de atribuio seletiva.
EXEMPLO 7
Escreva um cdigo VHDL que implemente o seguinte circuito, que contm um bus de entrada contendo 4 sinais e
um de sada contendo 3 sinais. O bus de entrada, D_IN, representa um nmero binrio de 4 bits, e o bus de sada,
SZ_OUT, usado para indicar a magnitude do nmero de entrada. A relao entre entrada e sada mostrada na
tabela abaixo. Use uma declarao seletiva de sinal na soluo.
Margem de entrada de D_IN Valor de sada de SZ_OUT
0000 at 0011 100
0100 at 1001 010
1010 at 1111 001
Condio desconhecida 000


Soluo:

-----------------------------------------------------------------
-- Um circuito decodificador para o exemplo 7, usando atribuio
-- seletiva de sinal.
--
-- Adicionar cabealho e bibliotecas caso queira compilar
-----------------------------------------------------------------
entity my_ckt is
port ( D_IN : in std_logic_vector(3 downto 0);
SX_OUT : out std_logic_vector(2 downto 0));
end my_ckt;

architecture spec_dec of my_ckt is
begin
with D_IN select
SX_OUT <= 100 when 0000 | 0001 | 0010 | 0011,
010 when 0100 | 0101 | 0110 | 0111
| 1000 | 1001,
001 when 1010 | 1011 | 1100 | 1101
| 1110 | 1111,
000 when others;
end spec_dec;
Figura 24: Soluo do exemplo 7
O nico comentrio dessa soluo que a barra vertical usada como um caractere de seleo na
seo choices (figura 21) da declarao de atribuio seletiva de sinal. Isso aprimora a legibilidade do
cdigo.
importante ressaltar novamente que a atribuio seletiva de sinal outra forma de atribuio
simultnea, o que se justifica porque sempre que a chooser_expression mudar, a atribuio seletiva ser
reavaliada.
Um ltimo comentrio sobre a soluo do exemplo 7: ela comparvel declarao switch ou
case de linguagens algortmicas de programao como "C" e Java no caso da primeira, e Matlab no caso
da segunda. Isso ser melhor explorado na seo de declaraes sequenciais.
A declarao de processo
A declarao de processo o ltimo tipo de atribuio simultnea que ser abordada, mas
primeiro, necessrio dar alguns passos para trs e explorar outras definies e princpios de VHDL que
no foram detalhados at este ponto. Lembre-se que h mais de mil maneiras de aprender alguma coisa,
especialmente uma linguagem de programao, onde h diversas solues para um mesmo problema.
Portanto, optou-se aqui por detalhar esse tipo de declarao depois, para ficar mais claro.

Vous aimerez peut-être aussi