fpga4fun.com/Music Box

1.Einfacher Piepton

Erstellen Sie zunächst einen einfachen Summer. Das Prinzip besteht darin, dass der Quarzoszillator durch verschiedene Frequenzteiler in verschiedene Frequenzen aufgeteilt wird und der Ton mit unterschiedlichen Tönen über die Schaltung ausgegeben wird.
Im Beispiel hat die Pluto-FPGA-Karte eine Taktfrequenz von 25 MHz. Bei Verwendung eines 16-Bit-Zählers (der 65536 verschiedene Werte generieren kann) beträgt die Frequenz des höchsten Bits 25000000/65536 = 381 Hz (unterschiedliche Frequenzen werden durch Teilen der Frequenz durch verschiedene Bits des Zählers erzeugt). Das 0. Bit beträgt beispielsweise 25 MHz / 2 ^ 0 = 12,5 MHz ... Das höchste Bit liegt zwischen 0/1 bei einer Frequenz von 381 Hz. Der Beispielcode für das Zurückschalten lautet wie folgt
:

module music(clk, speaker);
input clk;
output speaker;

// first create a 16bit binary counter
reg [15:0] counter;
always @(posedge clk) counter <= counter+1;

// and use the most significant bit (MSB) of the counter to drive the speaker
assign speaker = counter[15];
endmodule

Jetzt ist der Ton 381 Hz

"Ein Ton

Die Tonfrequenz von A beträgt 440 Hz. Um einen 440-Hz-Ton zu erzeugen, ist 25000000/440 = 56818,18
ein 16-Bit-Zähler erforderlich, der die Zählung neu startet, wenn er 56817 erreicht. Aber für 32768 (2^15) ~ 56817 beträgt das Tastverhältnis 42 % (24049/56818). Um ein Tastverhältnis von 0,5 zu erreichen, Der einfachste Weg besteht darin, Take 2 zu dividieren (58818/2=28409). Um also eine Frequenz von 440 Hz und einen Arbeitszyklus von 0,5 zu erhalten, muss der Pegel innerhalb eines halben Zyklus gelöscht und invertiert werden (der Zähler ist 28409).
Um es einfach auszudrücken: Frequenz/Zeit des Quarzoszillators = die gewünschte Frequenz.
Verwenden Sie einen Zähler, um die Zeit zu bestimmen, und verwenden Sie die Zählmethode, d
.

module music(clk, speaker);
input clk;
output speaker;

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

reg speaker;
always @(posedge clk) if(counter==28408) speaker <= ~speaker;
endmodule

ein Krankenwagen kommt

Der Ton des Krankenwagens ist Tone[23] 25000000/2^23 = 1,5 Hz. Der
Ton ist derselbe. Das Intervall zwischen den beiden Ringen wechselt hin und her. Ein Mal ist clkdivider-1 und das andere ist clkdivider/2 -1, was den sogenannten Arbeitszyklus bildet. Wenn Ton[23]=1 ist, ist die Wartungszeit clkdivider-1, und wenn es 0 ist, ist die Wartungszeit clk Teiler/2 -1. Der Code lautet wie folgt:


module music(clk, speaker);
input clk;
output speaker;
parameter clkdivider = 25000000/440/2;

reg [23:0] tone;
always @(posedge clk) tone <= tone+1;

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

reg speaker;
always @(posedge clk) if(counter==0) speaker <= ~speaker;
endmodule

Guess you like

Origin blog.csdn.net/weixin_49574391/article/details/131747841