109 lines
2.2 KiB
Verilog
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
|