Folha de consulta de VHDL

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

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 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

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;
  • Instrução IF
[rótulo:] IF condição THEN
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         ELSIF condição THEN
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         ELSE
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         END IF [rótulo];
  • Instrução CASE
 [rótulo :] CASE expressão IS
                  WHEN valor =>                             -- valor único
                    afirmação_sequencial;                            
                    afirmação_sequencial;                            
                    ...
                  WHEN valor1 | valor2 | ... | valorN  =>   -- lista de valores
                    afirmação_sequencial;                            
                    afirmação_sequencial;                            
                    ...
                  WHEN valor1 TO valor2 =>                  -- faixa de valores
                    afirmação_sequencial;                            
                    afirmação_sequencial; 
                    ...
                  WHEN OTHERS  => 
                    afirmação_sequencial;                            
                    afirmação_sequencial; 
                    ...
          END CASE [rótulo];
  • Instrução LOOP incondicional:
[rótulo:] LOOP
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução FOR-LOOP:
[rótulo :] FOR identificador IN faixa LOOP
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução WHILE-LOOP:
[rótulo :] WHILE condição LOOP            -- Executa as "afirmações enquanto a "condição" for verdadeira
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução LOOP com EXIT:
[rótulo :] [FOR identificador IN faixa] LOOP
             afirmação_sequencial;
             -- EXIT incondicional.
             EXIT [rótulo_loop];
             -- EXIT condicional.
             EXIT [rótulo_loop] WHEN condição;	-- Se a "condição" é verdadeira, termina o "LOOP"
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução LOOP com NEXT:
[rótulo :] [FOR identificador IN faixa] LOOP
             afirmação_sequencial;
             -- 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ção_sequencial;
             ...
          END LOOP [rótulo];