xnor
в вашем выражении действует на два std_logic_vector
типа и, таким образом, возвращает другой тип std_logic_vector
, но выражение if
ожидает boolean
типа.
Вы можете изменить выражение ниже, если вы хотите, условие, которое является истинным, когда xnor
результат не все нули:
if (din(idx downto idx-3) XNOR sin(3 downto 0)) /= "0000" then
EDIT: Более подробная информации о неявном типе преобразовывает в VHDL -2008
VHDL сильный язык типизированного где дизайнер, как правило, должен сделать явный приведения типов, так что результат соответствует требуемому типу, а в противном случае ошибка генерируется.
Однако, VHDL-2008 добавил некоторое неявное приведение типа, в специальном с условия оператором ??
, который может конвертировать в boolean
типа. Оператор объявлен в std_logic_1164
пакете системы, как:
function "??" (l : std_ulogic) return boolean;
операция условия автоматически применяются для if
, elsif
, until
, assert
и тому подобные места, если выражение не оценивали к boolean
типа. Таким образом, если вы используете VHDL-2008, то можно написать:
signal test_sl : std_logic;
...
if test_sl then
...
Причем условие оператор ??
неявно применяется, как будто написано:
if ?? test_sl then
Эквивалент ниже, который также действует в VHDL-2002:
if (test_sl = '1') or (test_sl = 'H') then
??
оператор только объявлен в стандарте VHDL-2008 для std_ulogic
типа, , что также относится к типу std_logic
.Однако оператор может быть перегружен в объявленный пользователем функции, чтобы применить для std_logic_vector
с:
-- Or operation of ?? for all elements in arg
function "??" (arg : std_ulogic_vector) return boolean is
variable res_v : boolean;
begin
res_v := FALSE;
for idx in arg'range loop
res_v := res_v or (?? arg(idx));
end loop;
return res_v;
end function;
Если выше объявлена, то можно использовать неявное отливку std_logic_vector
к булева в if
отчетности, как:
signal test_slv : std_logic_vector(3 downto 0);
...
if test_slv then
....
Или даже:
if din(idx downto idx-3) XNOR sin(3 downto 0) then
Слово предостережения, хотя, поскольку код может стать менее читаемым для других и, следовательно, больше подвержен ошибкам, если такие трюки используются; но это возможно.
хороший трюк, спасибо. Я размышлял? почему can not я использую typecast как команда/оператор? (мой C ржавый ... но то, как я бы подошел к нему) – YNWA
@YNWA: потому что мышление VHDL полностью противоположно C. Оно строго типизировано и очень трудно не делать предположений и заставлять автора код, чтобы указать, что они хотят. Таким образом, нет предположений, например, «все биты нуль такие же, как ложные». Если вы хотите возможности C-like foot-shooting, вы найдете [Verilog там] (http://stackoverflow.com/questions/tagged/verilog) :) –
@YNWA: вы можете найти дополнительную информацию о типе casting добавлен в ответ выше, который также дополняет комментарий Мартина Томпсона о сильном типизированном языке. –