2013-07-23 2 views
3

У меня есть два 2D массива:VHDL - определение диапазона 2D-массив

type array1x1D is array (0 to 10) of std_logic_vector(0 to 10); -- Array of arrays 
type array2D is array (0 to 10, 0 to 10) of std_logic; -- Real 2D array 

Как получить доступ диапазон std_logic_vectors в первом и диапазоне в последнем? Я мог бы, конечно, использовать переменную, чтобы отслеживать их размер, но я бы предпочел избежать этого. Я пытаюсь перебрать массивы с помощью операторов GENERATE.

+0

Действительно ли это '0 downto 10'? Это может быть от 10 до 0 или от 0 до 10. – nio

+0

Не могли бы вы показать свой код с помощью своих выражений? – nio

+0

@nio oops, да, это должно быть от 0 до 10. Я редактировал сообщение. – alexdavey

ответ

7

array1x1D:

VHDL-2002: подтип требуется для std_logic_vector(0 downto 10) если вы хотите получить диапазон этой части, тем самым разделив тип в:

subtype array1x1D_element is std_logic_vector(0 to 10); 
type array1x1D is array (0 to 10) of array1x1D_element; -- Array of arrays 

Тогда вы возможно array1x1D_element'range.

VHDL-2008: Используйте добавленный атрибут 'element (возможно, для этой цели :-), и напишите array1x1D'element'range.

array2D:

доступ различных размеров по индексу для 'range, таким образом, с array2D'range(1) и array2D'range(2).

2
entity test1 is 
end entity; 
library ieee; 
use ieee.std_logic_1164.all; 
architecture a1 of test1 is 
    type array1x1D is array (0 to 10) of std_logic_vector(0 to 10); -- Array of arrays 
    type array2D is array (0 to 10, 0 to 5) of std_logic; -- Real 2D array 
    signal s1 : array1x1D; 
begin 
    name : process is 
    begin 
     report "array1x1D(0)'length:" & integer'image(s1(0)'length); 
     report "array2D'length(1):" & integer'image(array2D'length(1)); 
     report "array2D'length(2):" & integer'image(array2D'length(2)); 
     wait; 
    end process name; 
end architecture a1; 

производит:

# run -all 
# ** Note: array1x1D(0)'length:11 
# Time: 0 ns Iteration: 0 Instance: /test1 
# ** Note: array2D'length(1):11 
# Time: 0 ns Iteration: 0 Instance: /test1 
# ** Note: array2D'length(2):6 
# Time: 0 ns Iteration: 0 Instance: /test1 
# 

Я не могу сразу увидеть способ, чтобы выяснить длину векторных элементов массива 1d без промежуточного сигнала/постоянной/переменной этого типа ..

+0

Как назначить std_logic_vector в реальном 2D-массиве, так как использование обоих индексов будет просто ограничивать нас одним значением std_logic и использовать только один индекс недостаточно – quantum231

+1

@ quant231: вы имеете в виду 'array2d (от 0,0 до 5) <= "01010" '? У меня нет симулятора, но я думаю, что это синтаксис ... –

Смежные вопросы