Top secrets sources NedoPC pentevo

Rev

Rev 473 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

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