// ZX-Evo Base Configuration (c) NedoPC 2008,2009,2010,2011,2012,2013,2014
//
// integrates sound features: tapeout, beeper and covox
/*
This file is part of ZX-Evo Base Configuration firmware.
ZX-Evo Base Configuration firmware is free software:
you can redistribute it and/or modify it under the terms of
the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZX-Evo Base Configuration firmware is distributed in the hope that
it will be useful, but WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZX-Evo Base Configuration firmware.
If not, see <http://www.gnu.org/licenses/>.
*/
`include "../include/tune.v"
module sound(
input wire clk,
input wire [7:0] din,
input wire beeper_wr,
input wire covox_wr,
input wire beeper_mux, // output either tape_out or beeper
output wire sound_bit
);
reg [6:0] ctr;
reg [7:0] val;
reg mx_beep_n_covox;
reg beep_bit;
reg beep_bit_old;
wire covox_bit;
always @(posedge clk)
begin
/* if( beeper_wr ) */
if( beeper_wr && (beep_bit!=beep_bit_old) )
mx_beep_n_covox <= 1'b1;
else if( covox_wr )
mx_beep_n_covox <= 1'b0;
end
always @(posedge clk) if( beeper_wr ) beep_bit_old <= beep_bit;
always @(posedge clk)
if( beeper_wr )
beep_bit <= beeper_mux ? din[3] /*tapeout*/ : din[4] /*beeper*/;
always @(posedge clk)
if( covox_wr )
val <= din;
always @(negedge clk)
ctr <= ctr + 6'd1;
assign covox_bit = ( {ctr,clk} < val );
bothedge trigger
(
.clk( clk ),
.d( mx_beep_n_covox ? beep_bit : covox_bit ),
.q( sound_bit )
);
endmodule
// both-edge trigger emulator
module bothedge(
input wire clk,
input wire d,
output wire q
);
reg trgp, trgn;
assign q = trgp ^ trgn;
always @(posedge clk)
if( d!=q )
trgp <= ~trgp;
always @(negedge clk)
if( d!=q )
trgn <= ~trgn;
endmodule