2025-11-05 07:26:15 +01:00

109 lines
2.2 KiB
Verilog

// hangszóróvezérlő modul
module beep #(
parameter HIT_PERIOD = 1, // hullámforma periódusideje találat esetén
parameter HIT_LEN = 150, // lejátszás hossza
parameter MISS_PERIOD = 3, // hullámforma periódusideje leeső labda esetén
parameter MISS_LEN = 1400, // lejátszás hossza
parameter HALF_MS_DIV = 500 // 500us hosszú pulzusok osztásaránya
)(
input wire clk, // órajel (1MHz)
input wire rst, // szinkron reset
input wire hit, // labda visszaütve
input wire miss, // labda leesett
output reg beep // hangszótókimenet
);
// 0.5ms-os pulzusokat előállító számláló
reg [8:0] cntr;
always @(posedge clk)
begin
if (rst) // reset
begin
cntr <= 9'd0;
end
else
begin // számlálás
if (cntr != (HALF_MS_DIV - 1))
begin
cntr <= cntr + 9'd1;
end
else
begin
cntr <= 9'd0;
end
end
end
// túlcsordulás
wire tc = (cntr == (HALF_MS_DIV - 1));
// hullámforma előállítása
reg [3:0] period; // periódusidő
reg [3:0] subperiod_cntr; // perióduson belüli számláló
always @(posedge clk)
begin
if (rst || (!sound_playing)) // reset vagy nincs lejátszás
begin
beep <= 1'b0;
subperiod_cntr <= 4'd0;
end
else if (sound_playing && tc) // lejátszás és 0.5ms periódus vége
begin
if (subperiod_cntr != period)
begin
subperiod_cntr <= subperiod_cntr + 4'd1;
end
else
begin
subperiod_cntr <= 4'd0;
beep <= ~beep;
end
end
end
reg sound_playing; // hang lejátszás alatt van
reg [10:0] len; // lejátszás hossza
// lejátszás-vezérlése
always @(posedge clk)
begin
if (rst) // szinkron reset
begin
sound_playing <= 1'b0;
len <= 11'd0;
period <= 4'd0;
end
else if ((!sound_playing) && (hit || miss)) // ha épp nincs lejátszás és esemény történt
begin
if (hit) // hullámforma kiválasztása
begin
period <= HIT_PERIOD;
len <= HIT_LEN;
end
else if (miss) // .....
begin
period <= MISS_PERIOD;
len <= MISS_LEN;
end
sound_playing <= 1'b1;
end
else if (sound_playing && tc) // lejátszás, hátralevő idő csökkentése
begin
if (len != 10'd0)
begin
len <= len - 10'd1;
end
else
begin
sound_playing <= 1'b0; // lejátszás leállítása
end
end
end
endmodule