Как я могу кодировать 3-битный двоичный счетчик на основе диаграмм состояний? - PullRequest
0 голосов
/ 15 мая 2018

3bit counter state diagram

Я хочу построить модуль на основе этой диаграммы состояний. Приведенный ниже код представляет собой модуль, который я написал, и тестовый стенд. Когда вы создаете это, Вы можете столкнуться с этой ошибкой.

. / 3bit_c_sdiagram.v: 1: синтаксическая ошибка Я сдаюсь.

Как я могу решить эту синтаксическую ошибку? а также Если мой код далек от решения, как мне его кодировать?

3bit_c_sdiagram.v

module 3bit_c_sdiagram(y_out, clock, reset);

output y_out;
input clock, reset;

reg[2:0]    state;
parameter S0=3'b000, S1=3'b001, S2=3'b010, S3=3'b011, S4=3'b100, S5=3'b101, 
S6=3'b110, S7=3'b111;

always @ (posedge clock, negedge reset)
 if(reset == 0) state <= S0;    //Initialize to state S0
 else case(state)
  S0:   if(clock) state <= S1; else state <= S0;
  S1:   if(clock) state <= S2; else state <= S1;
  S2:   if(clock) state <= S3; else state <= S2;
  S3:   if(clock) state <= S4; else state <= S3;
  S4:   if(clock) state <= S5; else state <= S4;
  S5:   if(clock) state <= S6; else state <= S5;
  S6:   if(clock) state <= S7; else state <= S6;
  S7:   if(clock) state <= S0; else state <= S7;
 endcase

 assign y_out = (state == S7);
endmodule

simulat.v

module simulate;
wire t_y_out;
reg t_reset;
reg t_clock;

3bit_c_sdiagram M1(t_y_out, t_clock, t_reset);

initial #200 $finish; 
initial begin

$dumpfile("test.vcd");
$dumpvars(0,simulate);

   t_reset = 0;
   t_clock = 0;
   #5 t_reset = 1;

 repeat(16)
   #5 t_clock = ~t_clock;
end
endmodule

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Как указано в другом решении, имя вашего модуля не может начинаться с цифры.

Я добавляю этот ответ только для того, чтобы обрисовать одну вещь в вашем примере (даже если это не ответ на ваш вопрос),В вашем коде у вас есть:

always @ (posedge clock, negedge reset)
 if(reset == 0) state <= S0;    //Initialize to state S0
 else case(state)
  S0:   if(clock) state <= S1; else state <= S0;

Эта инструкция всегда @ будет выполняться в двух случаях: - когда ваши часы повышаются - ИЛИ когда ваш сброс упадет

Первый тест reset==0,затем перейдите в оператор else.Исходя из того, что было сказано ранее, оператор else будет выполняться ТОЛЬКО при повышении часов (потому что вы знаете, что reset! = 0).Итог: нет необходимости проверять if (clock).Вы можете сделать следующее:

always @ (posedge clock, negedge reset)
 if(reset == 0) state <= S0;    //Initialize to state S0
 else case(state)
  S0:   state <= S1; else state <= S0;
...

Операторы else state <= S0 также не нужны, это то, что произойдет по умолчанию (ваш регистр не изменит значения, если вы явно не измените его).Но если это поможет вам прояснить ситуацию, это тоже не повредит ...

Надеюсь, это поможет!

0 голосов
/ 15 мая 2018

3bit_c_sdiagram является недопустимым идентификатором (то есть именем) в Verilog. Имена Verilog могут содержать буквы, цифры, знаки доллара или подчеркивания, но они должны начинаться с буквы или подчеркивания .

...