VHDL中的类型枚举是什么? 我在哪里可以使用它来使代码更短,更易于理解? 例如,考虑下面的语句:
TYPE st_State IS (st_Idle,st_CheckHeader1,st_CheckHeader2,st_ReceiveData)
何时必须使用它。
VHDL中的类型枚举是什么? 我在哪里可以使用它来使代码更短,更易于理解? 例如,考虑下面的语句:
TYPE st_State IS (st_Idle,st_CheckHeader1,st_CheckHeader2,st_ReceiveData)
何时必须使用它。
您的示例只是一个名称为st_State
的类型的声明,并且该类型包含四个元素。每个元素都有一个从0
到Elements - 1
的数字。这类似于带有C typedef
的C enum
。
请查看this解释以获取更多详细信息。
一个典型的应用是状态机来命名不同的状态:
architecture Top_Arch of Top is
type State_Type is (S0,S1,S2,S3);
signal CurrentState : State_Type := S0;
begin
process(Clock)
begin
if(rising_edge(Clock)) then
case CurrentState is
when S0 => ...
when S1 => ...
when S2 => ...
when S3 => ...
end case;
end if;
end Top_Arch;
使用此方法可以使代码更易读和更简洁,但等效于此方法(未经测试):
architecture Top_Arch of Top is
signal CurrentState : INTEGER RANGE 0 to 3 := 0;
begin
process(Clock)
begin
if(rising_edge(Clock)) then
case CurrentState is
when 0 => ...
when 1 => ...
when 2 => ...
when 3 => ...
end case;
end if;
end Top_Arch;
注意:检查
range
语句。您必须使用它,因为必须为状态机声明每个值。因此,您必须使用when others
或将整数减少为2位。否则,您必须声明2^32 - 1
状态。
因此,至少需要一个带有type <YourType> is ...
的类型声明来声明您的自定义类型和一个使用您的类型的信号(在上例中为CurrentState
)。
枚举类型除了状态机中的状态外,还有许多其他用途。
您可以将它们用作数组,循环变量等的索引类型。例如,
type channel is (R,G,B);
Colour : array(channel) of byte;
constant Black : Colour := (R => 0,G => 0,B => 0);
signal VGA_Out : Colour;
-- in a process
for c in channel loop
VGA_Out(c) <= A(c) + B(c); -- mix video signals A and B
end loop;
以此类推