使用Ada,我可以使用.ads和.adb文件将模块化单元拆分为规格和主体 .
是否可以分离VHDL实体和架构?如果是这样,是否有命名约定或推荐的样式?实体可以放在自定义库/包中吗?
一切都被编译成一个库 . 默认情况下,这称为"work",但您可以覆盖它 . 我很少使用它 - 如果存在命名空间冲突,它偶尔会对外部IP有用 . 正如Chiggs评论的那样,使用库来创建命名空间是一种很好的做法 . 大多数合成器都是can deal with multiple libraries now,虽然它们在设置它们时也有点麻烦(你必须告诉编译器它们都在哪里) .
也许一个例子 - 比如你有一个i2c控制器和一个spi控制器 . 您可以调用两个块 controller 并将它们编译到自己的库 i2c 和 spi 中,然后将它们实例化为:
controller
i2c
spi
i2c_instance:entity i2c.controller...etc spi_instance:entity spi.controller...etc
或者你可以称他们 i2c_controller 和 spi_controller 并做:
i2c_controller
spi_controller
i2c_instance:entity work.i2c_controller...etc spi_instance:entity work.spi_controller...etc
并且库与硬盘文件夹“不一样” . 它们由VHDL编译器管理,因此您可以使用该工具使用的任何语法来创建和映射它们 .
例如,使用Modelsim, vlib 在文件系统中的特定位置创建一个库(因此此时看起来像文件夹), vmap 告诉编译器如何将 use some_lib; 子句映射到文件系统的特定位 .
vlib
vmap
use some_lib;
您可以将实体和体系结构(或每个实体甚至多个体系结构)分成多个文件,或将它们保存在一个文件中 . 将 architecture 保存在单独的文件中意味着当您重新编译它时,不会重新编译 entity ,这意味着您不必重新编译实例化它的所有内容 .
architecture
entity
与 packages 和 package body 类似 - 单独文件中的实体意味着您可以重新编译该部分而无需重新编译其他所有内容 . 请注意, package 不适用于放置实体 .
packages
package body
package
(旁白 - Modelsim有一个 -just 开关,允许你将所有内容保存在一个文件中,只编译文件的选定位,例如, architecture 和/或 body 部分)
-just
body
将可重用的核心编译到自己的库中以保护其命名空间
将其他所有内容编译到 work 库中
work
将有用的常量,函数,过程,类型定义放入一个或多个包中
将实体和体系结构放在一个或多个文件中是一种品味和发展风格的问题
将包和包体放入一个或多个文件是一个品味和发展风格的问题比什么都重要
实体和架构是独立的设计单元 . 它们可以位于同一文件中,也可以位于单独的文件中 . 文件扩展名保持不变:通常 .vhd 但也可以 .vhdl . 对于文件名,没有普遍接受的命名约定 . (实际上有数百种约定,所以没有任何约定一样有用)任何有效的东西;例如,您可以使用 myEntity.vhd 和 myEntity_RTL.vhd .
.vhd
.vhdl
myEntity.vhd
myEntity_RTL.vhd
您可以编译在自己的库中编写的实体和体系结构 . 您可以使用公司名称作为库名称 .
不过,请不要将 libraries 与 packages 混淆!包是一个包含可重用声明的编译单元 . 库是一组命名的编译单元 .
2 回答
图书馆
一切都被编译成一个库 . 默认情况下,这称为"work",但您可以覆盖它 . 我很少使用它 - 如果存在命名空间冲突,它偶尔会对外部IP有用 . 正如Chiggs评论的那样,使用库来创建命名空间是一种很好的做法 . 大多数合成器都是can deal with multiple libraries now,虽然它们在设置它们时也有点麻烦(你必须告诉编译器它们都在哪里) .
也许一个例子 - 比如你有一个i2c控制器和一个spi控制器 . 您可以调用两个块
controller
并将它们编译到自己的库i2c
和spi
中,然后将它们实例化为:或者你可以称他们
i2c_controller
和spi_controller
并做:并且库与硬盘文件夹“不一样” . 它们由VHDL编译器管理,因此您可以使用该工具使用的任何语法来创建和映射它们 .
例如,使用Modelsim,
vlib
在文件系统中的特定位置创建一个库(因此此时看起来像文件夹),vmap
告诉编译器如何将use some_lib;
子句映射到文件系统的特定位 .实体,架构,包
您可以将实体和体系结构(或每个实体甚至多个体系结构)分成多个文件,或将它们保存在一个文件中 . 将
architecture
保存在单独的文件中意味着当您重新编译它时,不会重新编译entity
,这意味着您不必重新编译实例化它的所有内容 .与
packages
和package body
类似 - 单独文件中的实体意味着您可以重新编译该部分而无需重新编译其他所有内容 . 请注意,package
不适用于放置实体 .(旁白 - Modelsim有一个
-just
开关,允许你将所有内容保存在一个文件中,只编译文件的选定位,例如,architecture
和/或body
部分)摘要
将可重用的核心编译到自己的库中以保护其命名空间
将其他所有内容编译到
work
库中将有用的常量,函数,过程,类型定义放入一个或多个包中
将实体和体系结构放在一个或多个文件中是一种品味和发展风格的问题
将包和包体放入一个或多个文件是一个品味和发展风格的问题比什么都重要
实体和架构是独立的设计单元 . 它们可以位于同一文件中,也可以位于单独的文件中 . 文件扩展名保持不变:通常
.vhd
但也可以.vhdl
. 对于文件名,没有普遍接受的命名约定 . (实际上有数百种约定,所以没有任何约定一样有用)任何有效的东西;例如,您可以使用myEntity.vhd
和myEntity_RTL.vhd
.您可以编译在自己的库中编写的实体和体系结构 . 您可以使用公司名称作为库名称 .
不过,请不要将 libraries 与 packages 混淆!包是一个包含可重用声明的编译单元 . 库是一组命名的编译单元 .