VHDL中的类型枚举

VHDL中的类型枚举是什么? 我在哪里可以使用它来使代码更短,更易于理解? 例如,考虑下面的语句:

TYPE st_State IS (st_Idle,st_CheckHeader1,st_CheckHeader2,st_ReceiveData)

何时必须使用它。

nihao_123456 回答:VHDL中的类型枚举

您的示例只是一个名称为st_State的类型的声明,并且该类型包含四个元素。每个元素都有一个从0Elements - 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;

以此类推

本文链接:https://www.f2er.com/2386752.html

大家都在问