2015-01-14 3 views
3

я использую следующий пакет только в моем VHDL файл:Сравните std_logic_vector с постоянным использованием пакета STD_LOGIC_VECTOR ТОЛЬКО

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

В коде, я сравниваю сигнал STD_LOGIC_VECTOR: А с постоянным значением, например

...if A<="00001011" then 

код был успешно проверен Xilinx ISE. Мое понимание заключается в том, что пакет STD_LOGIC_1164 не включает реализацию неравенств, имеющих операнд std_logic_vector, поэтому почему приведенный выше оператор кода был принят и будет ли приведенное выше сравнение рассматривать A как подписанное или неподписанное число?

ответ

2

«< =» называется реляционным оператором в VHDL.

Это предопределенный. См. IEEE Std 1076-2008, 9.2.3 Реляционные операторы таблицы. Это предопределенный оператор для любого скалярного или одномерного типа дискретных массивов.

std_logic_vector квалифицируется как одномерный тип дискретного массива, его типы элементов дискретны, в этом случае являются перечисляемыми типами (std_logic/std_ulogic). См. 5.2 Скалярные типы, 5.2.1 Общие положения, в которых первый абзац демонстрирует, что перечисляемый тип является дискретным.

И для более простого ответа это часть языка.

2

Короткий ответ: вы потребность использовать дополнительный пакет: ieee.numeric_std

я должен предположить, что вы определили как std_logic_vector(7 downto 0).

Этот тип данных представляет собой массив бит. Существует не числовое значение, связанное с ним. Следовательно, сравнение между A и вашим литералом битовой строки не имеет смысла.

Если вы хотите сравнить числовые значения, представленные A, вам необходимо использовать unsigned(7 downto 0) или signed(7 downto 0), предпочтительно из пакета ieee.numeric_std. Это общепринятая практика, позволяющая присваивать числовые значения массивам бит.

Технически вы можете обойти это и определить свою собственную функцию «< =», но вы просто будете дублировать код из стандартной библиотеки IEEE VHDL.

2

Чтобы немного расширить ответ Дэвида: он предопределен для дискретных массивов, так что в основном элементы массива сравниваются слева направо (согласно IEEE 1076-2008, 9.2.3), и каждый массив скалярных массивов сравнивается с использованием который, в случае перечисления типа std_logic, определяется его положением (согласно 5.2.2.1). '1' «больше чем» '0' только потому, что его позиция в заявке std_ulogic выше (и 'Z' «больше, чем» '1' по той же причине).

Должно быть ясно, что он не обрабатывает векторы как подписанные или без знака. Это случается выглядеть как это обрабатывать векторы, как беззнаковое если они равны длине и содержат только '0' и '1', но вы все равно не должны это делать.

+0

