¿Cómo escribir un contador en verilog para eliminar el rebote de una entrada?

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

Respuestas (1)

Si va a insistir en usar tres alwaysbloques 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 wait20entrada 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 keyCodesalida nunca se establece.

Necesito hacerlo con 3 bloques siempre porque mi instructor quiere que juguemos seguros ya que todos somos principiantes en esto. Se supone que mi código lee una matriz de botones de 4x4 de una placa beti y toma un código clave para el botón presionado, luego lo muestra en una pantalla de 7 segmentos en mi basys2 fpga. Ahora estoy publicando mi módulo superior con el reloj.
CA,CB... Son cátodos para display de 7 seg. Y A3 A2... son los ánodos. Todos esos funcionan bien. Pero cuando coloco el wait100 que se supone que hace que mi módulo espere 100 ms, ya no toma ninguna entrada del teclado, cuando en input clk en el módulo superior en la entrada wait100 funciona pero no se elimina.