¿Cómo escribir un contador en verilog para anunciar una entrada?

1

Estoy intentando escribir un contador de módulo para rebotar una entrada proveniente de botones mecánicos. El módulo de botón de matriz 4x4 debe controlar el módulo cuando se inicia o detiene la 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 e intento 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 ningún contador, las entradas se toman bastante bien desde el 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
    
pregunta anon

1 respuesta

2

Si va a insistir en usar tres bloques always para cada máquina de estado (excesivamente pedante y detallado, en mi opinión), debe hacerlo correctamente: solo debe registrarse el proceso que actualiza las variables de estado - los otros (marcados como "siguiente estado CL" y "salida CL" en los comentarios) deben ser puramente combinatorios; es decir, always @* begin ... .

Con los tres procesos cronometrados en cada caso, tienes algunas etapas adicionales de "canalización" que probablemente están arruinando tu lógica.

EDITAR:

Aunque en una lectura más a fondo, no veo de inmediato nada malo que salte sobre mí, suponiendo que mis suposiciones sobre cómo están conectados los dos módulos 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 entrada wait20 en el módulo del escáner? Si lo vincula alto, la siguiente lógica de estado nunca se ejecutará, pero si lo vincula bajo, la salida keyCode nunca se establece.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas