Você está na página 1de 105

LINGUAGEM DE DESCRIO DE

HARDWARE - VHDL

Prof. Marco Aurlio Benedetti Rodrigues

ELETRNICA DIGITAL HDL - RONALD


J. TOCCI
Entity
 A entity a parte principal de qualquer projeto,
pois descreve a interface do sistema.
 Tudo que descrito na entity fica
automaticamente visvel a outras unidades
associadas com a
 entity. O nome do sistema o prprio nome da
entity. Assim, deve-se sempre iniciar um
 projeto em VHDL pela entity.


ELETRNICA DIGITAL HDL




Architecture
A entity de um sistema to importante que a
architecture especificada na forma de
architecture of entity.
Um sistema pode ser descrito em termos de
funcionalidade, isto , o que o sistema faz, ou em
termos de estrutura, isto , como o sistema
composto.
Defies das funcionalidades do sistema

ELETRNICA DIGITAL HDL


Package
 Quando for necessrio utilizar algo no definido
nas bibliotecas do VHDL padro, faz se uso do
package. A nica restrio que o package deve
ser previamente definido, antes do inicio da entity.
O uso do package feito por meio de duas
declaraes: library e use.


Ex.:
library IEEE;
use IEEE.std_logic_1164.all;

DESCRIO DE COMPORTAMENTO


O comportamento, ou funcionalidade, de um sistema


corresponde a uma lista de operaes a serem executadas
para se obter um determinado resultado. Process o modo
formal de se fazer uma lista seqencial dessas operaes, e
tem um formato estruturado.
Existem algumas regras para se fazer uma descrio
process. Inicialmente, deve-se especificar que a listagem
corresponde a um process, realizado pelo comando process,
que fica posicionado aps o nome e os dois pontos. Da
mesma forma este nome deve ser colocado aps a
declarao end of process. Para separar as operaes
seqenciais de comandos tais como variable ou constant, a
declarao begin usada para marcar o inicio da listagem
das operaes seqenciais.

DESCRIO DE COMPORTAMENTO


A listagem a seguir ilustra o uso de process para


se implementar um multiplexador 2x1.

MUX2x1: process (A, B, Sel)


constant High : Bit := 1;
begin
y <=A;
if (Sel = 1) then Y <= B;
end if;
end process MUX2x1;

ELETRNICA DIGITAL


Controlador de Motor de Passo

ESPECIFICAES BSICAS DO PROJETO


Voc entende completamente como o projeto deve operar?
Quantos Bits de dados so necessrios ?
Quantos acionamentos so necessarios no projeto (sadas) ?
Quais os nomes das entradas e sadas?
Quais as entradas e sadas so ativas em Alto e Baixo (default) ?
Quais as necessidades de Velocidade (escolha do chip) ?
O que definiria o completo sucesso do seu projeto?

CONTROLADOR DE MOTOR DE PASSO

CONTROLADOR DE MOTOR DE PASSO

CONTROLADOR DE MOTOR DE PASSO

CONTROLADOR DE MOTOR DE PASSO

CONTROLADOR DE MOTOR DE PASSO

REGISTRADORES
Tipos de Flip Flops

Flip FLop D
D
CLK

CLK

CLK
D

Flip Flop JK
J
J

Q
CLK

ou

CLK

Q0

Q0

TOGGLE

Obs.: Flip Flop T= variante do JK

CLK
J

K
Q

REGISTRADORES


Divisor de Frequncia
1
S1

S2

CLK

cl
k
s1
s2

clk
S1 =
2
S1 CLK
S2 =
=
2
4

REGISTRADOR DE 8 BITS COM CLEAR


LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY reg8 IS
PORT ( D : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ;
Resetn, Clock: IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ) ;
END reg8 ;
ARCHITECTURE Behavior OF reg8 IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= "00000000" ;
ELSIF Clock'EVENT AND Clock = '1' THEN Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;

