SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
VHDL - Introdução

   MO801/MC912
Níveis de Abstração
• Comportamental: Descrição utilizando
  construções de alto nível da linguagem
• RTL: Nível intermediário, inclui
  mapeamento de portas
• Gate Level: Nível de portas lógicas
Definições
• RTL: Register Transfer Level → Nível de
  transferência de registradores
• VHDL RTL: VHDL sintetizável
• Behavioral VHDL: VHDL comportamental
  → Síntese dependente da forma de
  escrita e da ferramenta utilizada
• Definição comum: VHDL RTL é tudo que
  pode ser sintetizável
Ferramentas
• ghdl (Linux)
  – Front-end do gcc para VHDL
• Altera Quartus II (Windows/Linux?)
  – Síntese para FPGA da Altera
• Xilinx ISE (Windows/Linux?)
  – Síntese para FPGA da Xilinx
• Modelsim (Windows/Linux?)
  – Simulador
• Mentor Leonardo ou Precision (Windows/Linux)
  – Síntese para diversos fabricantes
A linguagem
• Baseada em ADA
• Desenvolvida a pedido do departamento
  de defesa americano
• Finalidade original: Especificar os circuitos
  de forma não ambígua
• Padrão IEEE 1076 (1987)
  – Revisão em 1993
  – Revisão em 2000
Construções da Linguagem
• Foco apenas na parte sintetizável
• Não serão gastas muitas aulas nessa
  parte
  – Algum tempo nas construções básicas da
    linguagem
  – Para maiores detalhes, consultar o livro
• Abordagem por exemplos de código e
  descrição de funcionalidades extras
Constantes
constant number_of_bytes : integer := 4;
constant number_of_bits : integer := 8 *
 number_of_bytes;
constant e : real := 2.718281828;
constant prop_delay : time := 3 ns;
constant size_limit, count_limit : integer :=
 255;
Variáveis
variable index : integer := 0;
variable sum, average, largest : real;
variable start, finish : time := 0 ns;
Onde declarar?
architecture exemplo of entidade is
  constant pi : real := 3.14159;
begin
  process is
      variable contador : integer;
  begin
      … -- uso de pi e contador
  end process;
end architecture exemplo;
Tipos
• Declaração de tipos
  type apples is range 0 to 100;
  type oranges is range 0 to 100;
  type grapes is range 100 downto 0;
• O tipo apples é incompatível com oranges
  constant number_of_bits : integer := 32;
  type bit_index is range 0 to number_of_bits-1;
• O valor padrão é o mais a esquerda do
  intervalo
Operadores Aritméticos
+ → soma ou identidade
- → subtração ou negação
* → multiplicação
/ → divisão
mod → módulo
rem → resto da divisão
abs → valor absoluto
** → exponenciação
rem e mod
• A = (A / B) * B + (A rem B)
  5 rem 3 = 2
  (-5) rem 3 = -2
  5 rem (-3) = 2
  (-5) rem (-3) = -2
• A = B * N + (A mod B)
  5 mod 3 = 2
  (-5) mod 3 = 1
  5 mod (-3) = -1
  (-5) mod (-3) = -2
Exemplos de Números
23            0             146
23.1          0.0           3.14159
46E5          1E+12         19e00
1.234E09      98.6E+21      34.0e-08
2#11111101# = 16#FD#      = 16#0fd#
2#0.100#    = 8#0.4#      = 12#0.6#
2#1#E10     = 16#4#E2     = 10#1024#E+00
123_456       3.131_592_6   2#1111_1100_
                            0000_0000#
Ponto Flutuante
• VHDL 2000 exige, no mínimo, 64 bits
• VHDL 87 e VHDL 93 exigem, no mínimo,
  32 bits
  type input_level is range -10.0 to +10.0;
  variable x : input_level;
  variable y : real;
• O valor padrão é o mais a esquerda do
  intervalo
