在vhdl中使用resize函数时出错

时间:2016-01-12 20:54:02

标签: vhdl

我正在尝试用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;

1 个答案:

答案 0 :(得分:2)

您正在混合使用VHDL数学库。我建议你使用numeric_std(我的偏好)或std_logic_unsigned / std_logic_arith,但不能同时使用。

还有其他几个问题。您不能将较大的(通过&#39; d&#39;位)manitissa1值分配回manitissa1,您需要一个适当大小的目标。你减去E1-E2需要一些类型转换是合法的,也许:签名(E1) - 签名(E2)

老实说,你可能想重新考虑你想要做的事情的整个方法,特别是如果你希望将这个代码合成为逻辑。