Mudanças entre as edições de "Folha de consulta de VHDL"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 62: Linha 62:
  
 
==Tipos de dados==
 
==Tipos de dados==
 +
* Tipo '''BOOLEAN'''
 +
Pode assumir os valores '''false''' e '''true'''
 +
 +
* Tipo '''BOOLEAN_VECTOR'''
 +
É constituído de vários BOOLEAN agrupados.  Pode ser declarado com índices ascendentes ('''TO''') ou descendentes ('''DOWNTO''').
 +
;NOTA - BOOLEAN_VECTOR apenas existe no VHDL 2008:
 +
 
* Tipo '''BIT'''
 
* Tipo '''BIT'''
pode assumir os valores  
+
Pode assumir os valores  
 
<pre>
 
<pre>
 
'0',  -- Forcing  0
 
'0',  -- Forcing  0
Linha 70: Linha 77:
  
 
* Tipo '''BIT_VECTOR'''
 
* Tipo '''BIT_VECTOR'''
É constituído de vários BITS agrupados.  Pode ser declarado como ascendente ('''TO''') ou descendente ('''DOWNTO''').
+
É constituído de vários BITS agrupados.  Pode ser declarado com índices ascendentes ('''TO''') ou descendentes ('''DOWNTO''').
 
<syntaxhighlight lang=vhdl>
 
<syntaxhighlight lang=vhdl>
 
-- Declaração de um SIGNAL do tipo BIT e BIT_VECTOR
 
-- Declaração de um SIGNAL do tipo BIT e BIT_VECTOR
Linha 90: Linha 97:
 
<nome_i>  <= 215;
 
<nome_i>  <= 215;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
* Tipo '''INTEGER_VECTOR'''
 +
É constituído de vários INTEGER agrupados.  Pode ser declarado com índices ascendentes ('''TO''') ou descendentes ('''DOWNTO''').
 +
;NOTA - INTEGER_VECTOR apenas existe no VHDL 2008:
  
 
* Tipo '''STD_LOGIC'''
 
* Tipo '''STD_LOGIC'''
Linha 106: Linha 117:
  
 
* Tipo '''STD_LOGIC_VECTOR'''
 
* Tipo '''STD_LOGIC_VECTOR'''
É constituído de vários STD_LOGIC agrupados.  Pode ser declarado como ascendente ('''TO''') ou descendente ('''DOWNTO''').
+
É constituído de vários STD_LOGIC agrupados.  Pode ser declarado com índices ascendentes ('''TO''') ou descendentes ('''DOWNTO''').
 
<syntaxhighlight lang=vhdl>
 
<syntaxhighlight lang=vhdl>
 
SIGNAL <nome_sl>  : STD_LOGIC;
 
SIGNAL <nome_sl>  : STD_LOGIC;
Linha 118: Linha 129:
  
 
* Tipo '''UNSIGNED'''
 
* Tipo '''UNSIGNED'''
É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas sem signal (apenas valores positivos).  Deve ser declarado como descendente ('''DOWNTO'''), para não haver problemas na interpretação dos resultados.
+
É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas sem signal (apenas valores positivos).  Deve ser declarado com índices descendentes ('''DOWNTO'''), para não haver problemas na interpretação dos resultados.
 
<syntaxhighlight lang=vhdl>
 
<syntaxhighlight lang=vhdl>
 
SIGNAL <nome_uns> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);
 
SIGNAL <nome_uns> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);
Linha 128: Linha 139:
  
 
* Tipo '''SIGNED'''
 
* Tipo '''SIGNED'''
É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas com signal (pode ter valores positivos ou negativos).  Deve ser declarado como descendente ('''DOWNTO'''), para não haver problemas na interpretação dos resultados.  O valor numérico corresponde ao complemento de 2.
+
É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas com signal (pode ter valores positivos ou negativos).  Deve ser declarado com índices descendentes ('''DOWNTO'''), para não haver problemas na interpretação dos resultados.  O valor numérico corresponde ao complemento de 2.
 
<syntaxhighlight lang=vhdl>
 
<syntaxhighlight lang=vhdl>
 
SIGNAL <nome_sig> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);
 
SIGNAL <nome_sig> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);

Edição atual tal como às 23h16min de 1 de abril de 2024

Estrutura do código VHDL

