Mad_kvmg 0 August 15, 2007 Posted August 15, 2007 · Report post День добрый, помогите разобраться с массивами на VHDl. Нужно сформировать массив из входных сигналов, и далее произвести выборку из этого массива одного элемента в зависимости от передаваемого параметра. Возможно ли в прицепе такое реализовать на VHDl, или передача параметра в конструкцию невозможна на VHDL? library ieee; use ieee.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity arrayT is port( CLK : in std_logic; Input : in std_logic; DATA1 : in std_logic_vector(3 downto 0); DATA2 : in std_logic_vector(3 downto 0); O1 : out std_logic_vector(3 downto 0) ); end entity; architecture arrayT_arch of arrayT is type Tarray is array (1 to 2) of std_logic_vector (3 downto 0); signal K : Tarray; begin ---формирование массива------ process (CLK) begin if rising_edge(CLK) then K(1) <= DATA1; K(2) <= DATA2; end if; end process; --Пытаюсь из массива вытащить первое или второе значение, в зависимости от параметра---- G1 : for index in 1 to 3 generate begin process (Input) variable temp : std_logic; begin temp := Input; O1 <= K(temp); end process; end generate; end architecture; Ругается на строчку O1 <= K(temp); The index types in the reference to the array object are incompatible with its range type. Возможно проблема в типе данных параметра. Quote Share this post Link to post Share on other sites More sharing options...
AJIEKCEu 0 August 15, 2007 Posted August 15, 2007 (edited) · Report post Попробуйте вместо O1 <= K(temp); Сделать: O1 <= K(conv_integer(temp)); Если заругается - значит библиотека не подключена. Но вроде это должно быть в IEEE.std_logic_unsigned.all Кстати, generate у вас совершенно зря используется... Вы даже индекс нигде не используете.... Да и переменная ни к чему... И ещё со списком чувствительности разберитесь (это набор сигналов после process в скобочках). А то у вас в списке чувствительности стоит Input, а присвоение зависит input и K, короче если будете моделировать и у вас изменится DATA1 и DATA2 но не изменится input то на выходе останется старое значение. Попробуйте в модели - лучше поймете. Или дополнительно спросите. Можно просто process (Input, K) begin O1 <= K(conv_integer(Input)); end process; Edited August 15, 2007 by AJIEKCEu Quote Share this post Link to post Share on other sites More sharing options...
Mad_kvmg 0 August 15, 2007 Posted August 15, 2007 · Report post Попробуйте вместо O1 <= K(temp); Сделать: O1 <= K(conv_integer(temp)); Если заругается - значит библиотека не подключена. Но вроде это должно быть в IEEE.std_logic_unsigned.all Кстати, generate у вас совершенно зря используется... Вы даже индекс нигде не используете.... Да и переменная ни к чему... И ещё со списком чувствительности разберитесь (это набор сигналов после process в скобочках). А то у вас в списке чувствительности стоит Input, а присвоение зависит input и K, короче если будете моделировать и у вас изменится DATA1 и DATA2 но не изменится input то на выходе останется старое значение. Попробуйте в модели - лучше поймете. Или дополнительно спросите. Можно просто process (Input, K) begin O1 <= K(conv_integer(Input)); end process; AJIEKCEu благодарю, Ваша код работает куда лучше. И переменная не нужна и generate ни к месту тут. AJIEKCEu может быть сможете подсказать как реализовать обратную конструкцию. Выборка из массива всех элементов кроме того, номер которого передается в Input. Выходов тогда получается на один меньше чем входов. Заранее, спасибо! Quote Share this post Link to post Share on other sites More sharing options...
AJIEKCEu 0 August 15, 2007 Posted August 15, 2007 · Report post Выборка из массива всех элементов кроме того, номер которого передается в Input. Выходов тогда получается на один меньше чем входов. Какая-то странная задача... Как мне кажется - сложно найти такой задаче применения. А чего мы решаем собственно? В институте задачу задали? Вроде лето.... Примерно так... А дальше сам смотри. Но в общем-то я не могу себе представить зачем это надо. И ресурсов это много займет. constant N : integer := 5; type Tarray is array (1 to N) of std_logic_vector (3 downto 0); signal K : Tarray; .... process(K,input) variable ct : integer range 1 to N; begin i:=1; for i in 1 to N loop O(ct) <= K(i); if i = conv_integer(input) then ct:=ct+1; end if; end loop; end process; Quote Share this post Link to post Share on other sites More sharing options...
Mad_kvmg 0 August 15, 2007 Posted August 15, 2007 · Report post Какая-то странная задача... Как мне кажется - сложно найти такой задаче применения. А чего мы решаем собственно? В институте задачу задали? Вроде лето.... Примерно так... А дальше сам смотри. Но в общем-то я не могу себе представить зачем это надо. И ресурсов это много займет. constant N : integer := 5; type Tarray is array (1 to N) of std_logic_vector (3 downto 0); signal K : Tarray; .... process(K,input) variable ct : integer range 1 to N; begin i:=1; for i in 1 to N loop O(ct) <= K(i); if i = conv_integer(input) then ct:=ct+1; end if; end loop; end process; Вобщем надо это затем, чтоб сделать ядро медианной фильтрации. Суть проста апертура(окно) размером 3 на 3 переменяется по изображения. Соответственно в ядро передаются 9 логических векторов, глубенной по 10бит. Надо эти 9 значений(пикселей) выстроить впорядке возрастания и подать на выход тот который посередине(на 4 месте). И далее формируется отфильтрованное изображение. Вот прикидываю разные варианты, как это ядро реализовать наиболее компактно.(в плане количества кода) Аппаратные затраты не страшны, все это делается на virtex 8-ми миллионнике. спасб, за код! Quote Share this post Link to post Share on other sites More sharing options...
AJIEKCEu 0 August 15, 2007 Posted August 15, 2007 · Report post Аппаратные затраты не страшны, все это делается на virtex 8-ми миллионнике. Гм. А чего такое "восьми милионник"? Как-то я больше привык к индексам от 50 до быть может 8000 у virtex. Ну и потом. Если не экономя ресурсы ВООБЩЕ можно засунуть схему в такой плис гарантированно, то возможно при экономии можно будет ПЛИС попроще купить и денюжку сэкономить. Quote Share this post Link to post Share on other sites More sharing options...
Mad_kvmg 0 August 15, 2007 Posted August 15, 2007 · Report post Гм. А чего такое "восьми милионник"? Как-то я больше привык к индексам от 50 до быть может 8000 у virtex. Ну и потом. Если не экономя ресурсы ВООБЩЕ можно засунуть схему в такой плис гарантированно, то возможно при экономии можно будет ПЛИС попроще купить и денюжку сэкономить. Ну да я имел ввиду самый "вместительный" виртекс. Да можно конечно и попроще fpga взять, но на фирме я этого не решаю, у них вообще практика такая, все с запасом делать. Есть простецкая плата, которая с разьемов канала RS-485 принимает 16 сигнальчиков и передает на PCI шину, так и там чтобы сигналы гонять впихнули виртекс второй. А чтоб ядро это сделать, по большому счету, вообще массивы не нужны, выборку вообще с помощью case можно сделать process (Input,K) begin case conv_integer(input) is when 0 => O1 <= K(1); O2 <= K(2); O3 <= K(3); when 1 => O1 <= K(0); O2 <= K(2); O3 <= K(3); when 2 => O1 <= K(0); O2 <= K(1); O3 <= K(3); when 3 => O1 <= K(0); O2 <= K(1); O3 <= K(2); when others => O1 <= NON_ACTIVE; O2 <= NON_ACTIVE; O3 <= NON_ACTIVE; end case; end process; Но тебе все равно спасибо! В споре, рождается истинна. Quote Share this post Link to post Share on other sites More sharing options...
AJIEKCEu 0 August 15, 2007 Posted August 15, 2007 · Report post Есть простецкая плата, которая с разьемов канала RS-485 принимает 16 сигнальчиков и передает на PCI шину, так и там чтобы сигналы гонять впихнули виртекс второй. ЫЫЫЫ !!! У нас тоже баловались virtex2 при госзаказах.... Но почему-то при уходе в коммерцию нам удалось склонить их в сторону Спартана3. Quote Share this post Link to post Share on other sites More sharing options...