Std_logic_vector添加功能

时间:2014-06-01 16:24:00

标签: function vhdl

    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

的函数

1 个答案:

答案 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参数的最大长度调整结果的长度。