Введите ошибку, разрешающую инфиксное выражение "или" как тип std.STANDARD.BOOLEAN - PullRequest
0 голосов
/ 17 января 2020

У меня проблемы с пониманием ошибки. По большей части, я понимаю, что проблема связана с типом данных. Почему некоторые из моих данных по умолчанию имеют значение BOOLEAN? Когда он делает A и B, он должен вернуть правильное значение std_logi c? Может кто-нибудь объяснить, что происходит?

library ieee;
use ieee.std_logic_1164.all;

entity Majority is port (
    A, B, C : in std_logic;
    Y: out std_logic);

end Majority;


architecture behavioral of Majority is
    begin
    Y <= '1' when ((A AND B) OR (A AND C) OR (B AND C)) else
         '0';

end architecture behavioral;

1 Ответ

0 голосов
/ 17 января 2020

Операторы and и or возвращают std_logi c, когда им передается операнд std_logic, а не логическое значение (как я думал в моем удаленном ответе). when - else требует, чтобы условия были логическими.

Итак, как указано в комментарии, вы можете сделать Y <= '1' when ((A AND B) OR (A AND C) OR (B AND C)) = '1' else '0';, чтобы преобразовать выражение, возвращающее std_logic, в логическое значение, чтобы оно могло использоваться в структуре «когда-либо».

Однако эта структура является избыточной. Вы можете просто go с: Y <= (A AND B) OR (A AND C) OR (B AND C);. Условие возвращает std_logic, так что вы можете назначить его напрямую.

Или дополнительно с VHDL 2008 "??" operator :

VHDL-2008 вводит новый оператор ??. Он называется оператором условия и преобразует выражение STD_LOGI C в БУЛЕВОЕ: «1» и «H» считаются ИСТИНА, а все остальное ЛОЖЬ. (Он также преобразует бит в BOOLEAN.)

?? оператор применяется автоматически в структуре when-else, поэтому при использовании VHDL 2008 ваш код должен работать.

...