2013-12-04 2 views
0

это кажется простым, но я не могу пройти мимо негоПочему я не могу использовать XNOR по типу «std_logic_vector»?

  din : in std_logic_vector(13 downto 0); 
      sin : in std_logic_vector(3 downto 0); 
      . 
      . 
      . 

      if (din(idx downto idx-3) XNOR sin(3 downto 0)) then 

и я получаю ошибку

** Error: Z:/lab_dig_2/1/prep/additionalQ/additionalQ.vhd(30): Type error resolving infix expression "xnor" as type std.STANDARD.BOOLEAN.

есть специальный оператор для векторов? Я помню, что std_logic_vector - идеальный тип для таких операторов?

ответ

3

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 

Слово предостережения, хотя, поскольку код может стать менее читаемым для других и, следовательно, больше подвержен ошибкам, если такие трюки используются; но это возможно.

+0

хороший трюк, спасибо. Я размышлял? почему can not я использую typecast как команда/оператор? (мой C ржавый ... но то, как я бы подошел к нему) – YNWA

+0

@YNWA: потому что мышление VHDL полностью противоположно C. Оно строго типизировано и очень трудно не делать предположений и заставлять автора код, чтобы указать, что они хотят. Таким образом, нет предположений, например, «все биты нуль такие же, как ложные». Если вы хотите возможности C-like foot-shooting, вы найдете [Verilog там] (http://stackoverflow.com/questions/tagged/verilog) :) –

+0

@YNWA: вы можете найти дополнительную информацию о типе casting добавлен в ответ выше, который также дополняет комментарий Мартина Томпсона о сильном типизированном языке. –

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