Jump to content
    

Странные вопросы по VHDL

готово: general_purpose_lib.rar

Использовать так:

    del_lat : delay generic map (
        DEL => DUT_LAT
    ) port map (
        clk => clk,       -- clock
        -- Входные данные
        data_in => del_in,
        -- Выходные данные
        data_out => del_out
    );
    del_in <= y1_mat_i & y1_mat_q & y2_mat_i & y2_mat_q;
    -- -- y1_mat_d_i <= del_out(EXT_DATA_BW*4 - 1 downto EXT_DATA_BW*3);
    -- -- y1_mat_d_q <= del_out(EXT_DATA_BW*3 - 1 downto EXT_DATA_BW*2);
    -- -- y2_mat_d_i <= del_out(EXT_DATA_BW*2 - 1 downto EXT_DATA_BW  );
    -- -- y2_mat_d_q <= del_out(EXT_DATA_BW   - 1 downto 0            );
    split(del_out, y1_mat_d_i, y1_mat_d_q, y2_mat_d_i, y2_mat_d_q);

Share this post


Link to post
Share on other sites

Знатоки, подскажите, пожалуйста. Есть строчка:

        rnd_const <= (NRS_BITS-1 => '1', others => '0');

где

entity mult35x35 is generic (
    NRS_BITS : natural := 0;

Active-HDL выдаёт такое ругательство:

# Warning: COMP96_0349: ../../../../../rtl/std_lib/mult35x35.vhd : (194, 23): Aggregate with multiple choices has a non-static or null choice.

Пробовал вместо NRS_BITS подставлять константу - та же ошибка.

Пробовал вместо NRS_BITS подставлять просто число - ошибки нет.

 

Как правильно написать, чтобы не было ворнинга. Что я делаю не так?

Share this post


Link to post
Share on other sites

rnd_const <= (NRS_BITS - 1 => '1', others => '0');

entity mult35x35 is generic (
         NRS_BITS : natural := 0;

Чему равно NRS_BITS при инстанцировании компонента?

Share this post


Link to post
Share on other sites

бывает 0 в некоторых инстансах, бывает 33

rnd_const объявлена так:

    signal rnd_const : std_logic_vector(BW_DSP_OUT-1 downto 0);

, где

 constant BW_DSP_OUT : natural := 48;

 

Share this post


Link to post
Share on other sites

бывает 0 в некоторых инстансах

 

    signal rnd_const : std_logic_vector(BW_DSP_OUT-1 downto 0);

 

Ну вот и ответ. Если 0, то получаем

rnd_const <= (-1 => '1', others => '0');

Вы вышли за диапазон.

 

Share this post


Link to post
Share on other sites

Виноват, сразу не показал весь код, там ещё генерэйт есть:

    norndg: if NRS_BITS = 0 generate
        rnd_const <= (others => '0');
    end generate norndg;
    rndg: if not (NRS_BITS = 0) generate
        rnd_const <= (NRS_BITS-1 => '1', others => '0');

    end generate rndg;

Так что нулевые отсеиваются. Ругается на ненулевые похоже. Попробовал ещё раз вместо NRS_BITS подставить константу NRS_BITS_С, определённую как

    constant NRS_BITS_C : natural := 4;

Варнинг исчез.

Но когда определяю так:

    constant NRS_BITS_C : natural := NRS_BITS;

. То варнинг остаётся.

Получается ругается на generic параметры?...

Share this post


Link to post
Share on other sites

    constant NRS_BITS_C : natural := 4;

Варнинг исчез.

Но когда определяю так:

    constant NRS_BITS_C : natural := NRS_BITS;

. То варнинг остаётся.

Получается ругается на generic параметры?...

Да, это такая багофича в ActiveHDL - в индексах агрегатов нельзя использовать дженерики и производные от дженериков константы, а только локальные константы.

А ещё нельзя использовать "others=>" совместно с unconstrained ports и производными от них:).

При этом без агрегатов можно сделать то же самое без проблем...

 

Share this post


Link to post
Share on other sites

спасибо. Все подводные камни уже оказывается прощупаны )

Share this post


Link to post
Share on other sites

готово

