Перечисление типов в VHDL - PullRequest
0 голосов
/ 22 апреля 2020

Что такое перечисление типов в VHDL? где я могу его использовать, чтобы сделать код короче и понятнее? Например, рассмотрим следующий оператор:

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

, когда необходимо его использовать.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Перечисляемые типы имеют много других применений, кроме просто состояний в конечных автоматах.

Вы можете использовать их в качестве индексных типов в массивах, l oop переменных и т. Д. c. Например,

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;

и т. Д.

0 голосов
/ 22 апреля 2020

Ваш пример - только объявление типа с именем 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 в приведенном выше пример).

...