реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> VHDL. Массив входных шин.
Jenya7
сообщение Feb 27 2017, 07:20
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 083
Регистрация: 29-03-12
Пользователь №: 71 075



Хочу сделать генерик
вместо
Код
entity S_SPI_REG is
    generic
    (
        DATA_WIDTH    : integer := 8;
     );
    port
    (        
        DATA1_IN : in std_logic_vector(DATA_WIDTH-1 downto 0);
        DATA2_IN : in std_logic_vector(DATA_WIDTH-1 downto 0);
        DATA3_IN : in std_logic_vector(DATA_WIDTH-1 downto 0);
        DATA4_IN : in std_logic_vector(DATA_WIDTH-1 downto 0);
        
        );
end S_SPI_REG;

что то вроде
Код
entity S_SPI_REG is
    generic
    (
        DATA_WIDTH    : integer := 8;
        CHANNELS : integer := 4
   );
    port
    (        
        DATA_IN : in array (0 to CHANNELS) of std_logic_vector(DATA_WIDTH-1 downto 0);                  
    );
end S_SPI_REG;

но на array компайлер ругается. можно это как то сделать?

Сообщение отредактировал Jenya7 - Feb 27 2017, 07:21
Go to the top of the page
 
+Quote Post
FakeDevice
сообщение Feb 27 2017, 08:02
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 67
Регистрация: 31-10-14
Из: Воронеж
Пользователь №: 83 452



Код
entity S_SPI_REG is
    generic
    (
        DATA_WIDTH    : integer := 8;
        CHANNELS : integer := 4
   );
    port
    (        
        DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0);                  
    );
end S_SPI_REG;

а если так?

UPD: ну а если всё-таки дальше захотите видеть массив из векторов -- объявите тип в модуле, через generate раскидайте один большой вектор по массиву векторов.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2017, 08:12
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 083
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(FakeDevice @ Feb 27 2017, 14:02) *
Код
entity S_SPI_REG is
    generic
    (
        DATA_WIDTH    : integer := 8;
        CHANNELS : integer := 4
   );
    port
    (        
        DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0);                  
    );
end S_SPI_REG;


а если так?

так можно. правда надо следить за границами шин. дополнительная математика.
Go to the top of the page
 
+Quote Post
FakeDevice
сообщение Feb 27 2017, 08:17
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 67
Регистрация: 31-10-14
Из: Воронеж
Пользователь №: 83 452



Цитата(Jenya7 @ Feb 27 2017, 11:12) *
так можно. правда надо следить за границами шин. дополнительная математика.

это же HDL. тут такие конструкции приходится иногда заворачивать, что порой не поймёшь: плакать или смеяться. А математика -- это для синтезатора какие-нибудь лишние микросекунды.
Go to the top of the page
 
+Quote Post
vladec
сообщение Feb 27 2017, 08:19
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 944
Регистрация: 3-10-05
Из: Москва
Пользователь №: 9 158



Цитата
DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0);

И последняя сгенерированная шина будет 32-разрядной.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2017, 08:39
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 083
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(FakeDevice @ Feb 27 2017, 14:17) *
это же HDL. тут такие конструкции приходится иногда заворачивать, что порой не поймёшь: плакать или смеяться. А математика -- это для синтезатора какие-нибудь лишние микросекунды.

да но в первом случае я могу записать
Код
my_signal <= DATA2_IN(5 downto 3);

в случае DATA_WIDTH * CHANNELS на каждую запись надо вычислять индекс.

Сообщение отредактировал Jenya7 - Feb 27 2017, 08:40
Go to the top of the page
 
+Quote Post
FakeDevice
сообщение Feb 27 2017, 09:17
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 67
Регистрация: 31-10-14
Из: Воронеж
Пользователь №: 83 452



Цитата(Jenya7 @ Feb 27 2017, 11:39) *
да но в первом случае я могу записать
Код
my_signal <= DATA2_IN(5 downto 3);

в случае DATA_WIDTH * CHANNELS на каждую запись надо вычислять индекс.

не обязательно на каждую. можно сделать как-то так:

