2015-10-28 5 views
-1

Я пытаюсь создать эту государственную машину в Verilog:Verilog Синхронное состояние машины

enter image description here

я есть:

`timescale 1ns/1ns 
module labEightMachine(y, x,clk,clr) 
     output  y; 
     input [1:2] x; 
     input  clk, clr; 
     reg [1:2] q; 
     reg   y; 
     reg   nX; 
     always @ (posedge clk) 
      begin 
      if(clr) 
       {q}<=2'b00; 

      else 
       q<= {nX} 
      end 
     always @(y,x) 
     begin 
     if(q==2'b00) 
      if(x==2'b00) 
       q<=2'b00; 
      else 
       q<=2'b01; 
       y<=1; 
     if(q==2'b01) 
      if((x==2'b00)||(x==2'b01)) 
       q<=2'b00; 
       y<=0; 
      else 
       q<=2'b11; 
       y<=0; 
     if(q==2'b11) 
      if(x==2'b10) 
       q<=2'b10; 
       y<=1; 
      else 
       q<=2'b00; 
       y<=0; 
     if(q==2'b10) 
      q<=2'b00; 
       y<=0; 
     end 
endmodule 

Если какой-либо один может помочь, сказав мне, где это неверно, что было бы весьма полезно. Государственные машины путают меня, и я не уверен, что правильно переназначаю все.

+0

Создайте тестовый стенд и выполните симуляцию. – toolic

+0

Для более легкого понимания FSM используют утверждения case, [asic-world] (http://www.asic-world.com/tidbits/verilog_fsm.htm). – Morgan

ответ

1

Применение стимула - это всегда лучший способ проверить ваш код. Оставляя синтаксические ошибки полуколоней/начала-конца, и все это, пару ближайших логических ошибок, которые я вижу, приведены ниже.

Объявление reg nX объявляет переменную одного бита ширина. Наоборот, q объявлен как reg [1:2] q, два бита ширина.

Во-вторых, q является от двух всегда блоков. Если clr LOW, то q управляется nX. Пока nX никогда не управляется никаким сигналом. Таким образом, выход будет x в большинстве случаев (оставляя эти условия гонки). Несколько проблем с драйверами.

В-третьих, было бы лучше использовать лестницу if--else if--else вместо нескольких if. Это приведет к тому, что логика next_state будет очищена.

Лучше FSM, может иметь два блока always и один выходной логический блок. Один для последовательной логики и другой для комбинационной логики. Секвенциальный блок используется для обновления значения current_state значением next_state. В то время как комбинационный блок используется для обновления следующего значения состояния в соответствии с входами. Логика вывода должна либо иметь отдельный блок непрерывных назначений, либо процедурный блок.

Также может быть удобно использовать оператор case для логики next_state. Это будет полезно, когда слишком много состояний взаимодействуют друг с другом в одном FSM. Использование default в случае утверждения неизбежно.

Дополнительную информацию об эффективных стилях кодирования FSM см. В документе CummingsSNUG1998SJ_FSM и CummingsSNUG2000Boston_FSM.

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