Когда мне следует использовать std_logic_vector, а когда - другие типы данных?

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

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

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

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


person Emil Eriksson    schedule 27.05.2011    source источник


Ответы (3)


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

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

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

person Jan Decaluwe    schedule 27.05.2011
comment
Значит, нет ничего плохого в том, чтобы просто использовать целое число? - person Emil Eriksson; 29.05.2011
comment
@ Эмиль. Правильно (конечно, ограниченные целочисленные подтипы). Однако на практике целые числа имеют (тревожный) 32-битный предел, что означает, что вы можете предпочесть беззнаковые / подписанные, например. если вас беспокоит параметризуемость или согласованность. - person Jan Decaluwe; 29.05.2011
comment
Nitpick (я знаю, что Ян это знает, но я укажу на это для полноты): стандарт гарантирует, что целые числа не совсем 32-битные - они меняются от - ((2 31) -1) до + ((2 31) -1). Многие поставщики предоставляют полный диапазон int32_t, но это не гарантируется :( - person Martin Thompson; 30.05.2011
comment
Вы считаете стандартный пакет VHDL 2008 ... злом ?! Если да, то почему? - person atomh33ls; 28.07.2016

Я предлагаю не использовать 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.

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

person deepsubmicron    schedule 07.04.2013

В целом замечание об использовании подходящего типа для моделирования верное (Ян Декалуве). Однако с этим есть одна большая проблема. Если вы занимаетесь разработкой на смешанном языке (комбинируя VHDL, Verilog / System Verilog), вам нужно быть осторожным с языковыми границами. Некоторые инструменты имеют существенные ограничения на типы сигналов, используемых при преодолении языковых барьеров.

В настоящее время я просматриваю руководство пользователя по синтезу Vivado 2019 (UG901), в котором перечислены типы, которые вы можете использовать в точке пересечения. Вам нужно посмотреть на свой набор инструментов.

person kgh ghk    schedule 16.01.2021