Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial VHDL
1
Tutorial VHDL
Objetivo
Familiarizar-se com a linguagem VHDL utilizada no laboratório de Prática de
Eletrônica Digital 1 (PED1).
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.
2
Tutorial VHDL
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).
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.
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).
*Como já visto em sala de aula, podemos substituir o "in bit", por "STD_Logic".
4
Tutorial VHDL
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.
5
Tutorial VHDL
Exemplo: De acordo com a tabela verdade crie o projeto em VHDL utilizando o SIGNAL.
6
Tutorial VHDL
7
Tutorial VHDL
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
8
Tutorial VHDL
retorna o valor verdadeiro define o valor que é transferido para o sinal de destino.
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
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"
● 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.
11
Tutorial VHDL
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).
12
Tutorial VHDL
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.
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.
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).
15
Tutorial VHDL
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
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).
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
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.
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
Solicitação de componente
19
Tutorial VHDL
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).
20
Tutorial VHDL
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.
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).
No nosso novo projeto declaramos a arquitetura do nosso somador de 1 bit completo (Ver
Figura 33).
22
Tutorial VHDL
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.
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.
23
Tutorial VHDL
Flip-Flop tipo JK
24
Tutorial 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
Flip-Flop tipo D
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.
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).
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
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.
29
Tutorial VHDL
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
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
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
● 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.
33
Tutorial VHDL
Note que:
34
Tutorial VHDL
Bibliografia
35