You are on page 1of 35

Tutorial VHDL

Prática de Eletrônica Digitais 1 – 119466

Tutorial VHDL

Nome Matrícula Assinatura


Mateus Cunha Vasconcelos de Araújo
Macário Soares da Cruz Júnior
Felipe Agustini Boccardi
Hugo da Silva de Freitas Catarino

1
Tutorial VHDL

Objetivo
Familiarizar-se com a linguagem VHDL utilizada no laboratório de Prática de
Eletrônica Digital 1 (PED1).

Aspectos gerais da linguagem

Como a linguagem VHDL suporta projetos com múltiplos níveis de hierarquia, a


descrição pode consistir na interligação de outras descrições menores, a um código que
representa o comportamento esperado do circuito. A ordem da avaliação dos comandos
executada pelo simulador é irrelevante, sendo que o resultado será sempre o mesmo. As
operações internas executadas pela ferramenta de simulação, contudo, são efetuadas
sequencialmente. Sendo assim, o simulador necessita de um mecanismo interno para armazenar
o resultado de cada comando, até que a avaliação de todos os envolvidos tenha sido realizada.

A linguagem permite delimitar regiões de código sequencial, onde a execução dos


comandos segue a ordem de sua apresentação, para essas regiões são utilizados comandos
específicos, que não podem ser empregados na região de código concorrente.

Assim como as linguagens de programação mais conhecidas (C, C++, Java, etc.), a
linguagem VHDL permite a definição de subprogramas na forma de procedimentos e funções.
Os subprogramas podem ser empregados em rotinas de conversão, definição de novos
operadores e outras operações não diretamente ligadas a um circuito passível de síntese. Nada
impede, entretanto, que um subprograma tenha uma correspondência direta a um elemento do
circuito a ser sintetizado.

Principais pontos abordados na linguagem VHDL

● O desenvolvimento da linguagem VHDL foi motivada pela necessidade de um padrão


para o intercâmbio de informações entre diversos fornecedores de equipamentos para o
Departamento de Defesa dos Estados Unidos da América.
● VHDL é uma linguagem concorrente. Os comandos envolvidos na ocorrência de um
evento são executados simultaneamente, assim como os elementos de um sistema
digital executam as suas tarefas conjuntamente.
● Uma descrição pode conter diversos níveis de abstração, variando da interligação de
componentes a uma representação do comportamento do sistema. Os diversos níveis de
abstração podem ser inseridos numa mesma descrição, sendo permitidos, também,
projetos hierárquicos.
● A linguagem VHDL não f oi concebida originalmente para a síntese, mas sim para a
descrição de circuitos digitais. Desse modo, nem todas as construções possíveis da
linguagem podem ser utilizadas para a síntese.

2
Tutorial VHDL

Aspecto de uma entidade

Uma entidade de projeto, pode representar desde uma simples porta lógica a
um sistema completo, e é composta de duas partes: declaração da entidade e
arquitetura. A declaração da entidade define a interface entra a entidade e o ambiente
exterior, como exemplo, as entradas e saídas. A arquitetura contém a especificação
das relações entre as entradas e saídas de uma entidade.
A simulação de uma entidade de projeto somente pode ser executada após a
sua compilação, e o resultado é armazenado em uma library(Ver Figura 1).

Figura 1: Exemplo de entidade de projeto.

Uma arquitetura pode ser descrita por meio de uma interligação de componentes, de
forma a estabelecer uma hierarquia no projeto. Cada componente deve ser declarado, sendo
ele também uma entidade de projeto. Descrições que empregam esse estilo são denominadas
estruturais, e a complexidade dessas descrições pode variar de um simples registradora um
processador contendo a interligação de blocos complexos como memórias, unidades lógicas
aritméticas, etc. Não existe limite para o nível da hierarquia e a descrição não precisa conter
unicamente a interligação de componentes, é possível mesclar diferentes estilos de descrições
em um mesmo código.

Figura 2: Interconexão de módulos individuais.


3
Tutorial VHDL

Declaração de uma entidade

