设计 16 位 ALU 时的"Can't determine the definition of operator +"



我正在设计一个16位ALU,它执行很少的操作。我有一个语法错误:

"

无法确定运算符"+"的定义。

以下代码执行有符号和无符号加法和减法以及移位操作。它执行其他一些操作,如OR,XOR等,我没有显示,因为它们没有任何问题。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 entity ALU16 is port
 ( A: in std_logic_vector (15 downto 0);
 B: in std_logic_vector (15 downto 0);
 AluOp: in std_logic_vector (4 downto 0);
 shamt: in std_logic_vector (2 downto 0);
 Zero: out std_logic;
 Overflow: out std_logic;
 R: out std_logic_vector (15 downto 0)
 );
 end ALU16;

 architecture RTL of ALU16 is
 signal  temp : std_logic_vector( 16 downto 0);
 signal usgnA, usgnB, Reg1 : unsigned(15 downto 0);
 signal sgnA, sgnB, Reg2 : signed(15 downto 0);
 begin
 process(AluOp)
 variable p : integer range 0 to 15;
 begin
--usgnA <= unsigned(A);
--usgnB <= unsigned(B);
sgnA <= signed(A);
sgnB <= signed(B);

 case AluOp is
    when "00000" =>
        --Reg1 <= usgnA + usgnB; 
        temp <= ('0' & A) + ('0' & B);
        Overflow <= temp(16);
        --temp <= A + B;
        R<=temp(15 downto 0);
        --Overflow <= A(15) and B(15);
--  when "00001" =>
--      --Reg1 <= usgnA - usgnB;
--      R<=A-B;
--      if (A < B) then Overflow<= '1';
--      else Overflow<= '0';
--      end if;
--      
--  when "00010" =>
--      Reg2 <= sgnA + sgnB;
--      R<=std_logic(Reg2);
--      Overflow <= A(14) and B(14);
--      
--  when "00011" =>
--      R <= sgnA - sgnB;
--      R<=std_logic(Reg2);
--      if (sgnA < sgnB) then Overflow<= '1';
--      else Overflow<= '0';
--      end if;
--      
--      when "01011" =>
--              temp <= A;
--              temp <= shift_right(A,to_integer(shamt));
--              p :=to_integer(shamt);
--              for i in 1 to 3 loop
--              temp(i-1) <= '0';
--              end loop; 
--              R<= temp;
--          
    when others =>
        NULL;
--  if( R = "0000000000000000" ) then
--          Zero <= '1';
--      else Zero <='0';
--      end if;

 end case;
 end process;
end RTL; 

当您使用 numeric_std 时(您应该这样做),您需要将temp的类型更改为 unsigned 或将添加的结果转换为 std_logic_vector 。对于有符号的添加,您可以通过比较输入符号和输出符号来检测溢出。如果输入符号匹配且输出符号不同,则表示存在溢出。否则,您不会。我可能还建议对所有中间结果使用变量而不是信号(这样您就不会遇到顺序信号分配的任何问题):

process (AluOp)
  variable Temp : std_logic_vector(15 downto 0);
begin
...
when "00010" =>
  Temp := std_logic_vector(sgnA + sgnB);
  R <= Temp;
  Overflow <= (sgnA(15) xnor sgnB(15)) and (sgnA(15) xor Temp(15));

你正在做总和到std_logic_vector。并且您尚未使用ieee.std_logic_arith.all,因此它显示错误。但是在一个HDL文件中,您不能使用IEEE。NUMERIC_STD。所有和ieee.std_logic_arith.所有。这会让编译器感到困惑。

所以更好的试用温度 <= std_logic_vector(无符号(A) + 无符号(B));它可能会解决您的问题。尝试像这样的不同组合。

相关内容

最新更新