Tipos Físicos
• Um número + uma unidade
  type length is range 0 to 1E9
    units
     um;
     mm = 1000 um;
     m = 1000 mm;
     inch = 25400 um;
     foot = 12 inch;
    end units length;
Tipos Físicos
• Atenção para as unidades
  – Só é possível somar e subtrair tipos da
    mesma unidade
  – Multiplicação e divisão por inteiro ou real
    mantém a unidade
• Uso
  variable distance : length := 100 m;
Tipos Enumerados
• Exemplo
  type alu_funcion is (disable, pass, add,
    subtract, multiply, divide);
  type octal_digit is (‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’);
  type control is (stop, pass);
• Uso
  variable command : alu_function := pass;
  variable status : control := pass;
Caracteres
• VHDL 97 só aceitava ASCII padrão (128
  valores)
  – Gerava problemas, inclusive, com os
    comentários
• VHDL 2000 usa ISO 8859 Latin 1,
  representado com 8 bits
  variable cmd_char, terminator : character;
  cmd_char := ‘P’;
  terminator := cr;
Booleans
type boolean is (false, true);
• Operadores
  – and, or, nand, nor, xor, xnor, not
• and, or, nand e nor fazem lazy evaluation
  (ou short circuit)
  – O segundo operando não será avaliado se o
    primeiro já indicar a resposta
Bits
type bit is (‘0’, ‘1’);
• Todos os operadores lógicos valem para
  bits
• Valores entre aspas simples
  variable switch : bit := ‘0’;
Standard Logic
• Pacote std_logic_1164
type std_ulogic is (
  ‘U’, -- não iniciado (unitialized)
  ‘X’, -- desconhecido (unknow) forte
  ‘0’, -- zero forte
  ‘1’, -- um forte
  ‘Z’, -- alta impedância ou desconectado (tri-state)
  ‘W’, -- desconhecido fraco
  ‘L’, -- zero fraco
  ‘H’, -- um fraco
  ‘-’); -- indiferente (don’t care)
Construtores seqüenciais
• Válidos quando dentro de processos
• Nem todos são sintetizáveis
  – if, case, null, for
  – while, loop, exit, next
if
[if_label:] if expressão_lógica then
   …
elsif expressão_lógica then
   …
else
   …
end if [if_label];
case
[case_label:] case expression is
  when opção1 =>
     …
  when opção2 =>
     …
  when others =>
     …
end case [case_label];
case (Exemplo)
case opcode is
  when load | add | subtract =>
    operand := memory_operand;
  when store | jump | jumpsub | branch =>
    operand := address_operand;
  when others =>
    operand := none;
end case;
case
• Também pode ser indicado intervalo
  when 0 to 9 =>
• Para síntese, é necessário cobrir todas as
  opções
  – Usar others quando em dúvida
  – std_logic tem 9 valores!
null
• Comando nulo
for
[for_label:] for identificador in intervalo loop
   …
end loop [for_label];

• Para hardware, significa replicação
• identificador não precisa ser declarado
  – e não pode ter valor atribuído
for (exemplo)
for count_value in 0 to 127 loop
  count_out <= count_value;
  wait for 5 ns;
end loop;
for (exemplo)
type controller_state is (initial, idle, active,
  error);
…
for state in controller_state loop
  …
end loop;
Vetores
type word is array (0 to 31) of bit;
type word is array (31 downto 0) of bit;
type controller_state is (initial, idle, active,
  error);
type state_counts is array (idle to error) of
  natural;
type matrix is array (1 to 3, 1 to 3) of real;
Valores para vetores
subtype coeff_ram_address is integer range 0 to
  63;
type coeff_array is array (coeff_ram_address) of
  real;
variable coeff : coeff_array := (0 => 1.6, 1 => 2.3,
  2 => 1.6, 3 to 63 => 0.0);
variable coeff: coeff_array := (0 => 1.6, 1 => 2.3,
  others => 0.0);
variable coeff : coeff_array := (0 | 2 => 1.6, 1 =>
  2.3, others => 0.0);
