Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Написание state machine, verilog
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Evgeny72
Доброго всем дня!
Подскажите пожалуйста по state machine. Есть машина состояний:
Код
reg [1:0] out;
reg [1:0] state;

// Declare states
parameter
        S0 = 0,    
        S1 = 1,
        S2 = 2;

// Output depends only on the state
always @ (state)
begin
case (state)
    S0:
        out = 2'b01;
    S1:
        out = 2'b10;
    S2:
        out = 2'b11;
        
    default:
        out = 2'b00;
endcase
end

// Determine the next state
always @ (posedge CLK)
begin
if (RESET)
    state <= S0;
else
case (state)
    S0:
            state <= S1;
    S1:
            state <= S3;
    S3:
            state <= S3;
endcase
end


Как правильно написать на verilog, если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? Насколько мне известно, описывается счетчик и 21 значение счетчика "приравнивается" (не совсем корректное слово) к состоянию S1. Как правильно это написать?
Flip-fl0p
Я давно задавал такой-же вопрос:
https://electronix.ru/forum/index.php?showt...0167&st=165 (сообщение 168)
one_eight_seven
Если у вас при нахождении в состоянии S0 ничего, требующего управления от FSM не происходит, то не смешивайте количество тактов и FSM. Просто подавайте на FSM сигнал, по которому будет переход в нужное вам состояние (в примере ниже s0_to_s1):
Код
always @ (posedge CLK) begin
  if (RESET)
    state <= S0;
  else
    state <= nextstate;
end

always @* begin
  nextstate = state; // loopback
  case(state)
    S0 : begin
      if (s0_to_s1)
        nextstate = S1;
    end
    .....
  endcase
end


А счётчик тактов делайте отдельно. Один из вариантов уже предложил Flip-fl0p: сигнал выхода FSM в S0 предзагружает и запускает счётчик, который после каждый такт декрементируется. Когда счётчик досчитывает до нуля, формируется сигнал s0_to_s1 (ну его лучше осмысленно назвать, согласно функции, которую он в дизайне выполняет)
Mad_max
В гугле пишем

Clifford Cummings FSM

и читаем все паперы этого уважаемого мужчины.
one_eight_seven
Цитата(Mad_max @ Dec 1 2017, 11:17) *
В гугле пишем

Clifford Cummings FSM

и читаем все паперы этого уважаемого мужчины.

Полностью согласен насчёт трудов Клиффа Каммингза, однако стоит понимать, что у него написано как кодить FSM, чтобы не было проблем при синтезе, чтобы не было расхождений между симуляций и синтезом, чтобы не было глитчей на выходе, какие автоматы работают быстрее, какие медленнее. То есть, как правильно сделать FSM, когда уже знаешь, что ты хочешь от FSM. На вопрос: "А когда нужен FSM и как его разрабатывать?", - там ответа нет.

Но, как и Mad_max, призываю эти документы изучить, и кодить машины так, как там советуют, ибо это хрестоматийно, канонично, и сразу понятно всем, кто этим занимается.
andrew_b
Чувак любит двухпроцессное описание КА и не любит однопроцессное. Это его право, разумеется. Но это не значит, что это абсолютная истина.
Evgeny72
Цитата(Mad_max @ Dec 1 2017, 12:17) *
В гугле пишем

Clifford Cummings FSM

и читаем все паперы этого уважаемого мужчины.


есть у меня сей труд. Прочитаю ещё раз. Код машины был выдернут из примеров Quartus и быстренько изменен только для того, чтобы задать вопрос.

Цитата(Flip-fl0p @ Dec 1 2017, 11:45) *
Я давно задавал такой-же вопрос:
https://electronix.ru/forum/index.php?showt...0167&st=165 (сообщение 168)


там пример описан на VHDL, я с ним не дружу. Спасибо, попытаюсь разобраться.

написал следующим образом:
Код
//Counter
reg[X:0] counter;
always @(posedge CLK)
begin
    if (RESET)
        counter <= 0;
        else
            counter <= counter + 1'b1;
end

...

S0:
            begin
                if ((counter[X:0] == значение счетчика))
                    state <= S1;
                else
                    state <= S0;
            end


в симуляторе работает.
g700
Посмотрите здесь в главе 8.
http://read.pudn.com/downloads166/sourceco...d%20Edition.pdf
Evgeny72
прилагаю файл state machine от компании Altera. В файле top описан счетчик (здесь его описание не привожу) и соединения его со state machine. В файле ссылка на видео с которого была списана машина состояний. Сделал подобным образом, все работает. Может кому пригодится в следующий раз.
Flip-fl0p
Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ?
Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно.
Evgeny72
Цитата(Flip-fl0p @ Jan 11 2018, 09:44) *
Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ?
Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно.

У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. rolleyes.gif
Flip-fl0p
Цитата(Evgeny72 @ Jan 11 2018, 09:56) *
У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. rolleyes.gif

Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->...
Там много чего интересного есть rolleyes.gif
Evgeny72
Цитата(Flip-fl0p @ Jan 11 2018, 10:07) *
Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->...
Там много чего интересного есть rolleyes.gif

да, есть template. Этого там нет. В файле есть ответ на мой же вопрос и ради чего была создана тема: ...если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты?
Flip-fl0p
Цитата(Evgeny72 @ Jan 11 2018, 10:17) *
да, есть template. Этого там нет.

Там тоже самое, но другими словами (стилем) описано....
Evgeny72
Цитата(Flip-fl0p @ Jan 11 2018, 10:23) *
Там тоже самое, но другими словами (стилем) описано....


Ткните носом в template с учетом выше сказанного - если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? А вообще - в спам "уходим".
Flip-fl0p
Цитата(Evgeny72 @ Jan 11 2018, 10:32) *
Ткните носом в template с учетом выше сказанного - если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? А вообще - в спам "уходим".

Так это же шаблон только. А всё остальное ручками делать надо в зависимости от алгоритма...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.