Jump to content
    

массив на VHDL

День добрый, помогите разобраться с массивами на 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.

 

Возможно проблема в типе данных параметра.

Share this post


Link to post
Share on other sites

Попробуйте вместо

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

Share this post


Link to post
Share on other sites

Попробуйте вместо

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. Выходов тогда получается на один меньше чем входов.

Заранее, спасибо!

Share this post


Link to post
Share on other sites

Выборка из массива всех элементов кроме того, номер которого передается в 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;

Share this post


Link to post
Share on other sites

Какая-то странная задача... Как мне кажется - сложно найти такой задаче применения. А чего мы решаем собственно? В институте задачу задали? Вроде лето....

 

Примерно так... А дальше сам смотри. Но в общем-то я не могу себе представить зачем это надо. И ресурсов это много займет.

 

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-ми миллионнике.

 

спасб, за код!

Share this post


Link to post
Share on other sites

Аппаратные затраты не страшны, все это делается на virtex 8-ми миллионнике.

 

 

Гм. А чего такое "восьми милионник"? Как-то я больше привык к индексам от 50 до быть может 8000 у virtex. Ну и потом. Если не экономя ресурсы ВООБЩЕ можно засунуть схему в такой плис гарантированно, то возможно при экономии можно будет ПЛИС попроще купить и денюжку сэкономить.

Share this post


Link to post
Share on other sites

Гм. А чего такое "восьми милионник"? Как-то я больше привык к индексам от 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;

 

Но тебе все равно спасибо! В споре, рождается истинна.

Share this post


Link to post
Share on other sites

Есть простецкая плата, которая с разьемов канала RS-485 принимает 16 сигнальчиков и передает на PCI шину, так и там чтобы сигналы гонять впихнули виртекс второй.

 

ЫЫЫЫ !!!

У нас тоже баловались virtex2 при госзаказах.... Но почему-то при уходе в коммерцию нам удалось склонить их в сторону Спартана3.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...