реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Написание state machine, verilog, state machine, verilog
Evgeny72
сообщение Dec 1 2017, 07:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 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. Как правильно это написать?
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Dec 1 2017, 07:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 430
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Я давно задавал такой-же вопрос:
https://electronix.ru/forum/index.php?showt...0167&st=165 (сообщение 168)
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Dec 1 2017, 08:16
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 736
Регистрация: 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
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Dec 1 2017, 08:17
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



В гугле пишем

Clifford Cummings FSM

и читаем все паперы этого уважаемого мужчины.
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение Dec 1 2017, 08:28
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 736
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата(Mad_max @ Dec 1 2017, 11:17) *
В гугле пишем

Clifford Cummings FSM

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

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

Но, как и Mad_max, призываю эти документы изучить, и кодить машины так, как там советуют, ибо это хрестоматийно, канонично, и сразу понятно всем, кто этим занимается.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Dec 1 2017, 08:48
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 832
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Чувак любит двухпроцессное описание КА и не любит однопроцессное. Это его право, разумеется. Но это не значит, что это абсолютная истина.
Go to the top of the page
 
+Quote Post
Evgeny72
сообщение Dec 1 2017, 08:55
Сообщение #7


Участник
*

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



Цитата(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


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

Сообщение отредактировал Evgeny72 - Dec 1 2017, 11:37
Go to the top of the page
 
+Quote Post
g700
сообщение Dec 1 2017, 12:52
Сообщение #8





Группа: Участник
Сообщений: 14
Регистрация: 22-06-17
Из: Санкт-Петербург
Пользователь №: 97 789



Посмотрите здесь в главе 8.
http://read.pudn.com/downloads166/sourceco...d%20Edition.pdf
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th December 2017 - 20:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016