A declaração de uma entidade iniciasse com a palavra entity. Depois a cláusula "Port" é
empregada para definir o modo e os tipos das portas de entrada e saída da descrição. Nós
possuímos 4 modos possíveis para "Port", estes são: In, Out, Buffer eInout(Ver Figura 3).

Figura 3: Declaração de uma entity.

*Como já visto em sala de aula, podemos substituir o "in bit", por "STD_Logic".

O corpo da arquitetura inicia-se com a palavra reservada "Architecture" seguida de um


nome identificador e o nome da declaração de entidade associada. As linha que seguem podem
conter declarações de sinais e constantes, declarações que identificam os componentes externos
utilizados pela arquitetura, bem como a descrição completa de subprogramas que são utilizados
localmente pela arquitetura. Os comandos concorrentes que descrevem a entidade,
propriamente, ficam entre as palavras reservadas "BEGIN" e "END".

O nome identificador da arquitetura permite a existência de mais de uma arquitetura


para uma mesma declaração de entidade (Ver Figura 4).

4
Tutorial VHDL

Figura 4: Corpo da arquitetura.

Classe de objetos

Objetos são elementos que contêm um valor armazenado. Quatro classes de objetos são
definidas em VHDL:

● Constante ou "CONSTANTE";
● Variável ou "VARIABLE";
● Sinal ou "SIGNAL";
● Arquivo ou "FILE";
A constante é um objeto com um valor estático. No caso da variável, o valor inicial
imposto pode ser alterado no decorrer do código, e é empregada em regiões de código
sequencial. Sinais são objetos que podem ter o seu valor alterado, e são empregados em regiões
de código concorrente e sequencial. Os objetos da classe "FILE" estão associados à criação de
arquivos.

A Figura 5 contém exemplos de declarações de objetos das classes. A sintaxe da


declaração é semelhante para as três classes. Elas iniciam com uma palavra reservada que define
a classe do objeto, seguida de uma lista de nomes que identificam os objetos através do
delimitador ":=" .

Os objetos são declarados nas regiões de arquiteturas, blocos, processos, subprogramas


e pacotes. Restrições se aplicam, com relação às regiões permitidas, as determinadas classes de
objeto, assim como à visibilidade atingida pelo objeto declarado. Na região de declarações de
uma arquitetura podem ser declarados sinais, constantes e variáveis. Os objetos ali declarados
são visíveis somente naquela arquitetura.

5
Tutorial VHDL

Figura 5: Declaração de objetos da classe constante, variável e sinal.

Na Figura 6 são apresentados alguns exemplos de transferência de informação entre


objetos das classes "SIGNAL", "VARIABLE" e "CONSTANT". A atribuição de valor para uma
variável emprega o delimitador " := ", enquanto a atribuição para um sinal emprega o
delimitador " <= ".

Figura 6: Exemplos de transferência de informação entre objetos

Exemplo: De acordo com a tabela verdade crie o projeto em VHDL utilizando o SIGNAL.

Figura 7: Tabela verdade.

6
Tutorial VHDL

Tirando o circuito da tabela verdade, temos(Ver Figura 8):

Figura 8: Circuito retirado a partir da tabela verdade.

E a seguinte expressão lógica(Ver Figura 9):

Figura 9: Expressão lógica retirada da tabela verdade.

Criando o código em VHDL, temos(Ver Figura 10):

7
Tutorial VHDL

Figura 10: Código em VHDL da tabela verdade utilizando SIGNALS.

Observe que os sinais (OR1, OR2 e OR3) são como ligações internas do circuito, onde
apenas partir delas conseguimos definir o código, mas o problema era bem simples. A utilização
de signal é muito importante quando se deseja criar uma ligação interna no circuito. Lembrando
que deve ser definido antes da inicialização (begin) da architecture.

Comandos sequenciais

Construção "When Else"

A construção "When Else" permite a transferência condicional de um sinal, e segue o


formato da Figura 11. Na construção, uma lista de opções é apresentada estabelecendo qual o
valor de uma expressão deve ser transferido a um sinal de destino. A primeira condição que

8
Tutorial VHDL

retorna o valor verdadeiro define o valor que é transferido para o sinal de destino.

Figura 11: Construção "WHEN ELSE".

O exemplo da Figura 12 mostra o código da seleção de um MUX 4x1 utilizando o


"WHEN ELSE". Lembrando que está não é a única maneira de se implementar um circuito
multiplexador.

Figura 12: Circuito de seleção empregando a construção "WHEN ELSE".

Construção "WITH SELECT"

A construção "WITH SELECT" transfere um valor a um sinal de destino segundo uma


relação de opções. Todas as condições da seleção devem ser consideradas, e elas devem ser
mutuamente exclusivas. A lista de opção nessa construção não contém uma prioridade, como
pode-se observar na sua construção, mostrado na Figura 13.

As opções podem ser agrupadas através do delimitador " | ", equivalendo, nesse caso,
uma condição "ou" entre elas. De modo semelhante, as palavras "TO" e "DOWNTO" podem ser
empregadas para delimitar uma faixa de condições de um tipo escalar. Outra palavra reservada
que também pode ser utilizada é a "OTHERS", que é válida como última alternativa,
englobando assim todas as condições restantes.

9
Tutorial VHDL

Figura 13: Construção "WITH SELECT"

O exemplo da Figura 14 mostra novamente um código de seleção de um mux 4x1, mas


dessa vez utilizando a construção "WITH SELECT". Desta vez utilizaremos vetores também na
construção do código.

Figura 14: Construção de um mux 4x1 utilizando a construção "WITH SELECT".

Note que, quando utilizamos "WITH SELECT" as linhas das condições são terminadas
com “,” (vírgula).

10
Tutorial VHDL

Cuidados na descrição!
Na construção "WHEN ELSE" a ordem em que as condições são apresentadas indica a
precedência na execução: a primeira tem prioridade máxima, e a última tem menor prioridade.
Na construção "WITH SELECT" todas as condições possuem a mesma prioridade. A diferença
entre as construções pode ser aproveitada pelo projetista para obter circuitos mais eficientes e
descrições mais sucintas, conforme o comportamento do circuito descrito.

Comando "PROCESS"

Um processo permite definir uma área contendo comandos sequenciais. A palavra


reservada para isso é "PROCESS" que identifica o comando conforme apresentado na Figura 15.
Um processo é composto de duas regiões:

● Parte da declaração;
● Parte de comandos sequenciais.
A primeira região é o local para a declaração de tipos e subtipos, constantes, variáveis,
entre outros. A declaração de sinais não é permitida. A segunda região, após a palavra
"BEGIN", inicia a área contendo comandos sequenciais que representam o comportamento de
uma parte ou de toda a descrição.

A palavra "PROCESS" pode ser antecedida de um rótulo qualquer, e ser seguida de


uma lista de sensibilidade. Essa lista define a quais sinais o conjunto de comandos contido no
processo é sensível. Isto é, ocorrendo uma mudança no valor de um dos sinais contidos na lista,
o processo será executado

Figura 15: Formato do comando "PROCESS".

11
Tutorial VHDL

Para que possamos continuar explicando sobre a utilização do comando "PROCESS",


devemos aprender a manusear os comandos sequenciais, sendo os mais comuns: "IF" e "CASE".

Construção "IF ELSE"

A construção "IF ELSE" permite a execução condicional de um ou mais comandos


sequenciais, segundo uma lista de condições. As condições avaliadas na ordem da apresentação
no código, e a condição de teste pode ser uma expressão que retorne um valor do tipo
"Booleano". A primeira condição verdadeira encontrada define o conjunto de comandos
sequenciais a serem executados.

O comando "IF" inicia a lista de condições, e pode ser seguido por cláusulas "ELSIF"
contendo, também condições a serem verificadas. Se nenhuma condição verdadeira for
encontrada, e existir uma cláusula "ELSE", o conjunto de comandos que a segue é executado.
Se nenhuma condição for verdadeira e não constar uma cláusula "ELSE" na construção, nenhum
comando é executado (Ver Figuras 16 e 17).

As cláusulas "ELSIF" e "ELSE" são opcionais, e o número de cláusulas "ELSIF" não é


limitado. Como o comando "IF" é, também, um comando sequencial, é possível aninhar vários
níveis de construções "IF ELSE" (Ver Figuras 16 e 17).

