Array em VHDL

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

Tipos ARRAY predefinidos no VHDL

Na linguagem VHDL existem alguns tipos que são definidos como array (vetores) de um tipo básico. Por exemplo, na biblioteca standard.vhd define os tipos string e bit_vector como ARRAY de bit e character. Na std_logic_1164.vhd é definido o tipo std_logic_vector como ARRAY de tipo std_logic. A biblioteca numeric_std.vhd define os tipos unsigned e signed também como ARRAY do tipo std_logic.

-- package standard.vhd  (não precisa ser declarado pois é usado por default)
library std;
use std.standard.all;
...
type string is array (positive range <>) of character; 
type bit_vector is array (natural range <>) of bit;

-- package std_logic_1164.vhd
library ieee;
use ieee.std_logic_1164.all;
...
type std_logic_vector is array ( natural range <>) of std_logic;

-- package numeric_std 
library ieee;
use ieee.numeric_std.all;
...
type unsigned is array (natural range <>) of std_logic;
type signed is array (natural range <>) of std_logic;

Para o uso desses tipos é necessário declarar a biblioteca e usar o pacote (package) correspondente, conforme indicado acima.

Declaração de tipos ARRAY pelo usuário

Para definir um tipo ARRAY em VHDL é usada a sintaxe abaixo:

 type nome_tipo is array (faixa_indices) of tipo_elemento_da_array;

Em VHDL é possível criar ARRAY de diferentes dimensões, seja 1D, 1D x 1D, 2D, 1D x 1D x 1D, 3D.

  • OBS: A forma de acesso aos elementos dos ARRAYs pode ser limitado pelo compilador ou software utilizado na síntese e simulação.

Array 1D

Exemplos são os array bit_vector, std_logic_vector, unsigned e signed, onde o vetor é composto por elementos do tipo bit ou std_logic

-- Declaração do tipo
type array1Du_bit is array (natural range <>) of bit;
type array1Du is array (natural range <>) of integer range 0 to 7;
type array1Dc is array (3 downto 0) of integer range -8  to 7;

-- Declaração do objeto
signal 	a : array1Du_bit (7 downto 0);
signal 	b : array1Du (1 to 5);
signal 	c : array1Dc;

-- Uso
 a <= "10100000";
 a <= ('1','0','1','0','0','0','0','0');
 a(7) <= '1';
 a(5 downto 3) <= '1' & "00";   
 ya <= a(0);           -- onde ya é um objeto do tipo bit;

 b <= (0, 1, 2, 3, 4);
 yb <= b(5);           -- onde yb é um objeto do tipo integer com range igual ou maior que os elementos de b

 c(3) <= 4;
 c(2 downto 1) <= (others => 0);   
 c(0) <= -6;
 yc <= c(2);          -- onde yc é um objeto do tipo integer com range igual ou maior que os elementos de c

Array 1D x 1D

Exemplos são os array nos quais os elementos são um ARRAY 1D ou um integer ou chararcter

 -- declaração do tipo
 type array1Dx1D_slv is array (natural range <>) of std_logic_vector (4 downto 0);
 type array1Du is array (1 to 4) of integer range 0 to 100;
 type array1Dx1D_int is array (1 to 3) of array1Dc;
 -- declaração do objeto
 signal a :   array1Dx1D_slv (1 to 4);
 signal b :   array1Dx1D_int;

 -- atribuição de valor
 a <= ("001Z0", "11111", "01001", "00000");
 b <= (( 12, 7, 10, 78),( 21, 99, 0, 100),( 34, 56, 100, 11));

 -- uso do valor
 a_slv <= a(1);    -- retorna"00Z10", o 1º vetor do array de array, onde a_slv é um objeto std_logic_vector (4 downto 0)
 a_sl <= a(1)(1);  -- retorna 'Z', o bit de índice 2 do  1º vetor do array de array, onde a_sl é um objeto std_logic
 b_int <= b(3)(4);    -- retorna 11, onde b_int é um objeto integer

Array 2D

 -- declaração do tipo
 type array2D_sl is array (natural range <>, natural range <>) of std_logic;
 -- declaração do objeto
 signal a :   array2D_sl (1 to 4, 4 downto 0);

 -- atribuição de valor
 a <= ("001Z0", "11111", "01001", ('0','0','0','0','0'));

 -- uso do valor
 a_sl <= a(1,1);    -- retorna 'Z', a posição (1,1) do array, onde a_sl é um objeto std_logic
 para 1Dx1D o acesso é assim a_sl <= a(1)(1);  -- retorna 'Z', o bit de índice 2 do  1º vetor do array de array, onde a_sl é um objeto std_logic


Array 1Dx1Dx1D

 -- declaração do tipo
 type array1Dx1D_slv is array (natural range <>) of std_logic_vector (4 downto 0);
 type array1Dx1Dx1D_slv is array (natural range <>) of array1Dx1D_slv;

 type array1Dx1D_int is array (1 to 4) of integer range 0 to 100;
 type array1Dx1Dx1D_int is array (1 to 2) of array1Dx1D_int;


 -- declaração do objeto
 signal a :   array1Dx1Dx1D_slv (1 to 4);
 signal b :   array1Dx1Dx1D_int;


 -- atribuição de valor
 a <= (("00011", "11101", "11101", "01110"), ("001Z0", "11111", "01001", "00000"));
 b <= ((4, 1, 3, 11),( 21, 99, 0, 100));

 -- uso do valor
 a_1Dx1D <= a(1);    -- retorna ("00011", "11101", "11101", "01110"), o 1º array, onde a_1Dx1D é um objeto array1Dx1D_slv
 a_slv   <= a(2)(1);  -- retorna "001Z0", o 1º array do 2º array onde a_slv é um objeto std_logic_vector (4 downto 0)
 a_sl    <= a(2)(1)(1);  -- retorna 'Z', o bit de índice 2 do  1º vetor do array de array, onde a_sl é um objeto std_logic
 b_int   <= b(2)(4);    -- retorna 100, onde b_int é um objeto integer

Array 3D

 -- declaração do tipo
 type array3D_sl is array (natural range <>, natural range <>, natural range <>) of std_logic;
 type array3D_bit is array (1 to 2, 1 to 4, 4 downto 0) of bit;

 -- declaração do objeto
 signal a :   array3D_sl (1 to 2, 1 to 4, 4 downto 0);
 signal b :   array3D_bit;

 -- atribuição de valor
 a <= (("00011", "11101", "11101", "01110"), ("001Z0", "11111", "01001", "00000"));
 b <= (("00011", "11101", "11101", "01110"), ("00110", "11111", "01001", "00000"));