REGISTRADOR DE N BITS
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY reg IS
GENERIC ( N : INTEGER := 8 ) ;
PORT (R : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Rin, Clock: IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END reg ;
ARCHITECTURE Behavior OF reg IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF Rin = '1' THEN Q <= R ;
END IF ;
END PROCESS ;
END Behavior ;

REGISTRADOR DE DESLOCAMENTO

entrada srie
entrada paralelo
entrada srie
entrada paralelo

sada paralelo
sada srie
sada srie
sada paralelo

REGISTRADOR DE DESLOCAMENTO
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
L, w, Clock : IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END shift4 ;
ARCHITECTURE Structure OF shift4 IS
COMPONENT muxdff
PORT ( D0, D1, Sel, Clock : IN STD_LOGIC ;
Q : OUT STD_LOGIC ) ;
END COMPONENT ;
BEGIN
Stage3: muxdff PORT MAP ( w, R(3), L, Clock, Q(3) ) ;
Stage2: muxdff PORT MAP ( Q(3), R(2), L, Clock, Q(2) ) ;
Stage1: muxdff PORT MAP ( Q(2), R(1), L, Clock, Q(1) ) ;
Stage0: muxdff PORT MAP ( Q(1), R(0), L, Clock, Q(0) ) ;
END Structure ;

REGISTRADOR DE DESLOCAMENTO DE 4 BITS


LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ;
Clock : IN STD_LOGIC ;
L, w : IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END shift4 ;
ARCHITECTURE Behavior OF shift4 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN Q <= R ;
ELSE
Q(0) <= Q(1) ;
Q(1) <= Q(2);
Q(2) <= Q(3) ;
Q(3) <= w ;
END IF ;
END PROCESS ;
END Behavior ;

REGISTRADOR DE DESLOCAMENTO DE N BITS


LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( R : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Clock : IN STD_LOGIC ;
L, w: IN STD_LOGIC ;
Q : BUFFER STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END shift ;
ARCHITECTURE Behavior OF shift IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN Q <= R ;
ELSE
Genbits: FOR i IN 0 TO N-2 LOOP
Q(i) <= Q(i+1) ;
END LOOP ;
Q(N-1) <= w ;
END IF ;
END PROCESS ;
END Behavior ;

CIRCUITOS DIGITAIS
 Contadores

Sncronos

CK

UP/DOWN

CLK

UP/DOWN
A
J0
B

J1
C

J1

J0
J

Q B

22/21

VCC

CONTADOR CRESCENTE
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY upcount IS
PORT ( Clock, Resetn, E : IN STD_LOGIC
;
Q : OUT STD_LOGIC_VECTOR (3
DOWNTO 0)) ;

THEN
IF E = '1' THEN
Count <= Count + 1 ;
ELSE
Count <= Count ;
END IF ;
END IF ;
END PROCESS ;

END upcount ;

Q <= Count ;

ARCHITECTURE Behavior OF upcount IS

END Behavior ;

SIGNAL Count : STD_LOGIC_VECTOR (3


DOWNTO 0) ;
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Count <= "0000" ;
ELSIF (Clock'EVENT AND Clock = '1);

CONTADOR COM CARGA


LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ELSIF (Clock'EVENT AND Clock =


'1') THEN
IF L = '1' THEN

ENTITY upcount IS

Q <= R ;

PORT ( R : IN INTEGER RANGE 0 TO 15 ;

ELSE

Clock, Resetn, L : IN STD_LOGIC ;

Q <= Q + 1 ;

Q :BUFFER INTEGER RANGE 0 TO 15 ) ;


END upcount ;
ARCHITECTURE Behavior OF upcount IS
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Q <= 0 ;

END IF;
END IF;
END PROCESS;
END Behavior;
Obs: com o uso do tipo BUFFER,
o sinal count no necessrio

CONTADOR DECRESCENTE
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

END IF ;
END PROCESS;

ENTITY downcnt IS
GENERIC ( modulus : INTEGER := 8 ) ;
PORT ( Clock, L, E : IN STD_LOGIC ;
Q : OUT INTEGER RANGE 0 TO modulus-1 ) ;
END downcnt ;
ARCHITECTURE Behavior OF downcnt IS
SIGNAL Count : INTEGER RANGE 0 TO modulus-1 ;
BEGIN
PROCESS
BEGIN
WAIT UNTIL (Clock'EVENT AND Clock = '1') ;
IF E = '1' THEN
IF L = '1' THEN
Count <= modulus-1 ; -- carrega o mdulo
ELSE
Count <= Count-1 ;
END IF ;

Q <= Count ;
END Behavior ;

CONTADOR MDULO 6 - AHDL

CONTADOR MDULO 6 - VHDL

TRABALHO EM SALA DE AULA




Criar grupo de no mximo 4 pessoas

Projetar um Shift Register Universal (completo)


 Entrada Serial
Deslocamento a Esquerda
Deslocamento a Direita
 Carga Paralela
 Sada Paralela

Projetar um contador BCD de ordem N com


controle para contagem crescente e decrescente.
 Interligar os dois circuitos anteriores, para a
entrada do sinal na forma paralela e saida via
serial.
 Entregar uma cpia do cdigo comentado.


PROJETO RELGIO DIGITAL

CONTADOR DE MDULO 10 - AHDL

CONTADOR DE MDULO 10 - VHDL

CONTADOR DE MDULO 12 - AHDL

CONTADOR DE MDULO 12 - VHDL

COMBINANDO MDULOS

COMBINANDO MDULOS EM AHDL

COMBINANDO MDULOS EM VHDL

FREQNCMETRO


Dispositivo capaz de contar um nmero de pulsos


em um determinado espao de tempo.

DIAGRAMA EM BLOCO DO FREQNCMETRO

TRABALHO EM SALA DE AULA




Criar grupo de at 3 pessoas


- Projetar o circuito de um frequencmetro
conforme o exposto anteriormente.
- Criar o diagrama de em bloco de cada contador.
- Criar o diagrama de bloco geral do sistema.
- Utilizar a linguagem HDL de sua preferncia.
- Entregar um relatrio com todas as funes e
desenho dos diagramas em bloco, comentadas.
- Obs.: O trabalho deve ser realizado em sala de
aula e no h a necessidade de implementar no
Quartus.

CONTROLE DE DISPOSITIVOS


Existe trs tipos de controles relacionandos ao


dispositivos de controle de hardware.

Controle Simples


Circuito que utiliza o acesso direto a um determinado


disposito (pinagem). O acionamento pode ser
realizado de entrada ou sada, desde que sejam
utilizados dispositivos do tipo pull-up ou pull-down
com a mesma tenso do dispositivos a utilizar esse
tipo de controle.

CONTROLE DE DISPOSITIVOS


Controle Buferizado


Esse controle de I/O utiliza um dispositivo do tipo


latch ou buffer para controlar um determinado
dispositivo.

Esse tipo de controle util para realizar a interface


com o mundo real,
ou onde pode no haver
compatibilidade de nveis de energia.

O controle bufferizado proteje o dispositivo a ser


controle de problemas de curto circuito, isto , um
barramento ou acionamento de entrada ligado a outro
de sada.

CONTROLE DE DISPOSITIVOS


Controle de Barramentos
O controle de barramentos identico ao controle
simples porm utiliza um acionamento (pino) que
indica se o processo de controle relacionado a uma
atividade de entrada ou de sada do sinal.
 Esse controle so pode existir entre dispositivos que
utilizam o mesmo nvel de tenso e normalmente no
utiliza dispositivos do tipo buffer, pois quanto maior a
velocidade do controle melhor.
 O controle de barramento utilizado por exemplo
para o controle de memrias e dispositivos de de troca
de informaes.


CONTROLE DE DISPOSITIVOS

CONTROLE SIMPLES


Como controlar os dispositivos


conversor ADC 0808 ?

de

I/O

do

EXEMPLOS DE CONTROLES


Controle Simples

Crie um diagrama em blocos e posteriormente o


cdigo em VHDL para o controle de um conversor
ADC0808
 Especificaes:
 Existe um clock na placa de 5Mhz.
 Definir a taxa de amostragem do conversor
A/D em 2500 amostras por segundo.


EXEMPLOS DE CONTROLES


Controle de barramento

Utilizando o mesmo exemplo do conversor A/D,


utilize os sinais RD e IO de um microprocessador
para a transmisso dos dados convertidos para
um barramento.



RD indica uma operao de leitura.


IO indica uma operao de acesso a leitura de um
perifrico.

O dado somente deve ser liberado para o


barramento aps ter sido completo o ciclo de
converso do A/D e os pedidos de leitura sejam
realizado pelo microcontrolador.

EXEMPLOS DE CONTROLES


Controle Bufferizado

Existe um teclado com 16 teclas porm um


microcontrolador somente possui 4 pinos para
leituras de teclas. Crie um dispositivo encoder
para a leitura das teclas e envio dos referidos
cdigos em para um microcontrolador.


Utilizar o mtodo de varredura das teclas atravs de


uma matriz de acionamento.


O circuito gera um acionamento para uma linha e verifica se


teve o retorno em alguma coluna. Caso exista um retorno
significa que houve uma tecla pressionada, onde esta deve ser
codificada e enviada para o microcontrolador.

EXEMPLOS DE CONTROLES
Fazer o diagrama em bloco do circuito para o encoder
de teclado.
 Escrever o cdigo em VHDL dos blocos do encoder
 Existe um clock na mquina de 50Mhz que pode ser
utilizado no circuito.
 Projetar uma rotina de espera, isto , um circuito
capaz de fazer um delay, por um determinado tempo,
enquanto a tecla for pressionada para a identificar o
acionamento.


CONTROLE DE DISPOSITIVO BUFFERIZADO

EXERCCIOS


Baseado na figura da transparncia 43, fazer o


que se pede:
Projetar um circuito para controlar os conversores
A/D e D/A
 Projetar um circuito para acionamento de periferios
via conector DB25, de acordo com o valor do
conversor A/D. Seguindo a tabela:


Valor do Conversor A/D

Acionamento

0<V<10

D0

10<V<20

D0 e D1

20<V<30

D0,D1 e D2

V>30

D3

CONTROLE DE BARRAMENTO


Atrasos devido ao efeito capacitivo

CONTROLE DE BARRAMENTO

CONTROLE DE BARRAMENTO

CONTROLE DE BARRAMENTO

CONTROLE DE BARRAMENTO
Cada perifrico, para
o seu acionamento,
existe um endereo
especfico para o seu
acionamento.
 Exemplo: Perifericos
do PC.


CONTROLE DE BARRAMENTO


Como fazer o controle para o acionamento dos


perifricos.
Definio do endereo
 Criao da lgica de decodificao para o endereo


CONTROLE DE BARRAMENTO


Controle de endereamento de memria

CONTROLE DE BARRAMENTO


reas de Sombra


Quando um dispositivo mapeado (projeto de um


endereo de acionamento) este deve possuir apenas
um endereo fsico capaz de acion-lo, salvo se este
endereo no for utilizado pelo circuito. Este endereo
que no utilizado pelo circuito e aciona o dispositvo
chamado de endereo de sombra ou rea de sombra.

Os endereos A2, A3,A4,A5,


A6,A8,A9 no so utilizados
Logo qualquer valor aciona o
Dispositivo.
A10

CONTROLE DE BARRAMENTO

CONTROLE DE BARRAMENTO


Identifique o endereo de acionamento de cada memria e os


endereos de sombra de todo o circuito.

CONTROLE DE LCD

CONTROLE DE LCD


Especificao

CONTROLE DE LCD

CONTROLE DE LCD


Diagrama de tempo

CONTROLE DE LCD


Diagrama de tempo

CONTROLE DE LCD


Tempos para o acionamento

CONTROLE DE LCD


Algoritmo para Inicializao do LCD

CONTROLE DE LCD


Algoritmo para Envio de Mensagem para o LCD

EXERCCIO


A partir das informaes anteriores, sobre o


Display de Cristal Lquido (LCD), fazer um
conjunto de rotinas em VHDL para inicializar o
LCD e enviar os dados para o display.

EXERCCIO
Fazer um projeto em HDL para realizar o
interfaceamento dos dispositivos abaixo, para
dispositivos de I/O utilizar o pino WR/RD para
indentificar uma operao de leitura/escrita.
 Apresentar o diagrama em bloco do sistema e
cdigo em HDL


Dispositivo

Endereo

Tipo

Teclado

0x600

Entrada (8bits)

Display

0x3d0

Saida (8 bits)

Microcontrolador

0x360

Entrada e Sada
(16 bits)

Prifrico (placa A/D)

0x362

I/O (32 bits)

MQUINA DE ESTADOS FINITOS EM VHDL




A mquina de estados finitos ou autmato finito uma


modelagem de um comportamental , representando um
circuito sequencial, que armazena estados, transies e aes.

As entradas e sadas so consideradas em instantes de tempo


discretos so definidas pelos pulsos de um sinal clock.

A mquina de Mealy um sistema seqencial cuja sada no


tempo t depende do estado e da entrada ou seja:
Z(t) = H(s(t), x(t)) onde x(t)=entrada no tempo t

A mquina de Moore um sistema seqencial cuja sada no


tempo t depende somente do estado , ou seja:
Z(t) = H(s(t))

MQUINA DE ESTADOS

Exemplo 1:

Mquina de Mealy
z(t) = H(s(t), x(t))

Mquina de Moore
z(t) = H(s(t))

MQUINA DE ESTADOS

Representao de mquinas de estados


DIAGRAMA DE ESTADOS

1. Diagrama de Estados da mquina do Exemplo 2

MQUINA DE ESTADOS

Descrio de mquinas de estados usando VHDL

Descrever a funo de transio de estado e a funo de sada


so descritas como processos separados.

O primeiro processo descreve a funo de transio de


estado e ativado sempre que h um evento no sinal de
clock.

O segundo processo descreve a funo de sada e ativado


sempre que h uma transio de estado

MQUINA DE ESTADOS

Descrio de mquinas de estados usando VHDL

Faa uma descrio VHDL da mquina de estados especificada pelo


diagrama de estados abaixo:

0/0

1/0

1/0

Sinic


S1

1/0

0/0

S2
1/1

0/0

0/0

S3

ARCHITECTURE comportamental OF detetor_de_padroes IS


TYPE estados IS (Sinic, S1, S2, S3);
SIGNAL estado_atual: estados;
SIGNAL estado_anterior: estados;

DESCRIO EM VHDL
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY detetor IS
PORT
( x : IN STD_LOGIC;
y : OUT STD_LOGIC;
clk : IN STD_LOGIC
);
END detetor;

0/0

1/0

1/0

S1

Sinic

1/0

0/0

S2

1/1

0/0

0/0

BEGIN
PROCESS (clk)
BEGIN
IF RISING_EDGE (clk) THEN
CASE estado_atual IS
WHEN Sinic => IF x = '0' THEN estado_atual <= Sinic;
ELSE estado_atual <= S1;
estado_anterior <= Sinic;
END IF;
WHEN S1 => IF x = '0' THEN estado_atual <= Sinic;
estado_anterior <= S1;
ELSE estado_atual <= S2;
estado_anterior <= S1;
END IF;
WHEN S2 => IF x = '0' THEN estado_atual <= S3;
estado_anterior <= S2;
ELSE estado_atual <= S2;
estado_anterior <= S2;
END IF;
S3
WHEN S3 => IF x = '0' THEN estado_atual <= Sinic;
estado_anterior <= S3;
ELSE estado_atual <= S1;
estado_anterior <= S3;
END IF;
END CASE;
END IF;
END PROCESS;

DESCRIO VHDL EXEMPLO 3




PROCESS (estado_atual, estado_anterior)


BEGIN
CASE estado_atual IS
WHEN Sinic => y <= '0';
WHEN S1 => IF estado_anterior = S3 THEN y <= '1';
ELSE y <= '0';
END IF;
WHEN S2 => y <= '0';
WHEN S3 => y <= '0';
END CASE;
1/0
0/0
END PROCESS;
END comportamental;
Sinic

1/0

S1

1/0

0/0

S2

1/1

0/0

0/0

S3

CONTADOR COM MAQUINAS DE ESTADOS




Contador de 4 bits (modulo 16)- contador binrio


com uma mquina de estados, usando trs
processos1: o primeiro processo verifica o sinal
reset e muda o estado na borda de subida do
clock. O segundo processo identifica o prximo
estado e o terceiro especifica a sada do circuito
para cada estado

CONTADOR COM MQUINA DE ESTADOS

CONTADOR COM MQUINA DE ESTADOS

EXERCCIO


Fazer uma mquina de estados para o controle do


conversor A/D ADC0808.

Fazer um contador BCD de 4 bits utilizando


mquinas de estados.

FUNES EM AHDL

FUNES


Funo uma seo de cdigo com o propsito de criar


novas processos normalmente encontrados como
converso de tipos, operaes lgicas, operadores
aritmticos

FUNCTION function_name [<parameter list>] RETURN


data_type IS [declarations]
BEGIN
(sequential statements)
END function_name;

EXEMPLO DE FUNO
FUNCTION positive_edge(SIGNAL s:
STD_LOGIC) RETURN BOOLEAN IS
BEGIN
RETURN (s'EVENT AND s='1');
END positive_edge;
------ Chamada de Funo ------------------------------...
IF positive_edge(clk) THEN...

EXEMPLO DE FUNO
------ Corpo da Funo: ------------------------------FUNCTION conv_integer (SIGNAL vector: STD_LOGIC_VECTOR)
RETURN INTEGER IS
VARIABLE result: INTEGER RANGE 0 TO 2**vector'LENGTH-1;
BEGIN
IF (vector(vector'HIGH)='1') THEN result:=1;
ELSE result:=0;
END IF;
FOR i IN (vector'HIGH-1) DOWNTO (vector'LOW) LOOP
result:=result*2;
IF(vector(i)='1') THEN result:=result+1;
END IF;
END LOOP;
RETURN result;
END conv_integer;
------ Chamada da Funo--------------------------y <= conv_integer(a);

FUNO NO PROGRAMA PRINCIPAL


---------------------------------------------

ARCHITECTURE my_arch OF dff IS

LIBRARY ieee;

------------------------------------------

USE ieee.std_logic_1164.all;
---------------------------------------------

FUNCTION positive_edge(SIGNAL s:
STD_LOGIC)

ENTITY dff IS

RETURN BOOLEAN IS

PORT ( d, clk, rst: IN STD_LOGIC;

BEGIN

q: OUT STD_LOGIC);

RETURN s'EVENT AND s='1';

END dff;

END positive_edge;

----------------

-----------------------------------------BEGIN
PROCESS (clk, rst)
BEGIN
IF (rst='1') THEN q <= '0';
ELSIF positive_edge(clk) THEN q <= d;
END IF;
END PROCESS;
END my_arch;
---------------------------------------------

FUNO EM UM PACOTE
------- Package: -----------------------------

------ Main code: ----------------------------

LIBRARY ieee;

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_1164.all;

----------------------------------------------

USE work.my_package.all;

PACKAGE my_package IS

----------------------------------------------

FUNCTION positive_edge(SIGNAL s: STD_LOGIC)

ENTITY dff IS

RETURN BOOLEAN;
END my_package;

PORT ( d, clk, rst: IN STD_LOGIC;


q: OUT STD_LOGIC);
END dff;

---------------------------------------------PACKAGE BODY my_package IS

----------------------------------------------

FUNCTION positive_edge(SIGNAL s: STD_LOGIC)

ARCHITECTURE my_arch OF dff IS

RETURN BOOLEAN IS

BEGIN

BEGIN

PROCESS (clk, rst)

RETURN s'EVENT AND s='1';

BEGIN

END positive_edge;

IF (rst='1') THEN q <= '0';

END my_package;

ELSIF positive_edge(clk) THEN q <= d;


END IF;
END PROCESS;
END my_arch;

PROCEDIMENTOS EM VHDL


Um procedimento (procedure) em VHDL um


conjunto de operaes que executa uma
determinada ao. Este procedimento pode ser
chamado de qualquer parte do programa VHDL,
de forma similar a chamada de funes feita em
VHDL e, tambm, em varias outras linguagens.

Para a chamada de um procedimento em VHDL,


basta escrever-se o nome do procedimento
seguido de ponto e virgula (;).

PROCEDIMENTOS EM VHDL
procedure contagem is
begin
if(contador<=100)then
contador <= contador +1;
else
contador<=0;
end if;
end contagem;

...
contagem;
{ chamada do procedimento de
atraso}
...
Implementa um procedimento
de contagem ate 100. Note
que contador deve ser uma
varivel global (SIGNAL).

PROCEDIMENTOS EM VHDL


Procedimentos com Parmetros em VHDL


Para ser mais completa, a utilizao de
procedimentos em VHDL permite a passagem de
parmetros quando for realizada a sua chamada.
 Para tanto deve-se inicialmente prever na declarao
do procedimento os parmetros a serem enviados,
descrevendo-se o mesmo entre parnteses.
 Na sua descrio, o parmetro composto por um
identificador, um modo (in, out ou inout) e o tipo.
 A palavra-chave func_code utilizada quando desejase que o tipo do parmetro seja dado pelo programa
que chama o procedimento.


PROCEDIMENTOS EM VHDL
procedure envia_serial (dado : in func_code) is

if teste = (tamanho_dado_serial +1) then

variable indice : dado_serial := 0;

temp := stop_bit;

variable teste : positive := 0;

dout <= temp;

variable temp : bit := start_bit ;


begin

return;
end if

if (clock='1') then
if teste >1 and teste<(tamanho_dado_serial
+ 1)

then

dout <= temp;


end procedure envia_serial;

teste := teste +1;


if indice <= tamanho_dado_serial then Ex: de Chamada da procedure:
temp := dado(indice);
dado := 34;
indice := indice +1;
end if;
end if;
end if;

Envia_serial(dado);
...

PROCEDIMENTOS EM VHDL


Procedimentos com Parmetros de Retornos em VHDL


 Para ilustrar que procedimentos tambm poder retornar valores a
seguir apresenta-se um exemplo de um algoritmo para converso de
valor decimal para BCD:

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


menos_sig : out integer range 0 to 9) is
begin
if numero > 39 then return;
elsif numero >= 30 then
mais_sig := 3;
menos_sig := numero - 30;

mais_sig := 1;
menos_sig := numero - 10;
else mais_sig := 0;
menos_sig := numero;
end if;
end procedure converte_para_BCD;

elsif numero >= 20 then


mais_sig := 2;
menos_sig := numero - 20;
elsif numero >= 10 then

Ex: de Chamada da procedure:


converte para BCD (dado lido, dezena,
unidade);

COMANDO WHILE-LOOP


A estrutura while-loop um caso especial de


estrutura de loop, onde uma condio testada
inicialmente antes de qualquer operao do loop e
caso seja verdadeira, o loop executado. Se a
condio no for satisfeita, o loop para de ser
executado

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

COMANDO WHILE-FOR
O uso de estrutura de for-loop e utilizado
principalmente para execuo de operaes a
serem repetidas por um numero determinado de
vezes.
 A seqncia abaixo descreve o clculo do fatorial
do numero 10.


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

COMANDO WHILE-FOR


A estrutura for-loop permite tambem a realizao


de iteraes em ordem decrescente. Neste caso
basta utilizar-se a palavra-chave downto no lugar
de to:
contador := 5;
resultado := 0;
for contador in 10 downto 1 loop
resultado := contador;
end loop;

COMANDO EXIT


O comando EXIT serve para forar a sada de um


lao conforme das seguintes formas:
exit; => utilizado para terminar um while, for;
 exit <label loop>; => termina o lao e desloca para o
label;
 exit <label loop> when <condio>; => termina o lao
quando (when) condio satisfeita;


COMANDO EXIT


Estrutura Loop com Sada Forcada por Exit:




Um estrutura LOOP pode entretanto precisar de uma


condio de sada. A palavra-chave exit, forca a sada
do loop quando uma determinada condio for
atendida.

Por exemplo:
loop
loop
exit when reset_contador = '1';
contador := contador +1;
saida := contador;
end loop;
contador := 0;
end loop;

COMANDO EXIT
Vrios Loops, Loops encadeados:
loop_externo : loop
contador := 0;
loop_intermediario : loop
loop_interno : loop
saida := contador;
exit when contagem_habilitada = '0';
exit loop_intermediario when reset_contador ='1';
end loop loop_interno;
contador := contador +1;
end loop loop_intermediario;
end loop loop_externo;


COMANDO NEXT
O comando NEXT utilizado para terminar
prematuramente execuo de uma iterao do
tipo while, for ou um loop infinito.
 Esta estrutura similar ao caso de sada por
EXIT, s que a palavra-chave NEXT serve para
reiniciar a sequncia de operaes do loop.
 No exemplo abaixo, note que com o uso de next a
execuo no sai fora do loop:


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

CONVERSO DE TIPOS


STD LOGIC para BIT

function to_bit ( s : std_ulogic ) return bit;


Ex:
variable x : bit;
variable y : std_logic;
x := to_bit(y);

STD LOGIC VECTOR para BIT VECTOR

function to_bitvector ( s : std_ulogic_vector ) return bit vector;


Ex:
variable x : bit_vector(3 downto 0);
variable y : std_logic_vector(3 downto 0);
x := to_bitvector(y);

CONVERSO DE TIPOS
BIT_VECTOR para STD_LOGIC_VECTOR
function to_stdlogicvector ( b : bit vector ) return
std_logic_vector;
Ex:
variable x : bit_vector(3 downto 0);
variable y : std_logic_vector(3 downto 0);
y := to_stdlogicvector(x);


CONVERSO DE TIPOS


Converses para INTEGER

function conv_integer(arg: integer) return integer;


function conv_integer(arg: unsigned) return integer;
function conv_integer(arg: signed) return integer;
function conv_integer(arg: std ulogic) return small int;
Exemplos:
signal b : std_logic;
signal u1 : unsigned (3 downto 0);
signal s1 : signed (3 downto 0);
signal i1, i2, i3 : integer;
u1 <= "1001";
s1 <= 111";
b <= 'X';

i1 <= conv_integer(u1); - 9
i2 <= conv_integer(s1); - 7
i3 <= conv_integer(b);
- valor ASCII de X

CONVERSO DE TIPOS


Converso para STD_LOGIC_VECTOR


function conv std logic vector(arg: integer, size: integer) return
std logic vector;
function conv_std_logic_vector(arg: unsigned, size: integer) return
Std_logic_vector;
function conv_std_logic_vector(arg: signed, size: integer) return
Std_logic_vector;
function conv_std_logic_vector(arg: std ulogic, size: integer) return
Std_logic_vector;

CONVERSO DE TIPOS


Exemplos:

signal u1 : unsigned (3 downto 0);


signal s1 : signed (3 downto 0);
signal v1, v2, v3, v4 : std_logic_vector (3 downto 0);
signal i1, i2 : integer;
u1 <= "1101";
s1 <= "1101";
i1 <= 13;
i2 <= -3;
v1 <= conv_std_logic_vector(u1, 4); - = "1101"
v2 <= conv_std_logic_vector(s1, 4);

- = "1101"

v3 <= conv_std_logic_vector(i1, 4);

- = "1101"

v4 <= conv_std_logic_vector(i2, 4); {

- = "1101"

EXERCCIOS


Fazer uma projeto em VHDL para ler a


temperatura ambiente, caso a temperatura seja
maior que 37 graus gerar alarme de temperatura
alta e desligar o aquecimento. Caso a
temperatura ambiente seja menor que 27 graus,
gerar um alarme de temperatura baixa e ligar o
aquecimento
Dever existir uma funo para monitorao da
9temperatura que utilize o comando loop.
 Dever existir a utilizao do comando FOR para
realizar o acionamento enviar via a quantidade de
pulsos, correspondente a temperatura, atravs de um
pino de sada.3


Você também pode gostar