私はオーディオコントローラを介してサウンドを生成しようとしていますが、FPGA上でどのスイッチが反転したかに応じてさまざまな周波数の方形波を作成します。私は48kHzのチップクロックを持っているオーディオコントローラを使用していますので、クロック分周器を使用しています(各ノートごとに1つずつ、今は必要ありませんが、なぜ私がそれをやっているのか不思議であれば後になります)各ノートのデューティ・サイクルをカウントし、デューティ・サイクルごとに+振幅と振幅の間を反転させます。なんらかの理由でオーディオを出力することができますが、音符の音程は私がそれらに与えた周波数を表すものではありません(トーンは一見無作為であり、はるかに高いピッチになります)。私はインターネットを乾燥した検索し、なぜこれは...どのような助けが大いに感謝している解決策を考え出すことができません!Verilogで特定の周波数の方形波を出力する
// Positive and negative amplitude parameters for square wave
parameter pos_amp = 32'h7FFFFFFF;
parameter neg_amp = 32'h80000000;
// Determines channel_audio_out via dac_out
wire signed [32:1] channel_audio_out = dac_out ? pos_amp : neg_amp;
// Seperate 8-bit counter for each note
reg [7:0] ac_counter_C4;
reg [7:0] ac_counter_D4;
reg [7:0] ac_counter_E4;
reg [7:0] ac_counter_F4;
reg [7:0] ac_counter_G4;
reg [7:0] ac_counter_A4;
reg [7:0] ac_counter_B4;
reg clear_audio_out_memory; // To clear audio_out buffer when no SW is flipped
reg write_audio_out; // To signal when to write to audio_out buffer
reg dac_out; // Determines pos_amp or neg_amp for channel_audio_out
// Determines dac_out via ac_counter's (AUD_XCK dividers)
[email protected](posedge AUD_XCK) // 48kHz
begin
clear_audio_out_memory <= 1'b0;
if (SW[0] == 1'b1) // C4 --- f = 261.626 Hz --- Duty Cycle = 184
begin
ac_counter_C4 <= ac_counter_C4 + 1'b1;
if (ac_counter_C4 >= 8'd183)
ac_counter_C4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_C4 < 8'd92) ? 1'b1 : 1'b0;
end
else if (SW[1] == 1'b1) // D4 --- f = 293.665 Hz --- Duty Cycle = 164
begin
ac_counter_D4 <= ac_counter_D4 + 1'b1;
if (ac_counter_D4 >= 8'd163)
ac_counter_D4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_D4 < 8'd82) ? 1'b1 : 1'b0;
end
else if (SW[2] == 1'b1) // E4 --- f = 329.628 Hz --- Duty Cycle = 146
begin
ac_counter_E4 <= ac_counter_E4 + 1'b1;
if (ac_counter_E4 >= 8'd145)
ac_counter_E4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_E4 < 8'd73) ? 1'b1 : 1'b0;
end
else if (SW[3] == 1'b1) // F4 --- f = 349.228 Hz --- Duty Cycle = 138 // Wrong note completely
begin
ac_counter_F4 <= ac_counter_F4 + 1'b1;
if (ac_counter_F4 >= 8'd137)
ac_counter_F4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_F4 < 8'd69) ? 1'b1 : 1'b0;
end
else if (SW[4] == 1'b1) // G4 --- f = 391.995 Hz --- Duty Cycle = 122
begin
ac_counter_G4 <= ac_counter_G4 + 1'b1;
if (ac_counter_G4 >= 8'd121)
ac_counter_G4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_G4 < 8'd61) ? 1'b1 : 1'b0;
end
else if (SW[5] == 1'b1) // A4 --- f = 440 Hz --- Duty Cycle = 110
begin
ac_counter_A4 <= ac_counter_A4 + 1'b1;
if (ac_counter_A4 >= 8'd109)
ac_counter_A4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_A4 < 8'd55) ? 1'b1 : 1'b0;
end
else if (SW[6] == 1'b1) // B4 --- f = 493.883 Hz --- Duty Cycle = 98
begin
ac_counter_B4 <= ac_counter_B4 + 1'b1;
if (ac_counter_B4 >= 8'd97)
ac_counter_B4 <= 8'd0;
write_audio_out <= 1'b1;
dac_out = (ac_counter_B4 < 8'd44) ? 1'b1 : 1'b0;
end
else // NO SWITCH ON --- DEFAULT STATE
begin
ac_counter_C4 <= 1'd0;
ac_counter_D4 <= 1'd0;
ac_counter_E4 <= 1'd0;
ac_counter_F4 <= 1'd0;
ac_counter_G4 <= 1'd0;
ac_counter_A4 <= 1'd0;
ac_counter_B4 <= 1'd0;
write_audio_out <= 1'b0;
clear_audio_out_memory <= 1'b1;
dac_out <= 1'b0;
end
end
ありがとう:
は、ここに私のコードの抜粋です!
回答をいただきありがとうございますが、問題を把握しました。私が使っていたクロック(DAC_XCK)は、それが私が思っていたものではなかったことが分かります。どのくらい正確に動作するのかまだ分かりませんが、CLOCK_50(50MHzクロック)に変更し、この変更に合わせてすべてのデューティサイクルを変更しました。私はオクターブを変えて同時に複数の音符を演奏することさえできました!昨夜は多くの進歩があり、とても興奮しています。 – gSider