VHDL中的组件实例化与实体实例化

时间:2016-03-25 22:55:31

标签: vhdl

我有使用Verilog / SystemVerilog的经验,但我是VHDL的新手,我正在试图找出何时应该使用组件实例化或实体实例化。 通过组件实例化,我指的是在实例化实体之前声明实体组件的传统方式。另一方面,随VHDL-93引入的实体实例化允许您直接声明实体而不指定组件。 Related Article

在我看来,实体实例化总是更可取的,除非你还没有实现架构而你只想定义一个黑盒子。

这是我发现的Related Question,但它完全解决了我的疑虑。由于可以为任何实体定义通用映射和体系结构:

entity work.MyEntity_E(ARCH) generic map(
...)
port map(
...
);

进行组件实例化的额外灵活性是什么?什么是最简单的示例,显示无法通过实体实例化完成但可以通过组件实例化完成

3 个答案:

答案 0 :(得分:2)

我喜欢将组件视为IC套接字。您可以通过将编译(分析)比作组装PCB并将详细说明与将芯片放入插槽来进一步进行类比。如果您使用IC插座,即使您尚未订购芯片,也可以组装PCB;你可以推迟将芯片放入插座中。同样,如果您使用组件:即使对应于组件的实体和体系结构尚不存在,您也可以编译设计;你可以推迟绑定直到以后,直到详细说明。

那么,为什么会这样呢?为什么他们还不存在?

i)这是一个很大的项目。并非每个人都完成了他们的阻止。但您仍然可以轻松地在设计的任何位上编译顶级和运行模拟。您可以通过注释/编辑来完成此操作,但使用组件可以更轻松。

ii)您已自动生成了一些IP。这给了你一个模拟的行为模型,但是没有可合成的模型 - 这个想法是你在流程中稍后组合一些自动生成的IP物理视图。这对于模拟来说是可以的,但是如果有一点遗漏 - 你生成的IP会如何编译你的设计以进行综合?

iii)您正在进行递归实例化:您在其自身内部实例化一个块。通过直接实例化,您可以获得牢不可破的鸡与蛋情况(又称​​循环依赖);使用直接实例化,您无法实例化尚未编译的内容,但无法编译它,因为实例化的实体尚未编译。 组件实例化可以打破这种循环依赖。

iv)组件实例化还允许您在设计中的同一位置实例化不同的实体(在配置的控制下)。 @ user1155120给出了上述示例:使用组件实例化(和配置)使您可以创建具有不同子块的相同块。

以下是EDA Playground - https://www.edaplayground.com/x/2QrS上两者的比较示例。

答案 1 :(得分:1)

VHDL最初是一种硬件文档语言。不是模拟,也不是合成。

我同意组件实例化非常冗长,但如果未在同一源文件中声明实体,则它更具可读性。

此外,在非常大的项目上。它允许分离每个实体的编译。因此,改变一个实体并不意味着重新编译整个项目。

并且可以轻松地与行为拱交换以进行模拟。即:一个DRAM将只是你的fpga的一堆端口。或者您可以下载一个dram模型并验证您的代码是否按预期工作。每次模拟某些内容时,您都不需要返回并更改实例化。

答案 2 :(得分:1)

您可以通过配置完成的任务之一(取决于组件实例化)是使用虚拟组件。

您可以编写一个依赖于某个理想化实体(此处命名为x)的VHDL描述,并将其映射到具有不同端口信号名称的不同组件:

entity a is
    port (
        in1:   in  bit;
        in2:   in  bit;
        out1:  out bit
    );
end entity;
architecture fum of a is
begin
    out1 <= in1 xor in2;
end architecture;

entity b is
end entity;

architecture foo of b is
    component x is
        port (
            a: in  bit;
            b: in  bit;
            c: out bit
        );
    end component;
    signal a, b, c: bit;
begin
TARG:
    x 
        port map (
            a => a,
            b => b,
            c => c
        );

STIMULI:
    process
    begin
        wait for 2 ns;
        a <= '1';
        wait for 2 ns;
        b <= '1';
        wait for 2 ns;
        a <= '0';
        wait for 2 ns;
        b <= '0';
        wait for 2 ns;
        a <= '1';
        wait for 2 ns;
        wait;
    end process;

end architecture;

configuration fum of b is
    for foo
        for TARG: x use entity work.a
            port map (
                in1 => a,
                in2 => b,
                out1 => c
            );
        end for;
    end for;
end configuration fum;

详细说明和模拟配置给出:

fum.png

查看TARG的端口信号时。

此功能旨在用于将来自不同供应商库的基元映射到标准组件声明。

配置中涉及的感知复杂性与LPM(参数化模块库)等可移植性库相抵消,这些库通过使用属性和泛型来增加不同的复杂轴,同时标准化接口名称并减少库原语的数量。 / p>

行为综合已经超越了结构设计规范的两种方法都已经走到了尽头。

FPGA供应商对显式配置声明的支持也一直滞后。您可以注意到IEEE Std 1076.6-2004(RTL综合,现已撤销)需要支持配置声明,隐式配置在精化过程中提供默认绑定指示。