// 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