Vetores
type bit_vector is array (natural range <>)
  of bit;
subtype byte is bit_vector(7 downto 0);
type std_ulogic_vector is array (natural
  range <>) of std_ulogic;
variable channel_busy_register :
  bit_vector(1 to 4);
variable current_test : std_ulogic_vector(0
  to 13) := “ZZZZZZZZZZ----”;
Estrutura Básica de um Arquivo
              VHDL
entity and2 is
  port (a, b : in bit;
       c : out bit);
end entity and2;
architecture behavior of and2 is
begin
  c <= a and b;
end architecture behavior;
Estrutura Básica de um Arquivo
               VHDL
entity and2 is
  port (a, b : in bit;
         c : out bit);
end entity and2;
architecture behavior of and2 is
begin
  comb: process (a, b) is
  begin
       c <= a and b;
  end process comb;
end architecture behavior;
Flip-Flop D (entidade)
entity FlipFlopD is
  port (d, clk : in bit;
        q, notq : out bit);
end entity FlipFlopD;
Flip-Flop D (arquitetura)
architecture behavior of FlipFlopD is
  signal state : bit;      tem que incluir
                            state também
begin
  process (clk) is
  begin
      if (clk’event and clk = ‘1’) then
               state <= d;
                                           q <= d;
      end if;
                                           notq <= not d;
      q <= state;
      notq <= not state;
  end process;
end architecture behavior;
Comandos Paralelos
• Executados fora dos processos
• Possuem equivalentes para serem
  executados dentro dos processos
• Cada um tem o seu lugar, não é permitida
  a troca
when (if)
architecture bhv of M is     architecture bhv of M is
begin                        begin
  process (sel, d0, d1) is     z <= d0 when sel = ‘0’
      if (sel = ‘0’) then      else d1;
        z <= d0;             end architecture bhv;
      else
        z <= d1;
      end if;
  end process;
end architecture bhv;
when
architecture bhv of M is
begin
  z <= d0 when sel0 = ‘0’ and sel1 = ‘0’ else
       d1 when sel0 = ‘0’ and sel1 = ‘1’ else
       unaffected when sel0 = ‘1’ and
              sel1 = ‘0’ else
       d2;
end architecture bhv;
select (case)
with alu_function select
 result <= a + b when alu_add | alu_add_u,
           a – b when alu_sub | alu_sub_u,
           a and b when alu_and,
           a or b when alu_or
           a when alu_pass_a;
Exemplo 1
• Circuito para fazer debounce
  – Remove oscilações do circuito

                    Debounce




• Assuma que as oscilações durem menos
  de 5 ciclos de clock
Exemplo 2
• Fazer um contador com 2 botões de
  entrada, um para contar para cima e outro
  para contar para baixo. Use o componente
  de debounce do exemplo anterior.
• Se o botão ficar apertado, o contador não
  deve contar de novo.
Atributos
                           type A is array ( 1 to 4 , 31 downto
• Atributos
                              0) of boolean;

  –   A’left(N)                –   A’left(1) = 1
  –   A’rirht(N)               –   A’rirht(2) = 0
  –   A’low(N)                 –   A’low(1) = 1
  –   A’high(N)                –   A’high(2) = 31
  –   A’range(N)               –   A’range(1) is 1 to 4
  –   A’reverse_range(N)       –   A’reverse_range(2) is 0 to 31
  –   A’length(N)              –   A’length(2) = 32
  –   A’ascending(N)           –   A’ascending(1) = true
                               –   A’ascending(2) = false
Atributos
type resistance is range 0   resistance'left = 0 ohm;
  to 1E9                     resistance'right = 1E9 ohm;
   units                     resistance'low = 0 ohm;
     ohm;                    resistance'high = 1E9 ohm;
     kohm = 1000 ohm;        resistance'ascending = true;
     Mohm = 1000 kohm;       resistance'image(2 kohm) =
   end units resistance;       "2000 ohm";
                             resistance'value("5 Mohm")
                               = 5_000_000 ohm;
