Estoy tratando de escribir un contador de módulo para contrarrestar una entrada proveniente de botones mecánicos. El módulo debe ser controlado por el módulo de botones de matriz 4x4 cuando se inicia o se detiene el debonce.
Este es mi módulo contador
module counter(input clk,input start, input[25:0] stateToGo ,output reg finished);
reg [25:0]state = 0;
reg [25:0]nextState = 0;
//state register
always@(posedge clk)begin
state <= nextState;
end
//output CL
always@(posedge clk)begin
if (start == 1)begin
if(state == stateToGo)
finished = 1;
else
finished = 0;
end
end
//next state CL
always@(posedge clk)begin
if(start == 1)begin
if(state == stateToGo)
nextState = 0;
else
nextState = state + 1;
end
end
endmodule
Y este otro es mi módulo KeyboardScanner, pero cuando los conecto con un módulo superior y trato de presionar un botón, no se toma ninguna entrada del KeyboardScanner:
module keyboardScanner (input wait100,input wait20, input [3:0] col, output reg start,output reg [3:0] row, output reg [7:0] keyCode);
reg [1:0]state=2'b00;
reg [1:0]nextState=2'b01;
//state register
always@(posedge wait100) begin
state <= nextState;
end
//output CL
always@(posedge wait100) begin
case (state)
2'b00: row <= 4'b0001;
2'b01: row <= 4'b0010;
2'b10: row <= 4'b0100;
2'b11: row <= 4'b1000;
default: row <= 4'b0001;
endcase
if (col != 4'b0000)
start = 1;
if (col != 4'b0000 && wait20 == 1) begin
keyCode <= {row[1],row[2],row[3],row[0], col[0],col[1],col[2],col[3]};
start = 0;
end
end
//next state CL
always @(posedge wait100) begin
if(wait20 == 0 && start == 1)begin
case (state)
2'b00: nextState <= 2'b01;
2'b01: nextState <= 2'b10;
2'b10: nextState <= 2'b11;
2'b11: nextState <= 2'b00;
default: nextState <= 2'b00;
endcase
end
end
endmodule
¿Algo va mal con mi contador? Si uso CLK y no tengo contador, las entradas se toman bastante bien del KeyboardScanner FSM
Este es mi módulo superior con contador:
module comboModule(input clk, input [3:0]col,output [3:0] row, output CA,CB,CC,CD,CE,CF,CG,AN0,AN1,AN2,AN3,output [7:0]kCode);
wire finish20,finish100,starter;
counter c20(clk,starter,26'b00000000011000011010100000, finish20);
counter c100(clk,1 ,26'b00000001111010000100100000, finish100);
keyboardScanner kScan(finish100,finish20,col,starter,row,kCode);
SevenSegment SS(clk, kCode,CA,CB,CC,CD,CE,CF,CG,AN0,AN1,AN2,AN3);
endmodule
Si va a insistir en usar tres always
bloques para cada máquina de estado (excesivamente pedante y prolijo, en mi opinión), debe hacerlo bien: solo debe cronometrarse el proceso que actualiza las variables de estado, los demás (marcados como " next state CL" y "output CL" en los comentarios) deben ser puramente combinatorios; es decir, always @* begin ...
.
Con los tres procesos cronometrados en cada caso, tiene algunas etapas de "canalización" adicionales en marcha que probablemente estén arruinando su lógica.
EDITAR:
Aunque en una lectura más profunda, no veo nada malo que salte a la vista de inmediato, asumiendo que mis conjeturas sobre cómo los dos módulos están conectados entre sí son correctas. Tendría que ver sus módulos de nivel superior (ambas versiones) para estar seguro.
Cuando "no usa contador", ¿qué está haciendo con la wait20
entrada al módulo del escáner? Si lo vincula alto, la lógica del siguiente estado nunca se ejecutará, pero si lo vincula bajo, la keyCode
salida nunca se establece.
luego
luego