Mudanças entre as edições de "DI2022802 2024 1 AULA12"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Lista de Exercícios para AT2= ==Parte 1 - Registradores== :1. Para que são utilizados os registradores? :2. Quais as principais diferenças entre registradores porta "par...')
 
 
(2 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Lista de Exercícios para AT2=
+
=VHDL - Linguagem de Descrição de ''Hardware''=
  
==Parte 1 - Registradores==
+
;OBJETIVOS
  
:1. Para que são utilizados os registradores?
+
:O aluno será capaz de:
:2. Quais as principais diferenças entre registradores porta "paralela" e porta "serial"?
 
:3. Quais os quatro tipos básicos de registradores?
 
:4. Considerando o sentido do movimento dos dados, como podem ser os registradores?
 
:5. Por que que num registrador de deslocamento feito a partir de FF JK eu preciso colocar a porta inversora na  frente do primeiro FF entre J e K?
 
:6. Desenhe um diagrama de blocos de um registrador feito com FF JK com deslocamento para esquerda.
 
:7. Quais as características do CI 74HC166?
 
:8. O que há de errado na Figura 10 - Registrador tipo porta paralela. (pra quem assistiu a videoaula)
 
:9. Com base na Figura 11 - Tranferência serial entre registradores. Responda:
 
::a) Quantos pulsos de clock eu preciso para transferir os dados da registrador X para o registrador Y?
 
::b) Considerando que agora o primeiro registrador (X) esta vazio, quantos pulsos clock eu precisaria?
 
::c) Quantos pulsos de clock eu precisaria para tranferir 12 bits? (considerando X e Y vazios)
 
:10. Como ficaria o diagrama de blocos que representasse a transferência paralela de registradores de 3 bits?
 
:11. Como funciona o registrador contador em anel? Simule. Funcionou?
 
:12. Como funciona o registrador contador johnson? Simule. Funcionou?
 
:13. O que é o "tecerceiro" estado de uma saída (tristate)?
 
:14. Escolha um CI de Registradores, exceto 74166 e 74195, faça o diagrama de pinagem, tabela verdade e resumo do tipo de registrador do CI escolhido (datasheet).
 
  
==Parte 2 - Codificadores==
+
:*Saber sobre as definições da linguagem VHDL;
 +
:*Conhecer o ciclo de projeto;
 +
:*Diferenciar Entidades e Arquiteturas; e
 +
:*Conhecer Identificadores e Tipos de Dados.
  
:1. Desenhe os circuitos lógicos para o codificador e decodificador BCD 8421 e Exesso3.
 
:2. Projetar os seguintes conversores de código:
 
::a) Excesso 3 para BCD 8421;
 
::b) BCD 8421 para 2 entre 5;
 
::c) BCD 8421 para Johnson;
 
::d) BCD 8421 para Gray;
 
::e) Gray para BCD 8421.
 
:3. Desenhe o  circuito do conversor BCD para 7 segmentos.
 
  
==Parte 3 - MUX e DEMUX==
+
;METODOLOGIA
  
:1. O que faz um multiplexador (MUX)?
+
:A aula será expositiva (gravada), utilizando apresentação de texto base na Internet, onde será apresentado uma introdução ao VHDL que uma linguagem utilizada para descrição de ''hardware'' amplamente utilizada.
:2. Internamente como é constituído um MUX?
 
:3. Para um MUX de 32 entradas precisamos de quantas linhas de endereço?
 
:4. Construa um circuito MUX de 32 entradas a partir de MUX de 4 entradas.
 
:5. O que é o circuito 74151? Quais as suas características básicas?
 
:6. Desenhe um MUX de 8 entradas a partir do CI 74153.
 
:7. Pra que serve um demultiplexador (DEMUX)?
 
:8. Como é constituído internamente um DEMUX?
 
:9. Para um DEMUX de 64 saídas eu preciso de quantas linhas de endereço?
 
:10. O que é o circuito 74154? Quais as suas características básicas?
 
:11. Desenhe um MUX de 8 entradas a partir do CI 74155.
 
:12. Cite algumas aplicações de MUX e DEMUX.
 
:13. O que são as redes SDH e PDH?
 
:14. O que é PCM e TDM?
 
:15. O que é um canal E1?
 
  
==Parte 4 - Memórias==
 
  
:1. O que é memória?
+
;INTRODUÇÃO: VHDL ou (''Very High Speed Integrated Circuits'') é uma linguagem utilizada para descrever hardware. Ela foi concebida pelo departamento de defesa dos Estados Unidos (DARPA) na década de 80 para a documentação dos circuitos integrados vendidos às forças áreas americanas. Em 1987 ela foi padronizada pela IEEE como uma linguagem de descrição de hardware, o fato de ser padronizada e de domínio público ampliou e muito a sua utilização. A sua sintaxe é altamente tipada e lembra ADA e Pascal mas as semelhanças param por ai. A descrição de um circuito difere completamente de um software e muitas pessoas quando saem de uma linguagem de software e vem para linguagens de descrição de hardware encontram muitas dificuldades. Sempre mantenha em mente que você está descrevendo hardware e não escrevendo um algoritmo que um processador vai executar sequencialmente. VHDL é utilizando tanto para concepção de circuitos ASIC (por exemplo um i7 da Intel), quanto para desenvolvimento em FPGA. O resultado de uma “compilação” de um VHDL não é um executável mas sim uma ''netlist'' com todos os fios, conexões, componentes combinacionais e sequências de um hardware. [1]
:2. Para que serve a memoria principal em computador digital?
 
:3. O que flip-flop tem haver com memória?
 
:4. Memórias podem ser classificadas de acordo com algumas características. Quais são essas características?
 
:5. Qual a diferença entre acesso sequencial e acesso aleatório?
 
:6. Explique e dê exemplos do que são memórias voláteis e não voláteis.
 
:7. O que significa que uma memória é dita só de leitura? Então, como ela foi gravada?
 
:8. Qual a diferença entre memórias estáticas e dinâmicas?
 
:9. O que é uma célula de memória e quantos bits pode armazenar?
 
:10. O que é uma palavra de memória? Quantos bits tem um byte?
 
:11. O que é capacidade de armazenamento com relação a memórias?
 
:12. Qual a capacidade total (em bits e bytes) de uma memoria que possui 1024 palavras de 32 bits?
 
:13. Um certo chip de memória semicondutora é especificado como 16k X 4. a) Quantas palavras podem ser armazenadas neste chip? b) Qual é o tamanho da palavra? c) Quantos bits este chip pode armazenar no total? Apresente os cálculos.
 
:14. Qual das memórias armazena mais bits: uma memória de 512M X 8 ou uma memória que armazena 256M palavras com um tamanho de palavra de 16 bits? Apresente os cálculos.
 
:15. O que torna uma memória mais densa ou menos densa?
 
:16. O que é e para que serve um endereço de memória?
 
:17. Explique o que é uma operação de leitura de memória.
 
:18. Explique o que é uma operação de escrita na memória.
 
:19. O que é tempo de acesso de uma memória e como é medido esse tempo?
 
:20. O que acontece se a energia de uma memória volátil é interrompida?
 
:21. Qual a diferença entre uma memória RAM e uma memória SAM?
 
:22. Descreva os princípios de operação de uma memória RAM.
 
:23. Qual a diferença entre habilitar uma memória ou de energizá-la?
 
