Странное поведение XNOR в VHDL - PullRequest
6 голосов
/ 14 февраля 2012

Код, вызывающий проблемы, выглядит как обычная операция xnor, как показано ниже:

S(1) <= L(16) xnor L(26);

Эта строка вызывает следующую ошибку:

ncvhdl_p: *E,EXPSMI (HDL/aes_sbox_enc_depth16.vhd,169|14): expecting a semicolon (';') [9.5.1].
ncvhdl_p: *F,MAXERR: maximum error count reached (1).
TOOL: ncvhdl 10.20-s075: Exiting on Feb 14, 2012 at 12:56:05 GMT (total: 00:00:01)

Если кто-нибудь знает, что здесь происходит, точка с запятой явно там. Возможно ли, что VHDL не поддерживает xnor, если да, то как мне его переписать?

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

Чтобы уточнить ответ Павла.

  • IEEE-1076 Год 1987 : не поддерживает оператор xnor.
  • IEEE-1076 Год 2002 : Поддерживает оператор xnor.

Это можно проверить, посмотрев в Раздел 7.1 спецификации языка .

за 1987 год:

expression ::=
      relation { and  relation }
    | relation { or   relation }
    | relation { xor  relation }
    | relation [ nand relation ]
    | relation [ nor  relation ]

за 2002 год:

expression ::=
        relation { and  relation }
      | relation { or   relation }
      | relation { xor  relation }
      | relation [ nand relation ]
      | relation [ nor  relation ]
      | relation { xnor relation }

Если ваш инструмент поддерживает 2002 (или 2008), то ему также необходимо определить оператор в std_logic_1164, но это будет относительно вероятно.

Наиболее вероятно, что ваш инструмент поддерживает только IEEE-1076-1987. Затем вы захотите написать xnor как:

not(L(16) xor L(26));
6 голосов
/ 14 февраля 2012

Я считаю, что xnor определено для битов и логических значений, но не std_logic. Я думаю, что на самом деле это зависит от того, какую версию VHDL (например, 98/2002/2008) вы используете. Это, безусловно, закомментировано из некоторых версий std_logic_1164.vhd файлов, которые я видел.

Как насчет просто инвертировать xor?

S(1) <= not (L(16) xor L(26));
...