Jump to content

    

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Удачи! Rob.

 

Share this post


Link to post
Share on other sites

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

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

Quote

inst_channels_gen : for i in NumOfChannel to NumOfChannel generate

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites
09.10.2019 в 06:38 KeisN13 сказал:

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

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

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

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

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

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

Edited by big_ben

Share this post


Link to post
Share on other sites
33 minutes ago, big_ben said:

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

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

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this