Escolar Documentos
Profissional Documentos
Cultura Documentos
VHDL é nomeado após o programa do Departamento de Defesa dos Estados Unidos que o
criou, o Programa de Circuitos Integrados de Alta Velocidade (VHSIC). No início da década
de 1980, o Programa VHSIC buscou um novo HDL para uso no projeto dos circuitos
integrados que pretendia desenvolver. O produto desse esforço foi o VHDL Versão 7.2,
lançado em 1985. O esforço para padronizá-lo como padrão IEEE começou no ano seguinte.
História
A ideia de poder simular os ASICs a partir das informações desta documentação era tão
obviamente atraente que foram desenvolvidos simuladores lógicos que podiam ler os
arquivos VHDL. O próximo passo foi o desenvolvimento de ferramentas de síntese lógica
que lêem o VHDL e produzem uma definição da implementação física do circuito.
Devido ao Departamento de Defesa exigir o máximo possível da sintaxe para ser baseada em
Ada, a fim de evitar a reinvenção de conceitos que já haviam sido exaustivamente testados no
desenvolvimento de Ada, o VHDL empresta muito do Ada linguagem de programação em
conceito e sintaxe.
A versão inicial do VHDL, projetada para o padrão IEEE IEEE 1076-1987,[3] incluía uma
ampla gama de tipos de dados, incluindo numérico (inteiro e real), lógico (bit e booleano),
caractere e tempo, além de arrays de bits chamados bit_vector e de caractere chamado string.
Um problema não resolvido por esta edição, no entanto, foi a "lógica multivalorada", onde a
força de acionamento de um sinal (nenhuma, fraca ou forte) e valores desconhecidos também
são considerados. Isso exigia o padrão IEEE 1164, que definia os tipos lógicos de 9 valores:
escalar std_logic e sua versão vetorial std_logic_vector. Sendo um subtipo resolvido de seu
tipo pai std_Ulogic, os sinais tipados por std_logic permitem várias acionamentos para
modelar estruturas de barramento, por meio do qual a função de resolução conectada trata
adequadamente as atribuições conflitantes.
O IEEE 1076 atualizado, em 1993, tornou a sintaxe mais consistente, permitiu mais
flexibilidade na nomeação, estendeu o tipo de caractere para permitir caracteres imprimíveis
ISO-8859-1, adicionou o operador xnor, etc.[especificar]
Além do padrão IEEE 1164, vários padrões filhos foram introduzidos para estender a
funcionalidade da linguagem. O padrão IEEE 1076.2 adicionou melhor manuseio de tipos de
dados reais e complexos. O padrão IEEE 1076.3 introduziu tipos assinados e não assinados
para facilitar operações aritméticas em vetores. O padrão IEEE 1076.1 (conhecido como
VHDL-AMS) forneceu extensões de projeto de circuito analógico e de sinal misto.
Alguns outros padrões suportam o uso mais amplo de VHDL, notadamente VITAL
(Iniciativa VHDL para Bibliotecas ASIC) e extensões de projeto de circuito de micro-ondas.
Em junho de 2006, o Comitê Técnico VHDL da Accellera (delegado pelo IEEE para
trabalhar na próxima atualização do padrão) aprovou o chamado Draft 3.0 do VHDL-2006.
Ao mesmo tempo em que mantém total compatibilidade com versões mais antigas, esse
padrão proposto fornece várias extensões que facilitam a escrita e o gerenciamento de código
VHDL. As principais mudanças incluem a incorporação de padrões filho (1164, 1076.2,
1076.3) no padrão 1076 principal, um conjunto estendido de operadores, sintaxe mais flexível
de case e declarações de geração, incorporação de VHPI (VHDL Procedural Interface)
(interface para linguagens C/C++ ) e um subconjunto de PSL (Property Specification
Language). Essas alterações devem melhorar a qualidade do código VHDL sintetizável,
tornar os testbenches mais flexíveis e permitir um uso mais amplo de VHDL para descrições
em nível de sistema.
Estandardização
O padrão IEEE 1076 define a linguagem de descrição de hardware VHSIC, ou VHDL. Foi
originalmente desenvolvido sob o contrato F33615-83-C-1003 da Força Aérea dos Estados
Unidos concedido em 1983 a uma equipe da Intermetrics, Inc. como especialistas em idiomas
e contratante principal, Texas Instruments como especialistas em design de chips e IBM
como design de sistemas de computador especialistas. A linguagem passou por inúmeras
revisões e tem uma variedade de subpadrões associados a ela que a aumentam ou estendem
de maneiras importantes.
Revisões
IEEE 1076-1987 Primeira revisão padronizada da versão 7.2 da linguagem da Força Aérea
dos Estados Unidos.
IEEE 1076-1993 (também publicado com ISBN 1-55937-376-8). Melhorias significativas
resultantes de vários anos de feedback. Provavelmente a versão mais usada com o maior
suporte de ferramentas do fornecedor.
IEEE 1076-2000. Revisão menor. Introduz o uso de tipos protegidos.
IEEE 1076-2002. Revisão menor de 1076-2000. As regras em relação às portas de buffer são
relaxadas.
IEC 61691-1-1:2004. Adoção IEC do IEEE 1076-2002.
IEEE 1076c-2007. Introduziu o VHPI, a interface de procedimento VHDL, que fornece ao
software os meios para acessar o modelo VHDL. A linguagem VHDL exigiu pequenas
modificações para acomodar o VHPI.
IEEE 1076-2008 (anteriormente referido como 1076-200x). Grande revisão lançada em
26/01/2009. Entre outras mudanças, este padrão incorpora um subconjunto básico de PSL,
permite genéricos em pacotes e subprogramas e introduz o uso de nomes externos.
IEC 61691-1-1:2011. Adoção IEC do IEEE 1076-2008.
IEEE 1076-2019. Revisão principal.
Padrões relacionados
Projeto
VHDL é geralmente usado para escrever modelos de texto que descrevem um circuito lógico.
Tal modelo é processado por um programa de síntese, somente se fizer parte do projeto
lógico. Um programa de simulação é usado para testar o projeto lógico usando modelos de
simulação para representar os circuitos lógicos que fazem interface com o projeto. Essa
coleção de modelos de simulação é comumente chamada de testbench.
O VHDL tem construções para lidar com o paralelismo inerente aos projetos de hardware,
mas essas construções (processos) diferem em sintaxe das construções paralelas em Ada
(tarefas). Como Ada, o VHDL é fortemente tipado e não diferencia maiúsculas de
minúsculas. Para representar diretamente as operações que são comuns em hardware, existem
muitos recursos do VHDL que não são encontrados no Ada, como um conjunto estendido de
operadores booleanos, incluindo nand e nor.
O VHDL possui recursos de entrada e saída de arquivos e pode ser usado como uma
linguagem de uso geral para processamento de texto, mas os arquivos são mais comumente
usados por um banco de teste de simulação para dados de estímulo ou verificação. Existem
alguns compiladores VHDL que constroem binários executáveis. Nesse caso, pode ser
possível usar VHDL para escrever um testbench para verificar a funcionalidade do projeto
usando arquivos no computador host para definir estímulos, interagir com o usuário e
comparar resultados com os esperados. No entanto, a maioria dos designers deixa esse
trabalho para o simulador.
É relativamente fácil para um desenvolvedor inexperiente produzir código que simule com
sucesso, mas que não possa ser sintetizado em um dispositivo real ou seja grande demais para
ser prático. Uma armadilha em particular é a produção acidental de travas transparentes em
vez de flip-flops do tipo D como elementos de armazenamento.
Pode-se projetar hardware em um VHDL IDE (para implementação de FPGA, como Xilinx
ISE, Altera Quartus, Synopsys Synplify ou Mentor Graphics HDL Designer) para produzir o
esquema RTL do circuito desejado. Depois disso, o esquema gerado pode ser verificado
usando um software de simulação que mostra as formas de onda das entradas e saídas do
circuito após a geração do banco de testes apropriado. Para gerar um testbench apropriado
para um determinado circuito ou código VHDL, as entradas devem ser definidas
corretamente. Por exemplo, para entrada de clock, é necessário um processo de loop ou uma
instrução iterativa.
Um ponto final é que quando um modelo VHDL é traduzido em "portas e fios" que são
mapeados em um dispositivo lógico programável como um CPLD ou FPGA, então é o
hardware real que está sendo configurado, em vez do código VHDL sendo "executado "
como se estivesse em algum tipo de chip de processador.
Vantagens
A principal vantagem do VHDL, quando usado para projeto de sistemas, é que ele permite
que o comportamento do sistema necessário seja descrito (modelado) e verificado (simulado)
antes que as ferramentas de síntese traduzam o projeto em hardware real (portas e fios).
Outro benefício é que o VHDL permite a descrição de um sistema concorrente. VHDL é uma
linguagem de fluxo de dados na qual cada instrução é considerada para execução simultânea,
ao contrário das linguagens de computação procedural, como BASIC, C e código assembly,
onde uma sequência de instruções é executada sequencialmente uma instrução por vez.
Um projeto VHDL é multiuso. Sendo criado uma vez, um bloco de cálculo pode ser usado
em muitos outros projetos. No entanto, muitos parâmetros formais e funcionais do bloco
podem ser ajustados (parâmetros de capacidade, tamanho da memória, base do elemento,
composição do bloco e estrutura de interconexão).
Um projeto VHDL é portátil. Sendo criado para uma base de elementos, um projeto de
dispositivo de computação pode ser portado em outra base de elementos, por exemplo, VLSI
com várias tecnologias.
Uma grande vantagem do VHDL em relação ao Verilog original é que o VHDL possui um
sistema de tipo completo. Os designers podem usar o sistema de tipos para escrever um
código muito mais estruturado (especialmente declarando tipos de registro).
Exemplo de design
Em VHDL, um projeto consiste no mínimo de uma entidade que descreve a interface e uma
arquitetura que contém a implementação real. Além disso, a maioria dos designs importa
módulos de biblioteca. Alguns designs também contêm várias arquiteturas e configurações.
Nos exemplos a seguir, você verá que o código VHDL pode ser escrito de uma forma muito
compacta. No entanto, designers mais experientes geralmente evitam essas formas compactas
e usam um estilo de codificação mais detalhado para facilitar a leitura e a manutenção.
Nem todas as construções em VHDL são adequadas para síntese. Por exemplo, a maioria das
construções que lidam explicitamente com temporização, como esperar 10 ns; não são
sintetizáveis apesar de serem válidos para simulação. Embora diferentes ferramentas de
síntese tenham recursos diferentes, existe um subconjunto sintetizado comum de VHDL que
define quais construções de linguagem e expressões idiomáticas são mapeadas em hardware
comum para muitas ferramentas de síntese. O IEEE 1076.6 define um subconjunto da
linguagem que é considerado o subconjunto de síntese oficial. Geralmente, é considerado
uma "melhor prática" escrever código muito idiomático para síntese, pois os resultados
podem ser incorretos ou abaixo do ideal para construções não padrão.
Modelo MUX
Modelo de trava
Uma trava transparente é basicamente um bit de memória que é atualizado quando um sinal
de habilitação é gerado. Novamente, existem muitas outras maneiras de expressar isso em
VHDL.
-- modelo de trava 1:
Q <= D quando habilitado = '1' senão Q;
-- modelo de trava 2:
Processo (todos)
começar
Q <= D quando (Ativar);
fim do processo;
flip-flops tipo D
O flip-flop tipo D amostra um sinal de entrada na borda ascendente (ou descendente) de um
clock. Este exemplo tem um reset assíncrono ativo-alto e amostras na borda ascendente do
clock.
Outra maneira comum de escrever o comportamento acionado por borda em VHDL é com o
atributo de sinal 'evento'. Um único apóstrofo deve ser escrito entre o nome do sinal e o nome
do atributo.
DFF : processo (RST, CLK) é
começar
se RST então
Q <= '0';
elsif CLK'event e CLK = '1' então
Q <= D;
fim se;
finalizar processo DFF;
VHDL também se presta a "one-liners", como
DFF : Q <= '0' quando RST = '1' else D quando Ring_edge(clk);
ou
DFF : processo (todos) é
começar
se crescente_edge(CLK) então
Q <= D;
Q2 <= Q1;
fim se;
se RST então
Q <= '0';
fim se;
finalizar processo DFF;
O que pode ser útil se nem todos os sinais (registros) acionados por esse processo devem ser
redefinidos.
Exemplo: um contador
O exemplo a seguir é um contador ascendente com reset assíncrono, carga paralela e largura
configurável. Ele demonstra o uso do tipo 'unsigned', conversões de tipo entre 'unsigned' e
'std_logic_vector' e genéricos VHDL. Os genéricos estão muito próximos de argumentos ou
templates em outras linguagens de programação tradicionais como C++.
biblioteca IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all; -- para o tipo não assinado
entidade COUNTER é
genérico (
LARGURA : em natural := 32);
porta (
RST : em std_logic;
CLK : em std_logic;
LOAD : em std_logic;
DATA : em std_logic_vector(WIDTH-1 até 0);
Q : out std_logic_vector(WIDTH-1 até 0));
entidade final CONTADOR;
começar
processo (todos) é
começar
se RST então
Q <= (outros => '0');
elsif crescente_edge(CLK) então
se LOAD então
Q <= DADOS;
senão
Q <= std_logic_vector(unsigned(Q) + 1); --Adição não assinada, convertida de volta
para std_logic_vector
fim se;
fim se;
fim do processo;
Um grande subconjunto de VHDL não pode ser convertido em hardware. Este subconjunto é
conhecido como o subconjunto não-sintetizável ou apenas de simulação do VHDL e só pode
ser usado para prototipagem, simulação e depuração. Por exemplo, o código a seguir irá gerar
um clock com uma frequência de 50 MHz. Ele pode, por exemplo, ser usado para acionar
uma entrada de clock em um projeto durante a simulação. É, no entanto, uma construção
apenas de simulação e não pode ser implementada em hardware. No hardware real, o relógio
é gerado externamente; ele pode ser reduzido internamente pela lógica do usuário ou
hardware dedicado.
processo
começar
CLK <= '1'; aguarde 10 NS;
CLK <= '0'; aguarde 10 NS;
fim do processo;
As construções apenas de simulação podem ser usadas para construir formas de onda
complexas em um tempo muito curto. Tal forma de onda pode ser usada, por exemplo, como
vetores de teste para um projeto complexo ou como protótipo de alguma lógica de
sintetizador que será implementada futuramente.
processo
começar
espere até START = '1'; -- espere até que START esteja alto
Bibliotecas padrão
Também referido como pacotes padrão.
Pacote Padrão IEEE
O Pacote Padrão IEEE inclui o seguinte:
numeric_std
std_logic_1164
std_logic_arith
std_logic_unsigned
std_logic_signed
std_logic_misc
Simuladores VHDL
Comercial:
Aldec Active-HDL
Cadência Incisiva
Sinopse VCS-MX
Outro:
EDA Playground - IDE VHDL baseado em navegador gratuito (usa Synopsys VCS, Cadence
Incisive, Aldec Riviera-PRO e GHDL para simulação VHDL)
GHDL é um compilador VHDL de código aberto que pode executar programas VHDL.
GHDL no GitHub
Circuitos Sequências
Um circuito sequencial é aquele em que as saídas dependem das entradas actuais, mas
também da sequência de valores por que passaram as entradas. Exemplo: comando para
escolher o canal da TV com um botão para ir para o canal próximo/anterior (botão “+/-”).
Não é possível descrever o comportamento dum circuito sequencial simplesmente com uma
tabela que relacione as entradas com as saídas.
Para saber para onde vai evoluir um circuito sequencial, é preciso conhecer em que situação
ele se encontra actualmente.
No exemplo do comando para escolher o canal da TV, o número do canal actual é o estado
actual.
Conhecido o estado actual, pode sempre prever-se o próximo estado em função das entradas
actuais.
Num circuito digital, as variáveis de estado são valores binários e correspondem a sinais
internos desse circuito.
O período do relógio (T) coincide com o intervalo entre transições sucessivas (do relógio) na
mesma direcção.
Circuitos sequenciais simples: usam portas lógicas elementares (ANDs, ORs,…) e ciclos (ou
caminhos) com feedback para criar elementos de memória (latches e flip-flops).
-Elementos bi-estáveis
Quando Qestá no nível ALTO, o inversor inferior tem a saída no nível BAIXO, forçando
deste modo o inversor superior a colocar a sua saída no nível ALTO (como se assumiu
inicialmente).
Quando Qestá no nível BAIXO, o inversor inferior tem a saída no nível ALTO, forçando
deste modo o inversor superior a colocar a sua saída no nível BAIXO (como se assumiu
inicialmente).
Pode usar-se uma única variável de estado (sinal Q) para definir o estado do circuito. Logo,
há 2 estados possíveis: Q=0 e Q=1.
O elemento bi-estável é tão simples que não possui entradas, o que impede que o seu estado
seja controlado.
Quando o circuito é alimentado, ele assume um estado aleatório e permanece nele
indefinidamente.
funçãode
Efectuando uma análise do bi-estável
transferência
do
segundo uma perspectiva analógica
inversorsuperior
percebe-se melhor o seu funcionamento.
Um flip-flop é um dispositivo sequencial que amostra as suas entradas e que altera as suas
saídas apenas em instantes determinados por um sinal de relógio.
Uma latché um dispositivo sequencial que observa todas as suas entradas continuamente e
altera as suas saídas em qualquer momento, independentemente de qualquer sinal de relógio.
Uma latch S-R (ou /S-/R) reage ao valor das entradas em qualquer momento.
Contudo, pode ser alterada para reagir ao valor das entradas apenas quando uma entrada de
enable (C) estiver activa.
latch /S-/R
Esta latchelimina a situação problemática da latchS-R, que ocorre quando S e R são activadas
(a 1) em simultâneo.
Quando C=1, a latch está aberta / transparente e a saída Q acompanha a entrada D. Quando
C=0, a latch está fechada e a saída Q mantém o último valor.