Нет, это не сработает, потому что оператор assign
будет все время вызывать state = s0
. Компилятор также будет жаловаться на установку нескольких драйверов state
. Если нет сигнала сброса, один из вариантов:
initial begin
// set any initial values
state = s0;
end
Это будет вместо того, где у вас есть выражение assign
. Это хорошо работает в симуляции, но еще лучше будет изменить логику вашего состояния:
localparam s0 = 3'b000, s1 = 3'b001, s2 = 3'b010, s3 = 3'b011, s4 = 3'b100, s5 = 3'b101;
reg [2:0] state, next_state;
always @(posedge clk) begin
state <= next_state;
end
always @(state) begin
case (state)
// modify this state logic to reflect your FSM
s0: next_state <= s1;
s1: next_state <= s2;
s2: next_state <= s3;
s3: next_state <= s4;
s4: next_state <= s5;
s5: next_state <= s0;
// this controls the behavior at bringup w/o a reset
// you should include a default case even with a reset
default: next_state <= s0;
endcase
end
always @(state) begin
case (state)
// modify this output logic to reflect your FSM
s0: // set your output signals accordingly
s1: // set your output signals accordingly
s2: // set your output signals accordingly
s3: // set your output signals accordingly
s4: // set your output signals accordingly
s5: // set your output signals accordingly
// this controls the behavior at bringup w/o a reset
// you should include a default case even with a reset
default: // set all outputs to 0
endcase
end
Разделение логики на тактовый блок always
и логика комбинационного перехода состояний, приведенная выше, помогает создать конструкцию без защелок. Я знаю, что это больше, чем вы просили, но этот стиль кодирования помогает создавать хорошие синтезированные проекты.