Atributos
type set_index_range is range 21     •   logic_level'left = unknown;
   downto 11;                        •   logic_level'right = high;
type logic_level is (unknown, low,
   undriven, high);                  •   logic_level'low = unknown;
                                     •   logic_level'high = high;
•   set_index_range'left = 21;       •   logic_level'ascending = true;
•   set_index_range'right = 11;      •   logic_level'image(undriven) =
•   set_index_range'low = 11;            "undriven";
•   set_index_range'high = 21;       •   logic_level'value("Low") = low;
•   set_index_range'ascending =      •   logic_level'pos(unknown) = 0;
    false;                           •   logic_level'val(3) = high;
•   set_index_range'image(14) =      •   logic_level'succ(unknown) =
    "14";                                low;
•   set_index_range'value("20") =    •   logic_level'pred(undriven) =
    20;                                  low;

Mais conteúdo relacionado

Mais procurados

53297189 apostila-algoritmo-e-logica-i
53297189 apostila-algoritmo-e-logica-i53297189 apostila-algoritmo-e-logica-i
53297189 apostila-algoritmo-e-logica-i
Edvan Mateó
 
Curso De Algoritmo Aula 9
Curso De Algoritmo   Aula 9Curso De Algoritmo   Aula 9
Curso De Algoritmo Aula 9
Felipe Santos
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
Mauro Pereira
 
Videoulas de algoritmos e lógica de programação
Videoulas de algoritmos e lógica de programaçãoVideoulas de algoritmos e lógica de programação
Videoulas de algoritmos e lógica de programação
aldoirjava
 
Conceitos e técnicas de programação aula 3
Conceitos e técnicas de programação aula 3Conceitos e técnicas de programação aula 3
Conceitos e técnicas de programação aula 3
Robson Ferreira
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos
João moreira
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
RUI VIEIRA
 

Mais procurados (20)

53297189 apostila-algoritmo-e-logica-i
53297189 apostila-algoritmo-e-logica-i53297189 apostila-algoritmo-e-logica-i
53297189 apostila-algoritmo-e-logica-i
 
Canais Assíncronos I
Canais Assíncronos ICanais Assíncronos I
Canais Assíncronos I
 
Algoritmos - capítulo 6
Algoritmos - capítulo 6Algoritmos - capítulo 6
Algoritmos - capítulo 6
 
C pic
C picC pic
C pic
 
Curso De Algoritmo Aula 9
Curso De Algoritmo   Aula 9Curso De Algoritmo   Aula 9
Curso De Algoritmo Aula 9
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
 
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
 
Resumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCResumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroC
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Videoulas de algoritmos e lógica de programação
Videoulas de algoritmos e lógica de programaçãoVideoulas de algoritmos e lógica de programação
Videoulas de algoritmos e lógica de programação
 
Apostila c++
Apostila c++Apostila c++
Apostila c++
 
Caderno de exercicios algoritmos-v.1.3
Caderno de exercicios   algoritmos-v.1.3Caderno de exercicios   algoritmos-v.1.3
Caderno de exercicios algoritmos-v.1.3
 
Comandos de Controle de Programa em C
Comandos de Controle de Programa em CComandos de Controle de Programa em C
Comandos de Controle de Programa em C
 
Pic slides
Pic slidesPic slides
Pic slides
 
Estrutura de Dados - Ponteiros
Estrutura de Dados - PonteirosEstrutura de Dados - Ponteiros
Estrutura de Dados - Ponteiros
 
Relatório multiplexadores e decodificadores
Relatório multiplexadores e decodificadoresRelatório multiplexadores e decodificadores
Relatório multiplexadores e decodificadores
 
Conceitos e técnicas de programação aula 3
Conceitos e técnicas de programação aula 3Conceitos e técnicas de programação aula 3
Conceitos e técnicas de programação aula 3
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos
 