Figura 16: Formato da construção "IF", "ELSIF" e "ELSE".

12
Tutorial VHDL

Figura 17: Construções "IF ELSIF" aninhadas.

A Figura 18 contém um exemplo da construção "IF ELSE". Dois sinais são controlados
da seguinte forma: o comando "IF" específica a primeira condição, a cláusula "ELSIF"
especifica as novas condições, e a cláusula "ELSE" engloba as condições restante. Assim como
na construção concorrente "WHEN ELSE", a construção "IF ELSE" define uma prioridade na
ordem das opções, e o circuito equivalente corresponde a uma sequência de seletores
comandados por blocos que detectam as condições. Na construção "IF ELSE", entretanto, cada
circuito que detecta uma condição pode comandar mais de um seletor, pois vários comandos
podem ser executados para cada condição.

Figura 18: Parte de um código empregando a construção "IF ELSE".

O exemplo da Figura 19 mostra o código de um circuito comparador de 4 bits. Neste exemplo


13
Tutorial VHDL

definimos o "PROCESS". A cada processo é associado uma lista de sensibilidade, que indica
quais são as variáveis cuja alterações deve levar à reavaliação na saída.

Figura 19: Circuito comparador de 4 bits utilizando "PROCESS" e "IF ELSE".

Construção "CASE WHEN"

A construção "CASE WHEN" permite a execução condicional de um ou mais


comandos sequenciais, conforme o valor de uma expressão. Cada condição define um conjunto
de comandos sequenciais a serem executados.

As condições devem ser mutuamente exclusivas, significando que não é permitido mais
de uma condição verdadeira na relação de valores que a expressão pode assumir, e todas as
condições possuem a mesma prioridade. Caso a execução de um mesmo conjunto de comandos
seja condicionada a mais de uma condição, é possível agrupar as condições através do
delimitador " | ". Ele equivale a operação "ou" entre as condições de escolha. De modo
semelhante, as palavras reservadas "TO" e "DOWNTO" podem ser empregadas para delimitar
uma faixa de condições. A palavra "OTHERS" pode ser empregada na última condição para
agrupar as condições não-relacionadas na lista (Ver Figura 20).

Figura 20: Formato da construção "CASE WHEN".


14
Tutorial VHDL

Vamos agora ver outro exemplo da construção de um multiplexador, este utilizando


vários tópicos abordados já neste tutorial, sendo eles: "SIGNAL", "PROCESS", "CASE
WHEN"(Ver Figura 21).

Figura 21: Construção de um MUX4x1.

15
Tutorial VHDL

Vamos realizar outro exemplo, agora implementando um decodificador 2 para 4


utilizando "PROCESS", "IF" e "CASE WHEN"(Ver Figura 22).

Figura 22: Decodificador 2 para 4.

Construção "WHILE"
O comando de repetição “WHILE” permite a repetição de um ou mais comandos,
conforme uma condição de parada. O comando “WHILE” irá realizar um loop enquanto essa
condição não for atingida. Segue um multiplicador utilizando o comando “WHILE” sendo que
enquanto “I” for maior que 0 somará “A”, “B” vezes(Ver Figura 22).

16
Tutorial VHDL

Figura 22: Multiplicador com "WHILE".

Construção "FOR"
O comando de repetição “FOR” permite a repetição de um ou mais comandos,
conforme uma condição de parada, mas diferente do “WHILE”, é definido um valor inicial e
final para a variável que é a condição de parada. O comando “FOR” irá realizar um loop
enquanto essa condição não for atingida. Segue um multiplicador utilizando o comando
“FOR”(Ver Figura 23).

Figura 23:Multiplicador com "FOR".

Utilizando o “CLOCK”
O clock é um sinal usado para coordenar as ações de dois ou mais circuitos eletrônicos.
Um sinal de clock oscila entre os estados alto e baixo, normalmente usando um duty cycle de
50%, e gerando uma onda quadrada. Circuitos que usam o sinal de clock para sincronização
podem se tornar ativos no ápice, na queda ou em ambos os momentos do sinal de clock.

