Mudanças entre as edições de "Folha de consulta de VHDL"
(4 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 6: | Linha 6: | ||
library library_name; | library library_name; | ||
use library_name.package_name.all; | use library_name.package_name.all; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Biblioteca '''std'''. Essa biblioteca e seus pacotes não necessitam ser declarados, pois já estão por ''default''. | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | library std; | ||
+ | -- para utilizar os tipos BOOLEAN, CHARACTER, STRING, BIT, BIT_VECTOR, INTEGER, NATURAL, POSITIVE e suas funções | ||
+ | use ieee.standard.all; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Linha 12: | Linha 19: | ||
library ieee; | library ieee; | ||
-- para utilizar os tipos STD_LOGIC e STD_LOGIC_VECTOR e suas funções | -- 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 | -- para utilizar os tipos SIGNED e UNSIGNED e suas funções | ||
use ieee.numeric_std.all; | use ieee.numeric_std.all; | ||
Linha 19: | Linha 27: | ||
* Declaração da '''ENTITY''' | * Declaração da '''ENTITY''' | ||
<syntaxhighlight lang=vhdl> | <syntaxhighlight lang=vhdl> | ||
− | + | ENTITY entity_name IS | |
[generic ( | [generic ( | ||
cons_name1: const_type const_value; | cons_name1: const_type const_value; | ||
Linha 33: | Linha 41: | ||
[begin | [begin | ||
statement_part] | statement_part] | ||
− | end [ | + | end [ENTITY] [entity_name]; |
</syntaxhighlight> | </syntaxhighlight> | ||
Linha 46: | Linha 54: | ||
* Declaração da '''CONFIGURATION''' | * 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. | ||
+ | <syntaxhighlight lang=vhdl> | ||
+ | CONFIGURATION nome_cfg OF nome_entity IS | ||
+ | FOR nome_architecture END FOR; | ||
+ | END CONFIGURATION; | ||
+ | </syntaxhighlight> | ||
==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 | |
<pre> | <pre> | ||
'0', -- Forcing 0 | '0', -- Forcing 0 | ||
Linha 56: | Linha 77: | ||
* Tipo '''BIT_VECTOR''' | * Tipo '''BIT_VECTOR''' | ||
− | É constituído de vários BITS agrupados. Pode ser declarado | + | É 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 76: | 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 92: | Linha 117: | ||
* Tipo '''STD_LOGIC_VECTOR''' | * Tipo '''STD_LOGIC_VECTOR''' | ||
− | É constituído de vários STD_LOGIC agrupados. Pode ser declarado | + | É 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 104: | 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 | + | É 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 114: | 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 | + | É 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];