Перейти к содержанию

    

Написание state machine, verilog

Доброго всем дня!

Подскажите пожалуйста по 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. Как правильно это написать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я давно задавал такой-же вопрос:

https://electronix.ru/forum/index.php?showt...0167&st=165 (сообщение 168)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у вас при нахождении в состоянии 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 (ну его лучше осмысленно назвать, согласно функции, которую он в дизайне выполняет)

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В гугле пишем

 

Clifford Cummings FSM

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В гугле пишем

 

Clifford Cummings FSM

 

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

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

 

Но, как и Mad_max, призываю эти документы изучить, и кодить машины так, как там советуют, ибо это хрестоматийно, канонично, и сразу понятно всем, кто этим занимается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чувак любит двухпроцессное описание КА и не любит однопроцессное. Это его право, разумеется. Но это не значит, что это абсолютная истина.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В гугле пишем

 

Clifford Cummings FSM

 

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

 

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

 

Я давно задавал такой-же вопрос:

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

 

в симуляторе работает.

Изменено пользователем Evgeny72

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прилагаю файл state machine от компании Altera. В файле top описан счетчик (здесь его описание не привожу) и соединения его со state machine. В файле ссылка на видео с которого была списана машина состояний. Сделал подобным образом, все работает. Может кому пригодится в следующий раз.

state_machine.v

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ?

Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ?

Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно.

У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. :rolleyes:

Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->...

Там много чего интересного есть :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->...

Там много чего интересного есть :rolleyes:

да, есть template. Этого там нет. В файле есть ответ на мой же вопрос и ради чего была создана тема: ...если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты?

Изменено пользователем Evgeny72

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
да, есть template. Этого там нет.

Там тоже самое, но другими словами (стилем) описано....

Изменено пользователем Flip-fl0p

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Там тоже самое, но другими словами (стилем) описано....

 

Ткните носом в template с учетом выше сказанного - если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? А вообще - в спам "уходим".

Изменено пользователем Evgeny72

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация