Включение и выключение тона на скорости 120 ударов в минуту не работает

Я пытаюсь создать дизайн, который переключает звук со скоростью 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 и не изменить его, я все равно не получу звука. В чем тут может быть дело?

У вас нет конфигурации сброса, поэтому регистры будут начинаться с мусора или «X».
Я попытался добавить начальный набор к 0, но это не сработало.

Ответы (1)

50000000/2 требует 25 бит, а не 15 (логарифмическая база 2 25000000 равна 24,575, ceil 25). Во втором модуле счетчик устанавливается на 30783 вместо 25000000, поэтому «BPM» составляет ~ 97456 вместо 120.

Большое спасибо! Я неправильно истолковал таблицу степеней 2, заставив меня думать, что 15 бит было достаточно.