Estoy intentando crear un FSM que deja desplazamientos en un registro hasta que el MSB es 1 mientras se cuenta el número de turnos completados. Sin embargo, tengo un problema con los cierres porque no reasigno cada registro en un cambio de estado; a saber, los registros shift y ctr (ver las declaraciones "if (shift [3])"). Para deshacerme de los latches, sé que debo asignar estos registros, pero no quiero que sus valores cambien al final, quiero que se mantengan constantes.
¿Cómo logro esto?
'define RST 2'b00
'define LSH1 2'b01
'define LSH2 2'b10
'define DONE 2'b11
module leftshift(clk, rst, x, shift);
input [3:0] x;
input clk, rst;
output [3:0] shift;
reg [1:0] state, nextstate;
reg [3:0] shift; // reg holding shifted bits
reg [2:0] ctr; // ctr keeps track of how many shifts until completion
always @ (posedge clk)
if (rst) state <= 'RST;
else state <= nextstate;
always @ (state, x, shift[3])
case (state)
'RST: begin
shift <= x;
ctr <= 0;
nextstate <= 'LSH1;
end
'LSH1: begin
if (shift[3]) begin
//shift <= //don't change;
//ctr <= //don't change;
nextstate <= 'DONE;
end
else begin
shift <= {shift[2:0], 1'b0};
ctr <= ctr+1;
nextstate <= 'LSH2;
end
end
'LSH2: begin
if (shift[3]) begin
//ctr <= //don't change
//shift <= //don't change
nextstate <= 'DONE;
end
else begin
shift <= {shift[2:0], 1'b0};
ctr <= ctr+1;
nextstate <= 'LSH1;
end
end
'DONE: begin
//shift <= //don't change;
//ctr <= //don't change;
nextstate <= 'DONE;
end
endcase
endmodule