:24. Faça uma breve pesquisa sobre o que são os dispositivos de estado sólido (SSD) e o que o usuário comum precisa saber antes de comprar um para seu computador.
 
  
=Extra=
+
<blockquote style="background:#E6E6FA; border: 2px solid #8A2BE2; margin-left: 100px; margin-right: 100px; padding: 2em;">
 +
;NOTA: Este texto foi adaptado da Apostila Básica de VHDL do Prof. Dr. Renato Giacomini e da Apostila de Dispositivos Lógicos Programáveis dos professores: Caio Augusto de Oliveira, Jéssica Azevedo de Aguiar e Mateus Galvão Said Fontanini  (UNESP).
 +
</blockquote>
 +
 
 +
 
 +
==Definições e Abreviaturas==
 +
 
 +
:'''ASIC''' (''Application Specific Integrated Circuits'') Circuito integrado de aplicação específica.
 +
 
 +
:'''CPLD''' (''Complex Programmable Logic Devices'') Dispositivo lógico programável complexo.
 +
 
 +
:'''FPGA''' (''Field Programmable Gate Array'') Arranjo de portas programável em campo.
 +
 
 +
:'''VHDL''' (''VHSIC Hardware Description Language''). A sigla é derivada de outra abreviatura - VHSIC (''Very High Speed Integrated Circuits''), já que seu objetivo inicial era voltado ao projeto de circuitos integrados de altíssima velocidade.
 +
 
 +
:'''VHSIC''' (''Very High Speed Integrated Circuits'') Circuito integrado de altíssima velocidade.
 +
 
 +
 
 +
==Histórico==
 +
 
 +
Nas décadas de 70 e 80 foi posto em prática um programa do Departamento de Defesa (DoD) americano,
 +
para desenvolvimento de circuitos integrados de alta velocidade, denominado VHSIC e originado da
 +
preocupação de domínio das tecnologias envolvidas. Desde o princípio, anteviu-se o problema de
 +
representação dos projetos segundo uma linguagem que fosse comum às várias empresas envolvidas e que
 +
permitisse uma documentação fechada e clara para projetos de complexidade crescente. Nesta mesma
 +
época, já havia no mercado de computação a chamada crise do software, caracterizada pela dificuldade de
 +
gestão, documentação e sistematização do ciclo de vida do software (que envolve, em termos gerais, todas
 +
as atividades de relativas à sua criação e uso)[1]. O problema surgiu inicialmente no software porque era no
 +
software que se desenvolviam as aplicações, que tornavam o produto particular para um uso específico. Isso
 +
fazia com que um grande volume de projetos fossem conduzidos, quase sempre com muita complexidade e
 +
pouco método. No hardware a questão era mais bem controlada, pois os projetos eram, em geral, mais
 +
genéricos, especialmente para o hardware digital. Os projetos de microprocessadores, que eram os mais
 +
complexos, visavam na maior parte dos casos o uso geral. Um mesmo microprocessador seria utilizado em
 +
várias aplicações, seria reproduzido e testado aos milhões. Isso significava que o investimento em um único
 +
projeto poderia ser muito maior, inclusive em termos de especificação e testes. A evolução da metodologia
 +
de projeto de software foi então natural, em função dos argumentos sustentados pela crise. Hoje ainda é
 +
grande o desenvolvimento de novos métodos e a busca por uma linguagem descritiva universal, como o
 +
UML, para especificação e projeto de software orientado a objetos.
 +
 
 +
A questão preocupante quanto ao hardware, para o programa VHSIC americano, era que alguns fatos
 +
indicavam para uma evolução do mercado que faria surgirem problemas semelhantes aos apresentados pela
 +
crise de software. Entre estes fatos:
 +
 
 +
*A fabricação de circuitos integrados deixava de ser exclusiva de alguns poucos fabricantes. Surgiam empresas especializadas na fabricação de projetos de terceiros, o que permitiria, em conjunto com o desenvolvimento de tecnologias de fabricação menos custosas, a criação de CIs de uso específico para certas aplicações.
 +
 
 +
*As novas tecnologias de fabricação (abaixo de 2mm, na época) permitiam um aumento de densidade dos CIs, com conseqüente aumento de complexidade.
 +
 
 +
*Surgiam componentes de lógica programável (PLDs e PALs), inicialmente de pequena densidade, mas que poderiam evoluir para densidades muito maiores rapidamente. Tais componentes poderiam criar, como de fato ocorreu posteriormente, um grande mercado de projetos de pequena escala e aplicações específicas, muito parecido com o mercado de projetos de software.
 +
 
 +
A criação de uma linguagem de descrição de hardware patrocinada pelo programa e, em paralelo algumas
 +
outras linguagens criadas pela indústria, foi então uma decorrência natural. Em 1987, o VHDL foi
 +
normalizado pelo IEEE, tornando-se um padrão mundial, ao lado do Verilog, uma alternativa também
 +
expressiva no mercado de projetos de hardware. Hoje, praticamente todas as ferramentas de
 +
desenvolvimento de hardware computadorizadas aceitam essas linguagens como entrada, de forma que um
 +
projeto baseado em VHDL ou Verilog pode ser implementado com qualquer tecnologia.
 +
 
 +
 
 +
==Vantagens do Uso==
 +
 
 +
A alternativa para uso de uma linguagem formal de descrição de hardware como o VHDL é a descrição por
 +
diagramas esquemáticos. O VHDL apresenta as seguintes vantagens:
 +
 
 +
*Em sistemas sequenciais, o detalhamento da lógica de controle é realizado pelas ferramentas de automação do projeto, o que evita a trabalhosa e limitada aplicação das técnicas manuais tradicionais;
 +
 
 +
*O objetivo do projeto fica mais claro que na representação por esquemáticos, nos quais a implementação se sobrepõe à intenção do projeto;
 +
 
 +
*O volume de documentação diminui, já que um código bem comentado em VHDL substitui com vantagens o esquemático e a descrição funcional do sistema;
 +
 
 +
*O projeto ganha portabilidade, já que pode ser compilado em qualquer ferramenta e para qualquer tecnologia. É comum, na indústria, o uso de FPGAs e CPLDs para produções iniciais ou de menores escalas em projetos que posteriormente possam ser implementados em ASICs. Todas as implementações podem usar o mesmo código VHDL.
 +
 
 +
 
 +
==Ciclo de Projeto==
 +
 
 +
O projeto de um sistema digital auxiliado por ferramentas computadorizadas segue normalmente as etapas
 +
descritas a seguir.
 +
 
 +
 
 +
;1. Especificação
 +
 
 +
Esta etapa visa determinar os requisitos e funcionalidade de projeto, incluindo timing dos sinais e definido
 +
completamente as interfaces. É uma etapa comum e necessária a qualquer projeto, independentemente do
 +
uso do VHDL.
 +
 
 +
;2. Codificação
 +
 
 +
Nesta etapa, o objetivo é descrever, de forma estruturada e bem documentada, em VHDL, todo o
 +
projeto, segundo seus padrões de sintaxe. Assim, formaliza-se a especificação da etapa anterior, numa
 +
implementação de alto nível, em que são descritos apenas os aspectos relevantes à solução do problema.
 +
 
 +
;3. Simulação de Código Fonte
 +
 
 +
Nesta etapa, procura-se simular o código em uma ferramenta confiável, a fim de verificar, preliminarmente, o
 +
cumprimento da especificação. Esta simulação não considera ainda detalhes tecnológicos de implementação.
 +
 
 +
;4. Síntese Otimização e Fitting
 +
 
 +
