Когда я должен использовать std_logic_vector и когда я должен использовать другие типы данных? - PullRequest
14 голосов
/ 27 мая 2011

Я новичок в VHDL, и у меня возникают проблемы с выяснением, какие типы данных подходят для использования и где. Если я правильно понимаю, для синтеза все порты сущностей верхнего уровня должны быть объявлены либо как std_logic_vector, либо как std_logic, так и никогда другого типа.

Но std_logic_vector не поддерживает арифметику, так как мне с этим справиться?

Моя интуиция подсказывает мне, что я должен просто использовать std_logic_vector на верхнем уровне, а затем преобразовывать его в интегральные типы данных и из них при передаче их другим сущностям. Это правильно?

А какой целочисленный тип данных (целое число, без знака, со знаком) должен использоваться где? Я понимаю разницу между подписанным и неподписанным, но когда я должен использовать целое число?

Ответы [ 2 ]

17 голосов
/ 28 мая 2011

Используйте типы данных, которые наиболее подходят для целей моделирования, в том числе для портов. Это просто неправда, что синтез требует, чтобы вы использовали только std_logic или std_logic_vector для портов. Не верьте тем, кто говорит вам иначе.

Если вам нужны битовые векторы с арифметической поддержкой, рассмотрите подписанный / неподписанный от ieee.numeric_std. (В VHDL 2008 есть стандартный пакет, который добавляет арифметическую поддержку std_logic_vector, но я считаю это злом.)

Может возникнуть проблема только на самом верхнем уровне после синтеза, когда вы хотите смоделировать синтезированный список сетей. Типы портов этого сетевого списка могут не соответствовать вашему интерфейсу RTL верхнего уровня. Тем не менее, вы можете легко исправить это при создании уровня шлюза, выполнив правильные преобразования в этот момент. Это подходящее время для таких проблем низкого уровня - они не должны влиять на ваш стиль моделирования RTL.

2 голосов
/ 07 апреля 2013

Я предлагаю не использовать std_logic и std_logic_vector, если вы не попытаетесь смоделировать сигналы с тремя состояниями - что я считаю своего рода злом. Вместо этого используются std_ulogic и std_ulogic_vector, которые не разрешены. Это имеет преимущество в обнаружении нескольких назначений неразрешенных сигналов во время компиляции. С разрешенными сигналами вы обнаружите эту ошибку в конце моделирования или синтеза.

Недостаток: это предложение не очень распространено, и использование сторонней логики с std_logic может потребовать некоторых типов.

Для арифметики std_ulogic_vector используйте std_numeric. Затем необходимо выполнить приведение к знаку или неподписанию перед операцией и привести результат обратно к std_ulogic_vector. НЕТ такой вещи, как стандартная библиотека ieee.std_ulogic_unsigned для неразрешенных сигналов.

adder_result <= std_ulogic_vector( unsigned(operant1) + unsigned(operant2) ) ;
increment <= std_ulogic_vector( unsigned(operant) + 1 ) ;

Разница между целым, натуральным, положительным с одной стороны и неподписанным и подписанным с другой - это представление. Подписанные и неподписанные являются подтипом std_logic_vector и больше похожи на связку (или более точный массив) проводов std_logic.

Целочисленные типы - это скорее математическое представление числа. Они обычно используются больше с обобщениями, генерируют циклы и индекс массива. Но иногда синтез может обрабатывать их и для арифметических единиц.

...