Пакет numeric_std unsigned «<=» изменяет аргументы на одну и ту же длину, затем использует предопределенный реляционный оператор через функцию UNSIGNED_LESS_OR_EQUAL. Есть мультфильм с середины 60-х, который иллюстрирует, [Ничего святого?] (Http://i.stack.imgur.com/ePNcd.jpg) от Грэма Уилсона. Помимо разной длины или естественных операндов в неподписанных операциях нет ничего отличного от std_logic_vector. Есть предложение принять пакет std_logic_unsigned, вылечив «недостаток», он добавит третий вызов, проходящий через беззнаковый оператор numeric_std. – user1155120

+0

@DavidKoontz, Цель состоит в том, что, когда объектом является число, тогда сравнения должны действительно делать числовые сравнения. Кстати, предложение, о котором вы говорите, было за 2008 год, и это привело к добавлению пакета numeric_std_unsigned к языку. –

3

- Копирование моего comp.lang.vhdl ответа на это сообщение. Извините, некоторые дубликаты, но некоторые нет.

Все перечисленные типы и массивы перечисляемых типов неявно определяют регулярные упорядочивающие реляционные операторы (>,> =, <, < =). К сожалению, он не численно упорядочен, поэтому результаты могут быть не такими, как ожидалось. Вместо этого это словарь.

Сначала вы должны посмотреть на тип элемента, который является std_logic, базовый тип которого является std_ulogic. Для перечисленных типов, таких как std_ulogic, значения слева меньше правых значений, следовательно, для std_ulogic (и std_logic): 'U' < 'X' < '0' < '1' < 'Z' < 'W' < «L» < «Н» < «-»

Для равных массивов длины которых элемент базового типа является std_ulogic (например, std_logic_vector или std_ulogic_vector), значения которых только 0 или 1, все работает нормально: «1010» > «0101»

Обратите внимание, что сравнение словарей всегда сначала сравнивает левый элемент. Следовательно, для строки то, что начинается с «S», всегда меньше, чем что-то, что начинается с «T», не зависящего от длины. Это отлично подходит для сортировки строк в словаре и является единственным практическим дефолтом - если мы собираемся предоставить такие вещи.

OTOH, это не так здорово, если вы думаете, что вещи являются числовыми. Например, если массивы не равны по длине, то следующее верно, потому что ведущий «1» по левому параметру является> ведущим «0» правого параметра.
«100»> «0111»

Следовательно, только с «использовать ieee.std_logic_1164.all», у вас есть потенциальный риск плохой практики программирования, которые ошибочно думать std_logic_vector как числовые (например, без знака).

Многие будут спорить, никогда не использовать std_logic_vector для математики и «>» - это математика. Я вообще согласен.

И что мне делать? Как мне защитить мою команду дизайна и дизайна от этого. Сначала вы должны выбрать политику и как ее реализовать.

1) Запретить использование регулярных упорядочивающих реляционных операторов (>,> =, <, < =) с помощью std_logic_vector и применять его с помощью инструмента для линта. Однако это означает, что вам нужно покупать и требовать использования инструмента линта.

2) Запретить использование регулярных упорядочивающих реляционных операторов (>,> =, <, < =) с помощью std_logic_vector и обеспечить его выполнение с использованием обеих следующих ссылок на пакеты. Обратите внимание, что это порождает ошибки, ссылаясь на два определения для каждого из операторов, и, следовательно, при использовании выражение становится неоднозначным. Обратите внимание, что это может быть проблематично, поскольку numeric_std_unsigned был введен в 1076-2008, и он может пока не поддерживаться вашими инструментами синтеза.
library ieee; использование ieee.numeric_std_unsigned.all; use ieee.std_logic_unsigned.all;

3) Расслабьтесь в правилах. Наша самая большая проблема - правильность дизайна.Разрешить std_logic_vector интерпретироваться как значение без знака и либо ссылку numeric_std_unsigned (предпочтительнее, но это VHDL-2008 и еще не может быть реализована вашим инструментом синтеза, но если он не обязательно отправит отчет об ошибке) или std_logic_unsigned (not Предпочтительный - это старый пакет условно-бесплатных программ, который не является стандартом IEEE и, возможно, не входит в библиотеку IEEE - OTOH, он хорошо поддерживается и отлично работает с другими пакетами, такими как numeric_std).

Приятный результат этого является то, что она позволяет также сравнения, которые включают в себя целые числа: если А < = 11, то

Обратите внимание, некоторые предполагают, что перегрузка «>» и друзья в numeric_std_unsigned/std_logic_unsigned является незаконной. Это была очень консервативная интерпретация 1076 до VHDL-2008. Он был исправлен для всех версий VHDL с разрешением ISAC до VHDL-2008, который определил, что явно определенные операторы всегда перегружают неявно определенные операторы, не создавая никакой двусмысленности. Я отмечаю, что даже VHDL FAQ устарел по этой проблеме.

4) Будьте официальными, но практичными. Никогда не используйте std_logic_vector. Используйте только числовые типы, такие как unsigned и подписанные из пакета ieee.numeric_std. Типы, подписанные и неподписанные, также поддерживают сравнение с целыми числами.

Есть, вероятно, несколько стратегий, которые я забыл.

Обратите внимание, что VHDL-2008 вводит соответствующие операторы, которые также решают эту проблему, не определяя их для типов, которые не имеют числовой интерпретации. Этими операторами являются:? =,?/=,?>,?> =,? <,? < =