Síntese - É o processo de “tradução” ou compilação de um código VHDL para uma descrição abstrata,
 +
em linguagem mais próxima da implementação. Naturalmente, a síntese é ainda um processo independente
 +
da tecnologia. Basicamente, o resultado obtido é o que se chama de RTL (register- transfer level), em que
 +
se definem registros, suas entradas e saídas e a lógica combinacional entre elas.
 +
Otimização - É o processo de seleção da melhor solução de implementação para uma dada tecnologia.
 +
Logicamente, as ferramentas EDA (Engineering Design Automation) são preparadas para aceitar diretivas de
 +
otimização, dependendo do resultado que se quer (minimização de área, consumo, tempo de resposta, etc).
 +
Fitting - É o processo em que a lógica sintezada e otimizada é mapeada nos recursos oferecidos pela
 +
tecnologia.
 +
 
 +
;5. Simulação do modelo pós-layout
 +
 
 +
A simulação realizada com o resultado do fitting permite resultados mais apurados de comportamento e
 +
timing, porque considera as características da implementação definitiva na tecnologia, como, por exemplo,
 +
os tempos de propagação dos sinais.
 +
 
 +
;6. Geração
 +
 
 +
É a fase de configuração das lógicas programáveis ou de fabricação de ASICs.
 +
 
 +
=Entidades e Arquiteturas=
 +
 
 +
 
 +
O código abaixo representa um comparador binário para palavras de quatro bits:
 +
 
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
 
 +
-- comparador de 4 bits
 +
entity comp4 is
 +
    port ( a, b: in bit-vector (3 downto 0);
 +
          equals: out bit);
 +
end comp4;
 +
 
 +
architecture arq1 of comp4 is
 +
begin
 +
    equals <= ‘1’ when (a=b) else ‘O’;
 +
end arq1;
 +
</syntaxhighlight>
 +
 
 +
 
 +
Uma entidade (entity) é uma abstração que descreve um sistema, uma placa, um chip, uma função ou, até
 +
mesmo, uma porta lógica. Na declaração de uma entidade, descreve-se o conjunto de entradas e saídas. No
 +
exemplo dado, a entidade comp4 possui duas entradas, a e b, e uma saída, equals, que definem o port da
 +
entidade.
 +
 
 +
Os ports correspondem a pinos e são tratados como objetos de dados. Pode-se atribuir valores ou obtê-los
 +
de ports. Cada entrada ou saída possui um modo (mode) de operação. Os modos possíveis são:
 +
 
 +
'''in''' – entrada;
 +
 
 +
'''out''' – saída: os pinos definidos como saída não podem ser utilizados como entradas, nem seus valores
 +
utilizados na lógica interna;
 +
 
 +
'''buffer''' - saída com possibilidade de realimentação;
 +
 
 +
'''inout''' - substitui qualquer um dos outros, mas seu uso deve ser limitado aos casos em que o pino deva ser
 +
utilizado como entrada e saída, para clareza na descrição.
 +
 
 +
 
 +
==Corpo de Arquitetura==
 +
 
 +
A arquitetura de uma entidade pode ser descrita de três formas distintas, mas que, em geral, conduzem a
 +
uma mesma implementação.
 +
 
 +
 
 +
===Descrição comportamental===
 +
 
 +
 
 +
 
 +
A arquitetura (''architecture'') descreve as funções realizadas pela entidade. No caso do exemplo é atribuído o
 +
valor ‘1 ‘ à saída equals, sempre que as entradas forem iguais e ‘0’, caso contrário.
 +
 
 +
Esta é a forma mais flexível e poderosa de descrição. São definidos processos concorrentes (process). A
 +
cada processo é associada uma lista de sensibilidade, que indica quais são as variáveis cuja alteração deve
 +
levar à reavaliação da saída. No simulador funcional, quando uma variável da lista é modificada, o processo
 +
é simulado novamente. O código abaixo ilustra a aplicação deste tipo de descrição ao comparador do
 +
exemplo.
 +
 
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
-- comparador de 4 bits
 +
entity comp4 is
 +
    port ( a, b: in bit_vector (3 downto Æ);
 +
          equals: out bit);
 +
end comp4;
 +
 
 +
architecture comport of comp4 is
 +
begin
 +
    comp: process (a,b) -- lista de sensibilidade
 +
    begin
 +
      if a = b then
 +
          equals < = ‘1’ ;
 +
      else
 +
          equals < = ‘O’ ;
 +
      end if;
 +
    end process comp;
 +
end comport;
 +
</syntaxhighlight>
 +
 
 +
 
 +
Uma arquitetura pode ter mais de um processo e eles serão executados concorrentemente entre si.
 +
 
 +
 
 +
===Descrição por fluxo de dados===
 +
 
 +
Neste tipo de descrição, os valores de saída são atribuídos diretamente, através de expressões lógicas.
 +
Todas as expressões são concorrentes no tempo.
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
-- comparador de 4 bits
 +
entity comp4 is
 +
    port ( a, b: in bit_vector (3 downto 0);
 +
          equals: out bit);
 +
end comp4;
 +
architecture fluxo of comp4 is
 +
begin
 +
    equals < = ‘1’ when (a=b) else ‘O’;
 +
end fluxo;
 +
</syntaxhighlight>
 +
 
 +
===Descrição estrutural===
 +
 
 +
A descrição estrutural apresenta netlists e instanciação de componentes básicos, ou seja, é como se fosse
 +
uma lista de ligações entre componentes básicos pré-definidos.
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
-- comparador de 4 bits
 +
entity comp4 is
 +
    port ( a, b: in bit_vector (3 downto 0);
 +
          equals: out bit);
 +
end comp4;
 +
 
 +
use work.gateskg.all;
 +
architecture estrut of comp4 is
 +
    signal x bit_vector (0 to 3);
 +
begin
 +
    U0: xnor2 port map (a(0), b(0), x(0));
 +
    U1: xnor2 port map (a(1), b(1), x(1));
 +
    U2: xnor2 port map (a(2), b(2), x(2));
 +
    U3: xnor2 port map (a(3), b(3), x(3));
 +
    U4: and4 port map (x(0), x(1), x(2), x(3), equals);
 +
end estrut;
 +
</syntaxhighlight>
 +
 
 +
==Identificadores==
 +
 
 +
Os identificadores são usados como referência a todos os objetos declarados no código. As regras para
 +
formação de nomes são:
 +
 
 +
*O primeiro carácter deve ser uma letra.
 +
*O último não pode ser ''underscore''.
 +
*Não são permitidos 2 ''underscores'' em sequência.
 +
*Maiúscula / Minúscula são equivalentes.
 +
 
 +
==Objetos de dados==
 +
 
 +
;CONSTANTES: - Assumem apenas um valor em todo o código.
 +
 
 +
Exemplo:
 +
 
 +
constant largura: integer: = 8 ;
 +
 
 +
Podem ser declaradas no níveis de
 +
:package
 +
:entity
 +
:architecture
 +
:process
 +
e valem apenas no contexto em que são declaradas.
 +
 
 +
 
 +
;SINAIS: - Representam ligações (fios) que interligam componentes. Ports são exemplos de sinais.
 +
 
 +
Exemplo: 
 +
 +
signal valor-de-contagem: bit-vector (3 downto 0):
 +
 
 +
Podem ser declarados na entidade ou na arquitetura.
 +
 
 +
 
 +