O clock da basys 3 possui uma frequência de 100 Mhz. Para utilizá-lo de forma
econômica, usaremos o divisor de clock, a função “rising_edge”, que detecta a mudança de
borda de subida e,então,nós podemos dividir a frequência da placa por uma frequência que nós
queiramos observar, por exemplo 400 frames por segundo, tendo esse resultado, colocamos
como uma condição que quando fosse detectado esse valor (124999 vezes) de subidas, o sinal
de saída mudaria, como ligado e desligado(Ver Figura 24).

17
Tutorial VHDL

Figura 24: Divisor de clock.

Componentes
Um componente em VHDL é um entidade dentro de uma arquitetura. A utilização desse
elemento permite a interligação de múltiplas entidades de projeto, de modo a formar uma
entidade mais complexa em um projeto hierárquico.

Podemos utilizar a declaração no corpo de uma arquitetura ou podemos utilizar também


em forma de pacote.

Declaração de componente
A declaração é semelhante a uma declaração de entidade, empregando a palavra
reservada "COMPONENT" no lugar da palavra "ENTITY". Nela podem ser apresentadas
uma lista de portas e uma lista de genéricos. A Figura 25 ilustra o exemplo de uma
declaração de um componente.

18
Tutorial VHDL

Figura 25: Declaração de um COMPONENT.

A declaração de um componente pode ser inserida no corpo da arquitetura ou em


pacotes. A declaração de componentes em um pacote é conveniente nos casos em que um
mesmo componente é empregado por diferentes arquiteturas, pois esse recurso evita a repetição
da declaração em cada arquitetura. Basta, apenas, tornar o pacote visível para a arquitetura.

Solicitação de componente

A solicitação é um comando concorrente e consiste em um rótulo de denominação


qualquer, o nome de um componente declarado e o mapa de portas, ou "PORT MAP". O mapa
contém uma lista que permite estabelecer uma associação entre os sinais definidos na declaração
do componente e os sinais definidos na entidade que solicita o componente.

A lista de sinais no mapa pode seguir a mesma ordem estabelecida na declaração do


componente, notação posicional, ou uma nova sequência definida no mapa, notação nomeada. A
palavra reservada "OPEN" indica que o sinal do componente solicitado não é conectado a
nenhum sinal da arquitetura.

Figura 26: Solicitação de um componente na descrição.

Para uma melhor compreensão, vejamos um exemplo(Ver Figura 27).

19
Tutorial VHDL

Figura 27: Exemplo de uma COMPONENT.

Os nomes dos componentes declarados são idênticos aos nomes das entidades
associadas aos componentes. O mesmo se aplica aos nomes das portas. Essa é a maneira mais
simples de se estabelecer um elo de correspondência entre uma entidade e uma declaração ao
componente.

Para a melhor compreensão, iremos fazer mais um exemplo. Dessa vez um somador de
4 bits. Observe como é um somador de 4 bits (Ver Figura 28).

Figura 28: Somador de 4 bits.

20
Tutorial VHDL

A partir da arquitetura da Figura 28, podemos fazer nosso somador de 4 bits.

Figura 29: Somador de 4 bits.

Note que, nosso somador está incompleto, pois nosso "component" não realiza a
operação do somador de 1 bits. O que devemos fazer é "puxar" o nosso "component" com a
operação do somador de 1 bit. O exemplo de um somador de 1 bit pode ser visto na Figura 30.

Figura 30: Somador de 1 bit.

Este código do somador de 1 bit deve ser declarado dentro do mesmo projeto. Para isto,
21
Tutorial VHDL

deve-se clicar com o botão direito do mouse em "Design Source" e depois "Add Sources", criar
um novo "design source", dentro do mesmo projeto (Ver Figura 31).

Figura 31: Adicionando um novo "Design Source".

O resultado obtido será este (Ver Figura 32).

Figura 32: Novo "Design Source".

No nosso novo projeto declaramos a arquitetura do nosso somador de 1 bit completo (Ver
Figura 33).

22
Tutorial VHDL

Figura 33: Somador de 1 bits.

Note que o nome da nossa entidade deve ser igual ao nome do nosso "COMPONENT"
declarado no nosso código principal "som_1a". Com isso, implementamos o nosso somador de
4 bits.

Implementação de Flip-Flops em VHDL

