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

#integer #port #vhdl #unsigned #signed

#целое #порт #vhdl #без знака #подписано

Вопрос:

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Значит, нет ничего плохого и в том, чтобы просто использовать integer?

2. @Emil. Это верно (ограниченные целочисленные подтипы, конечно). Однако на практике целые числа имеют (вызывающий беспокойство) 32-разрядный предел, что означает, что вы можете предпочесть unsigned / signed, например, если вас беспокоит параметризуемость или согласованность.

3. Придирка (я знаю, что Ян знает это, но я укажу на это для полноты картины): стандарт гарантирует, что целые числа будут «не совсем 32-разрядными» — они идут от -((2 31) -1) до ((2 31) -1). Многие поставщики предоставляют полный диапазон int32_t, но это не гарантировано : (

4. Считаете ли вы стандартный пакет VHDL 2008 … злым?! Если да, то почему?

Ответ №2:

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

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

Для арифметики std_ulogic_vector используйте std_numeric. Затем требуется выполнить преобразование в signed или unsigned перед операцией и привести результат обратно к 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.

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

Ответ №3:

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

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