我有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 回答
VHDL最初是一种硬件文档语言 . 不是模拟也不是合成模拟 .
我同意组件实例化是痛苦的冗长,但是如果实体未在同一源文件中声明,则它更具可读性 .
此外,在真正的大项目上 . 它允许分离每个实体的编译 . 因此,更改一个实体并不意味着重新编译整个项目 .
并且允许轻松地与行为拱交换以进行模拟 . 即:一个DRAM将只是你的fpga的一堆端口 . 或者您可以下载一个dram模型并验证您的代码是否按预期工作 . 每次模拟某些内容时,您无需返回并更改实例化 .
您可以通过配置完成的任务之一(取决于组件实例化)是使用虚拟组件 .
您可以编写依赖于某个理想化实体(此处命名为x)的VHDL描述,并将其映射到具有不同端口信号名称的不同组件:
详细说明和模拟配置给出:
在查看TARG的端口信号时 .
此功能旨在用于将来自不同供应商库的基元映射到标准组件声明 .
配置中涉及的感知复杂性与诸如LPM(参数化模块库)之类的可移植性库相对应,其通过使用属性和泛型来增加不同的复杂轴,同时标准化接口名称并减少库原语的数量 .
行为综合已经超越了结构设计规范的两种方法都已经走到了尽头 .
FPGA厂商对显式配置声明的支持也一直滞后 . 您可以注意到IEEE Std 1076.6-2004(RTL综合,现已撤销)需要支持配置声明,而隐式配置在精化过程中提供默认绑定指示 .
我喜欢将组件视为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的例子 .