FSM не работает должным образом (детектор последовательности 0110) - PullRequest
0 голосов
/ 26 мая 2020

Я не знаю, что написано в приведенном ниже коде. Он дает мне вывод 1 только после правильной настройки задержек моделирования. Он дает мне одну за другой. Я несколько раз перепроверил свой лог c, пожалуйста, поправьте меня. Я новичок в Verilog и разработал свой первый fsm. Пожалуйста, помогите мне найти мои ошибки. Спасибо за уделенное время :)

output

код

module seq_0110(sequence_in,clock,reset,detector_out
    );
input clock; 
input reset; 
input sequence_in; 
output reg detector_out; 
reg [1:0] current_state, next_state; // current state and next state


always @(posedge clock, posedge reset)
begin
 if(reset==1) 
 current_state <=2'b00;// when reset=1, reset the state of the FSM to "Zero" State
 else
 current_state <= next_state; // otherwise, next state
end 

always @(current_state,sequence_in)
begin
 case(current_state) 
 2'b00:begin
  if(sequence_in==1)
   next_state <= 2'b00;
  else
   next_state <= 2'b01;
 end
 2'b01:begin
  if(sequence_in==1)
   next_state <= 2'b10;
  else
   next_state <= 2'b01;
 end
 2'b10:begin
  if(sequence_in==1)
   next_state <= 2'b11;
  else
   next_state <= 2'b01;
 end 
 2'b11:begin
  if(sequence_in==1)
   next_state <= 2'b00;
  else
   next_state <= 2'b01;
 end

 default:next_state <= 2'b00;
 endcase
end
// combinational logic to determine the output
// of the Moore FSM, output only depends on current state
always @(current_state)
begin 
 case(current_state) 
 2'b00:   detector_out <= 1'b0;
 2'b01:   detector_out <=1'b0;
 2'b10:  detector_out <= 1'b0;
 2'b11:  detector_out <=(sequence_in==1)?1'b0:1'b1;

 default:  detector_out <= 1'b0;
 endcase
end 
endmodule

1 Ответ

1 голос
/ 26 мая 2020

Проблема заключается в вашей тестовой среде и в том, как вы отображаете сигналы в своем файле журнала.

В коде тестовой среды, который вы разместили в другом вашем вопросе ранее сегодня , вы использовали $monitor для печати входного и выходного сигнала. Проблема в том, что $monitor показывает эти сигналы, только если есть изменение в любом из сигналов. В вашем случае было бы гораздо более значимым показывать эти сигналы один раз за такт. Это можно сделать с помощью блока always и $display следующим образом:

always @(negedge clock) $display($time, " in=%b out=%b", sequence_in, detector_out);

initial begin
  $dumpfile("seq_0110.vcd");
  $dumpvars(0,seq_0110_t);
  sequence_in = 0;
  reset = 1;
  #30;
  reset = 0;

  repeat (5) @(posedge clock); sequence_in = 0;
             @(posedge clock); sequence_in = 1;
             @(posedge clock); sequence_in = 1;
             @(posedge clock); sequence_in = 0;

  repeat (5) @(posedge clock); sequence_in = 0;
             @(posedge clock); sequence_in = 1;
             @(posedge clock); sequence_in = 1;
             @(posedge clock); sequence_in = 0;

  repeat (5) @(posedge clock); sequence_in = 0;

  #10 $finish;
end

Теперь вывод ясно показывает, что ваш FSM обнаруживает битовый шаблон 0110 на вашем входе:

          10 in=0 out=0
          20 in=0 out=0
          30 in=0 out=0
          40 in=0 out=0
          50 in=0 out=0
          60 in=0 out=0
          70 in=0 out=0
          80 in=0 out=0
          90 in=1 out=0
         100 in=1 out=0
         110 in=0 out=1
         120 in=0 out=0
         130 in=0 out=0
         140 in=0 out=0
         150 in=0 out=0
         160 in=0 out=0
         170 in=1 out=0
         180 in=1 out=0
         190 in=0 out=1
         200 in=0 out=0
         210 in=0 out=0
         220 in=0 out=0
         230 in=0 out=0
         240 in=0 out=0
...