Вывод типа перечисления в VHDL [дубликат]

Попробуйте выполнить приведенный ниже код, чтобы исправить проблему:

import warnings

warnings.filterwarnings(action="ignore", module="scipy", message="^internal gelsd")
7
задан Matt 1 June 2013 в 13:58
поделиться

1 ответ

Да, вы можете, и я считаю это лучшей практикой - это наименьшая работа, лучшее понимание, простота в обслуживании и самый чистый дизайн.

Трюк состоит в том, чтобы объявить типы, общие для всего вашего проекта, в пакет (я обычно называю его «Common» :-) и добавляю use work.Common.all до объявления объекта AND у каждого клиента этого объекта.

Например:

package Common is    -- untested...

   type my_enum_type is (r1, r2, r3);

   -- (optional) useful tools
   function to_slv (e : my_enum_type) return std_logic_vector;
   function to_enum (s : std_logic_vector(my_enum'length downto 0)) 
                    return my_enum_type;

end Common;

package body Common is
   -- subprogram bodies here
end Common;

Теперь, когда вы добавляете значение в перечисление, вы ТОЛЬКО изменяете «Common» и перестраиваете дизайн, в то время как те, кто придерживается общепринятых правил, все еще пытаются идентифицировать каждый порт и сигнал, где им приходится увеличивать диапазон своего «std_logic_vector» на 1.

Хорошо работает и для интерфейсов шины, где запись в каждом направлении скрывает все сигналы индивидуальной шины и подтверждения.

Вам придется сражаться с мозговыми инструментами, такими как генератор автоматических тестовых стендов Xilinx, который будет успешно переводить ВСЕ ваши типы портов - целые или булевы, а также custom - в std_logic (_vector), а затем не скомпилировать. Просто переведите их снова.

Вы все же можете сделать случай, когда на самом верхнем уровне все внешние выводы FPGA все равно должны быть основаны на std_logic. И если вам когда-нибудь понадобится смоделировать постсинтезную версию вашего дизайна, вам либо нужно будет жить с портами std_logic_vector, либо добавить простую оболочку для преобразования из одной формы в другую.

8
ответ дан Brian Drummond 22 August 2018 в 11:33
поделиться
  • 1
    Это полностью работает! Вопрос: что на верхнем уровне и на штыре ... Как мне преобразовать? Просто, если? if (request = r1), тогда pin1 & lt; = '1' ... Это не проблема для меня, но я был бы рад узнать. – evading 1 June 2013 в 16:09
  • 2
    Похороните, что уровень детализации в «полезных инструментах» в общем пакете ... ваша оболочка затем содержит объект (список соединений post_synth с портами SLV) и назначения сигналов, такие как slv_enum <= to_slv(my_enum); – Brian Drummond 1 June 2013 в 17:16
  • 3
    Еще одно примечание - вы можете написать эти «полезные инструменты». (для перечислений) в терминах их атрибутов 'pos' и 'val' и numeric_std.unsigned, поэтому тело to_enum может быть просто return my_enum_type'val(unsigned(s)); – Brian Drummond 1 June 2013 в 17:35
Другие вопросы по тегам:

Похожие вопросы: