2014-09-14 2 views
0

У меня есть массив:Заполните одну строку в 2D массива вне процесса (VHDL)

type MATR is array(natural range 1 to N, natural range 1 to N) of natural; 
signal m: MATR; 

1) Можно ли заполнять элементы т (0, 1), т (0, 2) ... m (0, N) с некоторым значением вне процесса? Нечто подобное:

m(1) <= (others => 2) 

2) Можно назначить массив 1D (диапазон от 1 до N) одной строке массива 2D (также вне процесса)?

+0

Я видел, что вы приняли мой ответ в качестве решения. Какие цепочки инструментов вы используете? Мне интересны синтетические доказательства для цепочки инструментов Vivado или Quartus II. – Paebbels

+0

Я использую Xilinx 14.4, ваш код работает. Благодарю. – user3479125

ответ

1

Да, вы можете сделать это, написав процедуру, как этот:

procedure assign_row(signal slm : out T_SLM; slv : STD_LOGIC_VECTOR; constant RowIndex : NATURAL) is 
    variable temp : STD_LOGIC_VECTOR(slm'high(2) downto slm'low(2)); -- Xilinx iSIM work-around, because 'range(2) evaluates to 'range(1); tested with ISE XST/iSim 14.2 
begin 
    temp := slv; 
    for i in temp'range loop 
    slm(RowIndex, i) <= temp(i); 
    end loop; 
end procedure; 

Где T_SLM это мой тип матрицы определяется следующим образом:

-- STD_LOGIC_MATRIXs 
type T_SLM is array(NATURAL range <>, NATURAL range <>) of STD_LOGIC; 
-- ATTENTION: 
-- 1. you MUST initialize your matrix signal with 'Z' to get correct simulation results (iSim, vSim, ghdl/gtkwave) 
-- Example: signal myMatrix : T_SLM(3 downto 0, 7 downto 0) := (others => (others => 'Z')); 
-- 2. Xilinx iSIM work-around: DON'T use myMatrix'range(n) for n >= 2 
-- because: myMatrix'range(2) returns always myMatrix'range(1); tested with ISE/iSim 14.2 
-- USAGE NOTES: 
-- dimension 1 => rows  - e.g. Words 
-- dimension 2 => columns - e.g. Bits/Bytes in a word 

Так вот п Пример использовать эту процедуру:

architecture [...] 
    signal myVector : STD_LOGIC_VECTOR(7 downto 0); 
    signal myMatrix : T_SLM(3 downto 0, myVector'range) := (others => (others => 'Z')); 
    [...] 
begin 
    [...] 
    assign_row(myMatrix, myVector, 0); 
    assign_row(myMatrix, (myVector'range => '0'), 1); 
    assign_row(myMatrix, x"4A", 2); 
    [...] 
end; 

Этот код проверяется с ISE XST и işim (13.x, 14.x), VSIM и GHDL. Поскольку ISE 13.x был текущей версией, Xilinx заявила, что ошибка диапазона не будет исправлена ​​в ISE 14.x.

Если вам нужен другой путь вокруг, вот моя функция get_row:

-- get a matrix row 
function get_row(slm : T_SLM; RowIndex : NATURAL) return STD_LOGIC_VECTOR is 
    variable slv : STD_LOGIC_VECTOR(slm'high(2) downto slm'low(2));  -- Xilinx iSim work-around, because 'range(2) = 'range(1); tested with ISE/iSim 14.2 
begin 
    for i in slv'range loop 
    slv(i) := slm(RowIndex, i); 
    end loop; 
    return slv; 
end function; 

Если вы хотите использовать ПРИРОДНЫЙ в качестве элементарного типа для векторов и матриц, а затем обмениваться std_logic с естественным.

0

1) Можно ли заполнить элементы m (0, 1), m (0, 2) ... m (0, N) с некоторым значением вне процесса?

2) Возможно ли присвоить 1D массив (диапазон от 1 до N) одной строке двумерного массива (также вне процесса)?

Да, это возможно. Я приведу только пример загрузки новой строки. Обратите внимание, что этот пример для N = 4, метод может быть непрактичным для больших массивов.

Также обратите внимание, что это позволяет только указывать индексы.

entity foo is 
    constant N: natural := 4; 
end entity; 

architecture fum of foo is 
    type MATR is array(natural range 1 to N, natural range 1 to N) of natural; 
    type col is array (natural range 1 to N) of natural; 
    constant f:col := (1,2,3,4); 
    signal m: MATR; 

begin 
    m <= (1 => (1 => f(1), 2 => f(2), 3 => f(3), 4 => f(4)), 
      2 => (1 => m(2,1), 2 => m(2,2), 3 => m(2,3), 4 => m(2,4)), 
      3 => (1 => m(3,1), 2 => m(3,2), 3 => m(3,3), 4 => m(3,4)), 
      4 => (1 => m(4,1), 2 => m(4,2), 3 => m(4,3), 4 => m(4,4))); 

end architecture; 

(И, возможно, ваш вопрос (ы) должен быть немного более четко для ваших целей ответ не может быть практически.).

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