Top secrets sources NedoPC pentevo

Rev

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

// generates activity on avr SPI aimed to send bytes over SDcard SPI.
//
`ifdef SPITEST

`include "../include/tune.v"



`define AVR_HALF_PERIOD (45.2)

module spitest_avr(
       
        output wire spick,
        output reg  spics_n,
        output wire spido,
        input  wire spidi

);


        reg aclk;


        reg  spistart;
        wire spirdy;

        reg  [7:0] spidin;
        wire [7:0] spidout;




        // clock gen
        initial
        begin
                aclk = 1'b0;

                forever #`AVR_HALF_PERIOD aclk = ~aclk;
        end


        // signals init
        initial
        begin
                spics_n = 1'b1;

                spistart = 1'b0;
        end




        // use standard spi2 module to send and receive over SPI.
        // reverse bytes since spi2 sends and receives MSB first,
        // while slavespi LSB first
        spi2 spi2(

                .clock(aclk),

                .sck(spick),
                .sdo(spido),
                .sdi(spidi),

                .bsync(),

                .start(spistart),
                .rdy  (spirdy  ),

                .speed(2'b00),

                .din ({spidin[0], spidin[1], spidin[2], spidin[3],
                       spidin[4], spidin[5], spidin[6], spidin[7]}),

                .dout({spidout[0], spidout[1], spidout[2], spidout[3],
                       spidout[4], spidout[5], spidout[6], spidout[7]})
        );




        // test loop
        initial
        begin
                repeat(2211) @(posedge aclk);

                forever
                begin
                        get_access();
                        send_msg();
                        release_access();

                        repeat(1234) @(posedge aclk);
                end
        end





        task get_access(
        );
                reg [7:0] tmp;

                reg_io( 8'h61, 8'h81, tmp );

                while( !tmp[7] )
                        reg_io( 8'h61, 8'h81, tmp );
        endtask

        task send_msg(
        );
                reg [7:0] tmp;
                reg [71:0] msg = "AVR SEND\n";
                integer i;

                reg_io( 8'h61, 8'h80, tmp );

                for(i=8;i>=0;i=i-1)
                begin
                        reg_io( 8'h60, msg[i*8 +: 8], tmp );
                end

                reg_io( 8'h61, 8'h81, tmp );
        endtask

        task release_access(
        );
                reg [7:0] tmp;

                reg_io( 8'h61, 8'h81, tmp );
                reg_io( 8'h61, 8'h01, tmp );
        endtask

        task reg_io(
                input  [7:0] addr,
                input  [7:0] wrdata,
                output [7:0] rddata
        );

                reg [7:0] trash;


                spics_n <= 1'b1;
                @(posedge aclk);

                spi_io( addr, trash );

                spics_n <= 1'b0;
                @(posedge aclk);

                spi_io( wrdata, rddata );

                spics_n <= 1'b1;
                @(posedge aclk);

        endtask



        task spi_io(
                input  [7:0] wrdata,
                output [7:0] rddata
        );

                spidin <= wrdata;
                spistart <= 1'b1;

                @(posedge aclk);

                spistart <= 1'b0;

                @(posedge aclk);

                wait(spirdy==1'b1);

                @(posedge aclk);


                rddata = spidout;

        endtask




endmodule
`endif