;VARIÁVEIS: - São utilizadas em processos e subprogramas e devem ser declaradas neles. São atualizadas imediatamente e não correspondem à implementação física, como no caso dos sinais.
 +
 
 +
Exemplo: 
 +
 
 +
variable resultado: std-logic := ‘0’
 +
 
 +
==Tipos de Dados==
 +
 
 +
 
 +
VHDL é ''strongly typed'': objetos de dados de tipos diferentes não podem ser atribuídos um ao outro, sem conversão explícita.
 +
 
 +
Tipos escalares
 +
 
 +
*Enumeration Types
 +
Lista de valores que o objeto pode assumir.
 +
 
 +
Exemplo:
 +
 
 +
type estado is (espera, erro, cálculo, transmitido);
 +
 
 +
Pode-se então declarar um sinal do tipo:
 +
 
 +
signal estado_atual: estado;
 +
 
 +
Os dados desse tipo são ordenados, ou seja
 +
 
 +
erro > = espera
 +
 
 +
Já definidos pela norma:
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
type boolean is (FALSE, TRUE);
 +
type bit is (‘O’, ‘1’);
 +
type std_ulogic is ( ‘U’, -- não inicializada
 +
                    ‘X’, -- desconhecida forte
 +
                    ‘0’, -- 0 forte
 +
                    ‘1’, -- 1 forte
 +
                    ‘Z’, -- alta impedância
 +
                    ‘W’, -- desconhecida fraca
 +
                    ‘L’, -- O fraco
 +
                    ‘H’, -- 1 fraco
 +
                    ‘-’, -- tanto faz
 +
);
 +
subtype std_logic is resolved std_ulogic
 +
</syntaxhighlight>
 +
 
 +
resolved -> Existe uma função de resolução para os casos em que existe + de 1 driver para o sinal.
 +
 
 +
'''NOTA''': para usar std_logic e std_ulogic devem-se acrescentar as seguintes linhas antes da entidade:
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
[...]
 +
</syntaxhighlight>
 +
 
 +
 
 +
*Integer Types
 +
 
 +
Inteiros na faixa de valores possíveis: (<math>-2^{31} - 1</math>) a (<math>2^{31} - 1</math>)
 +
 
 +
Exemplo:
 +
 
 +
variable altura: integer range 0 to 255;
 +
 
 +
 
 +
*Flooting Types
 +
 
 +
Esse tipo vai de -1.0E38 a 1.0E38, porém são pouco utilizados, por envolverem grande quantidade de recursos.
 +
 
 +
 
 +
*Physical Types
 +
 
 +
Exemplo:
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
type time in range - 2147483647 to 2147483647
 +
units
 +
    fs;
 +
    ps = 1000 fs;
 +
    ns = 1000 ps;
 +
    us = 1000 ns;
 +
    ms = 1000 us;
 +
    sec = 1000 ms;
 +
    min = 60 sec;
 +
    hr = 60 min;
 +
end units;
 +
</syntaxhighlight>
 +
 
 +
 
 +
Este tipo relaciona-se diretamente a grandezas físicas
 +
 
 +
===Tipos compostos===
 +
 
 +
*Array
 +
 
 +
Exemplo:
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
type ward is array (15 downto 0) of bit;
 +
signal b: ward;
 +
</syntaxhighlight>
 +
 
 +
*Record
 +
 
 +
Exemplo:
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
type iocell is record
 +
    buffer_inp: bitvector (7 downto 0);
 +
    enable: bit;
 +
    buffer_out: bitvector (7 downto 0);
 +
end record;
 +
</syntaxhighlight>
 +
 
 +
=Exercícios=
 +
 
 +
;Parte 1
 +
 
 +
#O que significa CPLD, FPGA e VHDL?
 +
#Quais as principais vantagens no uso do VHDL?
 +
#Quais as etapas de um ciclo de projeto de sistemas em VHDL?
 +
#Qual a diferença entre uma Entidade (entity) e uma Arquitetura (architecture)?
 +
#O que são os Ports?
 +
#Que tipo de pinos (ports) existem e onde são aplicados?
 +
#O que é uma Descrição comportamental?
 +
#O que é uma Descrição por fluxo de dados?
 +
#O que é uma Descrição estrutural?
 +
#Quais são as regras para a formação dos Identificadores?
 +
#O que é uma constante?
 +
#Qual a diferença de Sinais e de Variáveis?
 +
#Quais os tipos de dados disponíveis em VHDL?
 +
 
 +
;Parte 2
 +
#Projetar e simular:
 +
##Biestável tipo JK com ''clock'' e borda de subida, com descrição comportamental.
 +
##Idem, com ''Preset'' e ''Clear'' assíncronos
 +
#Realizar o projeto de um contador síncrono, com uma sequência pré-definida em VHDL e simular.
 +
#Comentar os códigos abaixo:
 +
 
 +
*Código 1
 +
<syntaxhighlight lang=vhdl>
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
 
 +
entity FF_D is
 +
port
 +
(
 +
D : in  std_logic;
 +
clk : in  std_logic;
 +
Q : out std_logic
 +
);
 +
end FF_D;
 +
 
 +
architecture Ex1 of FF_D is
 +
begin
 +
-- Update the register output on the clock's rising edge
 +
process (clk)
 +
begin
 +
if (rising_edge(clk)) then
 +
Q <= D;
 +
end if;
 +
end process;
 +
end Ex1;
 +
</syntaxhighlight>
 +
 
 +
*Código 2
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
 +
ENTITY ff_jk is
 +
    port(j,k,clk: in bit;
 +
        q: out bit);
 +
END ff_jk;
 +
 +
ARCHITECTURE teste of ff_jk is
 +
BEGIN
 +
 
 +
process(clk)
 +
variable temp : bit :='0';
 +
begin
 +
if( falling_edge(clk) ) then
 +
if (j='1' and k='0') then
 +
temp:='1';
 +
elsif (j='0' and k='1') then
 +
temp:='0';
 +
elsif (j='1' and k='1') then
 +
temp:= not temp;
 +
else
 +
temp:=temp;
 +
end if;
 +
q<=temp;
 +
end if;
 +
end process;
 +
END teste;
 +
</syntaxhighlight>
 +
 
 +
*Código 3
 +
 
 +
<syntaxhighlight lang=vhdl>
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
use ieee.std_logic_arith.all;
 +
 
 +
entity CONTADOR is
 +
port(
 +
CLK: in  std_logic;
 +
    RESET: in  std_logic;
 +
ENABLE: in  std_logic;
 +
Q: out std_logic_vector (3 downto 0)
 +
);
 +
end CONTADOR;
 +
 
 +
architecture CONTADOR_arq of CONTADOR is
 +
begin
 +
process(CLK,RESET)
 +
variable X: integer range 0 to 15;
 +
begin
 +
if (RESET = '1') then
 +
X := 0;
 +
 
 +