No código VHDL cada arquivo é composto pela estrutura básica na qual se declaram os LIBRARY / PACKAGE utilizados, em seguida se declara a ENTITY e a ARCHITECTURE.

  • Declaração das bibliotecas e pacotes LIBRARY / PACKAGE
 library library_name;
 use library_name.package_name.all;
  • Biblioteca std. Essa biblioteca e seus pacotes não necessitam ser declarados, pois já estão por default.
 library std;
 -- para utilizar os tipos BOOLEAN, CHARACTER, STRING, BIT, BIT_VECTOR, INTEGER, NATURAL, POSITIVE e suas funções
 use ieee.standard.all;
  • Biblioteca ieee e seus pacotes mais utilizados:
 library ieee;
 -- para utilizar os tipos STD_LOGIC e STD_LOGIC_VECTOR e suas funções
 use ieee.std_logic_1164.all;

 -- para utilizar os tipos SIGNED e UNSIGNED e suas funções
 use ieee.numeric_std.all;
  • Declaração da ENTITY
 ENTITY entity_name IS
   [generic (
     cons_name1: const_type const_value;
     cons_name2: const_type const_value;
     ...
     cons_nameN: const_type const_value);]
   [port (
     signal_name1: mode signal_type;
     signal_name2: mode signal_type;
     ...
     signal_nameN: mode signal_type);]
   [declarative_part]
 [begin
   statement_part]
 end [ENTITY] [entity_name];
  • Declaração da ARCHITECTURE
 architecture arch_name of entity_name is
   [declarative_part]
 begin
   statement_part
 end [architecture] [arch_name];
  • Declaração da CONFIGURATION

Essa declaração associa a ARCHITECTURE com a ENTITY. Se houver apenas uma arquitetura, ela não é necessária. Se houver mais de uma arquitetura para a mesma entidade, se não houver a declaração de configuração, a última arquitetura será associada a entidade.

CONFIGURATION nome_cfg OF nome_entity IS
	FOR nome_architecture END FOR;
END CONFIGURATION;

Tipos de dados

  • Tipo BOOLEAN

Pode assumir os valores false e true

  • Tipo BOOLEAN_VECTOR

É constituído de vários BOOLEAN agrupados. Pode ser declarado com índices ascendentes (TO) ou descendentes (DOWNTO).

NOTA - BOOLEAN_VECTOR apenas existe no VHDL 2008
  • Tipo BIT

Pode assumir os valores

'0',  -- Forcing  0
'1',  -- Forcing  1
  • Tipo BIT_VECTOR

É constituído de vários BITS agrupados. Pode ser declarado com índices ascendentes (TO) ou descendentes (DOWNTO).

-- Declaração de um SIGNAL do tipo BIT e BIT_VECTOR
SIGNAL <nome_b> : BIT;
SIGNAL <nome_bv> : BIT_VECTOR(<msb_index> DOWNTO <lsb_index>);
SIGNAL <nome_bv> : BIT_VECTOR(<lsb_index> TO <msb_index>);

-- Atribuição de valor a um SIGNAL do tipo BIT e BIT_VECTOR
<nome_b>   <= '0'; -- ou '1'
<nome_bv>  <= "01...0";
  • Tipo INTEGER

Pode assumir valores inteiros de -2^(31) até 2^(31). Se não for limitado assume o RANGE máximo correspondente a 32 bits.

-- Declaração de um SIGNAL do tipo INTEGER
SIGNAL <nome_i> : INTEGER RANGE <low> TO <high>;
-- Atribuição de valor a um SIGNAL do tipo INTEGER
<nome_i>   <= 215;
  • Tipo INTEGER_VECTOR

É constituído de vários INTEGER agrupados. Pode ser declarado com índices ascendentes (TO) ou descendentes (DOWNTO).

NOTA - INTEGER_VECTOR apenas existe no VHDL 2008
  • Tipo STD_LOGIC

pode assumir os valores

'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
  • Tipo STD_LOGIC_VECTOR

É constituído de vários STD_LOGIC agrupados. Pode ser declarado com índices ascendentes (TO) ou descendentes (DOWNTO).

SIGNAL <nome_sl>  : STD_LOGIC;
SIGNAL <nome_slv> : STD_LOGIC_VECTOR(<msb_index> DOWNTO <lsb_index>);
SIGNAL <nome_slv> : STD_LOGIC_VECTOR(<lsb_index> TO <msb_index>);

-- Atribuição de valor a um SIGNAL do tipo STD_LOGIC e STD_LOGIC_VECTOR
<nome_sl>   <= '0'; -- ou qual um dos valores possíveis 
<nome_slv>  <= "01...Z";
  • Tipo UNSIGNED

É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas sem signal (apenas valores positivos). Deve ser declarado com índices descendentes (DOWNTO), para não haver problemas na interpretação dos resultados.

SIGNAL <nome_uns> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);

-- Atribuição de valor a um SIGNAL do tipo UNSIGNED
<nome_uns>   <= "1101";   -- +13
<nome_uns>   <= "0101";   --  +5
  • Tipo SIGNED

