Docstoc

Transpar ncias sobre VHDL

Document Sample
Transpar ncias sobre VHDL Powered By Docstoc
					         ==   VHDL ==
Vhsic Hardware Description Language
             Versão 24/10/2003

          Manuel Lois Anido - NCE/UFRJ

                                         1
                               Bibliografia
 Disponível no Help On-line de um dos ambientes a ser usado
  (Aldec, Xilinx, Altera, Modelsim, Warp, etc)

 Na página da Disciplina ( http://equipe.nce.ufrj.br/adriano/circlog)
     Cópia das Transparências do Professor (Formato Power Point)
     Resumo de Dicas VHDL em formato Word 97.
     Notas de aula sobre o uso das Ferramentas Warp e Active-HDL Sim

 Livros:
     “Digital Design and Modeling with VHDL and Synthesis”, K.C. Chang
           IEEE Computer Society - Melhor Livro - Biblioteca NCE

     “The VHDL Cookbook” - Peter J. Ashenden
           Disponível na Web: www.ecsi.org/EARNEST/digests/VHDL_cookbook

     “VHDL for Programmable Logic” - Kevin Skahill
           Addison Wesley Publishers, 1996 - Biblioteca NCE
           Vem com CD-ROM WARP da Cypress e Simulador Active-VHDL - Público

 Lista de Discussão da Disciplina: circlog@dcc.ufrj.br (subscrever a lista)

                                                                               2
  VHDL

Introdução




             3
                               VHDL- Introdução
   VHDL :
       Very high speed integrated circuit (Demanda Gov. USA, 1980,1983- Progr. VHSIC)
       Hardware
       Description
       Language
   Linguagem de alto nível conhecida por permitir:
     A modelagem de projetos eletrônicos complexos (especificações).

     A simulação dos modelos de componentes.

     A síntese lógica, ou seja, ferramentas pegam a descrição em VHDL e geram
      uma lista otimizada de portas lógicas e registros que pode ser sintetizada.

   Linguagem padronizada (IEEE Std 1076-1987 e 1076/93)

   Para uma boa descrição (e futura síntese do circuito) em VHDL
    recomenda-se ter em mente a implementação em Hardware.
                                                                                   4
                             VHDL - Introdução


 Modelagem de circuitos eletrônicos complexos.

    Linguagem de alto nível facilitando a descrição do comportamento dos
     modelos.

    Forte nível de abstração. A possibilidade de implementar fisicamente o
     projeto não é necessariamente levada em conta neste nível
     (comportamental).

    A partição em vários elementos permite dividir um modelo complexo em um
     número de elementos mais simples de desenvolver separadamente.




                                                                              5
                            VHDL - Introdução

 Programação
   Programação em VHDL é semelhante à programação procedural usual, mas
    com alguns conceitos novos.


      CÓDIGO         COMPILADOR        BIBLIOTECA        SIMULADOR
      FONTE             VHDL           COMPONENT            VHDL
       VHDL



   A noção de atraso (delay) e ambiente de simulação são dois conceitos
    novos em VHDL. VHDL também suporta concorrência e netlisting de
    componentes, que não são comuns em linguagens de programação.

   VHDL suporta concorrência usando o conceito de sentenças concorrentes
    rodando em tempo de simulação (este é o modo default da linguagem). Em
    VHDL também existem sentenças sequenciais para descrever
    comportamento algorítmico (especificadas dentro de um Process).

   Em VHDL, hierarquia de projeto é realizada compilando componentes
    separadamente e instanciando-os num componente de mais alto nível.
                                                                           6
                            VHDL - Introdução


 Simulação        (1):
   VHDL possui um conjunto de instruções particularmente potente para:
      Geração de estímulos
      Captura de resultados.

   Os modelos de comportamento (especificações) são simulados com a
    finalidade de verificar sua coerência.

   O conjunto de modelos de comportamento + arquivos de simulação
    constituem por sua vez uma especificação e um meio de verificação.

   O comportamento de um modelo e de sua realização física deveriam ser
    idênticos.



                                                                           7
                            VHDL - Introdução
   Simulação (2):
     A descrição de um projeto ou modelo, escrito em VHDL, é normalmente
      rodada num simulador VHDL para demonstrar o comportamento do sistema
      modelado. O fato de se ter um simulador associado é uma característica
      marcante de se trabalhar em VHDL.

     A linguagem VHDL suporta a descrição de vetores de teste (estímulos) para
      executar a simulação e a captura dos resultados.
    MAQ. ESTADOS
                                                                   ARQUIVO
                                    ARQUIVO
                                                                    SAÍDA
                                    ESTÍMULO

                    COMPILADOR                    SIMULADOR
                       VHDL                          VHDL
                                                                  GRAFICADOR

      CÓDIGO
      FONTE                        BIBLIOTECA
       VHDL                        COMPONENT



                                                                             8
                          VHDL - Introdução

 Síntese     lógica:
   Converte uma descrição HDL de um bloco na descrição de um circuito
    (estrutural - tal como esquemático) com portas lógicas e registros
    interligados, fazendo o maior número de otimizações possível. Síntese
    Lógica não é aplicável a blocos tais como RAMs, ROMs, PLAs e
    “Datapaths”, por duas razões: velocidade e área.

   Usa somente uma parte reduzida do conjunto de instruções da linguagem
    VHDL. Numerosas construções utilizáveis em modelos ou em simulação
    geram uma sintetização muito ruim (consomem muitos gates) ou não são
    diretamente sintetizáveis.

   As construções suportadas variam segundo as ferramentas.


 Síntese     de Alto Nível:
   Converte uma descrição funcional (tal como em “C” ou Pascal) numa
    descrição com portas lógicas e registros (ou direto layout). É menos
    eficiente que síntese lógica. Compiladores de Silício.
                                                                            9
                            VHDL - Introdução

 Uso      de Bibliotecas:
     A linguagem VHDL consiste de diversas partes (assim como outras
      linguagens), algumas embutidas e outras que são adicionadas usando
      Packages. Estas partes são listadas abaixo:

       Declarações adicionais de tipos de dados no Package STANDARD.
       Algumas funções utilitárias de I/O no Package TEXTIO
       Alguns tipos de dados para simulação no Package STD_LOGIC_1164.
       Algumas bibliotecas e Packages de fornecedores.
       Bibliotecas e Packages do usuário.


   Exemplos:
     Biblioteca IEEE : Package STD_LOGIC_1164 e Package STD_LOGIC_ARITH

     Biblioteca STD : Package TEXTIO e Package STANDARD



                                                                           10
                              VHDL - Introdução
   Projeto Top-Down:
     Uma descrição VHDL pode ser escrita em vários níveis de abstração.
        Algorítmico (comportamental)

        Transferência de Registros

        Funcional a nível de portas lógicas com atraso unitário

        Nível de portas lógicas com atrasos detalhados

     Na metodologia Top-Down, o projetista começa com um nível de abstração
      mais elevado e simula o sistema. Posteriormente, ele pode descrevê-lo em
      maior detalhe e voltar a simulá-lo. Um exemplo é o uso do operador “+”.

     Na hora em que usamos um operador “+” (e.g. “b+c”), abstraimos-nos do
      tipo de somador que é usado. Poderíamos definir um operador “plus16”
      que definiria uma soma inteira em 16 bits (“plus16 (b,c)”).



                                                                           11
         VHDL




        VHDL

Características Marcantes




                            12
                     VHDL - Características Marcantes
   VHDL - Estrutura
     Entity - Representa algo físico (subsistema, placa, chip, etc) - Os sinais de interface
      de um projeto são descritos na entidade.
     Architecture - Esta Unit descreve o comportamento do projeto.
     Package - Armazena certas especificações frequentemente usadas.
     Configuration - Permite selecionar uma variação de um projeto de uma biblioteca.

            Projeto VHDL
            Arquivos VHDL
               Packages                               Configurações
               Declaram constantes, tipos de          Definem as configurações
               dados, componentes, e                  específicas de componentes
               subprogramas usados por
               diversos projetos e/ou entidades


               Especificações de                      Arquiteturas
               Entidades                              Definem as implementações das
               Definem as interfaces das              entidades
               entidades



                                                                                          13
                  VHDL - Características Marcantes

   VHDL permite:
     Definir os “ports” de entrada/saída do
      conjunto lógico descritivo (ENTITY).
      Sinais simples ou na forma de “bus”.     Entidade

                                                 Declaração da Entidade
     Definir um modelo de comportamento
      (ARCHITECTURE) usando o conjunto           Declaração da Interface
      de instruções. Dependendo das
      ferramentas de síntese e simulação,
                                                  Corpo da Arquitetura
      podem ser usados os modelos
      comportamental, estrutural e fluxo de        Definição Funcional
      dados (data flow).

     Unir os diferentes módulos descritos
      separadamente.
      (Gerência de hierarquía, VHDL
      estrutural).


                                                                           14
                        VHDL - Características Marcantes

   Entidade (1)
     Declaração

      entity somador4 is port(
                                                                   a [3:0]   vem1
       a, b : in std_logic_vector (3 downto 0);
                                                                             soma [3:0]
       vem1 : in std_logic;
                                                                   b [3:0]          vai1
       soma: out std_logic_vector (3 downto 0);
       vai1 : out std_logic);                                          somador4
      end somador4;
                                                            MODE                           MODE
     Ports e Modos                                          In
                                                                                           Out

        Cada sinal de I/O numa entidade é um PORT, que é
         análogo a um pino num diagrama esquemático.
                                                                                           Buffer

        Modos
            In - Os dados fluem só p/dentro da entidade
                                                             In                            Inout
            Out - Saída somente. Não há realimentação

            Buffer - Permite realimentação mas não há       In
             dados bidirecionais.
                                                                                            Out
            Inout - Para sinais bidirecionais

                                                                                           15
                        VHDL - Características Marcantes
   Entidade (2)
     Tipos de dados para Ports
       Existem diversos tipos de dados, que estão disponíveis em diferentes “packages”.
       Alguns tipos facilitam o trabalho de simulação mas não são aplicáveis à síntese.

       Os tipos do padrão IEEE 1076/93, que são os mais úteis, bem suportados por
       ferramentas e que são aplicáveis à síntese são:
       boolean, bit, bit_vector e integer.

       Os tipos mais úteis e mais bem suportados do “package” IEEE std_logic_1164 para
       síntese são os tipos std_ulogic e std_logic e arrays destes tipos. Como os
       nomes indicam, “standard logic” é direcionado a ser um tipo standard usado para
       descrever circuitos para síntese e simulação.
       Package                               Tipos de Dados
       STD_LOGIC_1164                        Std_logic, std_logic_vector, std_ulogic
       STD_LOGIC_ARITH                       Signed, unsigned
       TEXTIO                                File, Line
       STANDARD                              Boolean, bit, character, time, string,
                                             bit_vector, natural, positive
       VHDL Language                         Integer, real
                                                                                     16
                           VHDL - Características Marcantes

   Arquitetura - Estrutura e Principais Características
     Toda Arquitetura está associada a uma Entidade (é uma parelha).
     Uma arquitetura descreve o funcionamento de uma entidade.
     VHDL permite descrever o funcionamento do sistema usando vários estilos de
      arquitetura.

        ARQUITETURA
        Declarações
        Declara sinais para comunicar entre sentenças concorrentes e entre sentenças concorrentes e
        portas da interface. Nem todas as arquiteturas contém todas as construções mostradas.


          Blocos                                        SENTENÇAS CONCORRENTES
          Sentenças concorrentes grupadas              Instanciação de Componentes
                                                       Criar uma instância de outra entidade
          Atribuições a Sinais
          Computa valores e atribui-os a sinais
                                                       Processos
          Procedure Calls                              Definem um novo algoritmo
          Invocam um algoritmo pré-definido

                                                                                                17
                          VHDL - Características Marcantes
   Arquitetura - Descrição Comportamental
        library ieee;
        use ieee.std_logic_1164.all;
        entity comparador4 is port (
           a, b : in std_logic_vector (3 downto 0);
           igual : out std_logic );
        end comparador4;

        architecture behavioral of comparador4 is         ( Descrição Algorítmica
        begin                                             ou High-Level )
        comp: process (a, b)
          begin
                  if a=b then
                                                               COMPARADOR4
                                                      4
                      igual <= “1”;                        a                        1
                  else
                                                                         igual
                      igual <= “0”;                   4
                  end if;                                  b
          end process comp;
        end behavioral;
                                                                                        18
                          VHDL - Características Marcantes
   Arquitetura - Descrição Dataflow
                                                      A arquitetura é “dataflow” porque ela
        library ieee;                                 especifica como os dados serão
                                                      transferidos de sinal para sinal e de
        use ieee.std_logic_1164.all;                  entrada para saída, sem o uso de
        entity comparador4 is port (                  sentenças sequenciais (fora de process)
           a, b : in std_logic_vector (3 downto 0);
                                                      ESCREVENDO DE OUTRA FORMA :
           igual : out std_logic );
                                                      library ieee;
        end comparador4;
                                                      use ieee.std_logic_1164.all;
                                                      entity comparador4 is port (
        architecture dataflow of comparador4 is
                                                         a, b : in std_logic_vector (3 downto 0);
        begin
                                                         igual : out std_logic );
            igual <= „1‟ when (a = b) else „0‟;
                                                      end comparador4;
        end dataflow;
                                                      architecture dataflow of comparador4 is
                COMPARADOR4                           begin
       4                                                igual <=          not(a(0) xor b(0))
            a                           1                         and     not(a(1) xor b(1))
                             igual                                and     not(a(2) xor b(2))
       4                                                          and     not(a(3) xor b(3));
            b
                                                      end dataflow;
                                                                                                19
                          VHDL - Características Marcantes
   Arquitetura - Descrição Estrutural                                   COMPARADOR4
                                                                 4
        library ieee;                                                a
                                                                                           1
        use ieee.std_logic_1164.all;
        entity comparador4 is port (
                                                                                  igual
                                                                 4
           a, b : in std_logic_vector (3 downto 0);                  b
           igual : out std_logic );
        end comparador4;
                                                                         COMPARADOR4
                                                            a(3:0)

        use work.gatespkg.all;                             b(3:0)
                                                                         a0
        architecture struct of comparador4 is
                                                                         b0
           signal x : std_logic_vector (0 to 3);
                                                                         a1
        begin
          u0 : xnor2 port map (a(0), b(0), x(0));                        b1               igual
          u1 : xnor2 port map (a(1), b(1), x(1));                        a2
          u2 : xnor2 port map (a(2), b(2), x(2));                        b2
          u3 : xnor2 port map (a(3), b(3), x(3));
                                                                         a3
          u4 : and4 port map (x(0), x(1), x(2), x(3),igual);
                                                                         b3
        end struct;


                                                                                           20
                      VHDL - Características Marcantes
   Modelando p/ Síntese x Modelando p/ Simulação

     A linguagem VHDL possui diversas construções que são mais
      orientadas à simulação e à verificação do que à síntese.

     Entender como um simulador VHDL processa o código ajuda a clarificar
      a semântica de algumas sentenças VHDL e assim permitir escrever
      código mais adequado.

     Uma codificação não adequada ao objetivo final pode levar à frustração
      com relação às ferramentas de síntese e de simulação.

     A princípio, o código VHDL usado para simulação e para síntese do
      circuito deveria ser o mesmo. No entanto, pode ser desejável para uma
      primeira simulação do sistema usar um código VHDL que não é
      sintetizável, mas que permite uma rápida codificação e simulação.




                                                                               21
                        VHDL - Características Marcantes
   As noções de Atraso e Tempo de Simulação (1)
     Embora VHDL seja similar a uma linguagem de programação procedural, ela
      possui diferenças marcantes. Entre estas diferenças estão a noção de
      atraso e o tempo de simulação (do ambiente de simulação).
     Exemplo1:
        processo_P1 : process (a, b, c)
          begin
                x <= a and b and c;
          end process;
          Este processo executará quando ocorrer uma mudança no valor dos sinais a, b
          ou c. A sentença x <= a and b and c sendo avaliada no tempo de simulação
          corrente Tc, é escalonada para atribuição a x, um atraso delta () no tempo de
          simulação Tc+ . O atraso  é infinitesimal e implica um (1) ciclo do simulador.
     Exemplo2:
       processo_P2 : process (a, b, c)
         begin
              x <= a and b and c after 5 ns;
         end process;
          No exemplo 2 x é escalonado para mudar, 5ns após mudança em a, b ou c.

          O exemplo 1 é sintetizável e o exemplo 2 não é (usado para simulação).

                                                                                      22
                             VHDL - Características Marcantes
   As noções de Atraso e Tempo
    de Simulação (2)
    Processo P1 está escalonado para executar
       em Tc= 5ns



                     Lista de Sensibilidades
                                                             a

    Processo_P1 : process (a, b, c)                          b
       begin
         x <= „0‟;                                           c
         if (a = b or c = „1‟ ) then
             x <= „1‟;                                       x
         end if;                                      
    end process Processo_P1;
                                                                  5ns       10ns        15ns

                                                                       x   („0‟,5ns („1‟, 5ns +  )

                                             Tc=5ns       Tc=5ns + 
    NOTA: No gráfico da forma de onda, só a
      transição em „a‟ dispara o processo. x<= „0‟        x <= „1‟
      Embora em T=10ns, „c‟ esteja em „1‟, ele
      não dispara o processo P1 pois não
      transiciona. Em T=15ns c dispara mas
      avalia falso o if.
                                                                                                      23
                             VHDL - Características Marcantes
   O Modelo de Tempo
                                                INICIALIZAÇÃO
    com Eventos Discretos           •Inicializar Sinais,
                                    •Tempo de Simulação=0
                                    •Executa cada módulo
                                    •Se resultam transições, elas são escalonadas
    Não Ocorreram
    Eventos em Sinais
                                 1o ESTÁGIO DE UM CICLO DE SIMULAÇÃO
                              • Avança Tempo de Simulação para o primeiro tempo (mais
                              cedo) em que haja transição escalonada.
                              •Executa Todas as transições escalonadas para aquele
                              tempo. Isto pode causar eventos ocorrerem -> 2o estágio
    Executou Todos os
    módulos e há mais                        Ocorreram Eventos em Sinais
    Transições Escalonadas
                                 2o ESTÁGIO DE UM CICLO DE SIMULAÇÃO
    Ainda não Executou
    Todos os Módulos e há     • Todos os módulos que reagem a eventos do 1o estágio são
                              executados.
    Transições Escalonadas
                              •Tais módulos normalmente escalonarão mais transições
                              em seus sinais de saída.

                                                          Não há mais Transições Escalonadas
                                                        FIM
                                                                                               24
                               VHDL - Características Marcantes
   A Noção de Sentenças Concorrentes                                            u       („0‟, 0ns)

    Quando estão fora de um process, a                                           v       („0‟, 0ns)
    atualização dos sinais de uma arquitetura                                    w       („0‟, 0ns)
    funciona de modo concorrente. A ordem de
                                                                                 x       („0‟, 0ns)
    aparecimento e execução das sentenças não
                                                                                 y       („0‟, 0ns)
    é importante.
                                  Para mostrar que a ordem não importa,          z       („0‟, 0ns)       („1‟, 0ns+)
                                  será executado do último para o primeiro
    entity Test_sinais is port (                                                                 INICIALIZAÇÃO
          a, b, c, d:       in bit;
          u, v, w, x, y, z: buffer bit); Ciclo   ns         a     b     c   d   u   v      w         x     y      z
                                         Sim
    end Test_sinais;
                                          1      000   +0    0     0     0   0   0   0       0        0     0      0
                                                 000   +1    0     0     0   0   0   0       0        0     0      1
    architecture Arquitet_1 of            2      100   +0    1     0     0   0   0   0       0        0     0      1
                Test_sinais is            3      200   +0    1     1     0   0   0   0       0        0     0      1
                                                 200   +1    1     1     0   0   1   0       0        0     0      1
    begin                                        200   +2    1     1     0   0   1   0       0        1     0      1
       z <= not y;                               200   +3    1     1     0   0   1   0       0        1     1      1
       y <= w or x;                              200   +4    1     1     0   0   1   0       0        1     1      0
       x <= u or v;                       4      300   +0    0     1     0   0   1   0       0        1     1      0
       w <= u and v;                             300   +1    0     1     0   0   0   0       0        1     1      0
       v <= c or d;                              300   +2    0     1     0   0   0   0       0        0     1      0
       u <= a and b;                             300   +3    0     1     0   0   0   0       0        0     0      0
    end Arquitet_1;                              300   +4    0     1     0   0   0   0       0        0     0      1
                                          5      400   +0    0     0     0   0   0   0       0        0     0      1

                                                                                                                 25
                    VHDL - Características Marcantes
   Concorrência entre Processos e
    Sequenciamento dentro de Processos
            ARQUITETURA
                    Sentença_1
                    Sentença_2
                    Processo_A                  Dentro da Arquitetura as sentenças
                      execução                  são concorrentes.
                     sequencial                 Os processos são concorrentes entre
                                                si e com as sentenças.
                    Processo_B
                                                Dentro dos processos as sentenças
                      execução                  executam sequencialmente.
                     sequencial

                    Processo_C
                                                          NOTAS:
                      execução
                     sequencial        1 - Fora do processo os sinais mudam de
                                       estado na hora da atribuição (só esperam os
                                       delta infinitesimais da resolução das
                                       dependências para mudar de estado)
                                       2 - Dentro do processo os sinais só mudam de
                                       estado ao final do processo e não na hora da
                                       atribuição.
                                                                                 26
                              VHDL - Características Marcantes
   Drivers Múlltiplos e Funções de Resolução                                           ÚTIL PARA SIMULAR
     VHDL não permite um sinal ter mais de um driver, a                                  BARRAMENTOS
      menos que tenha uma função de resolução associada.
       architecture ComErro of proj1 is                                                 a
                                                                                                           y
       begin                                                                            b
         y <= a and b;
         y <= a or b;
       end ComErro;

           Função de Resolução (Resolve o Conflito):
       function calcula_valor (a, b : X01) return X01 is                   a    b     a AND b         a OR b    y
       begin                                                               0    0         0              0      0
         if a /= b then return ( „X‟); - - se há conflito, sai „X‟         0    1         0              1      X
                   else return (a); - - ou return(b)
       end                                                                 1    0         0              1      X
                                                                           1    1         1              1      1

       SE FOSSE UM PROCESS, SERIA POSSÍVEL TER
       AS DUAS ATRIBUIÇÕES:
       processo_teste: process (a, b)
       begin                                      -- este processo sequencial é sintetizável pois o
         y <= a and b;                            -- sintetizador não gerará circuitos AND e OR como acima.
         y <= a or b;                             -- No instante corrente é atribuído ao sinal “y” o AND lógico de a e b.
       end process;                               -- No instante corrente + delta é atribuído ao sinal “y” o OR de a e b.
                                                  -- a atribuição AND não importa pois o último valor que fica é o OR.

                                                                                                                  27
                          VHDL - Características Marcantes
   Hierarquía
     Um projeto VHDL consiste de uma hierarquía de
      componentes conectados, compilados de                             COMPARE
      arquiteturas comportamentais, dataflow ou
      estruturais.                                               A       U0           U1
                                                                                 I          C
                                                                 B      XR2          INV
     É sempre muito útil esquematizar o sistema como
      sendo um conjunto de componentes (arquiteturas
      e/ou processos) que se comunicam através de
      sinais.
       architecture S of COMPARE is                       Na arquitetura “T” abaixo, as
       signal I: bit;                                     declarações dos componentes
                                                          estão num “package” chamado
       component XR2 port (X, Y : in bit; Z : out bit);   “xyz_gates” da biblioteca “work”.
       end component;

       component INV port (X : in bit; Z: out bit);       Use work.xyz_gates.all;
       end component;                                     architecture T of COMPARE is
                                                          signal I : bit;
       begin
        U0 : XR2 port map (A, B, I);                      begin
        U1 : INV port map (I, C);                            U0 : XR2 port map (A, B, I);
       end S;                                                U1 : INV port map (I, C);
                                                          end T;

                                                                                            28
                             VHDL - Características Marcantes
   Packages - Exemplo: Package STANDARD
     Contém Declarações de Tipos Compartilhados que foi compilada separado
    -- tipos enumerados pré-definidos
      type Boolean is (FALSE, TRUE); type BIT is („0‟, „1‟);
      type CHARACTER is ( NUL, SOH, ….., „A‟, „B‟, „C‟, …,‟0‟, „1‟, „2‟, „3‟, ...., „}‟, DEL);

    -- tipos numéricos pré-definidos
        type INTEGER {REAL} is range implementation_defined;
    -- tipo TIME pré-definido
        type TIME is range implementation_defined
          units
                    fs; -- femtosecond
                    ps=1000fs; -- picosecond
                    ns=1000ps; -- nanosecond
                    - - - - - - - --
          end units;
    -- subtipos numéricos pré-definidos
        subtype NATURAL is INTEGER range 0 to INTEGER‟HIGH;
        subtype POSITIVE is INTEGER range 1 to INTEGER‟HIGH;
    -- tipos array pré-definidos
        type STRING is array (POSITIVE range <>) of CHARACTER;
        type BIT_VECTOR is array (NATURAL range <>) of BIT;

                                                                                                 29
                          VHDL - Características Marcantes
   Packages - Exemplo: Package TEXTIO
    -- Definições de Tipos para TEXTIO
      type LINE is access STRING;           -- um LINE é um ponteiro para uma string
      type TEXT is file of STRING;          -- um arquivo de registros ASCII de tamanho variavel
      type SIDE is (RIGHT, LEFT);           -- para justificar dados de saída em campos
      ……………..
    -- Arquivos Texto Standard
        file INPUT: TEXT is in “STD_INPUT”;
        file OUTPUT: TEXT is out “STD_OUTPUT”;

    -- Rotinas de Entrada para Tipos Standard
        procedure READLINE (F: in TEXT; L: out LINE);
        procedure READ (L:inout LINE; VALUE: out BIT_VECTOR);

    -- Rotinas de Saída para Tipos Standard
        procedure WRITELINE (F: out TEXT; L: in LINE);
        procedure WRITE (L: inout LINE; VALUE: in BIT; JUSTIFIED: in SIDE:=RIGHT;
                                                       FIELD: in WIDTH :=0);
        …………………
    -- Predicados de Posição de Arquivo
        function ENDLINE (L: in LINE) return Boolean;
        function ENDFILE (F: in TEXT) return Boolean;


                                                                                           30
                           VHDL - Características Marcantes
   Sentenças Concorrentes:
      Executam ao mesmo tempo. Elas são:
           Sentença Process
           Sentença de Instanciação de Componente
           Sentença de Atribuição a Sinal Concorrente
           Relação: Exemplo: v <= (a and b and c) or d;

         Atribuição Condicional a Sinal Usando: WHEN … ELSE
              Exemplo: Y <= j when state = idle else
                              k when state = first_state else
                              l when others;
         Atribuição Condicional a Sinal Usando: WITH…SELECT….WHEN
              Exemplo: with state select
                               X <= “0000” when st0 or st1; - - st0 “or” st1
                                    “0010” when st2 and st3;
                                     Y      when st4;
                                     Z       when others;
         Procedure Call Concorrente
         Sentença Gerar (Generate) para Instanciação de Componentes ou Equações:
              Exemplo: G1: for I in 0 to 7 generate
                             reg1: register8 port map (clock, reset, enable, data_in(I), data_out(I));
                             end generate G1;
         Sentença Block
         Sentença de Declarar / Reportar Concorrente (Assert / Report).


                                                                                                     31
                          VHDL - Características Marcantes

   Sentenças Sequenciais
      Definem algoritmos para a execução de um subprograma ou processo.
         Sentença If – then - else
                              if (count = “00”) then
                                  a <=b;
                              elsif (count = “10”) then
                                      a <=c;
                              else
                                      a <=d;
                              end if;
         Sentença Case - when
                              case count is
                                     when “00” => a <= b;
                                     when “10” => a <= c;
                                     when others => a <= d;
                              end case;
         Sentença Exit
         Sentenças: For –Loop e While-Loop
         Sentença Next
         Sentença Null
         Sentença Procedure Call
         Sentença Return
         Sentença Wait
         Sentença de Atribuição a Sinal
         Sentença de Atribuição a Variável
         Sentença de Declarar / Reportar (Assert / Report)

                                                                          32
Elementos Primitivos de VHDL

       Tipos Escalares e Arrays
           Nomes e Objetos
             Expressões
              Atributos


                                  33
                                         VHDL

   Apresentação Geral:

   Informações prévias sobre a sintaxe (cont):

     Separadores: os separadores utilizados são:
        “ ; “ (ponto e vírgula, entre duas declarações ou ao fim de uma instrução).
        “ , “ (vírgula, entre dois nomes de sinal dentro de uma mesma declaração).
        “ : “ (dentro de uma declaração entre o nome de um objeto e seu tipo).
        “ “ (espaço).


     Espaços: o número de espaços entre duas palavras é indiferente, sempre
      que o mínimo seja respeitado.

     Retorno carro : Uma mesma instrução ou declaração pode ser escrita em
      várias linhas consecutivas.
      Os comentários podem ser inseridos ao final das linhas sem afetar a
      integridade do código.


                                                                                      34
                                           VHDL
   Objetos que se podem manipular em VHDL e seus tipos:

   3 classes principais de objetos:
      SINAIS : similares aos sinais encontrados nos esquemas
       Os “ports” declarados dentro de uma entidade são sinais. Podem ser declarados
       como “bus”. São definidos e utilizados dentro da arquitetura, mas dentro de um
       processo não podem ser definidos nem usados do lado direito de uma expressão.
       Só podem ser usados do lado esquerdo da expressão ( exemplo: sinal_a <= (X or Y)
       and Z;

      CONSTANTES : permitem definir valores permanentes.

      VARIAVEIS : utilizadas somente dentro dos “PROCESS” (instruções sequenciais).
       Não podem ser definidas nem utilizadas na arquitetura fora de um processo.


   Uma declaração de objeto compreende:
        CLASSE: sinal, constante ou variável.
        NOME : à escolha do criador (exceto palavras reservadas).
        MODO : (somente sinais) : in, out, inout, buffer.
        TIPO : bit, bit_vector, boolean, integer ...


                                                                                    35
                                   VHDL
   Tipos de objetos que se podem manipular em VHDL:
   Tipos pré-definidos principais:

     BIT : pode tomar o valor „0‟ ou „1‟. (difere de Boolean pois não se
      pode tomar uma decisão(true/false) baseado num tipo bit).

     BIT VECTOR : grupo de bits (bus).
      O valor binário de um bit_vector é definido entre aspas duplas.
      EXEMPLO:

      signal A : bit_vector (7 downto 0);
      - - o bit de maior peso (MSB) esstá à esquerda (bit 7 no exemplo)
      begin
        A <= “01011010”; - - equivalente a: A <= X”5A”;
        - - X “valor” indica um valor hexadecimal.


                                                                            36
                                        VHDL
   Tipos de objetos que se podem manipular em VHDL:
   Tipos pré-definidos principais (cont):
     BOOLEAN:
      Pode tomar os valores TRUE ou FALSE.


     INTEGER : Valor inteiro codificado em 32 bits.
      (de -2.147.483.648 a + 2.147.483.647)
      Um inteiro pode estar limitado em sua declaração, a fim de evitar sua codificação
      em 32 bits. São subtipos de integer os tipos positive (1,2,3,…) e natural (0,1,2,…)


      EXEMPLO:
      signal VALOR_A : integer range 0 to 255;
      begin
      VALOR_A <= 143 when INIT = „1‟ else 33;




                                                                                     37
                                     VHDL
   Tipos de dados que se podem manipular em VHDL:
   STD_LOGIC e STD_ULOGIC: Extensões do tipo BIT,
      Podem assumir 9 valores diferentes:
      type STD_ULOGIC is (
      „U‟, -- Uninitialized
      „X‟, -- Forcing Unknown
      „0‟, -- Forcing 0
      „1‟, -- Forcing 1
      „Z‟, -- High impedance
      „W‟, -- Weak unknown
      „L‟, -- Weak 0
      „H‟, -- Weak 1
      „-‟); -- Don‟t care
    (Extraído do código fonte do package “STD_LOGIC_1164”.)

     O tipo STD_LOGIC dá uma maior potência operacional que o tipo BIT, tanto
      para a simulação como para a síntese.
      (particularmente os valores „z‟ e „-‟ para a síntese).
                                                                             38
                                 VHDL

 Tiposde objetos que se podem manipular em
  VHDL:

 Tipo STD_LOGIC_VECTOR
    Grupo de objetos similar a BIT_VECTOR, mas com os 9 estados
     possíveis do STD_LOGIC para cada um dos 9 bits.


    Para utilizar estes tipos de dados (STD_LOGIC_VECTOR e
     STD_LOGIC), devemos declarar a utilização da biblioteca IEEE que
     contém o package particular (STD_LOGIC_1164), no cabeçalho do
     arquivo .vhd.

     Library IEEE;
     use IEEE.STD_LOGIC_VECTOR_1164.all;


                                                                        39
                                  VHDL
   Tipos de objetos que se podem manipular em VHDL:
   EXEMPLO de declaração da biblioteca IEEE, e do package
    STD_LOGIC_1164:

    library IEEE;
    use IEEE.STD_LOGIC_164.all;
    entitiy EXEMPLO is
          port (
            A,B : in STD_LOGIC_VECTOR(7 downto 0);
            SEL : in STD_LOGIC;
            MUX_OR : out STD_LOGIC);
    end EXEMPLO;
    architecture ARCHI of EXEMPLO is . . . . .




                                                         40
                                    VHDL
   Tipos de objetos que se podem manipular em VHDL:

   Tipos enumerados:
     Principalmente utilizados em síntese para definir os estados das
      máquinas de estado.

    architecture ARCHI of MACHINE is . . . . .

    - - parte declaratória da arquitetura                     Enumeração
    type ESTADOS is (REPOUSO, LEITURA, ESCRITA);
                                                                de tipo !!
    signal ESTADO_ATUAL, ESTADO_SEGUINTE : ESTADOS;
    - - os sinais ESTADO_ATUAL e ESTADO_SEGUINTE, poderão
    - - tomar os valores “REPOUSO”, “LEITURA” ou “ESCRITA”.
    begin
        - - atribuições



                                                                             41
                                     VHDL
   Tipos de objetos que se podem manipular em VHDL:
   Sub-tipos:
     subconjunto de um tipo predefinido ou declarado anteriormente
     Exemplo:                            Byte não é palavra reservada !


    subtype BYTE is STD_LOGIC_VECTOR (7 downto 0);
    signal A_BUS, B_BUS, SAIDA_A, SAIDA_B, SAIDA_C : BYTE;
    signal ENTRADA : STD_LOGIC_VECTOR (7 downto 0);

    constant K :    BYTE := X”C8”;
    begin
      SAIDA_A <=    A_BUS or K;
      SAIDA_B <=    B_BUS and X”9C”;
      SAIDA_C <=    ENTRADA;



                                                                           42
                                      VHDL
   Regras de atribuição dos vetores de dados:

     A ordem na qual se utiliza o vetor (bus) deve ser a mesma que na
      declaração do vetor.
      (valores crescentes ou decrescentes dos índices)


     Não é necessário utilizar o vetor inteiro. (utilização de uma parte dos
      sinais em um bus).


     A largura do bus (tamanho do vetor) deve corresponder para a
      maioria das operações.
      (exceto para comparação).




                                                                                43
                                         VHDL
   Regras de atribuição dos vetores de dados:
      architecture ARCHI of VECTOR is
      -- parte declaratória da arquitetura
      signal D_IN, MASCARA, D_OUT : std_logic_vector (7 downto 0);
      signal Q_OUT : std_logic_vector (7 downto 0);
      constant FIXA : std_logic_vector (2 downto 0) := “010”;
      -- a atribuição de um valor a uma constante ou variável
      -- se realiza pelo símbolo “ :=“
      -- de forma diferente da atribuição de sinais.

    Begin
      D_OUT <= D_IN and not (MASCARA); --Todas as operações são de 8 bits

      Q_OUT <= (D_IN(6 downto 2) and not (MASCARA (7 downto 3))) & FIXA;
      - - O sinal “&” é um operador chamado de concatenação
    end [ARCHI];



                                                                      44
                                    VHDL
   Atribuição de valores a um objeto segundo seu tipo:
       Inteiros:
        signal A, S, T, U, V : integer range 0 to 255;

        - - Base default : decimal
        s <= A + 83;     - - sem aspas

        Especificação da base:
        T <= 16#B3#;                  -- Base Hexadecimal
        U <= 10#145#;                 -- Base Decimal
        V <= A - 2#010010110#         -- Base Binaria

        - - equivalente a:
        -- V <= A - 2#0100_1010#;     -- Com separadores p/ ficar + claro



                                                                       45
                                            VHDL
   Atributos Simbólicos (1):
     Um atributo provê informação sobre itens tais como entidades, arquiteturas, tipos e
      sinais.

     Há diversos tipos pré-definidos de valor, sinal e range.

     Tipos escalares tem atributos de valor, que são: „left, „right, „high, „low, e „length
      (pronuncia-se as aspas simples como “tick”). Exemplo:
         type count is integer range(0 to 127);
         type states is (idle, decision, read, write);
         Entao tem-se que: count‟left = 0 ; states‟high = write ; states‟left = idle

     Um atributo importante de sinal, muito útil em simulação e síntese, é: „event. Ele
      retorna um valor booleano de “true” se um evento acabou de acontecer (transição). É
      utilizado principalmente para determinar se um clock transicionou. Exemplo:
           if CK‟event and CK=“1”              -- transicionou de „0‟ para „1‟

     Um atributo útil de range é: „range. Ele retorna o range de um objeto
      que possui limites. Exemplo:
           signal word: std_logic_vector (15 downto 0);
           word‟range = 15 downto 0

                                                                                               46
                                             VHDL
   Atributos Simbólicos(2):
     Atributos de Sinais
         ck‟event - sinal ck - Um valor booleano que indica se um evento ocorreu em ck
         saida‟stable(T) - sinal saída e parâmetro T - Um sinal BOOLEANO que é verdade
          quando o sinal de referência não tem tido eventos por um temo T.
         outros atributos (ver livros) .....

     Atributos Relacionados a Arrays
           VetA‟low - retorna limite inferior da faixa de índice (se faixa 0 a 511, retorna 0)
           VetA‟high - retorna limite superior da fiaxa de índice.
           VetA‟range - retorna o range de um tipo particular.
           Outros atributos (ver livros) ....

     Atributos Relacionados a Tipos
           NomeTipo‟succ(v) - retorna o próximo valor no tipo após v.
           NomeTipo‟pred(v) - retorna o valor anterior no tipo antes de v.
           NomeTipo‟leftof(v) - retorna o valor imediatamente à esquerda de v.
           outros atributos (ver livros) ....


                                                                                              47
    VHDL




Os operadores




                48
                                          VHDL

   Operadores frequentemente utilizados em síntese:

   Operadores lógicos pré-definidos

     and, or, nand, nor, xor e not
         (NOTA: não há operadores “|”, “&” como em C


     Operam sobre todos os objetos de todas as classes (sinais, constantes,
      variáveis) e de tipo:
           bit
           bit_vector
           std_logic, std_ulogic
           std_logic_vector, std_ulogic_vector
           boolean


     Os operandos devem ser do mesmo tipo e conter o mesmo número de bits.


                                                                               49
                                   VHDL

   Operadores frequentemente utilizados em síntese:

   Operadores lógicos pré-definidos
     Exemplo de utilização (1):

       entity OPE is
         port (A, B, C : in bit;
                S :      out bit);
       end OPE;

       architecture ARCHI of OPE is
         begin
           S <= (A and B) and not (C);
       end ARCHI;

                                                       50
                                            VHDL

   Operadores correntemente utilizados em síntese:
   Operadores relacionais:

     = (igual )                                   /= (diferente)
     < (menor )                                   <= (menor ou igual )
     > (maior )                                   >= (maior ou igual )

     Operam sobre objetos do tipo:
           bit, bit_vector
           std_logic, std_logic_vector
           std_ulogic, std_ulogic_vector
           integer
           boolean

     Os operandos devem ser do mesmo tipo, mas o número de bits
      comparados pode ser diferente !


                                                                          51
                                  VHDL
   Operadores correntemente utilizados em síntese:
   Operadores relacionais: Comparação de vetores:

     A comparação se faz comparando bit a bit os dois vetores començando
      pelo MSB.
      Os resultados podem surpreender se os vetores não são do mesmo número
      de bits.
      Exemplo:


       signal REG : std_logic_vector (4 downto 0);
       signal CNT : std_logic_vector (3 downto 0);
       begin
       -- temos o direito de escrever :
       --    REG        CNT
       -- “01111” >    “0100”   -- resultado nada surpreendente
       -- “01111” <    “1000”   -- resultado surpreendente !!
       -- O MSB de CNT(bit3) é superior ao MSB de REG (bit 4),
       -- o vetor CNT é considerado como superior.


                                                                       52
                                        VHDL
   Operadores correntemente utilizados em síntese:
   Operadores aritméticos:
      + (soma)                               - (subtração)
      * (multiplicação)                      / (divisão)
      ** (potência)                 mod               rem                abs

     Operam sobre objetos do tipo INTEGER (sem precisar declarar biblioteca
      aritmética especial), mas recomendamos transformar sempre os inteiros em
      vetores (std_logic_vector) e não usar multiplicação, nem divisão nem potência. O
      motivo é a baixa eficiência na implementação – gera um circuito muito grande.

     Podem igualmente operar sobre STD_LOGIC_VECTOR utilizando os pacotes
      STD_LOGIC_UNSIGNED e STD_LOGIC_ARITH do Synopsys.
         CUIDADO !!: Se declarar um vetor contador como std_logic_vector e fizer:
          “contador = contador + 1”, nao esquecer de declarar no início a biblioteca
          aritmética utilizada (use std_logic_arith.all por exemplo).

     Restrições: A maioria das ferramentas de síntese só autoriza as operações de
      multiplicação e divisão entre CONSTANTES, ou uma CONSTANTE potência de 2
      e um SINAL.
                                                                                       53
                                                      VHDL
       Altera provides several packages for use with MAX+PLUS II. All packages are located in subdirectories of the
        \maxplus2\vhdlnn directory, where nn is "87" or "93". These directories are created automatically during MAX+PLUS II
        installation. See the following table:

File:              Package:             Library:    Contents:

maxplus2.vhd maxplus2                   altera      MAX+PLUS II primitives, macrofunctions, and selected megafunctions
                                                    supported by VHDL.
megacore.vhd megacore                   altera      Pre-tested megafunctions consisting of several different design files.
std1164.vhd  std_logic_1164             ieee        Standard for describing interconnection data types for VHDL
std1164b.vhd                                        modeling, and the STD_LOGIC and STD_LOGIC_VECTOR types.
                                                    MAX+PLUS II does not support the to_x01(), is_x(), to_x01z(), or to_ux01()
                                                    functions in the std_logic_1164 package.
lpm_pack.vhd lpm_components             lpm         LPM megafunctions supported by VHDL.
arith.vhd    std_logic_arith            ieee        SIGNED and UNSIGNED types, arithmetic and comparison
arithb.vhd                                          functions for use with SIGNED and UNSIGNED types, and the conversion
                                                    functions CONV_INTEGER, CONV_SIGNED, and CONV_UNSIGNED.
                                                    MAX+PLUS II does not support the shl(), shr(), ext(), or sxt() functions in
                                                    the std_logic_arith package.
signed.vhd    std_logic_signed          ieee        Functions that allow MAX+PLUS II to use STD_LOGIC_VECTOR types
signedb.vhd                                         as if they are SIGNED types.
unsigned.vhd std_logic_unsigned         ieee        Functions that allow MAX+PLUS II to use STD_LOGIC_VECTOR
unsignedb.vhd                                       types as if they are UNSIGNED types.

NOTE: If you use more than one of these packages in a single VHDL Design File, you must use them in the order in which
   they are listed in this table.



                                                                                                                    54
       VHDL




      A Parelha
Entidade - Arquitetura




                         55
                                  VHDL

A   parelha entidade / arquitetura :
 Entidade     : Porção do código que permite definir em particular as
 Entradas e Saídas.


   Exemplo:                                   Equivalência Esquemática

      entitiy EXEMPLO is
        port (
          A,B : in bit_vector(7 downto 0);                   SÍMBOLO EXEMPLO

          SEL : in bit;                                A[7:0]

          MUX_OR : out bit                                            MUX_OR
                                                       B[7:0]
             );
                                                       SEL
      end EXEMPLO;
      OBS: Dar preferencialmente o mesmo nome à entidade e ao arquivo VHDL
       (neste caso EXEMPLO.VHD).
                                                                               56
                                    VHDL
A   parelha entidade / arquitetura :
                                                           Declaração da Entidade

 Arquitetura      : Porção de descrição do                Declaração da Interface

 comportamento do dispositivo a sintetizar.
   Está associada a uma entidade                            Corpo da Arquitetura

                                                             Definição Funcional


      architecture ARQUI of EXEMPLO is
      - - parte declaratória
      signal MUX_OUT : bit_vector (7 downto 0); - - sinal interno
      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - parte operatória
         begin
      - - Sentenças concorrentes e/ou Sequencias (processos)
      - - o sinal “<=“ é o símbolo de atribuição de um valor a um sinal
            MUX_OUT <= A when SEL = „0‟else B;
            MUX_OR <= „1‟ when MUX_OUT /= “00000000” else „0‟;
      end [ARQUI];
   NOTA: As atribuiçõs a MUX_OUT e MUX_OR ocorrem concorrentemente !!


                                                                                    57
                                     VHDL

A   parelha entidade / arquitetura :
 Arquitetura       : Informações complementares (1)
  A parte declaratória pode conter:
       Declarações de sinais internos.
        (que nao sejam I/Os)

       Declarações de componentes.
        (gerência da hierarquía, VHDL estrutural).

       Declarações de constantes.

       Declarações de tipos de objetos.
        (utilizados em particular para as máquinas de estado).

       Declarações de sub-programas.
       (funções e procedimentos).

                                                                 58
                                      VHDL
A      parelha entidade / arquitetura :
 Arquitetura         : Informações complementares (2)
     O código operatório pode conter:
          Atribuições concorrentes de sinais.
           (os resultados de síntese e de simulação são independentes da ordem de
           escrita das instruções).
CÓDIGO    Atribuições sequenciais:
  RTL      Processos e/ou sub programas
           Na simulação a execução de instruções ocorre na ordem de escrita do
           código (sequencialmente).
          Na síntese lógica, ou seja, na implementação, o mesmo comportamento é
           reproduzido.
         Instanciação de “caixas pretas”. (componentes).
         O módulo sendo desenvolvido pode chamar a outros sub-módulos (gerência
 CÓDIGO
          de hierarquía, VHDL estrutural).
ESTRUTURAL


                                                                                59
                                   VHDL

A  parelha entidade / arquitetura :
 Solução Completa : Arquivo “EXEMPLO.vhd”
     entitiy EXEMPLO is
        port (
           A,B : in bit_vector(7 downto 0);
           SEL : in bit;      - - O símbolo “;” se utiliza como separador entre
           MUX_OR : out bit   - - duas declarações de sinais e não deve
              );              - - aparecer depois do último símbolo declarado
      end [EXEMPLO];
     architecture ARQUI of EXEMPLO is
     - - parte delaratória
     signal MUX_OUT : bit_vector (7 downto 0); - - sinal interno
     - - parte operativa
     begin
       MUX_OUT <= A when SEL= „0‟ else B;
       MUX_OR <= „1‟ when MUX_OUT /= “00000000” else „0‟;
     end [ARQUI];

                                                                            60
                                       VHDL - COMPONENT
   O Componente é uma Estrutura que Referencia
    Diretamente uma Entidade e Possibilita a
    Instanciação e Replicação da Mesma sem a
    Necessidade de Descrevê-la Novamente.

    ENTITY inv IS PORT (
           e : IN bit;
           s: OUT bit);
    END inv;

    ARCHITECTURE inversor OF inv IS
    BEGIN
           s<= NOT e;
    END inversor;

    ENTITY yyy is PORT (
            ------)
    END yyy;
    ARQUITECTURE xxx of yyy IS
    signal T : ------------
    COMPONENT inv IS
            port (e: IN bit; s:OUT bit);
    END COMPONENT;
    BEGIN
            ---
            U1: inv PORT MAP (e=>a , s=> s1);
            U2: inv PORT MAP (e=> b, s=> s2);

    END ARCHITECTURE xxx;

                                                          61
                                   VHDL – PACKAGE

   Coleção de Tipos, Constantes, Subprogramas,              USO:
    agrupando Elementos Relacionados. Dividem-             LIBRARY ieee;
    se em:                                                 USE ieee.std_logic_1164.all;
                                                           USE work.cpu.ALL;
     Declaração
     Corpo                                                ENTITY xxx IS
         Corpo Pode Conter Definição de Procedimentos e      ---------
          Funções
                                                           END xxx;
   Declaração:                                            ARCHITECTURE yyy OF xxx IS
    PACKAGE cpu IS
      SUBTYPE byte IS bit_vector (7 DOWNTO 0);             BEGIN
      FUNCTION inc (valor: integer) RETURN integer;           ---------
    END cpu;                                                  PROCESS
                                                                        ---------
    PACKAGE BODY cpu IS
                                                                        VARIABLE reg: byte;
      FUNCTION inc (valor:integer) RETURN integer
                                                                        pc <= inc (pc);
      IS
                                                                        ---------
               VARIABLE result : integer;                     END PROCESS
               BEGIN                                       END ARCHITECTURE;
                         result := valor + 1;
               RETURN result;                              NOTA: Se não declarar o package no
                                                              início, aponta-se o caminho:
      END inc;
                                                              VARIABLE reg : work.cpu.byte;
    END cpu;
                                                              pc <= work.cpu.inc (pc);
                                                                                           62
                 VHDL – Exemplo: PACKAGE e COMPONENT

ARQUIVO: meu_package.vhd              ARQUIVO: Tst_ff_SR.vhd
library ieee;
use ieee.std_logic_1164.all;          library ieee;
                                      use ieee.std_logic_1164.all;
package meu_package is                use work.meu_package.all;
    component nor2 port(
     a, b: in bit;                    entity meu_ff_SR is port (
     sai: buffer bit);                  set, reset :        in bit;
    end component;                        Q, NQ :     buffer bit);
end meu_package;                      end meu_ff_SR;

library ieee;                         architecture Tst_FF_SR of meu_ff_SR is
use ieee.std_logic_1164.all;          begin
                                        CI1: nor2 port map (reset, NQ, Q);
entity nor2 is port (                   CI2: nor2 port map (Q, set, NQ);
    a,b: in bit;
      sai: buffer bit);               end Tst_FF_SR;
end nor2;

architecture meu_nor2 of nor2 is      NOTA: OBSERVAR QUE AO DECLARAR O
begin                                    COMPONENTE NOR2 (esquerda)
  sai <= a nor b;                        TIVEMOS QUE DECLARAR
                                         NOVAMENTE AS BIBLIOTECAS
end meu_nor2;                            UTILIZADAS – FAZE-LO PARA TODOS
                                         OS COMPONENTES !!!!!
                                                                       63
                               SUBPROGRAMA: FUNÇÕES
Funções São Usadas para Computar              FUNCTION somador4bits(
Valores e não Para Mudar o Valor de                     a:std_logic_vector (3 downto 0);
Objetos Associados c/Parâmetros (não                    b:std_logic_vector (3 downto 0))
mudam sinais). Parâmetros devem ser do        RETURN std_logic_vector IS
modo IN e da classe SIGNAL ou                 VARIABLE vaium: std_logic;
CONSTANT.                                     VARIABLE soma: std_logic_vector(3 downto 0);
                                              BEGIN
LIBRARY ieee;                                   vaium := ´0´;
USE ieee.std_logic_1164.all;                    FOR i IN 0 TO 3 LOOP
                                                        soma(i) := a(i) xor b(i) xor vaium;
ENTITY mult4bits is port (
  a, b: IN std_logic_vector (3 downto 0);               vaium := (a(i) and b(i) ) or (b(i) and
                                                                     vaium) or (vaium and a(i));
  s: OUT std_logic_vector (3 downto 0);
END mult4bits;                                  END LOOP;
                                                RETURN soma;
ARCHITECTURE arch_mult4bits of mult4bits IS   END;
                                              BEGIN                   -- BEGIN da ARQUITETURA
FUNCTION deslocador (x:std_logic_vector (3      PROCESS (a, b)
downto 0))                                      VARIABLE ----
RETURN std_logic_vector IS                      BEGIN
VARIABLE y : std_logic_vector (3 downto 0);             ------------
BEGIN                                                   aux1 := deslocador (aux1);
   for i in 3 downto 1 loop                             ------------
     y(i) := x(i-1);                                    aux2 := somador4bits (aux1, b);
   end loop;                                            ------------
   y(0) := ´0´;                                  END PROCESS;
   return y;
                                              END arch_mult4bits;
END;                                                                                         64
                         SUBPROGRAMA: PROCEDURES
Procedures Podem Trocar os Valores de
Objetos Associados c/Parâmetros Formais           ------------------
(podem trocar sinais de valor). Parâmetros        O SOMADOR4BITS é semelhante ao caso de
                                                                Funcao
Podem ser do modo IN, OUT e INOUT.                ------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY mult4bits is port (
  a, b: IN std_logic_vector (3 downto 0);
  s: OUT std_logic_vector (3 downto 0);
END mult4bits;

ARCHITECTURE arch_mult4bits of mult4bits IS

PROCEDURE deslocador (                           BEGIN                 -- BEGIN da ARQUITETURA
   SIGNAL x: IN std_logic_vector (3 downto 0);
   SIGNAL y: OUT std_logic_vector (3 dwonto 0)    ------------
IS                                                deslocador (ent1(3 downto 0), sai1 (3 downto 0);
BEGIN                                             ------------
   for i in 3 downto 1 loop                       somador4bits (A (3 downto 0), B (3 downto 0),
      y(i) <= x(i-1);                                           SOMA (3 downto 0));
   end loop;                                       ------------
   y(0) <= ´0´;
END;                                             END arch_mult4bits;



                                                                                            65
                             VHDL




Instruções, Sentenças e Procedures
            Concorrentes
 Instrução When ….Else
 Instrução With ….. Select
 Instrução For i in ….. Generate
 Sentença Process
 Sentença de Instanciação de Componente
 Procedure Call Concorrente
 Sentença de Atribuição a Sinal Concorrente
 Sentença Block
 Sentença de Declarar / Reportar Concorrente (Assert / Report).

                                                                   66
                                   VHDL
   Instruções concorrentes:
    As operações se efetúam ao mesmo tempo (em paralelo).

     A ordem de escrita do código VHDL não afeta o resultado da síntese ou da
      simulação
     O estilo de escrita é comparável às linguagens de programação de PALs ou
      Linguagens Declarativas (equações lógicas).
     Exemplo de atribuições simples: (equações)
       entity CONCURRENT is
         port (A, B, C : in bit;                      Não precisava
               S, T : out bit); end CONCURRENT;       ter este nome
       architecture ARCHI of CONCURRENT is
         begin
           S <= (A and B) and not (C);
           T <= B xor C;
           -- a ordem da atribuição de S e de T é indiferente.
       end ARCHI;


                                                                          67
                                        VHDL
   Instruções concorrentes:
     Atribuição de sinais por condição: WHEN ... ELSE
         Sintaxe:
          signal_x <= valor_x when signal_y = valor_y else valor_z;
         Notar que valor_z é indicado diretamente depois de “else”. (O símbolo de
          atribuição “<=“ é aqui implícito).
     Exemplo:
      entity LOGICA1 is
         port (A, B, C : in bit;
                S, T : out bit);
      end LOGICA1;
      architecture ARCHI of LOGICA1 is begin
         S<= A when C=„1‟ else B;   -- SINTETIZA COM MUX 2:1 !!
         T <= not B;
      end ARCHI;


    As duas instruções são                      A     1M
    concorrentes e geram =>                             U      S      B              T
                                                B     0X
                                                C

                                                                                     68
                                    VHDL
   Instruções concorrentes:
     Atribuição de sinais por condição: WHEN ... ELSE

      entity BUFFER_BUS_TRISTATE is
         port (A, B : in std_logic_vector (15 downto 0);
                C : in std_logic;
                S : out std_logic_vector (15 downto 0));
      end BUFFER_BUS_TRISTATE;
      architecture ARCHI of BUFFER_BUS_TRISTATE is
        begin
          S <= A when C = „1‟else “ZZZZZZZZZZZZZZZZ”; -- SINTETIZA COM
          S <= B when C = „0‟else “ZZZZZZZZZZZZZZZZ”; -- BUFFER 3-STATE
        end ARCHI;

                                    B[15:0]                S[15:0]
    As duas instruções são
                                        C
    concorrentes e geram =>
                                    A[15:0]

                                                                      69
                                    VHDL
   Instruções concorrentes:
     Atribuição de sinais por seleção: WITH ... SELECT
         Exemplo:
      architecture ARCHI of SELETOR_SINAIS is
        begin
           with SEL select
               S <=   A when “00”, -- SINTETIZA COM CIRCUITO MUX N:1
                      B when “01”, -- OU TAMBÉM CHAMADO SELETOR
                      C when “10”,
                      D when others;
               T <=   not B;
      end ARCHI;

                                          A    00
                                          B    01
                                                              S   B    T
                                          C    10
                                          D    Outros casos

                                   SEL [1:0]
                                                                       70
                                     VHDL
   Instruções Concorrentes:
     Instrução de Loop: FOR i IN ... GENERATE :
      Sintaxe:
      LABEL : for I in inteiro_a to inteiro_b generate
        - - instruções concorrentes
      end generate;


      A utilização de um LABEL é obrigatória.
      LABEL1 : for I in 0 to 15 generate                   RANGE é um atributo pré-definido
       S(I) <= A(I) when C = „0‟ else „Z‟;                 em VHDL. Código genérico,
                                                           independente da largura do bus.
       S(I) <= B(I) when C = „1‟ else „Z‟;
                                                           Portabilidade, re-uso, evolução
      end generate;

      LABEL1 : for I in S‟range generate
                                                 B[15:0]                             S[15:0]
       S(I) <= A(I) when C = „0‟else „Z‟;
                                                     C
       S(I) <= B(I) when C = „1‟else „Z‟;
      end generate;
                                                 A[15:0]


                                                                                       71
                                                 VHDL
   Exercício:                                     Comparador (when ... Else)

    BUS_A[3:0]                                                                                             a
                  A                      A_MIN
                           A<B                                                                         f   g   b
                                   (Declarado em modo OUT)
    BUS_B[3:0]                                                                                     e           c
                  B
                                                                                                           d
                                        Multiplexor tri-state
                                        (for I in ... Generate)
                                                                                     (sinal interno)
                                                                            D        DISPLAY[6:0]
                                                                                                           6
                                   MIN[3:0]                VAL[3:0]         E                                       A
                      1                                                     C
                             MUX
                             2:1                                            O                              5
                       0                                                    D                                       B
                                                                            E                              4        C
                                                                            R
                                   MAX[3:0]                                                                3
                      1                                                                                             D
                             MUX
                             2:1                                                                           2
                       0                                                                                            E
                                                                      Decodificador                        1
                                                                                                                    F
    SEL_MIN                                                            7 segmentos                         0
                                                                                                                    G
           Mux Lógicos                                                (with ... Select)
           (when ... Else)

                                                                                                               72
                                       VHDL
   Exercício:
       library ieee;
       use ieee.std_logic.1164.all;
       entity COMPARADOR_DISPLAY is
         port (
                  -----;
       end COMPARADOR_DISPLAY;

       architecture AQUITETURA of .... Is
        signal .....
        Signal .....
        -----
        -----
        VALOR1 : for I in .... generate
        --------
        end generate;
        with VAL select
        DISPLAY <= “0000001” when x”0”,
                           -------
                     “0000000” when others;
        A <= ......;
        ------------;
       end ARCHI;
                                              73
            VHDL




Instruções Sequenciais


Algumas Características de Processos




                                       74
                                          VHDL
   Instruções Sequenciais: noção de PROCESSO

   Um PROCESSO é uma parte do código onde as
    instruções executam em sequencia (na ordem em
    que são escritas), mas uma variável ou sinal só
    armazenará o último valor atribuído.

   Uma mesma arquitetura pode conter diversos
    PROCESSOS.

   Todos os processos executam em paralelo. (um
    PROCESSO é equivalente a uma instrução
    concorrente complexa).

   O conjunto de instruções utilizáveis dentro de um
    processo é diferente do conjunto de instruções
    concorrentes.

   A ordem de escrita das instruções afeta os
    resultados da simulação e da síntese.

                                                        75
                                    VHDL
   Instruções sequenciais:
    As operações se efetuam em sequência.
     A ordem afeta os resultados de simulação e de síntese.
     Estilo de escrita parecido às linguagens de alto nível de informática.
     As instruções sequenciais se utilizam em partes específicas do código:
      PROCESS ou subprogramas.
     Exemplo:

      architecture ARCHI of SEQUENCIA is
        begin
         process begin
              wait until CK‟event and CK=„1‟;
                 if ENA = „1‟ then COUNT <= COUNT +1;
                 end if;
         end process;
      end ARCHI;
                                                                               76
                                     VHDL
   Instruções sequenciais: noção de PROCESS
   Implementação de:

      Lógica combinatória (processo combinatório).
      Lógica síncrona (processo síncrono).
      Lógica síncrona com inicialização assíncrona.

   Em simulação, um process diz-se dormindo até que os sinais suscetíveis de
    ativá-lo troquem de estado.
                                                       Lista dos sinais
                                                       podendo provocar uma
   Estrutura geral de um process:                     reavaliação do valor
                                                       dos sinais atribuídos
               Label opcional
                                                       no Process
    [Label:] process (lista_de_sensibilidades)
       -- parte declaratória
                -- declaração eventual de variáveis
       begin -- parte operatória
       -- instruções sequenciais (if, case, loop ...)
     end process;
                                                                               77
                                              VHDL
   Metodologia de uso dos PROCESS em síntese:
                               A                            A
     A                 S                      D   Q   S                      DS Q        S
                               B                            B
     B                                        C                              C
                       T       C                             C
     C                                        D   Q   T                      D     Q     T
                               D                             D
                       U                      C                              C R
     D                                                       CK
                               CK
                                                            Reset


    Process (A, B, C, D)                                    Process (CK, Reset)
                                   Process (CK)
                                                            - - process sincrono
                                   - - process sincrono
                                                            - - com iniciação
    - - process combinatório
                                   begin                    - - assíncrona
    begin
                                   if CK‟event and CK=„1‟   begin
    if (A=„1‟ and B=„0‟)
                                       then                 if Reset =„1‟then
         then ....
                                       if (A=„1‟and B=„0‟         S <= „1‟; T <= „0‟;
                                       then ...                   elsif CK‟event and CK=„1‟
                                                                  then
                                                                  if (A=„1‟ and B=„0‟)
                                                                  then ...
                                                                                         78
                                          VHDL
   Incoerências de projeto de hardware
                                                        A
    (suportadas pela linguagem VHDL)                                    DSQ      S
                                                        B
                                                                        C
      A
                   D   Q    S                           C
      B                                                                 D    Q   T
                   C                                    D
                                                                        CR
      C                         Não podem               CK
                   D   Q    T   estar na lista de
      D                                                     INIT
                   C            sensibilidade !!
       CK
                                                    Process (CK,INIT,A,B,C,D)
                                                    - - process sincrono
       Process (CK,A,B,C,D)
                                                    - - com iniciação
       -- processo sincrono                         - - assíncrona
       begin                                        begin

       if CK‟event and CK=„1‟                       if INIT =„1‟then
                                                        S <= „1‟; T <= „0‟;
          then
                                                        elseif CK‟event and CK=„1‟
          if (A=„1‟ and B=„0‟                           then
                 then ...                               if (A=„1‟ and B=„0‟)
                                                        then ...
                                                                                     79
                                     VHDL
   Instruções Sequenciais : Noção de PROCESS.

   Processos combinatórios :
     Exemplo:
    MUX : process (A, B, SEL) -- lista de sensibilidades
    -- parte declaratória não usada neste exemplo
    begin
      if SEL = „0‟   then SAIDA <= A;
                     else SAIDA <= B;
      end if;
    end process;

       Os sinais tratados dentro deste tipo de process são puramente
       combinatórios (não se faz nenhuma referência à detecção do flanco de
       troca (subida ou descida) do relógio.

       A lista de sensibilidades contem todos os sinais que podem causar uma
       atividade no processo. A parte declaratória pode conter variáveis e só
       será visível dentro do process em que está declarada.
                                                                                80
                                     VHDL
   Instruções Sequenciais : Noção de PROCESS.

   Processo síncrono simples : (sem iniciação assíncrona)
     Exemplo:
    process -- sem lista de sensibilidades neste caso !!!
    begin
      wait until (CK‟event and CK=„1‟);
      COUNT <= COUNT + 1; -- isto só é legal se a biblioteca
                           -- std_logic_unsigned for declarada
    end process;

     O sinal COUNT (std_logic_vector) será construído por flip-flops.

     Nenhum sinal tratado neste process pode ser combinatório pois estará
      sempre sendo analisado na subida do clock.

     Não há lista de sensibilidades (Usa-se Wait ) - a única condição que
      provocará uma troca de estado será o flanco de subida do relógio (CK).
                                                                               81
                                     VHDL
   Instruções Sequenciais : Noção de PROCESS.

   Processos síncronos com iniciação assíncrona
     Exemplo:
    [LABEL]: process(CK, RST)     -- lista de sinsibilidades
    begin
      if RST = „1‟then
          COUNT <= “0000”;        -- ação assíncrona ao CK
      elsif (CK‟event and CK=„1‟)then
          COUNT <= COUNT + 1;     -- ação síncrona com CK
      end if;
    end process [LABEL];

     A lista de sensibilidades contém o sinal de relógio e sua iniciação
      assíncrona. Neste caso, a condição assíncrona tem prioridade (IF
      RST=„1‟) e o flanco do relógio não se leva em conta se a condição de
      iniciação é verdadeira.

                                                                             82
                                   VHDL
   PROCESS e conjunto de instruções sequenciais
   Variáveis e sinais: Exemplo sobre os sinais:
    entity SIG is                              A
                                                       D Q   TMP
     port (A, B, C, CK: in std_logic;
                                               C       C
                S, T: out std_logic);
    end SIG;                                           D Q   T
    architecture ARCHI of SIG is                       C
    signal TMP : std_logic; begin              CK

      process                                          D Q   S
       begin                                           C

         wait until CK‟event and CK=„1‟;
         TMP <= A or B;   -- esta linha será ignorada
         S <= TMP;
         TMP <= A and C; -- anula a atribuição precedente
         T <= TMP;        -- ao sinal TMP.
       end process;
    end ARCHI;

                                                                 83
                                   VHDL
   PROCESS e conjunto de instruções sequenciais

   Variáveis e sinais: Exemplo utilizando uma variável:
    entity VARI is
     port (A, B, C, CK: in std_logic;       A
                                                      D Q    S
                S, T: out std_logic);       B
                                                      C
    end VARI;                               A
    architecture ARCHI of VARI is           C
                                                      D Q    T
    begin                                             C
     process                                 CK
       variable TMP : std_logic;
       begin
          wait until CK‟event and CK=„1‟;
          TMP <= A or B;   -- esta linha será efetiva
          S <= TMP;        -- para a atribuição do sinal S
          TMP <= A and C; -- esta o será
          T <= TMP;        -- para a atribuição do sinal T
       end process;
    end ARCHI;
                                                                 84
                             VHDL




           Instruções Sequenciais
 Sentença If
 Sentença Case
 Sentença For-Loop
 Sentença While-Loop
 Sentença Next
 Sentença Null
 Sentença Procedure Call
 Sentença Return
 Sentença Wait
 Sentença de Atribuição a Sinal
 Sentença de Atribuição a Variável
 Sentença de Declarar / Reportar (Assert / Report)
                                                      85
                                      VHDL
    PROCESS e conjunto de instruções sequenciais

   Instruções sequenciais frequentemente utlizadas

     IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …];
      END IF;
      Similar à atribuição de sinais por condição.

     CASE … END CASE;
      Similar à atribuição de sinais por seleção.

     FOR … LOOP END LOOP;
      Similar à instrução FOR … GENERATE.




                                                      86
                                VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;

   Exemplo:
    signal A, B, C, D : std_logic_vector (7 downto 0);
    signal SEL : std_logic_vector (1 downto 0);
    signal MUX : std_logic_vector (7 downto 0);

    BLABLA : process (A, B, C, D, SEL) -- rótulo BLABLA
    -- parte declaratória não utilizada neste exemplo
    begin
      if      SEL = “00” then MUX <= A;
      elsif SEL = “01” then MUX <= B;
      elsif SEL = “10” then MUX <= C;
      else                    MUX <= D;
      end if;
    end process;
                                                          87
                                VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
   Mais Exemplos:
    process (A, B, C, D, SEL) begin
        if SEL=“00” then MUX <= A;
        else if SEL = “01” then MUX <= B;
             else if SEL = “10” then MUX <= C;
                  else MUX <= D;
                  end if;
             end if;
        end if;
    end process;

    process (A, B, C, D, SEL)
    begin
      if      SEL = “00” then     MUX   <= A;
      elsif   SEL = “01” then     MUX   <= B;
      elsif   SEL = “10” then     MUX   <= C;
      else                        MUX   <= D;
      end if;           -- Um só “end   if” !!!
    end process;
                                                          88
                                VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
   Mais Exemplos:
    process (A, B, C, D, SEL) begin
        if SEL=“00” then MUX <= A;
        else if SEL = “01” then MUX <= B;
             else if SEL = “10” then MUX <= C;
                  else MUX <= D;
                  end if;
             end if;
        end if;
    end process;

    process (A, B, C, D, SEL)
    begin
      if      SEL = “00” then     MUX   <= A;
      elsif   SEL = “01” then     MUX   <= B;
      elsif   SEL = “10” then     MUX   <= C;
      else                        MUX   <= D;
      end if;           -- Um só “end   if” !!!
    end process;
                                                          89
                                          VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
     Resultados de síntese:



                   D       0

                                                  0

                   C       1                                         0
                                                                         MUX
         “10”      CMP                    B       1
        SEL[1:0]       =        “01”                         A       1
                                          CMP
                               SEL[1:0]       =       “00”   CMP
                                                  SEL[1:0]       =




                                                                               90
                                    VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
     Exemplo 3 : Utilização do Clock_Enable dedicado (com wait until):

    architecture ARCHI of SEQUENCE is
      begin
       process begin
          wait until CK‟event and CK = „1‟;
            if ENA = „1‟ then COUNT <= COUNT + 1;
            end if;
       end process;               Utilização do Clock Enable
    end ARCHI;                    dedicado dos FF Xilinx

    --   se ENA /= „1‟, o processo pode ser ativado pelo flanco
    --   do relógio, mas se a condição if ENA = „1‟não é verdadeira
    --   o último valor de COUNT será conservado.
    --   Este estilo de escrita garante o uso do Clock_Enable
    --   dos flip-flops FPGAs Xilinx, e permite por isso uma
    --   economia substancial de elementos de lógica combinatória,
    --   e de aumento da frequência de funcionamento.


                                                                          91
                                     VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
     Exemplo 3b : Utilização do Clock_Enable dedicado (if CK‟event ...):


    architecture ARCHI of SEQUENCE is
      begin
       process (CK) begin
          if CK‟event and CK = „1‟ then
            if ENABLE = „1‟ then COUNT <= COUNT + 1;
            end if;
          end if;
       end process;           Utilização do Clock Enable
    end ARCHI;
                                       dedicado dos FF Xilinx




                                                                            92
                                VHDL
   IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
     Cuidado com os riscos de inserção de lógica
      combinatória nos caminhos do relógio !


                                       D
                                                  D   Q   Q
                                       EC         C
                                       CK

    Process (CK, EC)
    begin
        if (CK‟event and CK = „1‟      and EC = „1‟) then
        Q <= D;
        end if;
    end process;



                                                              93
                                     VHDL
   CASE ... END CASE:
    Instruções que permitem revisar todos os valores possíveis de um sinal.
    Exemplo:

    Process (A, B,    C, D, SEL) begin                                              others
                                                                    D
      case SEL is
                                                                    C               “10”
              when    “00”      =>   MUX   <=   A;                                           MUX
              when    “01”      =>   MUX   <=   B;                  B               “01”
              when    “10”      =>   MUX   <=   C;                  A               “00”
              when    others    =>   MUX   <=   D;
      end case;
    end process;                                 “00”, ”01”, ”10”   Decodificação

                                                       SEL [1:0]     de valores




    -- When others permite citar no final todos os outros
    -- casos possíveis que não foram citados anteriormente
    -- O símbolo “=>”‟é interpretado como “portanto”.

                                                                                             94
                                  VHDL
   IF ... END IF e CASE ... END CASE:
    Mistura de IF e de CASE.    Exemplo:
    Process (FASE, AÇÃO) begin
      case FASE is
       when “00”=> if      AÇÃO = “00” then       SAIDA    <=   “010”;
                                                  STATUS   <=   “01”;
                     elseif    AÇÃO = “10” then   SAIDA    <=   “011”;
                                                  STATUS   <=   “01”;
                     else                         SAIDA    <=   “000”;
                                                  STATUS   <=   “00”;
                    end if;
        when “01” => if     AÇÃO = “00” then      SAIDA    <=   “100”;
                                                  STATUS   <=   “10”;
                     else                         SAIDA    <=   “101”;
                                                  STATUS   <=   “00”;
                   end if;
       when others => SAIDA <= “000”;             STATUS <= “00”;
      end case;
    end process;

                                                                         95
                               VHDL
   FOR …. LOOP:
    Exemplo:


    Meu_For_Loop:
    for i in 3 downto 0 loop
      if reset(i) = „1‟then
       data_out(i) := „0‟;
      end if;
    end loop Meu_For_Loop;




                                      96
                              VHDL
   WHILE ….. LOOP:
    Exemplo:


    count:= 16;
    Meu_While_Loop:
      While (count > 0) loop
        count := count -1;
        result <= result + data_in;
      end loop Meu_While_Loop;




                                      97
          VHDL




   Os Sub-programas

Funções e Procedimentos




                          98
                                VHDL

 Funções:
    Sub-programa podendo ser chamado uma ou varias vezes pelo
     programa principal. Permite organizar o código separando as partes
     repetidas.

    Uma função deve ser declarada antes de ser utilizada.

    Necessita um ou mais parâmetros de entrada e regressa um valor.

    Exemplo:

   function BOOL_TO_BIT ( A: in boolean) return STD_LOGIC is
   begin
     if A then return „1‟;    else return „0‟;
     end if;
   end BOOL_TO_BIT;                       PALAVRA RESERVADA !!
                                                                   99
                                   VHDL

 Funções:
   As funções usam o conjunto das instruções sequenciais.
   Os parâmetros (entradas) da função são inteiramente genéricos. Ex:
      function COISA ( ABUS: in std_logic_vector) return boolean is ...
   Variáveis locais podem ser declaradas
   As variáveis declaradas dentro de uma função são reinicializadas a cada
    chamada.
   As funções podem ser declaradas dentro da parte declaratória da
    arquitetura ou dentro de um package.
   Utilizadas para efetuar as conversões de dados (e.g.: std_logic_vector para
    inteiro), ou operações lógicas e aritméticas diversas.
   Os operadores “+”, “-”, “=“, … são definidos por funções
   As funções podem ser redefinidas (sobrecarregadas) com o fim de, por
    exemplo, serem aplicáveis a tipos de dados não previstos inicialmente. Por
    exemplo:

    O package STD_LOGIC_UNSIGNED redefine os operadores aritméticos e
    relacionais para serem aplicáveis ao tipo STD_LOGIC_VECTOR.
                                                                           100
                                 VHDL
   Funções: Exemplo de sobrecarga de funções
       (operador “+” para somas entre STD_LOGIC_VECTOR e inteiros)

    function “+” (A : std_logic_vector; B : integer)
                     return std_logic_vector is
    variable INT_A : integer range 0 to ((2**(A‟high+1))-1);
    variable STD_OUT : std_logic_vector (A‟range);
    begin
      INT_A := 0;
      for I in A‟range loop
        if A(I) = „1‟ then INT_A:=INT_A + 2**I; else INT_A:=INT_A;
        end if;         -- este loop converte o vetor para inteiro
    end loop;
    INT_A := INT_A + B; -- soma de 2 inteiros
    for J in A‟reverse_range loop
      if INT_A rem 2 = 1 then STD_OUT(J):=„1‟; else STD_OUT(J):=„0‟;
      end if;
      INT_A := INT_A / 2;
    end loop;       -- conversão do int. INT_A em std_logic_vector
    return STD_OUT; -- o valor retornado é um std_logic_vector
    end;
                                                                     101
                                 VHDL
   Procedimentos:

     Sub-programa que pode ser chamado uma ou varias vezes desde o
      programa principal.

     Um procedimento pode ter como parâmetros objetocs em modo in,
      out ou inout.
      (como um “component”, mas o tamanho dos parâmetros sempre é
      genérico).

     Os procedimentos usam o conjunto de instruções sequenciais.

     Variáveis locais podem ser declaradas e estarão reiniciadas a cada
      chamada do procedimento.



                                                                     102
                                    VHDL
   Procedimentos: Exemplo 1:
    library IEEE;

    use IEEE.STD_LOGIC_1164.all;
    entity PROCED is
    port (A, B : in STD_LOGIC_VECTOR (9 downto 0);
          SAIDA : out STD_LOGIC_VECTOR (9 downto 0));
    end PROCED;

    architecture ARCHI of PROCEDU is
        procedure MIN (signal L, M : in STD_LOGIC_VECTOR;
                        signal S : out STD_LOGIC_VECTOR) is
        begin
          if L < M then S<=L; else S<=M; end if;
        end MIN;
    begin                              Especifícação da classe de objeto
       MIN (A, B, SAIDA);                    (Sinais e constantes)
    end ARCHI;
                          Chamada            Declaração de Procedimento

                                                                           103

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:38
posted:7/26/2011
language:Latin
pages:103