1
VHDL – VHSIC HARDWARE DESCRIPTION LANGUAGE
Tutorial 01 - VHDL
Prof. Perci Ayres Antiqueira
Instituto Federal do Paraná - IFPR
2
TUTORIAL 01 – Conceitos básicos de VHDL
A linguagem VHDL foi criada para descrever circuitos complexos, na década de 1980. A sigla VHDL significa “VHSIC Hardware Description Language”, onde VHSIC significa “VERY HIGH SPEED INTEGRATED CIRCUITS”, ou seja, é uma linguagem de descrição de circuitos integrados de muito alta velocidade.
Fluxo de Projeto
O fluxo de projeto passa pelas etapas de Especificação, Codificação em VHDL, Analise e Síntese, Alocação física e Roteamento, Geração do código de programação e Gravação do dispositivo lógico programável (CPLD ou FPGA).
Durante as etapas de desenvolvimento são possíveis vários tipos de simulação para verificar o funcionamento correto do circuito antes da gravação do dispositivo.
Ferramentas Utilizadas
Para desenvolvimento com VHDL são utilizadas ferramentas EDA (Eletrônic Design Automation) que permitem a síntese e a simulação do circuito, além de interface de gravação.
Alguns exemplos de ferramentas EDA utilizadas são: Quartus II da Altera
ISE da Xilinx
3 Exemplo de código em VHDL – Porta XOR
Vemos abaixo um exemplo de código em VHDL, correspondente a um circuito de porta XOR (OU exclusivo). A linguagem VHDL não é “case sensitive”, ou seja, não diferencia letras maiúsculas e minúsculas.
Após a inclusão de algumas bibliotecas, aparece a entidade, que descreve os terminais de entrada e saída do circuito. Em seguida aparece a arquitetura, que descreve a lógica de funcionamento do circuito.
Após a compilação do código VHDL, são gerados vários arquivos que permitem a simulação funcional ou temporal do circuito.
Simulação funcional do circuito
Observa-se na simulação funcional do circuito, que a saída S é assume nível lógico alto quando exclusivamente uma das entradas A ou B estiver em nível lógico alto.
Na simulação funcional não são considerados os atrasos de propagação do sinal no circuito.
4 Representação de números e caracteres em VHDL Inteiros
Os números inteiros são normalmente representados na base 10 (decimais).
Binários
Os números binários são representados entre aspas simples para um único bit e entre aspas duplas para múltiplos bits.
‘1’ “0010”
Números sem sinal
Neste caso não existe representação para números negativos. Números com sinal
Neste caso os números são representados em complemento de dois, sendo que um número negativo tem o bit mais significativo com valor ‘1’ e um número positivo tem o bit mais significativo com valor ‘0’.
0111 = 7
1001 = -7 (Representação em complemento de dois) Caracteres
De forma similar à representação de números binários, os caracteres simbolizando seus códigos ASCII, são representados entre aspas simples para um único caractere e entre aspas duplas para uma sequência de caracteres.
‘A’ “mp3”
5 Estrutura do código VHDL
O código em VHDL contém três partes básicas Declaração de bibliotecas
Entidade
Arquitetura Declaração de bibliotecas
Esta parte contém uma lista das bibliotecas e respectivos pacotes utilizados, sendo as bibliotecas mais comuns ieee, std e work, sendo as duas últimas visíveis mesmo quando não são declaradas.
As bibliotecas contém uma coleção de pedaços de código comumente utilizados, permitindo sua utilização em vários projetos. Normalmente, uma biblioteca é composta por vários pacotes “package” contendo definições de tipos de dados, funções e procedimentos.
Um circuito desenvolvido anteriormente pode ser colocado em uma biblioteca, para ser utilizado (instanciado) em outros projetos, utilizando-se a palavra chave “COMPONENT”.
Para se declarar uma biblioteca utiliza-se a seguinte sintaxe: LIBRARY nome_da_biblioteca;
USE nome_da_biblioteca.nome_do_pacote.all;
6 Entidade
A entidade “ENTITY” define o nome e os terminas de entrada e saído do circuito. Para escrever a entidade utiliza-se a seguinte sintaxe:
ENTITY nome_da_entidade IS PORT(
nome_da_porta: modo tipo_de_sinal; nome_da_porta: modo tipo_de_sinal ...);
END nome_da _entidade
O nome da entidade e das portas pode ser qualquer palavra, exceto algumas poucas palavras reservadas, como por exemplo, VHDL.
Os modos das portas podem ser IN, OUT, INOUT ou BUFFER. Os modos IN e OUT são unidirecionais, o modo INOUT é bidirecional e o modo BUFFER é utilizado como saída, mas cujo valor pode ser lido internamente.
Os tipos de sinal podem ser BIT, INTEGER, STD_LOGIC e assim por diante.
Na figura abaixo vemos um exemplo de entidade para um circuito contador de 4 bits, onde foram criadas duas entradas (clk e reset) e quatro saídas (Q0, Q1, Q2 e Q3). Tanto as entradas como as saídas são do tipo STD_LOGIC.
Como veremos posteriormente, o tipo STD_LOGIC é semelhante ao tipo BIT, que admite os valores ‘0’ e ‘1’, mas permite também outros valores como alta impedância ‘Z’ e irrelevante ‘-’.
7 Arquitetura
A arquitetura contém uma descrição de como o circuito deve funcionar, sendo que a partir dela , o circuito é inferido. Uma sintaxe simplificada da arquitetura é mostrada abaixo.
ARCHITECTURE nome_da_arquitetura OF nome_da_entidade IS [declarações de sinais e variáveis]
BEGIN
Definição da arquitetura END
O nome da arquitetura pode ser qualquer palavra, exceto algumas poucas palavras reservadas, como por exemplo, VHDL.
A parte de declarações de sinais e variáveis é opcional.
Na parte de definição da arquitetura é descrito o código para a criação do circuito, que pode ser expresso de forma comportamental ou estrutural.
Na figura abaixo vemos um exemplo de arquitetura para o contador de 4 bits.
8
O nome da entidade deve corresponder ao nome da entidade criada anteriormente. Neste caso, “contador_vhdl”.
Em seguida foi declarado um sinal chamado “cont” do tipo UNSIGNED com 4 bits (3 downto 0) , no qual será realizada a contagem de 0 (“0000”) até 9 (“1001”).
O tipo UNSIGNED é um inteiro positivo.
Na parte de descrição de funcionamento do circuito foi criado um “process”, o qual é utilizado para criação de circuitos digitais sequenciais, os quais utilizam flip-flops. Nos circuitos sequenciais os sinais de saída dependem dos sinais atuais de entrada e também do estado anterior de alguns sinais de saída, daí a necessidade de flip-flops para armazenar o estado anterior. Já nos circuitos combinacionais, os sinais de saída dependem apenas dos sinais atuais de entrada.
Cada processo possui entre parênteses, uma lista de sensibilidade onde aparecem os sinais que serão as entrada do circuito sequencial. Neste caso, (clk, reset).
O processo também possui um começo (begin) e um fim (end process).
Dentro do processo, verifica-se se o sinal “reset” tem nível baixo (‘0’) e em caso afirmativo, o contador é zerado (if reset = ‘0’ then cont <= “0000”).
Caso contrário verifica-se se ocorreu uma borda de descida do sinal de clock (elsif clk’event and clk = ‘0’) e, em caso afirmativo, podem ocorrer duas situações. Se contador já estiver no último valor de contagem (9), ele deve ser zerado (if cont = “1001” then cont <= “0000”). Caso contrário, o contador deve ser incrementado (else cont <= cont+1)
Desta forma, sempre que ocorrer uma borda de descida do sinal de “clock”, o contador será incrementado e quando já estiver no último valor de contagem, será zerado para começar uma nova contagem.
Após descrição do processo, cada bit do sinal cont é atribuído a um sinal de saída Q0 <= cont(0); Q1 <= cont(1); Q2 <= cont(2); Q3 <= cont(3);
É importante ressaltar, que a atribuição destes bits ocorre de forma combinacional, ou seja, representa simplesmente uma ligação elétrica entre os bits do sinal “cont” e as saídas. Assim, praticamente no mesmo instante em que o sinal “cont” muda, as saídas também mudam.
9
O código completo do contador em VHDL é mostrado abaixo.