É um STD_LOGIC_VECTOR sobre o qual se podem fazer operações aritméticas com signal (pode ter valores positivos ou negativos). Deve ser declarado com índices descendentes (DOWNTO), para não haver problemas na interpretação dos resultados. O valor numérico corresponde ao complemento de 2.

SIGNAL <nome_sig> : UNSIGNED(<msb_index> DOWNTO <lsb_index>);

-- Atribuição de valor a um SIGNAL do tipo UNSIGNED
<nome_sig>   <= "1101";   --  -3
<nome_sig>   <= "0101";   --  +5

Instruções concorrentes

  • Afirmação WHEN-ELSE
[rótulo:] <signal_alvo> <= 
	<valor> WHEN <condição> ELSE
	<valor> WHEN <condição> ELSE
	...
	<valor>;
  • Afirmação WITH-SELECT
[rótulo:] WITH <expressão> SELECT
	<signal_alvo> <= 
		<valor> WHEN  <escolha>,
		<valor> WHEN  <escolha>,
	 	...
		<valor> WHEN OTHERS;
  • Afirmação FOR-GENERATE

É preciso ter atenção que no VHDL apenas nas afirmação do tipo GENERATE o rótulo é obrigatório

 
  '''rótulo_obrigatório''': 
  FOR identificador IN faixa GENERATE
     [Parte_Declarativa
  BEGIN]
     afirmações_concorrentes
  END GENERATE [rótulo];
  • Afirmação IF-GENERATE

É preciso ter atenção que no VHDL apenas nas afirmação do tipo GENERATE o rótulo é obrigatório

 
  '''rótulo_obrigatório''': 
  IF condição GENERATE
         afirmações_concorrentes
  END GENERATE [rótulo];
  • Afirmação PROCESS

A afirmação PROCESS é uma instrução concorrente, mas internamente a ela todas as instruções/afirmações devem ser sequenciais

[rótulo:] PROCESS [(lista_de_sensibilidade)] [IS]
             [parte_declarativa]
         BEGIN
             afirmações_sequenciais;
         END PROCESS [rótulo];

Instruções sequencias

Essas instruções devem ser utilizadas dentro de um PROCESS, ou FUNCTION, ou PROCEDURE. Elas não podem ser usadas diretamente na ARCHITECTURE

  • Atribuição de valor sobre SIGNAL:
[rótulo:] <signal_name> <= <expression>;
  • Atribuição de valor sobre VARIABLE:
[rótulo:] <variable_name> := <expression>;
  • Afirmação NULL que não faz nada
[rótulo:] NULL;
  • Afirmação IF
[rótulo:] IF condição THEN
             afirmações_sequenciais;
         ELSIF condição THEN
             afirmações_sequenciais;
         ELSE
             afirmações_sequenciais;
         END IF [rótulo];
  • Afirmação CASE
 [rótulo :] CASE expressão IS
              WHEN valor =>                             -- valor único
                 afirmações_sequenciais;
              WHEN valor1 | valor2 | ... | valorN  =>   -- lista de valores
                 afirmações_sequenciais;
              WHEN valor1 TO valor2 =>                  -- faixa de valores
                 afirmações_sequenciais;
              WHEN OTHERS  => 
                 afirmações_sequenciais;
          END CASE [rótulo];
  • Afirmação LOOP incondicional:
[rótulo:] LOOP
                 afirmações_sequenciais;
          END LOOP [rótulo];
  • Afirmação FOR-LOOP:
[rótulo :] FOR identificador IN faixa LOOP
                 afirmações_sequenciais;
          END LOOP [rótulo];
  • Afirmação WHILE-LOOP:
[rótulo :] WHILE condição LOOP            -- Executa as "afirmações enquanto a "condição" for verdadeira
                 afirmações_sequenciais;
          END LOOP [rótulo];
  • Afirmação LOOP com EXIT:
[rótulo :] [FOR identificador IN faixa] LOOP
             afirmações_sequenciais;;
             -- EXIT incondicional.
             EXIT [rótulo_loop];
             -- EXIT condicional.
             EXIT [rótulo_loop] WHEN condição;	-- Se a "condição" é verdadeira, termina o "LOOP"
             afirmações_sequenciais;
          END LOOP [rótulo];
  • Afirmação LOOP com NEXT:
[rótulo :] [FOR identificador IN faixa] LOOP
             afirmações_sequenciais;
             -- NEXT incondicional.
             NEXT [rótulo_loop];                  -- Não executa as linhas até a linha "END LOOP", e incrementa o "identificador".
             -- NEXT condicional.
             NEXT [rótulo_loop] WHEN condição;	 -- Se a "condição" é verdadeira, não executa as linhas até a linha "END LOOP", e incrementa o "identificador".
             afirmações_sequenciais;
          END LOOP [rótulo];