Henriquecristovao manual c-cpp
Henriquecristovao manual c-cppHenriquecristovao manual c-cpp
Henriquecristovao manual c-cpp
 

Destaque (20)

3. feladat
3. feladat3. feladat
3. feladat
 
Lyukas Garas
Lyukas GarasLyukas Garas
Lyukas Garas
 
Lyukas Garas
Lyukas GarasLyukas Garas
Lyukas Garas
 
How to make a gel candle
How to make a gel candleHow to make a gel candle
How to make a gel candle
 
5 cosas import
5 cosas import5 cosas import
5 cosas import
 
5 cosas import
5 cosas import5 cosas import
5 cosas import
 
P az
P azP az
P az
 
1 ger imp 2 week 1
1 ger imp 2 week 11 ger imp 2 week 1
1 ger imp 2 week 1
 
Marisol moriano cortes 10.
Marisol moriano cortes 10.Marisol moriano cortes 10.
Marisol moriano cortes 10.
 
Creaciones
CreacionesCreaciones
Creaciones
 
Vocabulary stress video
Vocabulary stress videoVocabulary stress video
Vocabulary stress video
 
P. Clemente - NHAZCA Open Day
P. Clemente - NHAZCA Open Day P. Clemente - NHAZCA Open Day
P. Clemente - NHAZCA Open Day
 
C. Esposito - NHAZCA Open Day
C. Esposito - NHAZCA Open Day C. Esposito - NHAZCA Open Day
C. Esposito - NHAZCA Open Day
 
Blablablaallll
BlablablaallllBlablablaallll
Blablablaallll
 
Vacances a Cantàbria
Vacances a CantàbriaVacances a Cantàbria
Vacances a Cantàbria
 
Dj
DjDj
Dj
 
Articel down syndrome
Articel down syndromeArticel down syndrome
Articel down syndrome
 
Musik Itu Terserah
Musik Itu TerserahMusik Itu Terserah
Musik Itu Terserah
 
Mentes creativas manos activas
Mentes creativas manos activasMentes creativas manos activas
Mentes creativas manos activas
 
Idilica portfolio prezentation04
Idilica portfolio prezentation04Idilica portfolio prezentation04
Idilica portfolio prezentation04
 

Semelhante a Vhdl

Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
Fabio Souza
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptx
LuanDev1
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
Jocelma Rios
 

Semelhante a Vhdl (20)

Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
 
Resumo Linguagem C
Resumo Linguagem CResumo Linguagem C
Resumo Linguagem C
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptx
 
Debugging tips and tricks
Debugging tips and tricksDebugging tips and tricks
Debugging tips and tricks
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-C
 
Aula de C e C++
Aula de C e C++Aula de C e C++
Aula de C e C++
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcional
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
 
Estruturação de Linguagens de Programação (Pascal e C++)
Estruturação de Linguagens de Programação (Pascal e C++)Estruturação de Linguagens de Programação (Pascal e C++)
Estruturação de Linguagens de Programação (Pascal e C++)
 
Python: a primeira mordida
Python: a primeira mordidaPython: a primeira mordida
Python: a primeira mordida
 
Py sintaxe
Py sintaxePy sintaxe
Py sintaxe
 
Arduino - iniciação à linguagem C (entradas e saídas digitais)
Arduino - iniciação à linguagem C (entradas e saídas digitais)Arduino - iniciação à linguagem C (entradas e saídas digitais)
Arduino - iniciação à linguagem C (entradas e saídas digitais)
 
Introdução à Linguagem Ruby
Introdução à Linguagem RubyIntrodução à Linguagem Ruby
Introdução à Linguagem Ruby
 
Unidade7 1
Unidade7 1Unidade7 1
Unidade7 1
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Aula 3-lógica.pptx
Aula 3-lógica.pptxAula 3-lógica.pptx
Aula 3-lógica.pptx
 
Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
Microcontroladores ARM Cortex M0+ Aplicação em robôs autoguiados - Resumo de ...
 

