john72 0 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба Доброго всем дня! Подскажите пожалуйста по 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 4 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба Я давно задавал такой-же вопрос: https://electronix.ru/forum/index.php?showt...0167&st=165 (сообщение 168) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 1 декабря, 2017 Опубликовано 1 декабря, 2017 (изменено) · Жалоба Если у вас при нахождении в состоянии 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 (ну его лучше осмысленно назвать, согласно функции, которую он в дизайне выполняет) Изменено 1 декабря, 2017 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба В гугле пишем Clifford Cummings FSM и читаем все паперы этого уважаемого мужчины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба В гугле пишем Clifford Cummings FSM и читаем все паперы этого уважаемого мужчины. Полностью согласен насчёт трудов Клиффа Каммингза, однако стоит понимать, что у него написано как кодить FSM, чтобы не было проблем при синтезе, чтобы не было расхождений между симуляций и синтезом, чтобы не было глитчей на выходе, какие автоматы работают быстрее, какие медленнее. То есть, как правильно сделать FSM, когда уже знаешь, что ты хочешь от FSM. На вопрос: "А когда нужен FSM и как его разрабатывать?", - там ответа нет. Но, как и Mad_max, призываю эти документы изучить, и кодить машины так, как там советуют, ибо это хрестоматийно, канонично, и сразу понятно всем, кто этим занимается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба Чувак любит двухпроцессное описание КА и не любит однопроцессное. Это его право, разумеется. Но это не значит, что это абсолютная истина. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
john72 0 1 декабря, 2017 Опубликовано 1 декабря, 2017 (изменено) · Жалоба В гугле пишем 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 в симуляторе работает. Изменено 1 декабря, 2017 пользователем Evgeny72 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
g700 0 1 декабря, 2017 Опубликовано 1 декабря, 2017 · Жалоба Посмотрите здесь в главе 8. http://read.pudn.com/downloads166/sourceco...d%20Edition.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
john72 0 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба прилагаю файл state machine от компании Altera. В файле top описан счетчик (здесь его описание не привожу) и соединения его со state machine. В файле ссылка на видео с которого была списана машина состояний. Сделал подобным образом, все работает. Может кому пригодится в следующий раз. state_machine.v Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ? Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
john72 0 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ? Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно. У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 11 января, 2018 Опубликовано 11 января, 2018 · Жалоба У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры. :rolleyes: Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->... Там много чего интересного есть :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
john72 0 11 января, 2018 Опубликовано 11 января, 2018 (изменено) · Жалоба Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->... Там много чего интересного есть :rolleyes: да, есть template. Этого там нет. В файле есть ответ на мой же вопрос и ради чего была создана тема: ...если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? Изменено 11 января, 2018 пользователем Evgeny72 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 11 января, 2018 Опубликовано 11 января, 2018 (изменено) · Жалоба да, есть template. Этого там нет. Там тоже самое, но другими словами (стилем) описано.... Изменено 11 января, 2018 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
john72 0 11 января, 2018 Опубликовано 11 января, 2018 (изменено) · Жалоба Там тоже самое, но другими словами (стилем) описано.... Ткните носом в template с учетом выше сказанного - если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты? А вообще - в спам "уходим". Изменено 11 января, 2018 пользователем Evgeny72 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться