在 VHDL 中,是否可以创建与另一个相同的新枚举类型?

问题描述 投票:0回答:1

VHDL 是否提供了一种简单的机制来复制枚举类型,以允许创建可以保存同一组值但不能相互连接或分配的对象?

用例将具有逻辑类型,这些逻辑类型将表示除了某些其他信号集之外不应连接的信号 - 例如不同频率的时钟或不应相互关联或与数据位关联的复位。这样,编译器可以检查这些类型的连接错误,并且代码中的类型名称本身可以具有含义,例如

clk40mhz_t
.

似乎可以为任何此类类型复制粘贴定义类似于

std_ulogic
的枚举,并定义合适的转换函数。不过,还有比这更方便的方法吗?

我试过像这样的直截了当的声明

type clock_t is std_ulogic;

但是因为

std_ulogic
不是一个范围,所以这不是一个有效的类型声明。

所以我也尝试了其他一些构思不佳和命运多舛的结构,如

std_ulogic’range
range std_ulogic’range
range std_ulogic’left to std_ulogic’right
,和
(std_ulogic’range)

所有都遇到编译器错误是可以理解的(使用 Quartus Prime Pro 22.3 编译)。

更新:为了清楚起见,这个问题的重点是在扩展到对象使用的 VHDL 中实现类型安全,而不仅仅是原始类型。有关为什么有用的更多信息,请参阅C++ 中强类型实现的解释

另一个更新:要基于上面关于类型名称的评论,考虑

signal sample_clk_50mhz : std_ulogic;

signal sample_clk : clk_50mhz_t;

我们可以放弃频率后缀,而不会丢失代码中包含的频率,and 编译器将在达到仿真之前检查

sample_clk
是否连接到正确频率的信号。通过减轻名称的一些工作量,提高模型抽象级别的任务变得更加容易,我们摆脱了硬件建模等同于原始的痴迷。

vhdl
1个回答
0
投票

我得到了类似于@user16145658 上面评论中提供的答案,这似乎是广泛实施的语言标准(2008)中可用的最佳解决方案。

想法是创建一个定义基类型及其转换函数的通用包,然后使用单独的包实例来创建具有预期行为的复制类型。然后可以使用别名将实例类型组合到统一包中,并避免大量导入通用包实例。

此实现还带来了扩展包实例的好处,可以为特定类型的“系列”提供额外的功能。使用

'val
'pos
属性可以简单地实现与“基本”类型之间的转换。

© www.soinside.com 2019 - 2024. All rights reserved.