我正在尝试用VHDL编程FPU单元。我正在迈出第一步。执行此指令时出现两个错误:
mantissa1 <= std_logic_vector(resize(unsigned(mantissa1),mantissa1'length + d));
错误是:
Error: C:/Modeltech_pe_edu_10.4a/examples/fpu/shifter.vhd(38): Illegal type conversion to ieee.std_logic_1164.STD_LOGIC_VECTOR (operand type is not known).
Error: C:/Modeltech_pe_edu_10.4a/examples/fpu/shifter.vhd(36): (vcom-1078) Identifier "unsigned" is not directly visible.
这是我的代码
library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_misc.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
use ieee.numeric_std.all;
entity fpu is
port (
E1,E2 : IN std_logic_vector( 30 downto 23);
M1,M2 : IN std_logic_vector( 22 downto 0);
S1,S2 : IN std_logic_vector (31 downto 31);
op : IN std_logic_vector (1 downto 0);
SUM : OUT std_logic_vector (45 downto 0);
E : OUT std_logic_vector (7 downto 0);
clk : IN std_logic
);
end entity;
architecture arch_fpu of fpu is
SIGNAL d: integer;
SIGNAL mantissa1 : std_logic_vector (22 DOWNTO 0) ;
SIGNAL mantissa2 : std_logic_vector (22 DOWNTO 0) ;
begin
process(E1,E2,M1,M2,S1,S2,clk)
BEGIN
if((op="01") or (op="00")) then
E<=E1 when E1>E2 else
E2;
d<=abs(conv_integer(E1-E2));
mantissa1 <= std_logic_vector(resize(unsigned(mantissa1),mantissa1'length + d));
end if;
END process;
end arch_fpu;
答案 0 :(得分:2)
您正在混合使用VHDL数学库。我建议你使用numeric_std(我的偏好)或std_logic_unsigned / std_logic_arith,但不能同时使用。
还有其他几个问题。您不能将较大的(通过&#39; d&#39;位)manitissa1值分配回manitissa1,您需要一个适当大小的目标。你减去E1-E2需要一些类型转换是合法的,也许:签名(E1) - 签名(E2)
老实说,你可能想重新考虑你想要做的事情的整个方法,特别是如果你希望将这个代码合成为逻辑。