Top secrets sources NedoPC ngs

Rev

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

// part of NeoGS project (c) 2007-2008 NedoPC
//
// sound_dac is a serializer of 16 bit data for TDA1543 DAC
// input is clock at 24 MHz and 16-bit parallel data
// the module generates strobe signal for data sender - load, indicating when it loaded new portion of data,
// and allowing sender to begin preparing new data. dac_leftright is also to be used by sender (by locking it
// when load is 1).
//
// dac_clock is symmetrical clock at 1/10 of input clock (2.4 MHz)
// load is positive 1 clock cycle pulse informing that new data has just loaded

module sound_dac(
        clock,         // input clock (24 MHz)

        dac_clock,     // clock to DAC
        dac_leftright, // left-right signal to DAC (0 - left, 1 - right)
        dac_data,      // data to DAC

        load,          // output indicating cycle when new data loaded from datain bus

        datain         // input 16-bit bus
);

        input clock;

        output dac_clock;

        output dac_leftright;

        output dac_data;

        output reg load;


        input [15:0] datain;

        reg [16:0] data; // internal shift register

        reg [2:0] fifth; // divide by 5
        reg [6:0] sync; // sync[0] - dac_clock
                        // sync[6] - dac_leftright

        wire load_int;



        // for simulation purposes
        initial
        begin
                fifth <= 0;
                sync <= 0;
                data <= 0;
                load <= 0;
        end


        // divide input clock by 5
        always @(posedge clock)
        begin
                if( fifth[2] )
                        fifth <= 3'b000;
                else
                        fifth <= fifth + 3'd1;
        end

        // divide further to get dac_clock and dac_leftright
        always @(posedge clock)
        begin
                if( fifth[2] )  sync <= sync + 7'd1;
        end


        // load signal generation
        assign load_int = fifth[2] & (&sync[5:0]);

        always @(posedge clock)
        begin
                        load <= load_int;
        end

        // loading and shifting data
        always @(posedge clock)
        begin
                if( fifth[2] && sync[0] )
                begin
                        if( load_int )
                                data[15:0] <= datain;
                        else
                                data[15:0] <= { data[14:0], 1'b0 }; // MSB first

                        data[16] <= data[15];
                end
        end

        assign dac_leftright = sync[6];
        assign dac_clock = sync[0];
        assign dac_data  = data[16];

endmodule