1

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

我得到的错误如下:

[Synth 8-1560] 形式总和的实际 s 必须是变量 ["C:/Nexys 4 >Projects/lab4_1_1/lab4_1_1.srcs/sources_1/new/add_two_values_procedure.vhd":54]

[Synth 8-2778] a 附近的类型错误;预期类型 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)返回std_logic_vector;

据我所知(在这个主题上它有多小)第 56 行在 and 运算符/函数(?)的任一侧使用 std_logic_vector,并且应该返回一个 std_logic_vector。那么为什么要我使用std_ulogic。编辑:我从这个网站http://www.csee.umbc.edu/portal/help/VHDL/packages/std_logic_1164.vhd看到的那一行,但从我的书《Designer's guide to 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;
4

1 回答 1

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。您正在将 a 分配std_logic_vector(3 downto 0)给 a std_logic

于 2015-08-06T03:21:02.993 回答