Counter in verilog

1

quiero hacer un contador que aumente por el valor de sus entradas, pero hice el banco de pruebas y la salida es indeterminada, xxxx. ¿Puede alguien decirme si hay algún error en este código?

    //Count

 module count(clk, 

 rst, val, coin


 );
//Declaración entradas y salidas

 input  clk, rst;
 input  [3:0] coin;
 output [3:0] val;

 reg [3:0] val;  
 reg [3:0] nval; 


 always @(posedge clk, negedge rst)
      if(rst == 0) val <= 4'b0000;
      else val <= nval;

    always @(val)
      nval <= val + coin ;
  endmodule
    
pregunta Mel J

2 respuestas

1

No está asignando un valor inicial a nval en ningún lugar, por lo que todos los demás valores dependen de esto, por lo que val no está determinado.

    
respondido por el andre_teprom
0

Es difícil estar seguro sin probar que no hay nada más, pero creo que es esto

always @(val)
   nval <= val + coin ;

Como una asignación no = de bloqueo, posiblemente tomará el valor antiguo de val (es decir, X) en el reinicio. Podría usar una asignación de bloqueo y completar la lista de sensibilidad correctamente:

always @(val or coin)
   nval = val + coin;

o usa una asignación:

wire [3:0] nval;
assign nval = val + coin;

Es probable que hacer cualquier otra cosa cause problemas (si no está aquí, con otro código).

    
respondido por el Sean Houlihane

Lea otras preguntas en las etiquetas