0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

work库在VHDL中的特殊用法

FPGA之家 来源:FPGA之家 2023-08-19 09:34 次阅读

VHDL 的一个强大功能是用库来组织 RTL 的不同部分。通过使用库,不同的设计人员可以做这个工程中自己负责的那部分工作,而不必担心会在命名方面与其他设计师发生冲突。在例化期间,这可以通过手动指定要使用的库或者通过配置语句来完成。

例如,已经在一个名为“my_lib1”的库中创建并编译了一个名为“bottom”的实体。

编译到任何库中的顶层可以轻松地通过直接实体例化来引用底层:

u0 : entity my_lib1.bottom port map (in1 => in1, out1 => out1);

通过采用上面的编码方式,需要哪个版本的底层就显而易见了。“my_lib1”库中的版本是正确无误的版本。

一个常见的误解与何时使用名为“work”的库有关。许多设计师将“work”用作库,假设它与其他库一样,是一个物理库。但情况并非如此。名为“work”的库在 VHDL 中的用法比较特殊。

它不是一个物理库,实际上它指的是“当前库”。

当一个文件被编译到一个特定的库中,然后被告知从“work”中获取逻辑时,它不会在名为“work”的物理库查找,而是会在例化的文件被编译到的库中查找。这一点可以通过几个例子来展示。

实例 #1

在此示例中,有三个文件,top.vhd、bottom1.vhd 和 bottom2.vhd。 Top.vhd 是设计中的顶层,例化了一个名为“bottom”的实体。底层的两个文件都有一个名为“bottom”的实体。在 bottom1.vhd 中,有一个输出是由一个通过反相器过驱动的的输出。在 bottom2.vhd,中,输出直接由输入驱动。

060ac244-3e29-11ee-ac96-dac502259ad0.jpg

顶层被编译到名为 y_lib1、bottom1.vhd 的库中(也在 my_lib1 库中),而且,bottom2.vhd 在名为 my_lib2 的库里。

在顶层,例化看起来类似于以下内容:

u0 : entity work.bottom port map (in1=> in1, out1 => out1);

查看详细视图,该示意图如下所示:

0622c3e4-3e29-11ee-ac96-dac502259ad0.png

这正是我们期待看到的结果。更重要的是,当使用相同的建立运行仿真时,波形图如下例所示:

0637bea2-3e29-11ee-ac96-dac502259ad0.png

接下来,如果 top.vhd 文件的库从 my_lib1 转换到 my_lib2,则对详细视图所做的更改如下所示:

065379b2-3e29-11ee-ac96-dac502259ad0.png

并且,仿真波形图也会发生变化:

066d3c9e-3e29-11ee-ac96-dac502259ad0.png

这正是我们预期的结果。因为 top.vhd 文件在 my_lib2 中,并且在实体例化中使用了“work”,所以它将从 my_lib2 中获取底层。

示例 #2

此示例将显示假设“work”是物理库所带来的危险。这是与示例#1 类似的测试。在此示例中,top.vhd 和 bottom1.vhd 将被编译到“my_lib1”库中,bottom2.vhd 将被编译到名为“work”的库中。

0680a63a-3e29-11ee-ac96-dac502259ad0.jpg

与前面的示例一样,顶层例化底部,如下所示:

u0: entity work.bottom port map (in1 => in1, out1 => out1)

这个设计的详细视图类似于以下示例:

069a7d62-3e29-11ee-ac96-dac502259ad0.png

仿真如下所示:

06ae5c92-3e29-11ee-ac96-dac502259ad0.png

因此,即使 bottom2.vhd 已被编译为一个名为“work”的物理库,并且顶层由“work”库例化了底部,但该工具仍然会使用 bottom1.vhd 中与top.vhd 编译到同一个库中的行为。

Vivado 默认库:

默认情况下,将 VHDL 文件输入 Vivado 工程时,该工具会将这些文件放入一个名为“xil_defaultlib”的库中。这样做的原因是让只使用库的用户能够轻松地将旧的工程移植到 VHDL 中,同时还能帮助设置有更多组合结构的用户以恰当的方式在 Vivado 中对他们的工程进行设置。

结论:

选择 VHDL 文件的库名时应小心。虽然名为“work”的库是许多工程公用的库名,但该工具处理这个库名的方式与处理其他库名的方式略有不同。如果将顶层文件编译到不同的库中并引用“work”,那么它就不会从名为“work”的物理库中获取行为。如果这不是所期望的,就可能会导致混乱的行为。

我的建议是永远不要使用“work”库。相反,在例化较低层时,始终应指定要使用的库。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 反相器
    +关注

    关注

    6

    文章

    311

    浏览量

    43496
  • vhdl
    +关注

    关注

    30

    文章

    817

    浏览量

    128312
  • RTL
    RTL
    +关注

    关注

    1

    文章

    385

    浏览量

    59942
  • 编译
    +关注

    关注

    0

    文章

    661

    浏览量

    33029
  • Work
    +关注

    关注

    0

    文章

    9

    浏览量

    9067

原文标题:如何使用 VHDL 中的 “work” 库

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    主流的微前端的实现原理及其用法

    本文对微前端的概念和场景进行科普,介绍一些主流的微前端的实现及其用法,并讲解部分这些的原理和实践知识。
    的头像 发表于 10-10 14:24 2851次阅读

    SQLxRust语言中的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL执行库,它支持多种数据,包括MySQL、PostgreSQL、SQLite等。本教程将以MySQL数据为例,介绍SQLxRust语言中的基础用法
    的头像 发表于 09-19 14:32 5449次阅读

    如何生产VHDL文件

    我创建了一个VHDL的程序包 mypak,我想把它编译到一个新mylib,这样我就可以我的以后就可以如下例子调用它library my_lib;use my_lib.my_lib.all;现在
    发表于 09-26 12:08

    怎么Vivado 2015.3创建一个

    'work'找不到包'tap'[Synth 8-1031]未声明tap_state [Common 17-69]命令失败:合成失败 - 请查看控制台或运行日志文件以获取详细信息因此,我正在搜索相关
    发表于 04-15 12:38

    可以将块设计添加到吗?

    嗨,是否有可能将块设计添加到工作,我可以使用“entity work.bs_name”对其进行实例化?我可以使用vhdl组件,使用i
    发表于 04-18 07:00

    ARM汇编语言跳转指令的特殊用法还有吗

    关于 ARM汇编语言跳转指令的特殊用法。有如下两条跳转指令: beq lablefbeq lableb其中 lable 为某段程序的标号,beq lablef 表示向前跳转到与当前指令最接近的标号
    发表于 10-31 15:30

    模拟开关特殊用法

    模拟开关特殊用法 模拟开关在数据采集系统通常被用作为模拟传输器,和A/D转换器配合使用以实现多通道的模拟信号输入;控制通常被用作为模拟
    发表于 08-14 22:28 34次下载

    简要说明如何使用“work

    因此,即使 bottom2.vhd 已被编译为一个名为“work”的物理,并且顶层由“work例化了底部,但该工具仍然会使用 bottom1.vhd
    的头像 发表于 07-25 15:33 3934次阅读
    简要说明如何使用“<b class='flag-5'>work</b>” <b class='flag-5'>库</b>

    如何得当使用C语言的特殊用法

    C语言有很多特殊用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。 比如我们使用STM32
    的头像 发表于 09-27 10:41 1984次阅读
    如何得当使用C语言的<b class='flag-5'>特殊</b>的<b class='flag-5'>用法</b>

    如何在VHDL设计中使用模块

    实际设计通常包括常用的电路块,如加法器、减法器、乘法器、解码器、计数器和移位器。Altera以模块的形式提供了这些块的有效实现,这些模块可以VHDL设计
    发表于 01-22 15:34 13次下载
    如何在<b class='flag-5'>VHDL</b>设计中使用<b class='flag-5'>库</b>模块

    你不可不知的STC单片机特殊用法的IO

    IO的特殊用法是什么鬼?简单说就是因为STC单片机的IO有好多都带有复用功能,单片机上电复位后,这些复用功能引脚的默认状态有一些特殊的规定或处理办法,若你不知晓,很有可能出现灾难性的
    发表于 02-10 11:19 3次下载
    你不可不知的STC单片机<b class='flag-5'>中</b><b class='flag-5'>特殊</b><b class='flag-5'>用法</b>的IO

    详解C语言中特殊用法

    C语言有很多特殊用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。
    的头像 发表于 07-15 08:57 1532次阅读

    如何使用ModelSimVHDL实现RAM

    本教程,我们将探索如何使用 ModelSim VHDL 实现 RAM。
    发表于 07-29 16:34 2791次阅读
    如何使用ModelSim<b class='flag-5'>在</b><b class='flag-5'>VHDL</b><b class='flag-5'>中</b>实现RAM

    数据orderby 和groupby用法

    数据是指将数据按照一定规则组织并存储起来,以实现高效的数据管理和访问。使用数据时,我们经常需要对数据进行排序和分组。数据的ORDE
    的头像 发表于 11-23 11:16 2853次阅读

    splitpython用法

    splitpython用法 split()是Python中一个非常常用的字符串函数,它能够根据指定的分隔符将一个字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。本文将详细介绍
    的头像 发表于 12-25 15:12 2092次阅读