2015-03-02 135 views
-1

我的綜合工具完全不支持VHDL2008,我想使用類型爲「a < = and bit_vector;」的代碼行。這基本上意味着如果bit_vector中的所有位都是'1',則a ='1',否則就是'0'。 (a是std_logic,bit_vector是std_logic_vector)。vhdl operator「and」is ambigous

所以我創建了一個小包裝我自己「和」功能來添加這個到我的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. 

我無法弄清楚如何解決這個問題。我可以將我的函數重命名爲「my_and」,但這並不是我真正想要的東西......有沒有人曾經做過類似的事情,並且能夠解釋問題,並且可能會指出我朝着正確的方向發展?

+0

除非我失去了一些東西,第一是可行的運營商(在std_logic_1164)似乎是你試圖重寫2008兼容的。 – fru1tbat 2015-03-02 14:33:51

+0

綜合工具可能支持一元'和',因此就是錯誤。另外,如果在具有不同VHDL-2008支持級別的工具中使用相同的代碼(如模擬器和綜合工具),則可能會與現有函數發生衝突的功能可能會導致問題。順便說一句。考慮編寫循環,比如在'範圍循環中爲'我支持任意範圍的L。 – 2015-03-02 17:08:24

+0

如果你不能讓一元''和'工作,考慮從'ieee.reduce_pack'回落到VHDL-2002'and_reduce()'函數,它執行相同的操作。 – 2015-03-02 17:27:53

回答

0

除了以前的答案和註釋:

如果需要使用一元「和」運營商在很寬的輸入向量,有些工具是不夠聰明的「和」操作映射到正確的資源。尤其是,如果您的代碼是針對FPGA,則可以使用進位鏈來加速「和」和「或」計算。

模塊arith_prefix_andPoC 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; 

/泰迪