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

Странные вопросы по 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);

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


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

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

        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 подставлять просто число - ошибки нет.

 

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

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


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

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

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

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

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


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

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

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

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

, где

 constant BW_DSP_OUT : natural := 48;

 

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


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

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

 

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

 

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

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

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

 

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


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

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

    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 параметры?...

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


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

    constant NRS_BITS_C : natural := 4;

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

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

    constant NRS_BITS_C : natural := NRS_BITS;

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

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

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

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

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

 

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


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

готово

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

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

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


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

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

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

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

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

VHDL, Агрегат

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


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

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

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

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


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

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

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

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

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


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

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

 

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

 

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


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

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

 

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

В Верилоге, чтобы надёжно ссылаться на "глобальный" сигнал, требуется знать полный абсолютный путь, а это невозможно для стандартных компонетов, которые могут быть включены куда угодно. То есть возможно, но для этого потребовалось создать модуль 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', как был инициализирован в глобальной декларации.

 

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


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

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

 

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

 

 

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

 

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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...