如何实现2bit karatsuba算法的Vhdl代码

问题描述 投票:0回答:1

我正在尝试编写有关 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 代码中实现它。

vhdl xilinx karatsuba
1个回答
0
投票

您的代码中有两个错误:

  1. 您遇到错误,因为您包含了两个为 3 种不同类型定义
    "+"
    的库 - 来自
    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;
  1. 任何包含的包中都没有为
    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
的替代品。

© www.soinside.com 2019 - 2024. All rights reserved.