library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
entity unu is
port(a,b:std_logic_vector(1 downto 0);
q:out std_logic_vector(2 downto 0)
);
end unu;
architecture Behavioral of unu is
function max (op1, op2 : INTEGER) return INTEGER is
begin
if op1 > op2 then
return op1;
else
return op2;
end if;
end max;
function "+"( A,B:std_logic_vector) return std_logic_vector is
constant size1: INTEGER := a'LENGTH;
constant size2: INTEGER := b'LENGTH;
constant size:integer :=max(size1,size2)+1;
variable result:std_logic_vector(size downto 0);
begin
result:=std_logic_vector(unsigned(A)+unsigned(B));
return result;
end "+";
begin
q<=a+b; --line 28
end Behavioral;
我收到此错误
错误:HDLC编译器:410 -Line 28:表达式有2个元素;预期4
我正在尝试创建一个添加两个std_logic_vector
的函数答案 0 :(得分:0)
要求分配左侧每个元素的右侧都有一个元素。您的左侧信号q有3个元素。右侧的表达式为4(A和B的最大长度加1,加上身份(大小为0)。
失败实际上是在指定无符号“+”运算符结果的std_logic_vector转换为结果函数,你已经使长度为4:
constant size:integer :=max(size1,size2)+1;
variable result:std_logic_vector(size downto 0);
如果你想要一个“+”运算符,将std_logic_vector值添加为unsigned,并将长度增加一次,请尝试:
architecture Behavioral of unu is
-- function max (op1, op2 : INTEGER) return INTEGER is
-- begin
-- if op1 > op2 then
-- return op1;
-- else
-- return op2;
-- end if;
-- end max;
function "+"( A,B:std_logic_vector) return std_logic_vector is
-- constant size1: INTEGER := a'LENGTH;
-- constant size2: INTEGER := b'LENGTH;
-- constant size:integer :=max(size1,size2)+1;
-- variable result:std_logic_vector(size downto 0);
begin
-- result:=std_logic_vector(unsigned(A)+unsigned(B));
-- return result;
return std_logic_vector('0' & unsigned(A)+unsigned(B));
end "+";
begin
q<=a+b; --line 28
end Behavioral;
您可以通过以下方式获得相同的结果:
return std_logic_vector(unsigned(A)+unsigned(B));
调整其中一个操作数或分配给q的结果:
q <= ('0' & a) + b;
OR
q <= a + ('0' & b);
OR
q <= '0' & (a + b);
符号扩展仅对签名添加有意义。操作数填充为结果提供了正常的算术含义。
包numeric_std中无符号“+”的函数声明:
function "+" (L, R: UNSIGNED) return UNSIGNED;
-- Result subtype: UNSIGNED(MAX(L'LENGTH, R'LENGTH)-1 downto 0).
-- Result: Adds two UNSIGNED vectors that may be of different lengths.
显示已经为Left或Right参数的最大长度调整结果的长度。