elsif (CLK'event and CLK='1') then
 +
if (ENABLE = '1') then
 +
X := X + 1;
 +
end if;
 +
end if;
 +
 
 +
Q <= conv_std_logic_vector(X, 4);
 +
 
 +
end process;
 +
end CONTADOR_arq;
 +
 
 +
</syntaxhighlight>
 +
 
 +
{{collapse top|Outros Exemplos}}
 +
 
 +
*Código 4: VIGIA
 +
<syntaxhighlight lang=vhdl>
 +
--1 - VIGIA
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
ENTITY Vigia IS
 +
PORT( clk : IN STD_LOGIC;
 +
      SensorA, SensorB : IN STD_LOGIC;
 +
      Multa_Vel, Multa_Comp : OUT STD_LOGIC);
 +
END Vigia;
 +
 
 +
ARCHITECTURE Intuitiva OF Vigia IS
 +
    TYPE STATE_TYPE IS (Espera,
 +
        Verificando_Velocidade,
 +
        Verificando_Tamanho,
 +
        Multa_Velocidade,
 +
        Multa_Tamanho,
 +
    Erro);
 +
    SIGNAL Estado: STATE_TYPE;
 +
    SIGNAL Cronometro: INTEGER RANGE 0 to 31;
 +
 
 +
BEGIN
 +
    PROCESS (clk)
 +
    BEGIN
 +
        IF clk'EVENT AND clk = '1' THEN
 +
            Multa_Vel <= '0';
 +
            Multa_Comp <= '0';
 +
            CASE Estado IS
 +
                WHEN Espera =>
 +
                    IF SensorA = '1' THEN
 +
                        IF SensorB = '0' THEN
 +
                            Estado <= Verificando_Velocidade;
 +
                        ELSE
 +
                            Estado <= Erro;
 +
                        END IF;
 +
                    END IF;
 +
                WHEN Verificando_Velocidade =>
 +
                    IF SensorA = '1' THEN
 +
                        IF SensorB = '0' THEN
 +
                            Cronometro <= Cronometro + 1;
 +
                        ELSE
 +
                            IF Cronometro < 8 OR Cronometro > 24 THEN
 +
                                Estado <= Multa_Velocidade;
 +
                            ELSE
 +
                                Estado <= Verificando_Tamanho;
 +
                            END IF;
 +
                        END IF;
 +
                    ELSE
 +
                        IF SensorB = '0' THEN
 +
                            Estado <= Espera;
 +
                            Cronometro <= 0;
 +
                        ELSE
 +
                            Estado <= Erro;
 +
                        END IF;
 +
                    END IF;
 +
                WHEN Verificando_Tamanho =>
 +
                    IF SensorA = '1' THEN
 +
                        IF SensorB = '1' THEN
 +
                            Cronometro <= Cronometro -1;
 +
                            IF Cronometro = 0 THEN
 +
                                Estado <= Multa_Tamanho;
 +
                            END IF;
 +
                        ELSE
 +
                            Estado <= Erro;
 +
                        END IF;
 +
                    ELSE
 +
                        Estado <= Espera;
 +
                        Cronometro <= 0;
 +
                    END IF;
 +
                WHEN Multa_Velocidade =>
 +
                    Multa_Vel <= '1';
 +
                WHEN Multa_Tamanho =>
 +
                    Multa_Comp <= '1';
 +
                WHEN Erro =>
 +
                    Multa_Vel <= '1';
 +
                Multa_Comp <= '1';
 +
            END CASE;
 +
        END IF;
 +
END PROCESS;
 +
END Intuitiva;
 +
</syntaxhighlight>
 +
::Exemplo 5: RECEPTOR
 +
<syntaxhighlight lang=vhdl>
 +
--2 – RECEPTOR
 +
-- Receptor serial
 +
entity Receptor is
 +
    port( data_in, clock, limpa: in bit;
 +
          pronto, ocupado: out bit;
 +
          data_out: buffer bit_vector(7 downto 0));
 +
end Receptor
 +
 
 +
architecture Receptor of Receptor is
 +
    TYPE STATE_TYPE IS ( Espera,
 +
                        Start_bit,
 +
                        Recebendo,
 +
                        Pronto);
 +
    SIGNAL Estado: STATE_TYPE;
 +
    SIGNAL Cronometro: INTEGER RANGE 0 to 7;
 +
    SIGNAL Conta_bits: INTEGER RANGE 0 to 7;
 +
process
 +
begin
 +
    if clock'event and clock = '1' then
 +
    CASE Estado IS
 +
        WHEN Espera =>
 +
            IF Data_in = '0'then
 +
                Cronometro <= 0;
 +
                Ocupado <= '1';
 +
                Estado <= Start_bit;
 +
            ELSE
 +
                Ocupado <= '0';
 +
            END IF;
 +
        WHEN Start_bit =>
 +
            IF Cronometro < 4 then
 +
                Cronometro = Cronometro+1;
 +
            ELSE
 +
                Cronômetro = 0;
 +
                Conta_bits =0;
 +
                Estado <= Recebendo;
 +
            END IF;
 +
        WHEN Recebendo =>
 +
            IF Conta_bits < 6 then
 +
                IF Cronometro < 3 then
 +
                    Cronometro = Cronometro+1;
 +
                ELSE
 +
                    Cronômetro = 0;
 +
                    Conta_bits = Conta_bits+1;
 +
                    Data_out(0)<= Data_out(1);
 +
                    Data_out(1)<= Data_out(2);
 +
                    Data_out(2)<= Data_out(3);
 +
                    Data_out(3)<= Data_out(4);
 +
                    Data_out(4)<= Data_out(5);
 +
                    Data_out(5)<= Data_out(6);
 +
                    Data_out(6)<= Data_out(7);
 +
                    Data_out(7)<= Data_in;
 +
                END IF;
 +
            ELSE
 +
                Estado <= Pronto;
 +
                Pronto <= '1';
 +
            END IF;
 +
        WHEN Pronto =>
 +
            IF Limpa = 0 Then
 +
                Ocupado <= '0';
 +
                Pronto <= '0';
 +
                Estado <= Espera;
 +
            END IF;
 +
    END CASE;
 +
    END IF;
 +
end process;
 +
end Receptor;
 +
</syntaxhighlight>
 +
 
 +
{{collapse bottom}}
 +
 
 +
=Referências=
 +
 
 +
 
 +
[1] https://www.embarcados.com.br/vhdl-basico-parte-1-entidade/
 +
 
 +
[2] http://www.embarcados.com.br/tutorial-de-modelsim-vhdl-fpga/
 +
 
 +
[3] https://www.altera.com/products/design-software/model---simulation/modelsim-altera-software.html
 +
 
 +
[4] [https://drive.google.com/file/d/1zVjHMsvCz-HFm3S2Vp0vWk1MSqTRHmqK/view?usp=sharing Videoaula VHDL]
  
:* [http://wiki.sj.ifsc.edu.br/images/e/e4/Exerc%C3%ADcios_-_Registradores.pdf Download Exercícios - Registradores]
 
  
  

Edição atual tal como às 14h56min de 12 de julho de 2024

VHDL - Linguagem de Descrição de Hardware

OBJETIVOS
O aluno será capaz de:
  • Saber sobre as definições da linguagem VHDL;
  • Conhecer o ciclo de projeto;
  • Diferenciar Entidades e Arquiteturas; e
  • Conhecer Identificadores e Tipos de Dados.


METODOLOGIA
A aula será expositiva (gravada), utilizando apresentação de texto base na Internet, onde será apresentado uma introdução ao VHDL que uma linguagem utilizada para descrição de hardware amplamente utilizada.


INTRODUÇÃO
VHDL ou (Very High Speed Integrated Circuits) é uma linguagem utilizada para descrever hardware. Ela foi concebida pelo departamento de defesa dos Estados Unidos (DARPA) na década de 80 para a documentação dos circuitos integrados vendidos às forças áreas americanas. Em 1987 ela foi padronizada pela IEEE como uma linguagem de descrição de hardware, o fato de ser padronizada e de domínio público ampliou e muito a sua utilização. A sua sintaxe é altamente tipada e lembra ADA e Pascal mas as semelhanças param por ai. A descrição de um circuito difere completamente de um software e muitas pessoas quando saem de uma linguagem de software e vem para linguagens de descrição de hardware encontram muitas dificuldades. Sempre mantenha em mente que você está descrevendo hardware e não escrevendo um algoritmo que um processador vai executar sequencialmente. VHDL é utilizando tanto para concepção de circuitos ASIC (por exemplo um i7 da Intel), quanto para desenvolvimento em FPGA. O resultado de uma “compilação” de um VHDL não é um executável mas sim uma netlist com todos os fios, conexões, componentes combinacionais e sequências de um hardware. [1]
NOTA
Este texto foi adaptado da Apostila Básica de VHDL do Prof. Dr. Renato Giacomini e da Apostila de Dispositivos Lógicos Programáveis dos professores: Caio Augusto de Oliveira, Jéssica Azevedo de Aguiar e Mateus Galvão Said Fontanini (UNESP).


Definições e Abreviaturas

ASIC (Application Specific Integrated Circuits) Circuito integrado de aplicação específica.
CPLD (Complex Programmable Logic Devices) Dispositivo lógico programável complexo.
FPGA (Field Programmable Gate Array) Arranjo de portas programável em campo.
VHDL (VHSIC Hardware Description Language). A sigla é derivada de outra abreviatura - VHSIC (Very High Speed Integrated Circuits), já que seu objetivo inicial era voltado ao projeto de circuitos integrados de altíssima velocidade.
VHSIC (Very High Speed Integrated Circuits) Circuito integrado de altíssima velocidade.


Histórico

Nas décadas de 70 e 80 foi posto em prática um programa do Departamento de Defesa (DoD) americano, para desenvolvimento de circuitos integrados de alta velocidade, denominado VHSIC e originado da preocupação de domínio das tecnologias envolvidas. Desde o princípio, anteviu-se o problema de representação dos projetos segundo uma linguagem que fosse comum às várias empresas envolvidas e que permitisse uma documentação fechada e clara para projetos de complexidade crescente. Nesta mesma época, já havia no mercado de computação a chamada crise do software, caracterizada pela dificuldade de gestão, documentação e sistematização do ciclo de vida do software (que envolve, em termos gerais, todas as atividades de relativas à sua criação e uso)[1]. O problema surgiu inicialmente no software porque era no software que se desenvolviam as aplicações, que tornavam o produto particular para um uso específico. Isso fazia com que um grande volume de projetos fossem conduzidos, quase sempre com muita complexidade e pouco método. No hardware a questão era mais bem controlada, pois os projetos eram, em geral, mais genéricos, especialmente para o hardware digital. Os projetos de microprocessadores, que eram os mais complexos, visavam na maior parte dos casos o uso geral. Um mesmo microprocessador seria utilizado em várias aplicações, seria reproduzido e testado aos milhões. Isso significava que o investimento em um único projeto poderia ser muito maior, inclusive em termos de especificação e testes. A evolução da metodologia de projeto de software foi então natural, em função dos argumentos sustentados pela crise. Hoje ainda é grande o desenvolvimento de novos métodos e a busca por uma linguagem descritiva universal, como o UML, para especificação e projeto de software orientado a objetos.

A questão preocupante quanto ao hardware, para o programa VHSIC americano, era que alguns fatos indicavam para uma evolução do mercado que faria surgirem problemas semelhantes aos apresentados pela crise de software. Entre estes fatos:

  • A fabricação de circuitos integrados deixava de ser exclusiva de alguns poucos fabricantes. Surgiam empresas especializadas na fabricação de projetos de terceiros, o que permitiria, em conjunto com o desenvolvimento de tecnologias de fabricação menos custosas, a criação de CIs de uso específico para certas aplicações.
  • As novas tecnologias de fabricação (abaixo de 2mm, na época) permitiam um aumento de densidade dos CIs, com conseqüente aumento de complexidade.
  • Surgiam componentes de lógica programável (PLDs e PALs), inicialmente de pequena densidade, mas que poderiam evoluir para densidades muito maiores rapidamente. Tais componentes poderiam criar, como de fato ocorreu posteriormente, um grande mercado de projetos de pequena escala e aplicações específicas, muito parecido com o mercado de projetos de software.

A criação de uma linguagem de descrição de hardware patrocinada pelo programa e, em paralelo algumas outras linguagens criadas pela indústria, foi então uma decorrência natural. Em 1987, o VHDL foi normalizado pelo IEEE, tornando-se um padrão mundial, ao lado do Verilog, uma alternativa também expressiva no mercado de projetos de hardware. Hoje, praticamente todas as ferramentas de desenvolvimento de hardware computadorizadas aceitam essas linguagens como entrada, de forma que um projeto baseado em VHDL ou Verilog pode ser implementado com qualquer tecnologia.


Vantagens do Uso

A alternativa para uso de uma linguagem formal de descrição de hardware como o VHDL é a descrição por diagramas esquemáticos. O VHDL apresenta as seguintes vantagens:

  • Em sistemas sequenciais, o detalhamento da lógica de controle é realizado pelas ferramentas de automação do projeto, o que evita a trabalhosa e limitada aplicação das técnicas manuais tradicionais;
  • O objetivo do projeto fica mais claro que na representação por esquemáticos, nos quais a implementação se sobrepõe à intenção do projeto;
  • O volume de documentação diminui, já que um código bem comentado em VHDL substitui com vantagens o esquemático e a descrição funcional do sistema;
  • O projeto ganha portabilidade, já que pode ser compilado em qualquer ferramenta e para qualquer tecnologia. É comum, na indústria, o uso de FPGAs e CPLDs para produções iniciais ou de menores escalas em projetos que posteriormente possam ser implementados em ASICs. Todas as implementações podem usar o mesmo código VHDL.


Ciclo de Projeto

O projeto de um sistema digital auxiliado por ferramentas computadorizadas segue normalmente as etapas descritas a seguir.


1. Especificação

Esta etapa visa determinar os requisitos e funcionalidade de projeto, incluindo timing dos sinais e definido completamente as interfaces. É uma etapa comum e necessária a qualquer projeto, independentemente do uso do VHDL.

2. Codificação

Nesta etapa, o objetivo é descrever, de forma estruturada e bem documentada, em VHDL, todo o projeto, segundo seus padrões de sintaxe. Assim, formaliza-se a especificação da etapa anterior, numa implementação de alto nível, em que são descritos apenas os aspectos relevantes à solução do problema.

3. Simulação de Código Fonte

Nesta etapa, procura-se simular o código em uma ferramenta confiável, a fim de verificar, preliminarmente, o cumprimento da especificação. Esta simulação não considera ainda detalhes tecnológicos de implementação.

4. Síntese Otimização e Fitting

Síntese - É o processo de “tradução” ou compilação de um código VHDL para uma descrição abstrata, em linguagem mais próxima da implementação. Naturalmente, a síntese é ainda um processo independente da tecnologia. Basicamente, o resultado obtido é o que se chama de RTL (register- transfer level), em que se definem registros, suas entradas e saídas e a lógica combinacional entre elas. Otimização - É o processo de seleção da melhor solução de implementação para uma dada tecnologia. Logicamente, as ferramentas EDA (Engineering Design Automation) são preparadas para aceitar diretivas de otimização, dependendo do resultado que se quer (minimização de área, consumo, tempo de resposta, etc). Fitting - É o processo em que a lógica sintezada e otimizada é mapeada nos recursos oferecidos pela tecnologia.

5. Simulação do modelo pós-layout

A simulação realizada com o resultado do fitting permite resultados mais apurados de comportamento e timing, porque considera as características da implementação definitiva na tecnologia, como, por exemplo, os tempos de propagação dos sinais.

6. Geração

É a fase de configuração das lógicas programáveis ou de fabricação de ASICs.

Entidades e Arquiteturas

O código abaixo representa um comparador binário para palavras de quatro bits:


-- comparador de 4 bits
entity comp4 is
    port ( a, b: in bit-vector (3 downto 0);
           equals: out bit);
end comp4;

architecture arq1 of comp4 is
begin
    equals <= 1 when (a=b) else O;
end arq1;


Uma entidade (entity) é uma abstração que descreve um sistema, uma placa, um chip, uma função ou, até mesmo, uma porta lógica. Na declaração de uma entidade, descreve-se o conjunto de entradas e saídas. No exemplo dado, a entidade comp4 possui duas entradas, a e b, e uma saída, equals, que definem o port da entidade.

Os ports correspondem a pinos e são tratados como objetos de dados. Pode-se atribuir valores ou obtê-los de ports. Cada entrada ou saída possui um modo (mode) de operação. Os modos possíveis são:

in – entrada;

out – saída: os pinos definidos como saída não podem ser utilizados como entradas, nem seus valores utilizados na lógica interna;

buffer - saída com possibilidade de realimentação;

inout - substitui qualquer um dos outros, mas seu uso deve ser limitado aos casos em que o pino deva ser utilizado como entrada e saída, para clareza na descrição.


Corpo de Arquitetura

A arquitetura de uma entidade pode ser descrita de três formas distintas, mas que, em geral, conduzem a uma mesma implementação.


Descrição comportamental

A arquitetura (architecture) descreve as funções realizadas pela entidade. No caso do exemplo é atribuído o valor ‘1 ‘ à saída equals, sempre que as entradas forem iguais e ‘0’, caso contrário.

Esta é a forma mais flexível e poderosa de descrição. São definidos processos concorrentes (process). A cada processo é associada uma lista de sensibilidade, que indica quais são as variáveis cuja alteração deve levar à reavaliação da saída. No simulador funcional, quando uma variável da lista é modificada, o processo é simulado novamente. O código abaixo ilustra a aplicação deste tipo de descrição ao comparador do exemplo.


-- comparador de 4 bits
entity comp4 is
    port ( a, b: in bit_vector (3 downto Æ);
           equals: out bit);
end comp4;

architecture comport of comp4 is
begin
    comp: process (a,b) -- lista de sensibilidade
    begin
       if a = b then
          equals < = 1 ;
       else
          equals < = O ;
       end if;
    end process comp;
end comport;


Uma arquitetura pode ter mais de um processo e eles serão executados concorrentemente entre si.


Descrição por fluxo de dados

Neste tipo de descrição, os valores de saída são atribuídos diretamente, através de expressões lógicas. Todas as expressões são concorrentes no tempo.

-- comparador de 4 bits
entity comp4 is
    port ( a, b: in bit_vector (3 downto 0);
           equals: out bit);
end comp4;
architecture fluxo of comp4 is
begin
    equals < = 1 when (a=b) else O;
end fluxo;

Descrição estrutural

A descrição estrutural apresenta netlists e instanciação de componentes básicos, ou seja, é como se fosse uma lista de ligações entre componentes básicos pré-definidos.

-- comparador de 4 bits
entity comp4 is
    port ( a, b: in bit_vector (3 downto 0);
           equals: out bit);
end comp4;

use work.gateskg.all;
architecture estrut of comp4 is
    signal x bit_vector (0 to 3);
begin
    U0: xnor2 port map (a(0), b(0), x(0));
    U1: xnor2 port map (a(1), b(1), x(1));
    U2: xnor2 port map (a(2), b(2), x(2));
    U3: xnor2 port map (a(3), b(3), x(3));
    U4: and4 port map (x(0), x(1), x(2), x(3), equals);
end estrut;

Identificadores

Os identificadores são usados como referência a todos os objetos declarados no código. As regras para formação de nomes são:

  • O primeiro carácter deve ser uma letra.
  • O último não pode ser underscore.
  • Não são permitidos 2 underscores em sequência.
  • Maiúscula / Minúscula são equivalentes.

Objetos de dados

CONSTANTES
- Assumem apenas um valor em todo o código.

Exemplo:

constant largura: integer: = 8 ;

Podem ser declaradas no níveis de

package
entity
architecture
process

e valem apenas no contexto em que são declaradas.


SINAIS
- Representam ligações (fios) que interligam componentes. Ports são exemplos de sinais.

Exemplo:

signal valor-de-contagem: bit-vector (3 downto 0):

Podem ser declarados na entidade ou na arquitetura.


VARIÁVEIS
- São utilizadas em processos e subprogramas e devem ser declaradas neles. São atualizadas imediatamente e não correspondem à implementação física, como no caso dos sinais.

Exemplo:

variable resultado: std-logic := ‘0’

Tipos de Dados

VHDL é strongly typed: objetos de dados de tipos diferentes não podem ser atribuídos um ao outro, sem conversão explícita.

Tipos escalares

  • Enumeration Types

Lista de valores que o objeto pode assumir.

Exemplo:

type estado is (espera, erro, cálculo, transmitido);

Pode-se então declarar um sinal do tipo:

signal estado_atual: estado;

Os dados desse tipo são ordenados, ou seja

erro > = espera

Já definidos pela norma:

type boolean is (FALSE, TRUE);
type bit is (O, 1);
type std_ulogic is ( U, -- não inicializada
                     X, -- desconhecida forte
                     0, -- 0 forte
                     1, -- 1 forte
                     Z, -- alta impedância
                     W, -- desconhecida fraca
                     L, -- O fraco
                     H, -- 1 fraco
                     -, -- tanto faz
);
subtype std_logic is resolved std_ulogic

resolved -> Existe uma função de resolução para os casos em que existe + de 1 driver para o sinal.

NOTA: para usar std_logic e std_ulogic devem-se acrescentar as seguintes linhas antes da entidade:

library ieee;
use ieee.std_logic_1164.all;
[...]


  • Integer Types

Inteiros na faixa de valores possíveis: () a ()

Exemplo:

variable altura: integer range 0 to 255;


  • Flooting Types

Esse tipo vai de -1.0E38 a 1.0E38, porém são pouco utilizados, por envolverem grande quantidade de recursos.


  • Physical Types

Exemplo:

type time in range - 2147483647 to 2147483647
units
    fs;
    ps = 1000 fs;
    ns = 1000 ps;
    us = 1000 ns;
    ms = 1000 us;
    sec = 1000 ms;
    min = 60 sec;
    hr = 60 min;
end units;


Este tipo relaciona-se diretamente a grandezas físicas

Tipos compostos

  • Array

Exemplo:

type ward is array (15 downto 0) of bit;
signal b: ward;
  • Record

Exemplo:

type iocell is record
    buffer_inp: bitvector (7 downto 0);
    enable: bit;
    buffer_out: bitvector (7 downto 0);
end record;

Exercícios

Parte 1
  1. O que significa CPLD, FPGA e VHDL?
  2. Quais as principais vantagens no uso do VHDL?
  3. Quais as etapas de um ciclo de projeto de sistemas em VHDL?
  4. Qual a diferença entre uma Entidade (entity) e uma Arquitetura (architecture)?
  5. O que são os Ports?
  6. Que tipo de pinos (ports) existem e onde são aplicados?
  7. O que é uma Descrição comportamental?
  8. O que é uma Descrição por fluxo de dados?
  9. O que é uma Descrição estrutural?
  10. Quais são as regras para a formação dos Identificadores?
  11. O que é uma constante?
  12. Qual a diferença de Sinais e de Variáveis?
  13. Quais os tipos de dados disponíveis em VHDL?
Parte 2
  1. Projetar e simular:
    1. Biestável tipo JK com clock e borda de subida, com descrição comportamental.
    2. Idem, com Preset e Clear assíncronos
  2. Realizar o projeto de um contador síncrono, com uma sequência pré-definida em VHDL e simular.
  3. Comentar os códigos abaixo:
  • Código 1
 
library ieee;
use ieee.std_logic_1164.all;

entity FF_D is
	port
	(
		D	: in  std_logic;
		clk	: in  std_logic;
		Q	: out std_logic
	);
end FF_D;

architecture Ex1 of FF_D is
begin
-- Update the register output on the clock's rising edge
process (clk)
begin
	if (rising_edge(clk)) then
		Q <= D;
	end if;
end process;
end Ex1;
  • Código 2
 
library ieee;
use ieee.std_logic_1164.all;
 
ENTITY ff_jk is
    port(j,k,clk: in bit;
         q: out bit);
END ff_jk;
 
ARCHITECTURE teste of ff_jk is
BEGIN

process(clk)
variable temp : bit :='0';
begin
	if( falling_edge(clk) ) then
		if (j='1' and k='0') then
			temp:='1';
		elsif (j='0' and k='1') then
			temp:='0';
		elsif (j='1' and k='1') then
			temp:= not temp;
		else
			temp:=temp;
		end if;
		q<=temp;
	end if;
end process;
END teste;
  • Código 3
 
library ieee;
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all;

entity CONTADOR is
port(
	CLK:	in  std_logic;
    	RESET:	in  std_logic;
	ENABLE:	in  std_logic;
	Q:	out std_logic_vector (3 downto 0)
);
end CONTADOR;

architecture CONTADOR_arq of CONTADOR is 
begin
	process(CLK,RESET)
		variable X: integer range 0 to 15;
	begin
		if (RESET = '1') then
			X := 0;

		elsif (CLK'event and CLK='1') then
			if (ENABLE = '1') then
				X := X + 1;
			end if;
		end if;

		Q <= conv_std_logic_vector(X, 4);

	end process;
end CONTADOR_arq;
Outros Exemplos
  • Código 4: VIGIA
--1 - VIGIA
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Vigia IS
PORT( clk : IN STD_LOGIC;
      SensorA, SensorB : IN STD_LOGIC;
      Multa_Vel, Multa_Comp : OUT STD_LOGIC);
END Vigia;

ARCHITECTURE Intuitiva OF Vigia IS
    TYPE STATE_TYPE IS (Espera,
        Verificando_Velocidade,
        Verificando_Tamanho,
        Multa_Velocidade,
        Multa_Tamanho, 
    Erro);
    SIGNAL Estado: STATE_TYPE;
    SIGNAL Cronometro: INTEGER RANGE 0 to 31;

BEGIN
    PROCESS (clk)
    BEGIN
        IF clk'EVENT AND clk = '1' THEN
            Multa_Vel <= '0';
            Multa_Comp <= '0';
            CASE Estado IS
                WHEN Espera =>
                    IF SensorA = '1' THEN
                        IF SensorB = '0' THEN
                            Estado <= Verificando_Velocidade;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    END IF;
                WHEN Verificando_Velocidade =>
                    IF SensorA = '1' THEN
                        IF SensorB = '0' THEN
                            Cronometro <= Cronometro + 1;
                        ELSE
                            IF Cronometro < 8 OR Cronometro > 24 THEN
                                Estado <= Multa_Velocidade;
                            ELSE
                                Estado <= Verificando_Tamanho;
                            END IF;
                        END IF;
                    ELSE
                        IF SensorB = '0' THEN
                            Estado <= Espera;
                            Cronometro <= 0;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    END IF;
                WHEN Verificando_Tamanho =>
                    IF SensorA = '1' THEN
                        IF SensorB = '1' THEN
                            Cronometro <= Cronometro -1;
                            IF Cronometro = 0 THEN
                                Estado <= Multa_Tamanho;
                            END IF;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    ELSE
                        Estado <= Espera;
                        Cronometro <= 0;
                    END IF;
                WHEN Multa_Velocidade =>
                    Multa_Vel <= '1';
                WHEN Multa_Tamanho =>
                    Multa_Comp <= '1';
                WHEN Erro =>
                    Multa_Vel <= '1';
                Multa_Comp <= '1';
            END CASE;
        END IF;
END PROCESS;
END Intuitiva;
Exemplo 5: RECEPTOR
--2 – RECEPTOR
-- Receptor serial
entity Receptor is
    port( data_in, clock, limpa: in bit;
          pronto, ocupado: out bit;
          data_out: buffer bit_vector(7 downto 0));
end Receptor

architecture Receptor of Receptor is
    TYPE STATE_TYPE IS ( Espera,
                         Start_bit,
                         Recebendo,
                         Pronto);
    SIGNAL Estado: STATE_TYPE;
    SIGNAL Cronometro: INTEGER RANGE 0 to 7;
    SIGNAL Conta_bits: INTEGER RANGE 0 to 7;
process
begin
    if clock'event and clock = '1' then
    CASE Estado IS
        WHEN Espera =>
            IF Data_in = '0'then
                Cronometro <= 0;
                Ocupado <= '1';
                Estado <= Start_bit;
            ELSE
                Ocupado <= '0';
            END IF;
        WHEN Start_bit =>
            IF Cronometro < 4 then
                Cronometro = Cronometro+1;
            ELSE
                Cronômetro = 0;
                Conta_bits =0;
                Estado <= Recebendo;
            END IF;
        WHEN Recebendo =>
            IF Conta_bits < 6 then
                IF Cronometro < 3 then
                    Cronometro = Cronometro+1;
                ELSE
                    Cronômetro = 0;
                    Conta_bits = Conta_bits+1;
                    Data_out(0)<= Data_out(1);
                    Data_out(1)<= Data_out(2);
                    Data_out(2)<= Data_out(3);
                    Data_out(3)<= Data_out(4);
                    Data_out(4)<= Data_out(5);
                    Data_out(5)<= Data_out(6);
                    Data_out(6)<= Data_out(7);
                    Data_out(7)<= Data_in;
                END IF;
            ELSE
                Estado <= Pronto;
                Pronto <= '1';
            END IF;
        WHEN Pronto =>
            IF Limpa = 0 Then
                Ocupado <= '0';
                Pronto <= '0';
                Estado <= Espera;
            END IF;
    END CASE;
    END IF;
end process;
end Receptor;

Referências

[1] https://www.embarcados.com.br/vhdl-basico-parte-1-entidade/

[2] http://www.embarcados.com.br/tutorial-de-modelsim-vhdl-fpga/

[3] https://www.altera.com/products/design-software/model---simulation/modelsim-altera-software.html

[4] Videoaula VHDL




Icone voltar.png Icone menu.png Icone prox.png