Zähler im Verilog

Ich möchte einen Zähler erstellen, der sich um den Wert seiner Eingaben erhöht, aber ich habe die Testbench erstellt und die Ausgabe ist unbestimmt, xxxx. Kann mir jemand sagen, ob in diesem Code etwas falsch ist?

    //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
Ich verwende hauptsächlich VHDL, und mein Verilog ist sehr rostig, aber es scheint mir seltsam, dass Sie eine Ausgabe namens val deklarieren und auch eine Registrierung namens val. Wenn das in Verilog legal ist, entschuldige ich mich. Es könnte sich trotzdem lohnen, zur Verdeutlichung einen anderen Namen zu verwenden.
Hier lernen Sie das Debuggen.
@MAB Ich verstehe deinen Punkt. Eigentlich wollte ich die Ausgabe als Registrierung deklarieren, aber es könnte falsch sein. Danke trotzdem, ich werde es prüfen.

Antworten (2)

Sie weisen nval nirgendwo einen Anfangswert zu , daher hängen alle weiteren Werte davon ab, daher ist val unbestimmt.

Ohne Tests ist es schwer sicher zu sein, dass es nichts anderes gibt, aber ich denke, es ist das

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

Als nicht=blockierende Zuweisung nimmt es beim Zurücksetzen möglicherweise den alten Wert von val (dh X) an. Sie könnten eine Sperrzuweisung verwenden und die Vertraulichkeitsliste richtig ausfüllen:

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

oder verwenden Sie eine Zuweisung:

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

Alles andere führt wahrscheinlich zu Problemen (wenn nicht hier, dann mit anderem Code).