如何定义VHDL组件和包?

时间:2015-10-08 05:40:38

标签: package components vhdl

下面我有两个VHDL文件。带有组件 x 的文件 x.vhd ,需要在 top.vhd 作为一个包。

-- x.vhd

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

package x_pkg is
    component my_x
        port(clk_clk          : in  std_logic    := '0';
             reset_reset_n    : in  std_logic    := '0';
    end component my_x;
end package x_pkg;

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

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity x is
    port (
        clk_clk               : in  std_logic         := '0';             --                             clk.clk        
        reset_reset_n         : in  std_logic         := '0';             --                           reset.reset_n
    );
end entity x;

architecture rtl of x is

需要在以下顶级文件中引用此包:

-- top.vhd

library ieee;
use ieee.std_logic_1164.all;

library altera;
use altera.altera_syn_attributes.all;
use work.x_pkg.all;

entity EyeTracker_Top is
    port
    (
        Nios_Clk : in std_logic;
        Nios_Reset_n : in std_logic;
    );

end EyeTracker_Top;

architecture struct of EyeTracker_Top is

begin
M1 : my_x port map(Nios_Clk, Nios_Reset_n);            -- Here I get the error message!

编译后,会收到以下错误消息:

***错误(12006):节点实例“M1”实例化未定义的实体“my_x”

这是什么问题?我猜包装参考有问题......

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在实例化组件my_x。组件只是一个声明,一种空壳。每个组件实例化必须在某个时刻绑定到实际的实体/体系结构对。必须使用显式配置完成此绑定。有几种方法可以做到这一点。一个是添加:

for all: my_x use work.x(rtl);

在您的体系结构的声明区域中(architecturebegin之间)。当然,实体x及其架构rtl必须在您用作work的库中进行编译,然后才能详细说明您的顶层。

您收到的错误消息很难理解,因为您的工具尝试根据名称应用默认配置策略:对于未绑定的组件实例,它会搜索与组件同名的实体。因为它没有找到,所以它抱怨缺少实体,而它是一个组件绑定问题,即缺少配置。一个更好的工具会告诉你组件M1的{​​{1}}实例没有绑定。

最后一点:如果所有这些组件的东西都太复杂了,只需要摆脱它并直接实例化你的实体:

my_x

,您将不需要组件声明,也不需要配置。

基本上有两种方法:

  • 自上而下的设计,包含组件实例和配置,
  • 自下而上的设计,包含实体实例化,没有组件,也没有配置。

了解两者之间的差异,其利弊并不容易。在那里,一本好的VHDL书可能比stackoverflow上的问题和答案更好。