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

VHDL

Descrio e Projeto de Circuitos Utilizando VHDL

O projeto de circuitos digitais de forma automatizada se tornou


prtica industrial comum. As principais vantagens so :
Portabilidade de tecnologia
Melhor documentao do projeto

As duas principais linguagens utilizadas so o Verilog HDL e o


VHDL.
O termo VHDL um acrnimo das seguintes siglas : VHSIC + HDL ,
onde
VHSIC = Very High Speed Integrated Circuits
VHDL = Hardware Description Language

A linguagem VHDL pode ser complexa, dependendo do que se quer


descrever e/ou projetar. No entanto, utilizaremos um pequeno sub-
conjunto de fcil aprendizado e suficiente para a sntese de
circuitos digitais de modesta complexidade.
Apresentamos aqui alguns construtores que sero utilizados :

variable assignment (atribuio de varivel)


xpto := 50
signal assignment (atribuio de sinal)
nextstate <= HIGHWAY_GREEN
comparaes lgicas
= (equal), /= (not equal),> (greater than),
< (less than)<= ( less than or equal), >= (greater than or equal)
operadores lgicos
(and, xor, or, nand, nor, xnor, not )
if statement
if ( presentstate = CHECK_CAR ) then ....
end if | elsif ....
for statement (loops)

Outros exemplos de construtores :


when else, case , wait .

VHDL POR EXEMPLOS

Utilizaremos exemplos de circuitos combinacionais para


introduzir o referido sub-conjunto do VHDL. Sero tambm
mostradas vrias implementaes do mesmo projeto.

Os exemplos sero :

2 to 1 Mux

8-level priority circuit

3 to 8 Decoder
MODELO BSICO

entity model_name is
port
(
list of inputs and outputs
);
end model_name;
architecture architecture_name of model_name is
begin
...
VHDL concurrent statements
....
end architecture_name ;

