从枚举类型创建子类型 [vhdl]

Making a subtype from an enumerated type [vhdl]

经过一些搜索,我似乎无法找到有关在 VHDL 中创建枚举类型的子类型的问题的答案。

如果我有一个描述状态机状态的类型,例如

type state_machine is (idle, reset, state1, state2, state3); -- all the way to a further 'n' number of states

我可能有两个使用状态类型的信号,即

signal state_signal0 : state_machine := idle;
signal state_signal1 : state_machine := state1;

但是,假设 state_signal1 信号只使用状态类型的一个子集,例如让我们说它只被分配 state1state2。是否可以生成 state_machine 类型的子类型。

在我的脑海里它看起来像这样:

type state_machine is (idle, reset, state1, state2, state3);
subtype state_machine_subset is state_machine(state1, state2);

signal state_signal0 : state_machine        := idle;
signal state_signal1 : state_machine_subset := state1;

到目前为止我还没有找到一种方法来实现这样的事情,因为所有子类型示例都被描述为在整数范围内查找范围并将它们分配给 positivenatural 等。有人会吗能对此有所启发吗?

A) 这种类型的子类型定义可能吗?

B) 如果可能的话,值得吗?即它是否提供任何综合优势?

谢谢

在特定情况下,state1state2 跨越一系列值,可以将子类型定义为:

subtype state_machine_subset is state_machine range state1 to state2;

不过,这并不普遍适用,因为不可能同时生成子类型,例如只有 idlestate3,因为它们不跨越一个范围。

在综合中,如果该工具识别出受限的值范围,这可能会节省一些位。工具确实会识别有限的值范围,例如,当整数子类型定义为 subtype int_0_7 is integer range 0 to 7; 时,通常会产生 3 位值。

在模拟中,子类型如果分配到范围之外会产生错误,这有助于提高测试质量。