Я пытаюсь создать дизайн, который переключает звук со скоростью 120 ударов в минуту (один раз каждые 0,5 секунды), и я использую часы с частотой 50 МГц. Вот тональный модуль:
module tone(
input clk,
input enable,
output reg speaker);
parameter clkdivider = 25000000/440/2;
reg [14:0] counter;
always @(posedge clk) if(counter==0) counter <= clkdivider-1; else counter <= counter-1;
always @(posedge clk) if(counter==0) speaker <= enable ? ~speaker : 0;
endmodule
и вот модуль переключения:
module lockstep_main(input clk, output speaker);
reg enable;
tone(.clk(clk), .enable(enable), .speaker(speaker));
parameter beat = 50000000/2;
reg [14:0] counter;
always @(posedge clk) if(counter==0) counter <= beat-1; else counter <= counter-1;
always @(posedge clk) if(counter==0) enable <= ~enable;
endmodule
Как бы то ни было, конструкция не работает должным образом, просто заставляя динамик издавать искаженные тона. Кроме того, если я попытаюсь сначала установить регистр включения в 1 и не изменить его, я все равно не получу звука. В чем тут может быть дело?
50000000/2 требует 25 бит, а не 15 (логарифмическая база 2 25000000 равна 24,575, ceil 25). Во втором модуле счетчик устанавливается на 30783 вместо 25000000, поэтому «BPM» составляет ~ 97456 вместо 120.
pjc50
последующий звук