Выяснились первые недостатки такого подхода - разделять умеет только вектора std_logic_vector, одиночные проводники типа std_logic не разделит. Либо нужно писать дополнительные процедуры, учитывая, что на каждом месте может быть одиночный проводник, а может и не быть. Даже для 4 аргументов придётся 16 разных функций описывать, это уж слишком...

Пока обхожу этот "гвоздь в крышку гроба VHDL" описанием одиночных сигналов как std_logic_vector(0 downto 0), но это неудобно, т.к. при подстановке приходится всегда индекс (0) подписывать.

Share this post


Link to post
Share on other sites

Да, это такая багофича в ActiveHDL - в индексах агрегатов нельзя использовать дженерики и производные от дженериков константы, а только локальные константы.

А ещё нельзя использовать "others=>" совместно с unconstrained ports и производными от них:).

При этом без агрегатов можно сделать то же самое без проблем...

О! Оказывается уже была такая проблема у людей... ) Только раньше это вызывало ошибку, а сейчас ворнинг. Ну и ладно. Забьём )

VHDL, Агрегат

Share this post


Link to post
Share on other sites

Такой вопрос появился: когда работал с Verilog под Xilinx, то в тестбенче использовали сигнал glbl.GSR, чтобы типа свой ресет не колхозить, а использовать "кошерный ресет", от производителя так сказать.

Как делают ресет в тестбенчах на VHDL под Xilinx?

Share this post


Link to post
Share on other sites

Такой вопрос появился: когда работал с Verilog под Xilinx, то в тестбенче использовали сигнал glbl.GSR, чтобы типа свой ресет не колхозить, а использовать "кошерный ресет", от производителя так сказать.

Как делают ресет в тестбенчах на VHDL под Xilinx?

В package vcomponents(файл ISE_DS\ISE\vhdl\src\simprims\simprim_Vcomponents.vhd) объявляется глобальный сигнал GSR, и все модули могут свободно на него ссылаться. Удобнее, чем в Верилоге:).

Share this post


Link to post
Share on other sites

А у Вас не найдётся примерчик использования такой конструкции?

 

А чем удобнее? Почему в Верилоге не все могут на него ссылаться?

 

Share this post


Link to post
Share on other sites

А у Вас не найдётся примерчик использования такой конструкции?

 

А чем удобнее? Почему в Верилоге не все могут на него ссылаться?

В Верилоге, чтобы надёжно ссылаться на "глобальный" сигнал, требуется знать полный абсолютный путь, а это невозможно для стандартных компонетов, которые могут быть включены куда угодно. То есть возможно, но для этого потребовалось создать модуль glbl, голову абсолютного пути, который приходится ставить вторым топом, что неудобно. А в Латтисе сделали ещё хуже.

 

Примерчик использования - выше я указал имя файла, открываем его и сразу вверху видим пример декларации глобальных сигналов.

Далее открываем какой-нибудь файл компонента, например ISE_DS\ISE\vhdl\src\simprims\primitive\mti\X_BUFR.vhd,

и видим в заголовке директиву use simprim.Vcomponents.all , которая открывает короткие ссылки на глобальные сигналы.

И далее есть строчка GSR_dly <= GSR, которая забирает глобальный сигнал внутрь.

 

Устанавливаться GSR должен в модулях X_SIM_CONFIG_*, и тут обнаружился сюрприз: в этих модулях есть директива use simprim.Vcomponents.all, однако GSR декларируется также и локально(это, похоже, ошибка), и по правилам по короткому имени будет устанавливаться локальный сигнал, который вообще нигде не используется. Таким образом, очень похоже, что GSR в VHDL тупо не моделируется, он всегда остаётся '0', как был инициализирован в глобальной декларации.

 

Share this post


Link to post
Share on other sites

Спасибо за развёрнутый ответ, теперь многое понятно.

 

Хорошо, что Вы прояснили. Оказывается в VHDL и сигнал GSR тоже есть, и пользоваться им удобнее...

 

 

... но он не работает ))))

 

Короче в VHDL на GSR проще забить и пользоваться самодельным типа:

        arst    <= '1';
        wait for 90 ns;
        arst    <= '0';

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...