2017-11-16 5 views
0

의 특정 주파수에서 구형파를 출력하므로 어떤 스위치가 FPGA에서 뒤집혀 있는지에 따라 다양한 주파수에서 구형파를 생성하여 오디오 컨트롤러를 통해 사운드를 생성하려고합니다. 48kHz의 칩 클럭을 가진 오디오 컨트롤러를 사용하고 있으므로 클럭 분배기를 사용하고 있습니다 (각 노트마다 하나씩, 지금은 필요하지 않지만 나중에 왜 그렇게하는지 궁금하면 나중에 나옵니다) 각 노트의 듀티 사이클을 카운트하고, + 듀티 사이클마다 + 진폭과 - 진폭 사이를 전환합니다. 어떤 이유로 나는 오디오를 출력 할 수 있지만, 음표의 음색은 내가 그들에게 주었던 주파수를 나타내지 않습니다. (음색은 겉으로보기에 무작위이며 훨씬 더 높은 음정이어야합니다.) 나는 인터넷을 마르고 수색 해 보았고 이것이 왜 ... 어떤 도움을 많이 주신 지에 대한 해결책을 제시 할 수 없다!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