의 특정 주파수에서 구형파를 출력하므로 어떤 스위치가 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
감사 :
여기 내 코드의 조각입니다!
응답 해 주셔서 감사합니다.하지만 문제가 발생했습니다. 내가 사용했던 시계가 (DAC_XCK) 내가 생각했던 것이 아니 었습니다. 아직도 정확하게 작동하는지 모르겠지만 CLOCK_50 (50MHz 클록)으로 변경하고 모든 듀티 사이클을이 변경과 일치하도록 변경했으며 지금은 완벽하게 작동합니다. 나는 심지어 옥타브를 바꾸고 동시에 여러 음을 연주하게했습니다! 어젯밤에 많은 발전이 있었고 저는 꽤 흥분합니다. – gSider