首页 文章

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

提问于
浏览
5

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

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

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

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

进行组件实例化的额外灵活性是什么?什么是显示 something that can not be done with entity instantiation but can be done with component instantiation 的最简单的例子?

3 回答

  • 1

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

    我同意组件实例化是痛苦的冗长,但是如果实体未在同一源文件中声明,则它更具可读性 .

    此外,在真正的大项目上 . 它允许分离每个实体的编译 . 因此,更改一个实体并不意味着重新编译整个项目 .

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

  • 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(参数化模块库)之类的可移植性库相对应,其通过使用属性和泛型来增加不同的复杂轴,同时标准化接口名称并减少库原语的数量 .

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

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

  • 2

    我喜欢将组件视为IC插座 . 您可以通过将编译(分析)比作组装PCB并将其简化为将芯片放入插座中来进一步进行类比 . 如果您使用IC插座,即使您尚未存在,也可以组装PCB;你可以将绑定推迟到以后,直到详细说明 .

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

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

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

    iii)你're doing recursive instantiation: you'在其自身内部实例化一个块 . 通过直接实例化,您将获得一个牢不可破的鸡与蛋情况(又称循环依赖);使用直接实例化,您无法实例化尚未编译的内容,但您无法编译它,因为实例化的实体尚未编译 . 组件实例化可以打破这种循环依赖关系 .

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

    这是一个比较两个EDA Playground - https://www.edaplayground.com/x/2QrS的例子 .

相关问题