Код
entity S_SPI_REG is
    generic(
        DATA_WIDTH : integer := 8;
        CHANNELS : integer := 4
    );
    port(
        DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0);
        MY_SIGNAL_OUT : out std_logic_vector(2 downto 0)
    );
end S_SPI_REG;

architecture RTL of S_SPI_REG is
    -- эта конструкция работает на "любых" параметрах без изменений кода.
    type TData is array(0 to CHANNELS - 1) of std_logic_vector(DATA_WIDTH - 1 downto 0);
    -- и эта...
    signal data : TData := (others => (others => 'X'));
begin

    -- и даже эта. пишется один раз и забывается.
    lbl_data_conv : for i in 0 to CHANNELS - 1 generate begin
        data(i) <= DATA_IN(DATA_WIDTH * (i + 1) - 1 downto DATA_WIDTH * i);
    end generate;

    -- а тут всё как и планировалось, ничего не надо "вычислять"
    MY_SIGNAL_OUT <= data(2)(5 downto 3);

end RTL;
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2017, 09:25
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 083
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(FakeDevice @ Feb 27 2017, 15:17) *
не обязательно на каждую. можно сделать как-то так:

Код
entity S_SPI_REG is
    generic(
        DATA_WIDTH : integer := 8;
        CHANNELS : integer := 4
    );
    port(
        DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0);
        MY_SIGNAL_OUT : out std_logic_vector(2 downto 0)
    );
end S_SPI_REG;

architecture RTL of S_SPI_REG is
    -- эта конструкция работает на "любых" параметрах без изменений кода.
    type TData is array(0 to CHANNELS - 1) of std_logic_vector(DATA_WIDTH - 1 downto 0);
    -- и эта...
    signal data : TData := (others => (others => 'X'));
begin

    -- и даже эта. пишется один раз и забывается.
    lbl_data_conv : for i in 0 to CHANNELS - 1 generate begin
        data(i) <= DATA_IN(DATA_WIDTH * (i + 1) - 1 downto DATA_WIDTH * i);
    end generate;

    -- а тут всё как и планировалось, ничего не надо "вычислять"
    MY_SIGNAL_OUT <= data(2)(5 downto 3);

end RTL;

как много нам открытий чудных... спасибо. sm.gif
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Feb 27 2017, 10:07
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 740
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(FakeDevice @ Feb 27 2017, 12:17) *
Код
     -- и даже эта. пишется один раз и забывается.
     lbl_data_conv : for i in 0 to CHANNELS - 1 generate begin
         data(i) <= DATA_IN(DATA_WIDTH * (i + 1) - 1 downto DATA_WIDTH * i);
     end generate;
В таких случаях я предпочитаю процесс:
Код
process (DATA_IN)
    for i in 0 to CHANNELS - 1 loop
         data(i) <= DATA_IN(DATA_WIDTH * (i + 1) - 1 downto DATA_WIDTH * i);
     end loop;
end process;

generate попрождает ещё один уровень иерархии, и с ним неудобно работать в симуляторе.
Go to the top of the page
 
+Quote Post
SemperAnte
сообщение Feb 27 2017, 10:55
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 24-10-10
Из: Санкт-Петербург
Пользователь №: 60 386



Если ваши синтезатор/симулятор поддерживают VHDL-2008, то в отдельном package вы можете объявить unconstrained array:
Код
type array_t is array(integer range <>) of std_logic_vector;

И в своем модуле объявить порт следующим образом:
Код
DATA_IN        : in array_t(0 to CHANNELS-1)(DATA_WIDTH-1 downto 0);
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 27 2017, 11:10
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 083
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(SemperAnte @ Feb 27 2017, 15:55) *
Если ваши синтезатор/симулятор поддерживают VHDL-2008, то в отдельном package вы можете объявить unconstrained array:
Код
type array_t is array(integer range <>) of std_logic_vector;

И в своем модуле объявить порт следующим образом:
Код
DATA_IN        : in array_t(0 to CHANNELS-1)(DATA_WIDTH-1 downto 0);

я понял. спасибо. в квартусе по моему есть галка для VHDL-2008.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th May 2017 - 17:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016