2013-12-06 2 views
2

Я хотел бы иметь новый оператор стиля С ++ для типа STD_LOGIC_VECTOR. До сих пор мне удалось создать и использовать следующую функцию:создать оператор ++ в VHDL

FUNCTION PLUS_ONE (a : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR is 
BEGIN 
    RETURN std_logic_vector(unsigned(a) + 1); 
END FUNCTION; 

теперь, если я создать это:

FUNCTION "++" (a : STD_LOGIC_VECTOR) RETURN  STD_LOGIC_VECTOR is 
BEGIN 
    RETURN std_logic_vector(unsigned(a) + 1); 
END FUNCTION; 

ISE выдает следующее сообщение об ошибке:

"++" is not a predefined operator. 

Теперь вопрос, возможно ли создать новых операторов в VHDL и что-то не хватает

+0

'Inc' может быть приемлемым именем для функции инкремента. –

ответ

5

Вы можете только перегрузка операторов в VHDL, вы не можете создавать новые символы оператора. Цитирование the LRM (раздел 4.5.2):

The declaration of a function whose designator is an operator symbol is used to overload an operator. The sequence of characters of the operator symbol shall be one of the operators in the operator classes defined in 9.2.

И соответствующий раздел руководства говорит:

condition_operator ::= ?? 
logical_operator ::= and | or | nand | nor | xor | xnor 
relational_operator ::= = | /= | < | <= | > | >= | ?= | ?/= | ?< | ?<= | ?> | ?>= 
shift_operator ::= sll | srl | sla | sra | rol | ror 
adding_operator ::= + | – | & 
sign ::= + | – 
multiplying_operator ::= * |/| mod | rem 
miscellaneous_operator ::= ** | abs | not 

Насколько мне нравится краткость, я должен признать, что выбор сокращенных операторов по сравнению со стандартными способами Написание выражений является «синтаксическим сахаром» и имеет потенциал для обфускации кода. Интересно отметить, что у «модных» языков, таких как Python и Ruby, нет оператора ++.

Может ли VHDL поддерживать оператор ++? В настоящее время я работаю над парсером VHDL, и я рискую сказать, что добавление постфикса ++ приведет к нарушению целого ряда правил грамматики языка, особенно потому, что унарные операторы ожидают взять операнд справа от символа. Вследствие этого и того факта, что не так много аргументов в пользу такого изменения, я не ожидаю увидеть его в ближайшее время. Все рассмотренные вопросы, мой личный выбор состоял в том, чтобы придерживаться value := value + 1 для стандартных типов данных.

+0

Вдумчивый и аргументированный ответ! – Floris

+1

Существует также проблема, по которой вам потребуется объявление неявного типа доступа и распределитель для (в данном случае) 'a', чтобы иметь возможность обновлять' a' без оператора присваивания, даже если VHDL поддерживал произвольные постфиксные унарные операторы. И это будет процедура, а не функция. – user1155120

Смежные вопросы