2015-03-02 2 views
-1

Мой инструмент синтеза не поддерживает VHDL2008 полностью, и я хотел бы использовать кодовую строку типа: «a < = и bit_vector;» что в основном означает, что a = '1', если все биты в bit_vector равны '1' и '0' в противном случае. (a - std_logic, а bit_vector - std_logic_vector).Оператор vhdl «и» является однозначным

Так что я создал небольшой пакет с моим собственным "и" функции, чтобы добавить это на мой VHDL:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

package common_pkg is 
    function "and" (L: std_logic_vector) return std_logic; -- And all bits in a vector 

end package common_pkg; 

package body common_pkg is 
    function "and" (L: std_logic_vector) return std_logic is 
    variable result : std_logic := '1'; 
    begin 
    for i in 0 to L'length - 1 loop 
     result := result and L(i); 
    end loop; 
    return result; 
    end function; 

end package body; 

Однако при составлении этого я получаю следующие ошибки:

** Error: c:\Repo\src\My_test.vhd(127): Operator "and" is ambiguous. 
    Feasible operators are: 
    (explicit) std_logic_1164."and"[STD_ULOGIC_VECTOR return STD_ULOGIC] at vhdl_src/ieee/stdlogic.vhd(140) 
    (explicit) common_pkg."and"[STD_LOGIC_VECTOR return STD_LOGIC] at c:\Repo\src\common_pkg.vhd(23) 
** Error: c:\Repo\src\My_test.vhd(127): Type error resolving prefix expression "and" as type ieee.std_logic_1164.STD_ULOGIC. 

I не может понять, как обойти это. Я могу переименовать свою функцию в «my_and», но это не совсем то, что я хочу ... Есть ли кто-нибудь, кто сделал что-то подобное этому раньше и сможет объяснить проблему и предположительно указать мне в правильном направлении?

+0

Если я что-то отсутствует, первый выполнимо оператор (в std_logic_1164), как представляется, 2008-совместимый один вы пытаетесь переписать. – fru1tbat

+0

Инструмент синтеза, вероятно, поддерживает унарные 'и' уже, таким образом, ошибку. Кроме того, выполнение функций, которые могут столкнуться с существующими функциями, может привести к проблемам, если один и тот же код используется в инструментах с различными уровнями поддержки VHDL-2008, таких как симулятор и инструмент синтеза. Btw. рассмотрите запись цикла как 'for i в цикле L'диапазона 'для поддержки L с любым диапазоном. –

+0

Если вы не можете заставить унарные 'и' работать, подумайте о возврате к функции VHDL-2002 'and_reduce()' из 'ieee.reduce_pack', которая делает то же самое. –

ответ

0

В дополнение к предыдущим ответам и комментариям:

Если необходимо использовать унарный «и» оператор на широкий входной вектор, некоторые инструменты не достаточно умны, чтобы отобразить «и» оператора к соответствующим ресурсам , Особенно, если ваш код нацелен на FPGA, есть способ использовать переносные цепи, чтобы ускорить вычисления «и» и «или».

Модуль arith_prefix_and от PoC Library имеет общее описание цепи переноса, написанное на VHDL, и специфичную для устройства примитива для примитивов Xilinx MUXCY для ускорения широких операций «и».

Существует также модуль arith_prefix_or.

0

Я попробовал вторую версию, но получил тот же результат. Вышеприведенный код завершен для части common_pkg.vhd. Другой код имеет следующий заголовок:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use ieee.std_logic_unsigned.all; 

library unisim; 
use unisim.vcomponents.all; 

library common_lib; 
use common_lib.common_pkg.all; 

/Teddy

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