2016-05-03 2 views
-1

Итак, я пытаюсь реализовать свой первый FSM, и я очень запутался.Работа с множеством выходов в конечных автоматах verilog

Коды немного долго, поэтому позвольте мне подвести итог: Я начинаю с объявляя входов и выходов Затем государственных декларации (у меня есть пять плюс три заполнителей) Тогда Текущее состояние назначения, который является последовательным

always @(posedge clk) 
begin 
    if (rst == 1'b1) 
     Current_State <= MainGreen; 
    else 
     Current_State <= Next_state; 
end 

А потом ... Я заблудился. У меня изначально была только одна большая последовательная схема, которая назначила next_state и выходы, но это было грязно/возможно, было много ошибок.

То, что я сейчас просто не имеет next_state логики, но ничего общего с выходами:

always @* 
begin 
    Next_state = Current_State; 
    case (Current_State) 

     MainGreen: 
     begin 
      if (count && expired) 
      begin 
       Next_state = MainYel; 
      end 
     end 

     MainYel: 
     begin 
      if (WR && expired) 
       Next_state = AllRed; 
      else if (expired) 
       Next_state = SideGreen; 
     end 

     AllRed: 
     begin 
      if (expired) 
       Next_state = SideGreen; 
     end 

     SideGreen: 
     begin 
      if(sensor && expired) 
       Next_state = SideYel; 
     end 

     SideYel: 
     begin 
      if(expired) 
       Next_state = MainGreen; 
     end 
    endcase 
    end 

У меня есть около восьми выходов, основываясь только на четыре и государстве, основанных на состоянии и вводе. Как их назначить?

+0

Вы похожи, что находитесь на правильном пути. Почему бы не 'output foo; ... присваивать foo = (Current_State == AllRed); '? – toolic

+0

Вы также можете включить их в свой оператор дела выше; у вас есть логика для 'Current_State == AllRed' через случай для' AllRed' – Unn

ответ

0

Вы находитесь на 90% пути оттуда. Есть два пути для продолжения (возможно, более того, но я дам вам то, что, по моему мнению, два из лучших вариантов):

Во-первых, у вас есть много выходов, которые только утверждают для небольшого меньшинства государств? Если да, то я бы рекомендовал что-то подобное в вашем комбинаторной всегда блокировать:

always @* 
begin 
    // default output values 
    output1 = 1'b0; 
    output2 = 1'b0; 
    output3 = 1'b0; 
    .... 
    case (Current_State) 
    STATE1: 
    begin 
     output2 = 1'b1; 
     // calculate next state 
     ... 
    end 

    STATE2: 
    begin 
     output4 = 1'b1; 
     // calculate next state 
     ... 
    end 
    ... 
    endcase 
end 

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

Последний способ, который я бы не рекомендовал, заключается в том, чтобы вывести команды smd в отдельные присваивающие утверждения. Он будет работать так же хорошо, но я думаю, что сохранение результатов вместе со следующей логикой состояния намного проще для обслуживания кода и хорошей привычки к разработке. Одно дело быстро взломать код для назначения, другое - разработать код для реального продукта, который может обновляться несколько раз в течение жизни продукта, а ремонтопригодность необходима (что-то мне нужно было изучить на работе, потому что никто не учил его в университете).

Смежные вопросы