Vhdl &引用;Can';t确定运算符+的定义&引用;设计16位ALU时
我正在设计一个16位ALU,它只做很少的操作。我有一个语法错误: 无法确定运算符“+”的定义 下面的代码执行有符号和无符号的加减和移位操作。它执行一些其他的操作,比如OR、XOR等,我没有显示这些操作,因为它们没有任何问题Vhdl &引用;Can';t确定运算符+的定义&引用;设计16位ALU时,vhdl,addition,signed,register-transfer-level,alu,Vhdl,Addition,Signed,Register Transfer Level,Alu,我正在设计一个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: i
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;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体ALU16是端口
(A:标准逻辑向量(15到0);
B:标准逻辑向量(15到0);
ALOUP:标准逻辑向量(4到0);
shamt:标准逻辑向量(2到0);
零:输出标准逻辑;
溢出:输出标准逻辑;
R:输出标准逻辑向量(15到0)
);
结束语16;
ALU16的体系结构RTL是
信号温度:标准逻辑向量(16至0);
信号usgnA、usgnB、Reg1:无符号(15到0);
信号sgnA、sgnB、Reg2:已签名(15至0);
开始
过程(ALOUP)
变量p:0到15的整数范围;
开始
--usgnA您正在对标准逻辑向量进行求和。
您没有使用ieee.std\u logic\u arith.all,因此它显示了错误。
但是在一个hdl文件中,不能使用IEEE.NUMERIC\u STD.ALL和IEEE.STD\u logic\u arith.ALL。
这会使编译器感到困惑
因此,更好地试用temp因为您使用的是数字std(应该是),您需要将temp
的类型更改为unsigned
,或者将添加的结果转换为std\u logic\u vector
。对于有符号加法,可以通过比较输入符号和输出符号来检测溢出。如果输入符号匹配而输出符号不同,则表示溢出。否则,你不会。我还建议对所有中间结果使用变量而不是信号(这样您就不会在顺序信号分配中遇到任何问题):
过程(ALOUP)
变量温度:标准逻辑向量(15到0);
开始
...
当“00010”=>
温度:=标准逻辑向量(sgnA+sgnB);
R谢谢你的答复。在我改为无符号加法后,它工作得很好。但是,我想知道如何用两个有符号的数字检查溢出?
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));