Pitonbl4 0 8 октября, 2019 Опубликовано 8 октября, 2019 · Жалоба Добрый день! Есть код вида library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; library UNISIM; use UNISIM.vcomponents.all; entity top_trigger is generic( NumOfChannel : integer := 6 --! ); port( clk_100MHz : in STD_LOGIC; --! start : in STD_LOGIC; --! data : in STD_LOGIC_VECTOR(255 downto 0); --! sig : out STD_LOGIC --! ); end top_trigger; architecture Behavioral of top_trigger is COMPONENT trigger is generic( n : integer := 64; --! param param : integer := 1; --! param length : integer := 1024 --! param ); port( clk_100MHz : in STD_LOGIC; start : in STD_LOGIC; dataIn : in STD_LOGIC_VECTOR(15 downto 0); sig : out STD_LOGIC ); END COMPONENT; signal dataOut : std_logic_vector(31 downto 0) := (others => '0'); signal start_d1 : std_logic := '0'; signal start_d2 : std_logic := '0'; begin inst_fd0: fd port map(start_d1, clk_100MHz, start); inst_fd1: fd port map(start_d2, clk_100MHz, start_d1); inst_channels_gen : for i in NumOfChannel to NumOfChannel generate inst_trigger : trigger generic map( n => 64, param => 1, length => 1024 ) port map( clk_100MHz => clk_100MHz, start => start_d2, dataIn => data(((i + 1) * 16) - 1 downto i * 16), sig => sig ); end generate; end Behavioral; Это PL часть. Сейчас хочу это все прокинуть в PS часть. В будущем, хотелось бы менять NumOfChannel из PS части. Для этого необходимо NumOfChannel убрать из generic и сделать портом. Пытаюсь так сделать, но появляются ошибки вида: actual for formal port is neither a static name nor a globally static expression; range for generate must be a static vhdl. Подскажите как это можно сделать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 8 октября, 2019 Опубликовано 8 октября, 2019 · Жалоба Сейчас ваш модуль поддерживает максимум 16 NumOfChannel за счет фиксированной ширины шины data. Определите NumOfChannel не как порт, а как константу внутри, равную 16. И заодно неясна ситуация с выходом sig, который управляется сразу несколькими модулями. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 30 8 октября, 2019 Опубликовано 8 октября, 2019 · Жалоба Приветствую! Когда вы делаете в цикле generate инстацируете какую либо логику или модули то это происходит на этапе компиляции. Соответственно на этапе выполнения вы не можете менять существующее железо. Так что вам нужно при компиляции делать generate на максимальное число портов, а уж обработку можно и распределять только на заданное из PS число но не более максимального (если так уж нужно). Удачи! Rob. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iglaz3 0 8 октября, 2019 Опубликовано 8 октября, 2019 · Жалоба Здравствуйте Никакой неясной ситуации с sig нет Quote inst_channels_gen : for i in NumOfChannel to NumOfChannel generate цикл генерации выполняется один раз )) А возможное решение поставить два мультиплексора, один подставит нужные данные в порт dataIn, второй выведет нужный sig. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KeisN13 10 9 октября, 2019 Опубликовано 9 октября, 2019 · Жалоба Не понятно почему автора кода удивляет, что в PL части SoC должен быть статический набор периферии, которую он этим кодом делает. В ПЛИС динамически ничего выделать нельзя. Если вы своим параметром хотите менять "на лету" количество интерфейсов, то Вас ждет фиаско. Вы можете создать заранее максимальное количество интерфейсов в PL части и потом нужное количество включать и выключать с помощью PS, но незадействованные все равно будут находиться внутри ПЛИС. Или использовать частичную реконфигурацию с набором областей, где будет подгружаться и куда будет заливаться нужное количество интерфейсов. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pitonbl4 0 10 октября, 2019 Опубликовано 10 октября, 2019 (изменено) · Жалоба 09.10.2019 в 06:38 KeisN13 сказал: Не понятно почему автора кода удивляет, что в PL части SoC должен быть статический набор периферии, которую он этим кодом делает. В ПЛИС динамически ничего выделать нельзя. Если вы своим параметром хотите менять "на лету" количество интерфейсов, то Вас ждет фиаско. Меня особо не удивляло, что в PL должен быть статический набор переферии 08.10.2019 в 18:19 iglaz3 сказал: А возможное решение поставить два мультиплексора, один подставит нужные данные в порт dataIn, второй выведет нужный sig. Так и думал.Надеялся что может есть более изящный вариант Изменено 10 октября, 2019 пользователем big_ben Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 10 октября, 2019 Опубликовано 10 октября, 2019 · Жалоба 33 minutes ago, big_ben said: что-то в духе some_port <= slv_reg(i) Если что - это и есть мультиплексор. В хардваре нет простых решений программистов. Можно заморочится и заливать через сдвиговый регистр или фифо. Но это на две головы выше вопроса "Сделать generic портом". Даже при моделировании программной модели ПЛИС в виртуальной среде чтобы поменять значение параметра без рекомпиляции нужно подзаморочится. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться