Ваш пример - только объявление типа с именем st_State
, и этот тип содержит четыре элемента. Каждый элемент получает число от 0
до Elements - 1
. Это похоже на C typedef
с C enum
.
Пожалуйста, проверьте это объяснение для более подробной информации.
Типичное применение поскольку это конечный автомат для именования различных состояний:
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
в приведенном выше пример).