Ton ein- und ausschalten bei 120 bpm funktioniert nicht

Ich versuche, ein Design zu erstellen, das einen Ton mit einer Rate von 120 BPM (einmal alle 0,5 Sekunden) umschaltet, und ich verwende einen 50-MHz-Takt. Hier ist das Tonmodul:

module tone(
input clk, 
input enable,
output reg speaker);

parameter clkdivider = 25000000/440/2;

reg [14:0] counter;
always @(posedge clk) if(counter==0) counter <= clkdivider-1; else counter <= counter-1;

always @(posedge clk) if(counter==0) speaker <= enable ? ~speaker : 0;
endmodule

und hier ist das Toggle-Modul:

module lockstep_main(input clk, output speaker);

reg enable;

tone(.clk(clk), .enable(enable), .speaker(speaker));

parameter beat = 50000000/2;
reg [14:0] counter;
always @(posedge clk) if(counter==0) counter <= beat-1; else counter <= counter-1;

always @(posedge clk) if(counter==0) enable <= ~enable;

endmodule

So wie es ist, funktioniert das Design nicht richtig, sondern führt nur dazu, dass der Lautsprecher verstümmelte Töne ausgibt. Auch wenn ich versuche, das Freigaberegister anfänglich auf 1 zu setzen und es nicht zu ändern, bekomme ich immer noch keinen Ton. Was könnte hier das Problem sein?

Sie haben keine Reset-Konfiguration, daher beginnen die Register voller Müll oder 'X'.
Ich habe versucht, einen Anfangssatz auf 0 hinzuzufügen, aber das hat nicht funktioniert.

Antworten (1)

50000000/2 erfordert 25 Bits, nicht 15 (die logarithmische Basis 2 von 25000000 ist 24,575, die Obergrenze davon ist 25). Im zweiten Modul wird der Zähler auf 30783 statt 25000000 gesetzt, sodass die „BPM“ ~97456 statt 120 beträgt.

Vielen Dank! Ich habe eine Potenzen von 2-Tabelle falsch gelesen, was dazu führte, dass ich dachte, 15 Bit seien ausreichend.