A declarao " entity " define a interface do modelo com o meio externo.
A lista " port " define os sinais externos.
O bloco " architecture " especifica o aspecto funcional do modelo :
seu nome definido pelo projetista
podem ser definidas mltiplas arquiteturas para a mesma entidade; determinadas
configuraes sero utilizadas para especificar que arquitetura deve ser utilizada para
uma particular entidade (nossos exemplos utilizaro uma nica arquitetura por
entidade, que ser sempre chamada " behavior " .

2to1 MUX Utilizando when else

library IEEE;
use IEEE.std_logic_1164.all;
vhdl model for 2 to 1 mux, 8bits wide
entity mux2to1 is
port
(
signal s: in std_logic;
signal zero,one: in std_logic_vector(7 downto 0);
signal y: out std_logic_vector(7 downto 0)
);
end mux2to1;
architecture behavior of mux2to1 is
begin
y <= one when (s = 1) else zero;
end behavior;
Standard Logic 1164

library IEEE;
use IEEE.std_logic_1164.all;

O comando " library " utilizado para referenciar um grupo de


units pr-programadas em VHDL (packages ).

O comando " use " especifica quais entidades ou packages


sero utilizadas desta biblioteca. No caso acima, o comando use
IEEE.std_logic_1164.all; importa todas as procedures/functions
da package std_logic_1164 package, da biblioteca IEEE.

A package std_logic_1164 define vrios tipos de dados. Dentre


eles podemos destacar :
tipo bit : valores 1 e 0 (padro no VHDL)
Z ( alta impedncia), (dont care)
tipo single bit std_logic e vector std_logic (para barramentos).

2:1 MUX Entity

entity mux2to1 is
port
(
signal s: in std_logic;
signal zero,one: in std_logic_vector(7 downto 0);
signal y: out std_logic_vector(7 downto 0)
);
end mux2to1;

A declarao " entity " define a interface do modelo com o meio


externo.
A lista " port " define os sinais externos. A definio dos sinais
consiste em: name, mode, e type de cada um dos sinais. Por
enquanto sero utilizados como mode apenas in, out ou inout .
Os types sero :
std_logic ( bit ) ou std_logic_vector (barramentos).

A especificao matricial no tipo std_logic_vector


define o " tamanho" do sinal:
std_logic_vector (7 downto 0) (descending range)
std_logic_vector (0 to 7) (ascending range)

Ambos so sinais de 8 bits.


Os termos descending/ascending range afetaro comandos
como:

y <= 11110000;

Para descending range, y(7) 1;

para ascending range y(0) 1.

2:1 MUX Architecture

architecture behavior of mux2to1 is


begin
y <= one when (s = 1) else zero;
end behavior;

O bloco " architecture " especifica o aspecto funcional do modelo.


Seu nome definido pelo projetista, porm, por facilidade o
chamaremos sempre por " behavior " .

O comando when ... else um comando condicional, com


funcionamento idntico aquele observado em outras linguagens.
2:1 MUX Architecture Utilizando Lgica Booleana

architecture behavior of mux2to1 is


signal temp: std_logic_vector(7 downto 0);
begin
temp <= (s, s, s, s, others => s);
y <= (temp and one) or (not temp and zero);
end behavior;

Operadores booleanos so utilizados para gerar a operao MUX.


Um conjunto de atribuies deve ser feito e pode ter vrias formas :
temp <= (others => s); a palavra others d o valor default
temp <= (s, s, s, s, s, s, s, s) ; atribuio posicional ( 7 downto 0 )
temp <= (4=>s, 7=>s, 2=>s, 5=>s, 3=>s, 1=>s, 6=>s, 0=>s)
atribuio nominal ou uma combinao dos anteriores.
2:1 MUX Architecture Utilizando um Processo

architecture behavior of mux2to1_8 is


begin
comb: process (s, zero, one)
begin
y <= zero;
if (s = 1) then
y <= one;
end if;
end process comb;
end behavior;

Um processo utilizado para gerar a operao MUX. O bloco processo considerado como um
simples comando concorrente. So permitidos apenas comandos sequenciais dentro do bloco
processo. Atribuies de sinais so consideradas como ocorrncias sequenciais, j que uma
atribuio precede uma anterior feita para o mesmo sinal. if ... else , case, for ... loop so
comandos sequenciais.
A lista de sinais colocada aps o comando process ( s, zero, one no exemplo acima )
chamada sensitivity list ; um evento em qualquer destes sinais causar uma reavaliao do bloco
processo, durante a simulao do modelo.

8level Priority Encoder

Modelo VHDL para um codificador de prioridade


IO Interface Declaration
entity priority is
port (
signal y1, y2, y3, y4, y5, y6, y7: in std_logic;
signal vec: out std_logic_vector(2 downto 0)
);
end priority;
Architecture body
architecture behavior of priority is
begin
process (y1,y2,y3,y4,y5,y6,y7)
begin
if (y7 = 1) then vec <= 111;
elsif (y6 = 1) then vec <= 110;
elsif (y5 = 1) then vec <= 101;
elsif (y4 = 1) then vec <= 100;
elsif (y3 = 1) then vec <= 011;
elsif (y2 = 1) then vec <= 010;
elsif (y1 = 1) then vec <= 001;
else vec <= B000;
end if;
end process;
end behavior;
Priority Encoder .....

Num processo, a ordem de comandos sequenciais que afetam uma


sada comum define a prioridade daquelas atribuies.

Architecture body
architecture behavior of priority is
begin
process (y1,y2,y3,y4,y5,y6,y7)
begin
vec <= 000;
if (y1 = 1) then vec <= 001; end if;
if (y2 = 1) then vec <= 010; end if;
if (y3 = 1) then vec <= 011; end if;
if (y4 = 1) then vec <= 100; end if;
if (y5 = 1) then vec <= 101; end if;
if (y6 = 1) then vec <= 110; end if;
if (y7 = 1) then vec <= 111; end if;
end process;
end behavior;

Como y7 testado por ltimo, ele ter a mais alta prioridade.

Exemplo 3 to 8 Decoder

entity dec3to8 is
port (
signal sel: in std_logic_vector(2 downto 0); seletor
signal en: in std_logic; enable
signal y: out std_logic_vector(7 downto 0) sadas ativas LOW
); end dec3to8;
architecture behavior of dec3to8 is
begin
process (sel,en)
begin
y <= 11111111;
if (en = 1) then
case sel is
when 000 => y(0) <= 0;
when 001 => y(1) <= 0;
when 010 => y(2) <= 0;
when 011 => y(3) <= 0; Ao utilizar processos, um erro comum esquecer
when 100 => y(4) <= 0; de atribuir a uma sada um valor default. Todas as
when 101 => y(5) <= 0; sadas devem ter valores defaults.
when 110 => y(6) <= 0; Examplo: No arquivo dec3to8.vhd se no fosse
when 111 => y(7) <= 0; atribudo a y o valor default de B 11111111, caso
end case; en is 0, ento nenhum valor seria atribudo a y !
end if;
end process;
end behavior;
Alternativa para o 3to8 Decoder

vhdl model for the 3 to 8 decoder


utiliza atribuies condicionais signal, que so comandos concorrentes
entity dec3to8_alt is
port (
signal sel: in std_logic_vector(2 downto 0); seletor
signal en: in std_logic; enable
signal y: out std_logic_vector(7 downto 0) sadas ativas LOW
);
end dec3to8_alt;
architecture behavior of dec3to8_alt is
begin
y(0) <= 0 when (en = 1 and sel = 000) else 1;
y(1) <= 0 when (en = 1 and sel = 001) else 1;
y(2) <= 0 when (en = 1 and sel = 010) else 1;
y(3) <= 0 when (en = 1 and sel = 011) else 1;
y(4) <= 0 when (en = 1 and sel = 100) else 1;
y(5) <= 0 when (en = 1 and sel = 101) else 1;
y(6) <= 0 when (en = 1 and sel = 110) else 1;
y(7) <= 0 when (en = 1 and sel = 111) else 1;
end behavior;

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