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