Flip-Flop tipo RS

Consiste no tipo mais básico de Flip-Flop, onde temos as duas saídas Q e Q' e suas
variáveis de entrada, que são um Set(S) e um Reset (R), o qual é denominado de SR. Neste
quesito, o Set seleciona o nível lógico 1 na saída do circuito (Q) e o Reset seleciona o nível
lógico 0 na saída (Q'). Um exemplo desse Flip-Flop encontrasse nas Figuras 34 e 35.

Figura 34: Flip-Flop tipo SR e sua tabela verdade.

23
Tutorial VHDL

Agora implementando o código temos:

Figura 35: Flip-Flop tipo SR em VHDL.

Flip-Flop tipo JK

O funcionamento do JK nada mais é que um Flip-Flop SR realimentado, conforme se


apresenta nas Figuras 36 e 37.

24
Tutorial VHDL

Figura 36: Flip-Flop tipo JK e sua tabela verdade.

Figura 37: Flip-Flop tipo JK em VHDL.

Flip-Flop tipo T

Este Flip-Flop é obtido a partir de um Flip-Flop JK, onde temos as entradas curto-
circuitadas. Assim, o circuito só pode assumir dois estados lógicos. Para uma maior

25
Tutorial VHDL

compreensão, as Figuras 28 e 39 apresentam um exemplo do JK.

Figura 38: Flip-Flop tipo T e sua tabela verdade

Figura 39: Flip-Flop tipo T em VHDL.

Flip-Flop tipo D

Muito parecido com o Flip-Flop tipo T, este apresenta a semelhança de curto-circuitar

26
Tutorial VHDL

as entradas. Porém, ao invés disso, temos a presença de uma porta inversora entre as duas
entradas. Neste sentido, as Figuras 40 e 41, exemplificam o T.

Figura 40: Flip-Flop tipo D e sua tabela verdade.

Figura 41: Flip-Flop tipo D em VHDL.

27
Tutorial VHDL

Máquina de estados

Uma máquina de estados nada mais é que um circuito sequencial síncrono, esse circuito
apresenta seus estados pré-definidos, cujo estes são condicionados a um clock de controle. Dois
estilos de máquinas são definidos (Ver Figuras 42 e 43). Na máquina de Mealy o estado futuro
vai depender tanto do estado atual quanto das entradas aplicadas e sua saída depende tanto do
estado atual quanto das entradas, já na máquina de Moore a saída diferentemente da máquina de
Mealy depende apenas do estado atual (Ver Figuras 42 e 43).

Figura 42: Máquina de Mealy.

Figura 43: Máquina de Moore.

De acordo com o que foi explicado, iremos fazer um exemplo. Neste exemplo consta
uma máquina de 4 estados, sendo eles: 00, 01, 11 e 10. Está também será a ordem na qual a
nossa máquina de estados irá contar. Neste exemplo a máquina inclui uma entrada para
28
Tutorial VHDL

inicialização assíncrona denominada "rst", ou seja, reset.

Segue a seguinte sequência: 0, 1, 3 e 2 em decimal. Vejamos na Figura 44 um possível


exemplo do esquemático de nossa máquina, código VHDL e seu complemento nas Figuras 45 e
46.

Figura 44: Máquina de 4 estados.

Observando a Figura 44, vemos que o estado futuro depende do nosso estado atual,
então temos um padrão Moore. O clock é responsável por atualizar a saída e nosso "rst" será
responsável pela nossa condição inicial, após a inicialização dele, a sequência começa.

Nosso código ficará da seguinte maneira:

Figura 45: Código VHDL máquina de 4 estados.

Se sintetizarmos veremos que ele nos dá um Flip-Flop do tipo D, que é condicionado ao


reset e também ao clock.

29
Tutorial VHDL

Figura 46: Esquemático da máquina de 4 estados.

Máquina de estados finitos

Ela apresenta na saída uma sequência estabelecida de estados e usaremos um controle


para inverter a sequência de estados. Com o controle podemos selecionar o sentido dos estados
da máquina (Figura 47).

Figura 47: Máquina de estados com controle.

Podemos observar que se o controle for igual a 0, temos a contagem no sentido anti-
horário e se o controle for igual à 1 a contagem irá acontecer no sentido horário. Podemos ver o
diagrama em blocos da nossa máquina de estados na Figura 48.

30
Tutorial VHDL

Figura 48: Diagrama em blocos da máquina de estados.

Observe que a entrada de controle vai controlar o sentido de acionamento da saída, que
será uma saída de 2 bits. A Figura 49 mostra um exemplo da linguagem VHDL dessa situação.

31
Tutorial VHDL

Figura 49: Código VHDL máquina de 4 estados finitos.

Contadores

Um contador pode ser descrito como uma máquina de estados, cujo estado de saída é o
valor da contagem. Vamos mostrar como exemplo uma contagem de 0 à 9 (Figura 50).

32
Tutorial VHDL

Figura 50: Exemplo de contador em VHDL.

Devemos fazer algumas observações no código, estas são:

● load é a entrada que quando habilitada, ela carrega os dados para a saída, ou seja, pois
pode-se modificar o valor para determinar em qual valor irá iniciar a contagem
● data é nossa entrada de dados, foi usado o integer invés de std_logic_vector, isso quer
dizer que é um valor inteiro que conta até 16 unidades, ou seja, 4 bits.
● Lembre-se que para atribuição de variável usamos " := ".
● Se load está setado, ele carrega o" q_var := data".
● Se load = 0, ai vamos testar a contagem.
● Perceba que apesar de atribuirmos valores de 0 à 15, a nossa contagem realizada é
apenas de 9 dígitos, conta de 0 à 8.

Contador regressivo com display de 7 segmentos


Neste exemplo podemos como é um contador regressivo com display de 7 segmentos,
observe na Figura 51.

33
Tutorial VHDL

Figura 51: Exemplo de contador regressivo com display 7 segmentos.

Note que:

Iniciamos nossa variável em 9.

A cada atualização do clock ele vai decrementando de 1 em 1.

Lembrando que o código está na configuração CATODO COMUM, diferente do que


usamos na FPGA Basys 3 que é ANODO COMUM.

Quando counter chega a 0, ele para de decrementar.

34
Tutorial VHDL

Bibliografia

▪ D'AMORE, R. Descrição e Síntese de Circuitos Digitais. Editora LTC.


▪ NICOLAU, M. J. Código BCD. , 1999. Disponível em:
<http://marco.uminho.pt/~joao/Computacao2/node15.html>. Acesso em: 05 maio 2017.
▪ CARLOS, Antônio. Introdução à computação: Codificação Inclusive BCD e ASCII. ,
2009. Disponível em:
<http://www.ifba.edu.br/professores/antoniocarlos/index_arquivos/>. Acesso em: 20
maio 2017.
▪ IDOETA, I. V., CAPUANO, F. G. Elementos de Eletrônica Digital. 40. Ed. São
Paulo: Editora Érica, 2007.
▪ THOMAS L. F. Sistemas digitais: fundamentos e aplicações; tradução José Lucimar do
Nascimento. – Dados eletrônicos. – 9. ed. – Porto Alegre : Bookman, 2008.
▪ IRIS SERVER, Departamento de Engenharia Elétrica, USP. Disponível em:
<http://iris.sel.eesc.usp.br/sel414m/Aula%2010%20-
%20Circuitos%20Aritmeticos.pdfs>. Acesso em 05 de Maio de 2017.
▪ Instituto de Informática, UFRGS. Disponível em:
<http://www.inf.ufrgs.br/~cgdaudt/inf01118/AP07.pdf>. Acesso em 16 de Abril de
2017.
▪ RONALD J. T. , NEAL S. W. , and GREGORY L. M. Sistemas Digitais - Princípios
e Aplicações. Prentice-Hall, 10° edition, 2007.
▪ ADEL S. S. and KENNETH G. S. Microeletrônica. Pearson Prentice Hall, 5° edition,
2007.
▪ Curso de FPGAs (VHDL) <https://www.youtube.com/watch?v=F0-
CgRe6hAc&list=PLZ8dBTV2_5HS79fVexGTtCMDUp7kjnumS>. Acesso em 12 de Abril
de 2017.

35

You might also like