|
Написание state machine, verilog, state machine, verilog |
|
|
|
Dec 1 2017, 07:35
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Доброго всем дня! Подскажите пожалуйста по 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. Как правильно это написать?
|
|
|
|
|
Dec 1 2017, 08:16
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Если у вас при нахождении в состоянии 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 - Dec 1 2017, 08:18
|
|
|
|
|
Dec 1 2017, 08:28
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата(Mad_max @ Dec 1 2017, 11:17)  В гугле пишем
Clifford Cummings FSM
и читаем все паперы этого уважаемого мужчины. Полностью согласен насчёт трудов Клиффа Каммингза, однако стоит понимать, что у него написано как кодить FSM, чтобы не было проблем при синтезе, чтобы не было расхождений между симуляций и синтезом, чтобы не было глитчей на выходе, какие автоматы работают быстрее, какие медленнее. То есть, как правильно сделать FSM, когда уже знаешь, что ты хочешь от FSM. На вопрос: "А когда нужен FSM и как его разрабатывать?", - там ответа нет. Но, как и Mad_max, призываю эти документы изучить, и кодить машины так, как там советуют, ибо это хрестоматийно, канонично, и сразу понятно всем, кто этим занимается.
|
|
|
|
|
Dec 1 2017, 08:55
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(Mad_max @ Dec 1 2017, 12:17)  В гугле пишем
Clifford Cummings FSM
и читаем все паперы этого уважаемого мужчины. есть у меня сей труд. Прочитаю ещё раз. Код машины был выдернут из примеров Quartus и быстренько изменен только для того, чтобы задать вопрос. Цитата(Flip-fl0p @ Dec 1 2017, 11:45)  там пример описан на 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 - Dec 1 2017, 11:37
|
|
|
|
|
Dec 1 2017, 12:52
|
Группа: Участник
Сообщений: 14
Регистрация: 22-06-17
Из: Санкт-Петербург
Пользователь №: 97 789

|
|
|
|
|
|
Jan 11 2018, 06:22
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

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

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(Flip-fl0p @ Jan 11 2018, 09:44)  Я бы названия состояниям автомата дал более осмысленные. Это сегодня Вы помните. А что будет через пару месяцев ? Ну и разделил логику переключения автомата и логику формирования выходных состояний в разные блоки. Так нагляднее код, хоть и больше. Но это не обязательно. У себя в проекте я все описал, в файле приведено лишь то, что на видео от Альтеры.
|
|
|
|
|
Jan 11 2018, 07:17
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

|
Цитата(Flip-fl0p @ Jan 11 2018, 10:07)  Так у альтеры все шаблоны легко найти в Quartus. Edit -> Insert template->... Там много чего интересного есть  да, есть template. Этого там нет. В файле есть ответ на мой же вопрос и ради чего была создана тема: ...если мне необходимо чтобы состояние S0 сменилось на S1 через 20 периодов тактовой частоты?
Сообщение отредактировал Evgeny72 - Jan 11 2018, 07:30
|
|
|
|
|
Jan 11 2018, 07:32
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 4-01-14
Пользователь №: 79 899

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