我正在尝试编写有关 karatsuba 算法的 vhdl 代码,但在以下代码中遇到有关运算符 + 的错误,无法确定精确的重载匹配。如果有人可以帮我解决代码,请:
`
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity kmulti is
Port (
A : in std_logic_vector(1 downto 0);
B : in std_logic_vector(1 downto 0);
result : out std_logic_vector(3 downto 0)
);
end kmulti;
architecture Behavioral of kmulti is
-- signal A0, A1, B0, B1: std_logic;
signal P0, P1, P2, Temp3: std_logic;
begin
-- A0 <= a(0);
-- A1 <= a(1);
-- B0 <= b(0);
-- B1 <= b(1);
P0 <= A(0) AND B(0);
P1 <= (A(0) + A(1)) AND (B(0) + B(1));
P2 <= A1 AND B1;
Temp3 <= P1 - P2 - P0;
result <= P2 & "00" + Temp3 & "0" + P0;
end Behavioral;`
我尝试编写 2bit 的代码。但无法在面临错误的 vhdl 代码中实现它。
您的代码中有两个错误:
"+"
的库 - 来自 std_logic_vector
的 STD_LOGIC_UNSIGNED
和来自 unsigned
的 signed
和 STD_LOGIC_ARITH
类型。当您执行此行时:
result <= P2 & "00" + Temp3 & "0" + P0;
is 不知道“&”函数之后的结果类型是
std_logic_vector
、unsigned
还是 signed
,因此它不知道要使用哪个 "+"
函数。要解决此问题,您可以使用限定符来指定类型:
result <= std_logic_vector'(P2 & "00") + std_logic_vector'(Temp3 & "0") + P0;
std_logic
+ std_logic
提供算术函数的函数。这就是您在这些行中所做的事情:P1 <= (A(0) + A(1)) AND (B(0) + B(1));
...
Temp3 <= P1 - P2 - P0;
对此有一个解决方法,结合第一个解决方案,您可以简单地连接一个 0 长度的数组,使其成为长度为 1 的数组,然后限定结果类型。
P1 <= ( std_logic_vector'(""& A(0)) + std_logic_vector'(""& A(1))) AND (std_logic_vector'(""& B(0)) + std_logic_vector'(""&B(1));
这一切都非常冗长,因此您可能需要重新评估您正在使用的类型。
旁注:
std_logic_arith
和 std_logic_unsigned
不是标准 VHDL 软件包,自 1992 年以来就没有更新过。使用标准 numeric_std
软件包可能会更好,它是 VHDL 标准的一部分。自 VHDL 2008 以来,numeric_std_unsigned
也可作为 std_logic_unsigned
的替代品。