VHDL - VHDL

VHDL
Paradigma concorrente , reativo , fluxo de dados
Apareceu pela primeira vez Década de 1980
Versão estável
IEEE 1076-2019 / 23 de dezembro de 2019 ; 20 meses atrás ( 23/12/2019 )
Disciplina de digitação Forte
Extensões de nome de arquivo .vhd
Local na rede Internet IEEE VASG
Dialetos
VHDL-AMS
Influenciado por
Ada , Pascal
Fonte VHDL para um adicionador assinado

A linguagem de descrição de hardware VHSIC ( VHDL ) é uma linguagem de descrição de hardware (HDL) que pode modelar o comportamento e a estrutura de sistemas digitais em vários níveis de abstração , desde o nível do sistema até o de portas lógicas , para entrada de projeto, documentação, e para fins de verificação. Desde 1987, o VHDL foi padronizado pelo Instituto de Engenheiros Elétricos e Eletrônicos (IEEE) como IEEE Std 1076 ; a versão mais recente (em abril de 2020) é IEEE Std 1076-2019 . Para modelar sistemas analógicos e de sinais mistos , um HDL padronizado IEEE baseado em VHDL chamado VHDL-AMS (oficialmente IEEE 1076.1) foi desenvolvido.

O VHDL deve o seu nome ao programa do Departamento de Defesa dos Estados Unidos que o criou, o Very High-Speed ​​Integrated Circuits Program (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 um padrão IEEE começou no ano seguinte.

História

Em 1983, o VHDL foi originalmente desenvolvido a pedido do Departamento de Defesa dos Estados Unidos para documentar o comportamento dos ASICs que as empresas fornecedoras estavam incluindo nos equipamentos. O padrão MIL-STD-454N no Requisito 64 na seção 4.5.1 "Documentação ASIC em VHDL" exige explicitamente a documentação de "Dispositivos Microeletrônicos" em VHDL.

A ideia de 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. A próxima etapa 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 baseado em Ada, a fim de evitar a reinvenção de conceitos que já foram exaustivamente testados no desenvolvimento de Ada, o VHDL empresta muito da linguagem de programação Ada em ambos conceito e sintaxe .

A versão inicial do VHDL, projetado para IEEE padrão IEEE 1076-1987, incluiu uma ampla gama de tipos de dados, incluindo numérico ( inteiro e reais ), lógico ( bit e boolean ), caráter e tempo , além de matrizes de bitchamada bit_vectore de characterchamada de corda .

Um problema não resolvido por esta edição, no entanto, foi a "lógica multivalorada", onde a força do drive do sinal (nenhum, fraco 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_logice sua versão vetorial std_logic_vector. Sendo um subtipo resolvido de seu std_Ulogictipo-pai, os std_logicsinais do tipo -tipo permitem o acionamento múltiplo para modelar estruturas de barramento, por meio do qual a função de resolução conectada lida com atribuições conflitantes de forma adequada.

O IEEE 1076 atualizado , em 1993, tornou a sintaxe mais consistente, permitiu mais flexibilidade na nomenclatura, estendeu o charactertipo para permitir caracteres ISO-8859-1 imprimíveis, adicionou o xnoroperador, etc.

Pequenas mudanças no padrão (2000 e 2002) adicionaram a ideia de tipos protegidos (semelhante ao conceito de classe em C ++ ) e removeram algumas restrições das regras de mapeamento de portas.

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 tratamento de tipos de dados reais e complexos. O padrão IEEE 1076.3 introduziu tipos com e sem sinal para facilitar as operações aritméticas em vetores. O padrão IEEE 1076.1 (conhecido como VHDL-AMS ) fornecia extensões de design de circuito de sinal analógico e misto.

Alguns outros padrões suportam um uso mais amplo de VHDL, notavelmente VITAL (VHDL Initiative Towards ASIC Libraries) e extensões de design 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 Projeto 3.0 do VHDL-2006. Enquanto mantém compatibilidade total com versões mais antigas, este padrão proposto fornece várias extensões que tornam a escrita e o gerenciamento de código VHDL mais fácil. As principais mudanças incluem a incorporação de padrões filhos (1164, 1076.2, 1076.3) no padrão 1076 principal, um conjunto estendido de operadores, sintaxe mais flexível de caso e instruções geradas , 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.

Em fevereiro de 2008, a Accellera aprovou o VHDL 4.0, também conhecido informalmente como VHDL 2008, que abordou mais de 90 problemas descobertos durante o período de teste para a versão 3.0 e inclui tipos genéricos aprimorados. Em 2008, a Accellera lançou o VHDL 4.0 para o IEEE para votação para inclusão no IEEE 1076-2008. O padrão VHDL IEEE 1076-2008 foi publicado em janeiro de 2009.

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 especialista em idiomas e contratante principal, Texas Instruments como especialista em design de chip e IBM como design de sistema de computador especialistas. A linguagem passou por várias revisões e tem uma variedade de subpadrões associados a ela que a aumentam ou estendem de maneiras importantes.

1076 foi e continua sendo um marco no projeto de sistemas eletrônicos.

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 secundária. Apresenta o uso de tipos protegidos .
  • IEEE 1076-2002. Revisão secundária de 1076-2000. As regras com 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 procedural 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). Revisão principal 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

  • IEEE 1076.1 VHDL analógico e sinal misto ( VHDL-AMS )
  • Pacotes padrão IEEE 1076.1.1 VHDL-AMS (stdpkgs)
  • Pacote de matemática IEEE 1076.2 VHDL
  • Pacote de síntese IEEE 1076.3 VHDL (vhdlsynth) (padrão numérico )
  • Pacote de Síntese IEEE 1076.3 VHDL - Ponto Flutuante (fphdl)
  • IEEE 1076.4 Timing (VHDL Initiative Towards ASIC Libraries: vital)
  • IEEE 1076.6 VHDL Synthesis Interoperability (retirado em 2010)
  • Pacotes IEEE 1164 VHDL Multivalue Logic (std_logic_1164)

Projeto

VHDL é geralmente usado para escrever modelos de texto que descrevem um circuito lógico. Esse modelo é processado por um programa de síntese, apenas 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. Esta coleção de modelos de simulação é comumente chamada de testbench .

Um simulador VHDL é normalmente um simulador orientado a eventos . Isso significa que cada transação é adicionada a uma fila de eventos por um horário programado específico. Por exemplo, se uma atribuição de sinal ocorrer após 1 nanossegundo, o evento é adicionado à fila por tempo + 1ns. Atraso zero também é permitido, mas ainda precisa ser programado: para esses casos, o atraso delta é usado, o que representa um intervalo de tempo infinitamente pequeno. A simulação muda entre dois modos: execução de instrução, onde as instruções disparadas são avaliadas, e processamento de evento, onde os eventos na fila são processados.

VHDL tem construções para lidar com o paralelismo inerente em designs de hardware, mas essas construções ( processos ) diferem na sintaxe das construções paralelas em Ada ( tarefas ). Como Ada, VHDL é fortemente tipado e não faz distinção entre maiúsculas e minúsculas . Para representar diretamente as operações que são comuns no hardware, existem muitos recursos do VHDL que não são encontrados em Ada, como um conjunto estendido de operadores booleanos incluindo nand e nor .

VHDL tem recursos de entrada e saída de arquivo e pode ser usado como uma linguagem de propósito geral para processamento de texto, mas os arquivos são mais comumente usados ​​por um testbench de simulação para estímulos ou dados de verificação. Existem alguns compiladores VHDL que criam binários executáveis. Nesse caso, pode ser possível usar VHDL para escrever um testbench para verificar a funcionalidade do design usando arquivos no computador host para definir estímulos, interagir com o usuário e comparar os 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 muito grande para ser prático. Uma armadilha 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 IDE VHDL (para implementação FPGA como Xilinx ISE, Altera Quartus, Synopsys Synplify ou Mentor Graphics HDL Designer) para produzir o esquema RTL do circuito desejado. Depois disso, o esquemático gerado pode ser verificado usando um software de simulação que mostra as formas de onda de entradas e saídas do circuito após gerar o testbench apropriado. Para gerar um testbench apropriado para um circuito específico ou código VHDL, as entradas devem ser definidas corretamente. Por exemplo, para entrada de relógio, um processo de loop ou uma instrução iterativa é necessária.

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 sendo configurado, ao invés do código VHDL sendo "executado "como se estivesse em alguma forma de um chip 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 em que cada instrução é considerada para execução simultaneamente, ao contrário das linguagens de computação procedurais, como BASIC, C e código de montagem, onde uma sequência de instruções é executada sequencialmente, uma instrução por vez.

Um projeto VHDL é polivalente. Sendo criado uma vez, um bloco de cálculo pode ser usado em muitos outros projetos. No entanto, muitos parâmetros de blocos formacionais e funcionais 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 elemento, um projeto de dispositivo de computação pode ser portado em outra base de elemento, por exemplo VLSI com várias tecnologias.

Uma grande vantagem do VHDL em comparação com o Verilog original é que o VHDL tem um sistema de tipos completo . Os designers podem usar o sistema de tipos para escrever um código muito mais estruturado (especialmente declarando tipos de registro ).

Exemplos de design

Em VHDL, um design consiste no mínimo em uma entidade que descreve a interface e uma arquitetura que contém a implementação real. Além disso, a maioria dos projetos importa módulos de biblioteca. Alguns projetos também contêm várias arquiteturas e configurações .

Uma porta AND simples em VHDL seria semelhante a

-- (this is a VHDL comment)
/*
    this is a block comment (VHDL-2008)
*/
-- import std_logic from the IEEE library
library IEEE;
use IEEE.std_logic_1164.all;

-- this is the entity
entity ANDGATE is
  port ( 
    I1 : in std_logic;
    I2 : in std_logic;
    O  : out std_logic);
end entity ANDGATE;

-- this is the architecture
architecture RTL of ANDGATE is
begin
  O <= I1 and I2;
end architecture RTL;

(Observe que RTLsignifica Register transfer level design.) Embora o exemplo acima possa parecer prolixo para iniciantes em HDL, muitas partes são opcionais ou precisam ser escritas apenas uma vez. Geralmente, funções simples como essa fazem parte de um módulo comportamental maior, em vez de ter um módulo separado para algo tão simples. Além disso, o uso de elementos como o std_logictipo pode, à primeira vista, parecer um exagero. Pode-se usar facilmente o bittipo embutido e evitar a importação da biblioteca no início. No entanto, usando uma forma de lógica multivalorada , especificamente lógica 9 de valor ( U, X, 0, 1, Z, W, H, L, -), em vez de bits simples (0,1) oferece uma simulação muito poderoso e ferramenta de depuração para o designer que atualmente faz não existe em nenhum outro HDL.

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 manutenção.

Construções sintetizáveis ​​e modelos VHDL

O VHDL é freqüentemente usado para dois objetivos diferentes: simulação de projetos eletrônicos e síntese de tais projetos. Síntese é um processo em que um VHDL é compilado e mapeado em uma tecnologia de implementação, como FPGA ou ASIC.

Nem todas as construções em VHDL são adequadas para síntese. Por exemplo, a maioria das construções que lidam explicitamente com o tempo, como wait for 10 ns;não são sintetizáveis, apesar de serem válidas para simulação. Embora diferentes ferramentas de síntese tenham recursos diferentes, existe um subconjunto sintetizável comum de VHDL que define quais construções de linguagem e idiomas mapeiam em hardware comum para muitas ferramentas de síntese. IEEE 1076.6 define um subconjunto da linguagem que é considerado o subconjunto de síntese oficial. Geralmente, é considerado uma "prática recomendada" escrever um código muito idiomático para síntese, pois os resultados podem ser incorretos ou subótimos para construções não padrão.

Modelo MUX

O multiplexador , ou 'MUX' como é geralmente chamado, é uma construção simples muito comum no design de hardware. O exemplo abaixo demonstra um MUX simples dois para um, com entradas Ae B, seletor Se saída X. Observe que existem muitas outras maneiras de expressar o mesmo MUX em VHDL.

X <= A when S = '1' else B;

Modelo de trava

Uma trava transparente é basicamente um bit de memória que é atualizado quando um sinal de habilitação é gerado. Novamente, há muitas outras maneiras de expressar isso em VHDL.

-- latch template 1:
Q <= D when Enable = '1' else Q;

-- latch template 2:
process(all)
begin
    Q <= D when(Enable);
end process;

Flip-flops tipo D

O flip-flop tipo D faz a amostragem de um sinal de entrada na borda ascendente (ou descendente) de um relógio. Este exemplo tem um reset assíncrono ativo-alto e amostras na transição ascendente do clock.

DFF : process(all) is
begin
  if RST then
    Q <= '0';
  elsif rising_edge(CLK) then
    Q <= D;
  end if;
end process DFF;

Outra maneira comum de escrever o comportamento disparado 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 : process(RST, CLK) is
begin
  if RST then
    Q <= '0';
  elsif CLK'event and CLK = '1' then
    Q <= D;
  end if;
end process DFF;

VHDL também se presta a "linhas simples", como

DFF : Q <= '0' when RST = '1' else D when rising_edge(clk);

ou

DFF : process(all) is 
begin
  if rising_edge(CLK) then
    Q  <= D;
    Q2 <= Q1;
  end if;
  if RST then
    Q <= '0';
  end if;
end process DFF;

O que pode ser útil se nem todos os sinais (registros) acionados por este processo forem reiniciados.

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 são muito próximos de argumentos ou modelos em outras linguagens de programação tradicionais, como C ++.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;    -- for the unsigned type

entity COUNTER is
  generic (
    WIDTH : in natural := 32);
  port (
    RST   : in std_logic;
    CLK   : in std_logic;
    LOAD  : in std_logic;
    DATA  : in std_logic_vector(WIDTH-1 downto 0);
    Q     : out std_logic_vector(WIDTH-1 downto 0));
end entity COUNTER;

architecture RTL of COUNTER is

begin
  process(all) is
  begin
    if RST then
      Q <= (others => '0');
    elsif rising_edge(CLK) then
      if LOAD then
        Q <= DATA;
      else
        Q <= std_logic_vector(unsigned(Q) + 1); --Addition is unsigned, converted back to std_logic_vector
      end if;
    end if;
  end process;

end architecture RTL;

Contadores mais complexos podem adicionar instruções if / then / else dentro do rising_edge(CLK) elsifpara adicionar outras funções, como a contagem ativa, parando ou rolando em algum valor de contagem, gerando sinais de saída como sinais de contagem de terminal, etc. Deve-se tomar cuidado com o pedido e aninhamento de tais controles se usados ​​em conjunto, a fim de produzir as prioridades desejadas e minimizar o número de níveis lógicos necessários.

Construções apenas de simulação

Um grande subconjunto de VHDL não pode ser convertido em hardware. Este subconjunto é conhecido como subconjunto não sintetizável ou somente simulação de VHDL e só pode ser usado para prototipagem, simulação e depuração. Por exemplo, o código a seguir irá gerar um relógio com uma frequência de 50 MHz. Ele pode, por exemplo, ser usado para acionar uma entrada de relógio 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.

process
begin
  CLK <= '1'; wait for 10 NS;
  CLK <= '0'; wait for 10 NS;
end process;

As construções apenas de simulação podem ser usadas para construir formas de onda complexas em um tempo muito curto. Essa forma de onda pode ser usada, por exemplo, como vetores de teste para um projeto complexo ou como um protótipo de alguma lógica de sintetizador que será implementada no futuro.

process
begin
  wait until START = '1'; -- wait until START is high
  
  for i in 1 to 10 loop -- then wait for a few clock periods...
    wait until rising_edge(CLK);
  end loop;

  for i in 1 to 10 loop 	-- write numbers 1 to 10 to DATA, 1 every cycle
    DATA <= to_unsigned(i, 8);
    wait until rising_edge(CLK);
  end loop;

  -- wait until the output changes
  wait on RESULT;
  
  -- now raise ACK for clock period
  ACK <= '1';
  wait until rising_edge(CLK);
  ACK <= '0';

  -- and so on...
end process;

Simuladores VHDL

Comercial:

De outros:

  • EDA Playground - VHDL IDE gratuito baseado em navegador da web (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
  • boot by freerangefactory.org é um compilador e simulador VHDL baseado em GHDL e GTKWave
  • VHDL Simili da Symphony EDA é um simulador VHDL comercial gratuito.
  • nvc de Nick Gasson é um compilador VHDL de código aberto
  • O freehdl de Edwin Naroska era um simulador VHDL de código aberto, abandonado desde 2001.

Veja também

Referências

Notas

Leitura adicional

links externos