【问题标题】:Quartus Prime VHDL component instantiation compile errorQuartus Prime VHDL 组件实例化编译错误
【发布时间】:2018-02-25 20:02:25
【问题描述】:

我在尝试编译以下代码时遇到问题:

----------------
----------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity adder_top is
Port ( a_in : in STD_LOGIC_VECTOR (3 downto 0);
       b_in : in STD_LOGIC_VECTOR (3 downto 0);
       clk : in STD_LOGIC;
       clk_en : in STD_LOGIC;
       carry_in : in STD_LOGIC;
       carry_out : out STD_LOGIC;
       c_out : out STD_LOGIC_VECTOR (3 downto 0));
end adder_top;

architecture Behavioral of adder_top is
COMPONENT c_addsub_0
  PORT (
    A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    CLK : IN STD_LOGIC;
    C_IN : IN STD_LOGIC;
    CE : IN STD_LOGIC;
    C_OUT : OUT STD_LOGIC;
    S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
  );
END COMPONENT c_addsub_0;
begin
inst_1 : COMPONENT c_addsub_0
    port map
    (
        A => a_in,
        B => b_in,
        CLK => clk,
        C_IN => carry_in,
        CE => clk_en,
        C_OUT => carry_out,
        S => c_out
    );

end Behavioral;

---------------------------
---------------------------

我在尝试编译时收到以下错误代码:

错误 (12006):节点实例“inst_1”实例化未定义的实体 “c_addsub_0”。确保指定了所需的库路径 正确,定义指定的实体,或更改实例化。 如果该实体代表英特尔 FPGA 或第三方 IP,则生成 IP 的综合文件。

我完全不确定为什么会收到此错误。任何帮助将不胜感激。

【问题讨论】:

标签: vhdl quartus


【解决方案1】:

用于分析和详细说明(a.k.a.compile)您的设计的综合工具 (Quartus) 抱怨它没有找到一个实体来绑定组件c_addsub_0和。您需要以工具定义的方式将工具指向包含所需entity 的库。

如果您希望 c_addsub_0 成为您创建的块,那么它可能没有按预期分析到 work 库中(意外的语法错误),或者 work 库的库路径未正确建立(不太可能用于综合工具)。如果您编写了c_addsub_0,那么使用直接实体实例化可能更容易——它省去了编写component 声明的麻烦,并使其与另一个文件中的实例和实体保持同步。例如:

inst_1 : ENTITY work.c_addsub_0(<arch_name>)
    port map
    (
        A => a_in,
        B => b_in,
        CLK => clk,
        C_IN => carry_in,
        CE => clk_en,
        C_OUT => carry_out,
        S => c_out
    );

如果c_addsub_0 块在布局布线之前要作为一个黑盒通过细化解除绑定,那么您需要通过decorating the instance with the appropriate syn_black_box attribute 告诉Quartus。

architecture Behavioral of adder_top is
COMPONENT c_addsub_0
  PORT (
    A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    CLK : IN STD_LOGIC;
    C_IN : IN STD_LOGIC;
    CE : IN STD_LOGIC;
    C_OUT : OUT STD_LOGIC;
    S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
  );
END COMPONENT c_addsub_0;

attribute syn_black_box : boolean;
attribute syn_black_box of c_addsub_0: component is true;

begin
...

然后它知道在该组件的合成后网表中合成一个黑盒表示。然后,您需要确保 Quartus 后端可以在某处的网表库路径中找到给定组件的网表。

VHDL 提供了多种方法来创建层次结构,对绑定、信号连接、块的命名/重命名和其他在普通设计中很少使用的功能进行难以置信的精确控制。除非您的综合工具仅支持使用组件声明的一种实例化方式,或者您需要一个黑盒,否则我会坚持直接实体实例化。

P.S.: 您的使用条款 use ieee.std_logic_unsigned; 应该是 use synopsys.std_logic_unsigned; -- IEEE 标准机构从未批准过 std_logic_unsigned 包。不过,如果使用 1076-2008 标准进行分析,现在可以将您想要的任何内容分析到 IEEE 库中。这允许 defacto 供应商但未正式标准化的包在不修改源代码的情况下使用。只有STD 库现在实际上是一个标准。请注意,此软件包的 Mentor Graphics 和 Synopsys 版本不同,因此您的代码可能无法实现使用基于标准的 numeric_std 软件包所实现的可移植性。

【讨论】:

  • 与综合工具不同,具有未绑定组件不是 VHDL 语言错误。 adder_top 的唯一语句似乎不太可能是未绑定的,它是更改端口正式名称的包装器。附言- 与 STD (IEEE Std 1076-2008, 13.2) 不同,IEEE 库中的内容没有限制。该标准提供 numeric_std_unsigned 代替 std_logic_unsigned (16.8.5)。无论如何,它不会在 adder_top 中使用。
  • 听起来 IEEE 标准机构通过明确批准他们在 1076-2008 年的行动,屈服于 Synopsys 劫持 IEEE 库名称。 (感谢 LRM 参考 @user1155120。)多么有趣,但真的很伤心。
  • 2008 版是第一个包含 std_logic_1164 和之前在 IEEE Std 1164-1993 和 IEEE Std 1076.3-1997 中找到的综合库的版本。这些标准还指定了各种包被分析到图书馆 IEEE,同时没有指定对其他内容的限制。考虑一下 Synopsys 为各自的标准化工作贡献了 MVL9 和 std_logic_arith。您的偏见并不少见,但并非基于事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2016-07-13
  • 1970-01-01
相关资源
最近更新 更多