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