jenya7 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 (изменено) · Жалоба Хочу сделать генерик вместо 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 компайлер ругается. можно это как то сделать? Изменено 27 февраля, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба 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 раскидайте один большой вектор по массиву векторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба 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; а если так? так можно. правда надо следить за границами шин. дополнительная математика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба так можно. правда надо следить за границами шин. дополнительная математика. это же HDL. тут такие конструкции приходится иногда заворачивать, что порой не поймёшь: плакать или смеяться. А математика -- это для синтезатора какие-нибудь лишние микросекунды. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladec 7 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба DATA_IN : in std_logic_vector(DATA_WIDTH * CHANNELS - 1 downto 0); И последняя сгенерированная шина будет 32-разрядной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 (изменено) · Жалоба это же HDL. тут такие конструкции приходится иногда заворачивать, что порой не поймёшь: плакать или смеяться. А математика -- это для синтезатора какие-нибудь лишние микросекунды. да но в первом случае я могу записать my_signal <= DATA2_IN(5 downto 3); в случае DATA_WIDTH * CHANNELS на каждую запись надо вычислять индекс. Изменено 27 февраля, 2017 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FakeDevice 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба да но в первом случае я могу записать 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба не обязательно на каждую. можно сделать как-то так: 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; как много нам открытий чудных... спасибо. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба -- и даже эта. пишется один раз и забывается. 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 попрождает ещё один уровень иерархии, и с ним неудобно работать в симуляторе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
semperante 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба Если ваши синтезатор/симулятор поддерживают 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 февраля, 2017 Опубликовано 27 февраля, 2017 · Жалоба Если ваши синтезатор/симулятор поддерживают 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться