正式总和的实际值必须是变量并且类型错误

时间:2015-08-06 03:13:58

标签: vhdl vivado

我正在xilinx学生实验室工作并尝试学习VHDL,但在修复错误方面遇到了一些麻烦。我现在主要专注于让加法部分工作。

我得到的错误如下:

  

[Synth 8-1560]正式金额的实际数字必须是变量[" C:/ Nexys 4> Projects / lab4_1_1 / lab4_1_1.srcs / sources_1 / new / add_two_values_procedure.vhd":54 ]

     

[Synth 8-2778]附近的类型错误;期望类型std_ulogic [" C:/ Nexys 4> Projects / lab4_1_1 / lab4_1_1.srcs / sources_1 / new / add_two_values_procedure.vhd":56]

     

[Synth 8-2778] b附近的类型错误;期望类型std_ulogic [" C:/ Nexys 4> Projects / lab4_1_1 / lab4_1_1.srcs / sources_1 / new / add_two_values_procedure.vhd":56]

对于第一个错误,我读到如果我不在一个过程中使用该过程,那么我必须将信号传递给过程,以便为其分配变量total。有人可以请问如何解决这个错误吗?

对于第二次和第三次错误,我在库中查找了std_logic_1164并看到了这一行

  

功能"和" (l,r:std_logic_vector)RETURN std_logic_vector;

据我所知(无论这个主题多么小),第56行在和/运算符/函数(?)的两侧都使用了std_logic_vector,并且应该返回一个std_logic_vector。那么为什么要求我使用std_ulogic。 编辑:上面我从这个网站http://www.csee.umbc.edu/portal/help/VHDL/packages/std_logic_1164.vhd看到的这一行,但从我的书,VHDL的设计师指南,包中没有这条线。

以下是我的代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;

entity add_two_values_procedure is
    Port ( a : in STD_LOGIC_VECTOR (3 downto 0);
           b : in STD_LOGIC_VECTOR (3 downto 0);
           operand : in STD_LOGIC;
           sum : out STD_LOGIC_VECTOR (3 downto 0);
           cout : out STD_LOGIC);
end add_two_values_procedure;

architecture Behavioral of add_two_values_procedure is
    signal s : STD_LOGIC_VECTOR (3 downto 0);
    procedure add_values (
        a : in STD_LOGIC_VECTOR (3 downto 0);
        b : in STD_LOGIC_VECTOR (3 downto 0);
        operand : in STD_LOGIC;
        sum : out STD_LOGIC_VECTOR (3 downto 0))
    is
        variable total : STD_LOGIC_VECTOR (3 downto 0);
    begin
        case operand is
            when '1' =>
                total := a + b;
            when '0' =>
                total := a - b;
        end case;
    sum := total;
    end procedure add_values;
begin
    add_values(a, b, operand, s);               54
    sum <= s;
    cout <= a and b;                            56
end Behavioral;

1 个答案:

答案 0 :(得分:1)

关于第54行:

引用VHDL 2008:

  

如果模式是inout或out,并且没有显式指定对象类,则假定为变量。

所以试试:

procedure add_values (
    a : in STD_LOGIC_VECTOR (3 downto 0);
    b : in STD_LOGIC_VECTOR (3 downto 0);
    operand : in STD_LOGIC;
    signal sum : out STD_LOGIC_VECTOR (3 downto 0))
is
    variable total : STD_LOGIC_VECTOR (3 downto 0);
begin
    case operand is
        ...

关于第56行:

查看cout的类型。 您正在为std_logic_vector(3 downto 0)分配std_logic