Vhdl

  • 1. VHDL - Introdução MO801/MC912
  • 2. Níveis de Abstração • Comportamental: Descrição utilizando construções de alto nível da linguagem • RTL: Nível intermediário, inclui mapeamento de portas • Gate Level: Nível de portas lógicas
  • 3. Definições • RTL: Register Transfer Level → Nível de transferência de registradores • VHDL RTL: VHDL sintetizável • Behavioral VHDL: VHDL comportamental → Síntese dependente da forma de escrita e da ferramenta utilizada • Definição comum: VHDL RTL é tudo que pode ser sintetizável
  • 4. Ferramentas • ghdl (Linux) – Front-end do gcc para VHDL • Altera Quartus II (Windows/Linux?) – Síntese para FPGA da Altera • Xilinx ISE (Windows/Linux?) – Síntese para FPGA da Xilinx • Modelsim (Windows/Linux?) – Simulador • Mentor Leonardo ou Precision (Windows/Linux) – Síntese para diversos fabricantes
  • 5. A linguagem • Baseada em ADA • Desenvolvida a pedido do departamento de defesa americano • Finalidade original: Especificar os circuitos de forma não ambígua • Padrão IEEE 1076 (1987) – Revisão em 1993 – Revisão em 2000
  • 6. Construções da Linguagem • Foco apenas na parte sintetizável • Não serão gastas muitas aulas nessa parte – Algum tempo nas construções básicas da linguagem – Para maiores detalhes, consultar o livro • Abordagem por exemplos de código e descrição de funcionalidades extras
  • 7. Constantes constant number_of_bytes : integer := 4; constant number_of_bits : integer := 8 * number_of_bytes; constant e : real := 2.718281828; constant prop_delay : time := 3 ns; constant size_limit, count_limit : integer := 255;
  • 8. Variáveis variable index : integer := 0; variable sum, average, largest : real; variable start, finish : time := 0 ns;
  • 9. Onde declarar? architecture exemplo of entidade is constant pi : real := 3.14159; begin process is variable contador : integer; begin … -- uso de pi e contador end process; end architecture exemplo;
  • 10. Tipos • Declaração de tipos type apples is range 0 to 100; type oranges is range 0 to 100; type grapes is range 100 downto 0; • O tipo apples é incompatível com oranges constant number_of_bits : integer := 32; type bit_index is range 0 to number_of_bits-1; • O valor padrão é o mais a esquerda do intervalo
  • 11. Operadores Aritméticos + → soma ou identidade - → subtração ou negação * → multiplicação / → divisão mod → módulo rem → resto da divisão abs → valor absoluto ** → exponenciação
  • 12. rem e mod • A = (A / B) * B + (A rem B) 5 rem 3 = 2 (-5) rem 3 = -2 5 rem (-3) = 2 (-5) rem (-3) = -2 • A = B * N + (A mod B) 5 mod 3 = 2 (-5) mod 3 = 1 5 mod (-3) = -1 (-5) mod (-3) = -2
  • 13. Exemplos de Números 23 0 146 23.1 0.0 3.14159 46E5 1E+12 19e00 1.234E09 98.6E+21 34.0e-08 2#11111101# = 16#FD# = 16#0fd# 2#0.100# = 8#0.4# = 12#0.6# 2#1#E10 = 16#4#E2 = 10#1024#E+00 123_456 3.131_592_6 2#1111_1100_ 0000_0000#
  • 14. Ponto Flutuante • VHDL 2000 exige, no mínimo, 64 bits • VHDL 87 e VHDL 93 exigem, no mínimo, 32 bits type input_level is range -10.0 to +10.0; variable x : input_level; variable y : real; • O valor padrão é o mais a esquerda do intervalo
  • 15. Tipos Físicos • Um número + uma unidade type length is range 0 to 1E9 units um; mm = 1000 um; m = 1000 mm; inch = 25400 um; foot = 12 inch; end units length;
  • 16. Tipos Físicos • Atenção para as unidades – Só é possível somar e subtrair tipos da mesma unidade – Multiplicação e divisão por inteiro ou real mantém a unidade • Uso variable distance : length := 100 m;
  • 17. Tipos Enumerados • Exemplo type alu_funcion is (disable, pass, add, subtract, multiply, divide); type octal_digit is (‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’); type control is (stop, pass); • Uso variable command : alu_function := pass; variable status : control := pass;
  • 18. Caracteres • VHDL 97 só aceitava ASCII padrão (128 valores) – Gerava problemas, inclusive, com os comentários • VHDL 2000 usa ISO 8859 Latin 1, representado com 8 bits variable cmd_char, terminator : character; cmd_char := ‘P’; terminator := cr;
  • 19. Booleans type boolean is (false, true); • Operadores – and, or, nand, nor, xor, xnor, not • and, or, nand e nor fazem lazy evaluation (ou short circuit) – O segundo operando não será avaliado se o primeiro já indicar a resposta
  • 20. Bits type bit is (‘0’, ‘1’); • Todos os operadores lógicos valem para bits • Valores entre aspas simples variable switch : bit := ‘0’;
  • 21. Standard Logic • Pacote std_logic_1164 type std_ulogic is ( ‘U’, -- não iniciado (unitialized) ‘X’, -- desconhecido (unknow) forte ‘0’, -- zero forte ‘1’, -- um forte ‘Z’, -- alta impedância ou desconectado (tri-state) ‘W’, -- desconhecido fraco ‘L’, -- zero fraco ‘H’, -- um fraco ‘-’); -- indiferente (don’t care)
  • 22. Construtores seqüenciais • Válidos quando dentro de processos • Nem todos são sintetizáveis – if, case, null, for – while, loop, exit, next
  • 23. if [if_label:] if expressão_lógica then … elsif expressão_lógica then … else … end if [if_label];
  • 24. case [case_label:] case expression is when opção1 => … when opção2 => … when others => … end case [case_label];
  • 25. case (Exemplo) case opcode is when load | add | subtract => operand := memory_operand; when store | jump | jumpsub | branch => operand := address_operand; when others => operand := none; end case;
  • 26. case • Também pode ser indicado intervalo when 0 to 9 => • Para síntese, é necessário cobrir todas as opções – Usar others quando em dúvida – std_logic tem 9 valores!
  • 28. for [for_label:] for identificador in intervalo loop … end loop [for_label]; • Para hardware, significa replicação • identificador não precisa ser declarado – e não pode ter valor atribuído
  • 29. for (exemplo) for count_value in 0 to 127 loop count_out <= count_value; wait for 5 ns; end loop;
  • 30. for (exemplo) type controller_state is (initial, idle, active, error); … for state in controller_state loop … end loop;
  • 31. Vetores type word is array (0 to 31) of bit; type word is array (31 downto 0) of bit; type controller_state is (initial, idle, active, error); type state_counts is array (idle to error) of natural; type matrix is array (1 to 3, 1 to 3) of real;
  • 32. Valores para vetores subtype coeff_ram_address is integer range 0 to 63; type coeff_array is array (coeff_ram_address) of real; variable coeff : coeff_array := (0 => 1.6, 1 => 2.3, 2 => 1.6, 3 to 63 => 0.0); variable coeff: coeff_array := (0 => 1.6, 1 => 2.3, others => 0.0); variable coeff : coeff_array := (0 | 2 => 1.6, 1 => 2.3, others => 0.0);
  • 33. Vetores type bit_vector is array (natural range <>) of bit; subtype byte is bit_vector(7 downto 0); type std_ulogic_vector is array (natural range <>) of std_ulogic; variable channel_busy_register : bit_vector(1 to 4); variable current_test : std_ulogic_vector(0 to 13) := “ZZZZZZZZZZ----”;
  • 34. Estrutura Básica de um Arquivo VHDL entity and2 is port (a, b : in bit; c : out bit); end entity and2; architecture behavior of and2 is begin c <= a and b; end architecture behavior;
  • 35. Estrutura Básica de um Arquivo VHDL entity and2 is port (a, b : in bit; c : out bit); end entity and2; architecture behavior of and2 is begin comb: process (a, b) is begin c <= a and b; end process comb; end architecture behavior;
  • 36. Flip-Flop D (entidade) entity FlipFlopD is port (d, clk : in bit; q, notq : out bit); end entity FlipFlopD;
  • 37. Flip-Flop D (arquitetura) architecture behavior of FlipFlopD is signal state : bit; tem que incluir state também begin process (clk) is begin if (clk’event and clk = ‘1’) then state <= d; q <= d; end if; notq <= not d; q <= state; notq <= not state; end process; end architecture behavior;
  • 38. Comandos Paralelos • Executados fora dos processos • Possuem equivalentes para serem executados dentro dos processos • Cada um tem o seu lugar, não é permitida a troca
  • 39. when (if) architecture bhv of M is architecture bhv of M is begin begin process (sel, d0, d1) is z <= d0 when sel = ‘0’ if (sel = ‘0’) then else d1; z <= d0; end architecture bhv; else z <= d1; end if; end process; end architecture bhv;
  • 40. when architecture bhv of M is begin z <= d0 when sel0 = ‘0’ and sel1 = ‘0’ else d1 when sel0 = ‘0’ and sel1 = ‘1’ else unaffected when sel0 = ‘1’ and sel1 = ‘0’ else d2; end architecture bhv;
  • 41. select (case) with alu_function select result <= a + b when alu_add | alu_add_u, a – b when alu_sub | alu_sub_u, a and b when alu_and, a or b when alu_or a when alu_pass_a;
  • 42. Exemplo 1 • Circuito para fazer debounce – Remove oscilações do circuito Debounce • Assuma que as oscilações durem menos de 5 ciclos de clock
  • 43. Exemplo 2 • Fazer um contador com 2 botões de entrada, um para contar para cima e outro para contar para baixo. Use o componente de debounce do exemplo anterior. • Se o botão ficar apertado, o contador não deve contar de novo.
  • 44. Atributos type A is array ( 1 to 4 , 31 downto • Atributos 0) of boolean; – A’left(N) – A’left(1) = 1 – A’rirht(N) – A’rirht(2) = 0 – A’low(N) – A’low(1) = 1 – A’high(N) – A’high(2) = 31 – A’range(N) – A’range(1) is 1 to 4 – A’reverse_range(N) – A’reverse_range(2) is 0 to 31 – A’length(N) – A’length(2) = 32 – A’ascending(N) – A’ascending(1) = true – A’ascending(2) = false
  • 45. Atributos type resistance is range 0 resistance'left = 0 ohm; to 1E9 resistance'right = 1E9 ohm; units resistance'low = 0 ohm; ohm; resistance'high = 1E9 ohm; kohm = 1000 ohm; resistance'ascending = true; Mohm = 1000 kohm; resistance'image(2 kohm) = end units resistance; "2000 ohm"; resistance'value("5 Mohm") = 5_000_000 ohm;
  • 46. Atributos type set_index_range is range 21 • logic_level'left = unknown; downto 11; • logic_level'right = high; type logic_level is (unknown, low, undriven, high); • logic_level'low = unknown; • logic_level'high = high; • set_index_range'left = 21; • logic_level'ascending = true; • set_index_range'right = 11; • logic_level'image(undriven) = • set_index_range'low = 11; "undriven"; • set_index_range'high = 21; • logic_level'value("Low") = low; • set_index_range'ascending = • logic_level'pos(unknown) = 0; false; • logic_level'val(3) = high; • set_index_range'image(14) = • logic_level'succ(unknown) = "14"; low; • set_index_range'value("20") = • logic_level'pred(undriven) = 20; low;