2017-11-16 22 views
0

私はオーディオコントローラを介してサウンドを生成しようとしていますが、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 

ありがとう:

は、ここに私のコードの抜粋です!

答えて

0

システムを正しく理解していれば、指定された周波数の正弦波振幅値をDACの入力として生成しないでください。 。 DACに2振幅の信号を供給する場合、アナログ出力は基本的に必要な基本周波数と高次高調波(これらは明らかに高いピッチに寄与している可能性があります)の組み合わせである方形波であると仮定しています。

+0

回答をいただきありがとうございますが、問題を把握しました。私が使っていたクロック(DAC_XCK)は、それが私が思っていたものではなかったことが分かります。どのくらい正確に動作するのかまだ分かりませんが、CLOCK_50(50MHzクロック)に変更し、この変更に合わせてすべてのデューティサイクルを変更しました。私はオクターブを変えて同時に複数の音符を演奏することさえできました!昨夜は多くの進歩があり、とても興奮しています。 – gSider

関連する問題