Перейти к содержанию
    

переменную убрать из generic и сделать портом

Добрый день!

Есть код вида
 

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. Подскажите как это можно сделать? 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас ваш модуль поддерживает максимум 16 NumOfChannel за счет фиксированной ширины шины data. Определите NumOfChannel не как порт, а как константу внутри, равную 16. И заодно неясна ситуация с выходом sig, который управляется сразу несколькими модулями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Когда вы делаете в цикле generate  инстацируете какую либо логику или модули то это происходит  на этапе компиляции. Соответственно на этапе выполнения вы не можете менять существующее железо.  Так что вам нужно при компиляции делать generate на максимальное число портов, а уж обработку можно и распределять только на заданное из PS число но не более максимального (если так уж нужно).   

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте

Никакой неясной ситуации с sig нет

Quote

inst_channels_gen : for i in NumOfChannel to NumOfChannel generate

цикл генерации выполняется один раз ))

А возможное решение поставить два мультиплексора, один подставит нужные данные в порт dataIn, второй  выведет нужный sig.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно почему автора кода удивляет, что в PL части SoC должен быть статический набор периферии, которую он этим кодом делает.

В ПЛИС динамически ничего выделать нельзя. Если вы своим параметром хотите менять "на лету" количество интерфейсов, то Вас ждет фиаско.

Вы можете создать заранее максимальное количество интерфейсов в PL части и потом нужное количество включать и выключать с помощью PS, но незадействованные все равно будут находиться внутри ПЛИС.

Или использовать частичную реконфигурацию с набором областей, где будет подгружаться  и куда будет заливаться нужное количество интерфейсов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

09.10.2019 в 06:38 KeisN13 сказал:

Не понятно почему автора кода удивляет, что в PL части SoC должен быть статический набор периферии, которую он этим кодом делает.

В ПЛИС динамически ничего выделать нельзя. Если вы своим параметром хотите менять "на лету" количество интерфейсов, то Вас ждет фиаско.

Меня особо не удивляло, что в PL должен быть статический набор переферии

08.10.2019 в 18:19 iglaz3 сказал:

А возможное решение поставить два мультиплексора, один подставит нужные данные в порт dataIn, второй  выведет нужный sig.

Так и думал.
Надеялся что может есть более изящный вариант

Изменено пользователем big_ben

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 minutes ago, big_ben said:

что-то в духе some_port <= slv_reg(i)

Если что - это и есть мультиплексор. В хардваре нет простых решений программистов. Можно заморочится и заливать через сдвиговый регистр или фифо. Но это на две головы выше вопроса "Сделать generic портом".

Даже при моделировании программной модели ПЛИС в виртуальной среде чтобы поменять значение параметра без рекомпиляции нужно подзаморочится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...