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?
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.
pjc50
Achtertrompete