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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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