new files (SPI)
This commit is contained in:
parent
ceb5bec774
commit
be0fde297d
52
src/fpga_spi.c
Normal file
52
src/fpga_spi.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
// insert cool lengthy disclaimer here
|
||||||
|
/*
|
||||||
|
fpga_spi.c: SPI functions for SRAM interfacing and mapper config
|
||||||
|
|
||||||
|
SPI commands
|
||||||
|
|
||||||
|
cmd param function
|
||||||
|
=============================================
|
||||||
|
00 bb[hh[ll]] set address to 0xbbhhll
|
||||||
|
2s - set SRAM size to s
|
||||||
|
3m - set mapper to m
|
||||||
|
0=HiROM, 1=LoROM
|
||||||
|
80 - read with increment
|
||||||
|
81 - read w/o increment
|
||||||
|
90 {xx}* write xx with increment
|
||||||
|
91 {xx}* write xx w/o increment
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "avrcompat.h"
|
||||||
|
#include "fpga.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "uart.h"
|
||||||
|
#include "spi.h"
|
||||||
|
#include "fpga_spi.h"
|
||||||
|
|
||||||
|
void spi_fpga(void) {
|
||||||
|
SPI_SS_HIGH();
|
||||||
|
FPGA_SS_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_sd(void) {
|
||||||
|
FPGA_SS_HIGH();
|
||||||
|
SPI_SS_LOW();
|
||||||
|
}
|
||||||
|
|
||||||
|
void fpga_spi_init(void) {
|
||||||
|
DDRC = _BV(PC7);
|
||||||
|
FPGA_SS_HIGH();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_avr_addr(uint32_t address) {
|
||||||
|
spi_fpga();
|
||||||
|
spiTransferByte(0x00);
|
||||||
|
spiTransferByte((address>>16)&0xff);
|
||||||
|
spiTransferByte((address>>8)&0xff);
|
||||||
|
spiTransferByte((address)&0xff);
|
||||||
|
spi_sd();
|
||||||
|
}
|
||||||
|
|
||||||
10
src/fpga_spi.h
Normal file
10
src/fpga_spi.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// insert cool lengthy disclaimer here
|
||||||
|
|
||||||
|
#define FPGA_SS_HIGH() do {PORTC |= _BV(PC7);} while (0)
|
||||||
|
#define FPGA_SS_LOW() do {PORTC &= ~_BV(PC7);} while (0)
|
||||||
|
|
||||||
|
void fpga_spi_init(void);
|
||||||
|
void fpga_spi_test(void);
|
||||||
|
void spi_fpga(void);
|
||||||
|
void spi_sd(void);
|
||||||
|
void set_avr_addr(uint32_t);
|
||||||
118
verilog/sd2snes/avr_cmd.v
Normal file
118
verilog/sd2snes/avr_cmd.v
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Company:
|
||||||
|
// Engineer:
|
||||||
|
//
|
||||||
|
// Create Date: 21:57:50 08/25/2009
|
||||||
|
// Design Name:
|
||||||
|
// Module Name: avr_cmd
|
||||||
|
// Project Name:
|
||||||
|
// Target Devices:
|
||||||
|
// Tool versions:
|
||||||
|
// Description:
|
||||||
|
//
|
||||||
|
// Dependencies:
|
||||||
|
//
|
||||||
|
// Revision:
|
||||||
|
// Revision 0.01 - File Created
|
||||||
|
// Additional Comments:
|
||||||
|
//
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
module avr_cmd(
|
||||||
|
input clk,
|
||||||
|
input cmd_ready,
|
||||||
|
input param_ready,
|
||||||
|
input [7:0] cmd_data,
|
||||||
|
input [7:0] param_data,
|
||||||
|
output [3:0] avr_mapper,
|
||||||
|
output [3:0] avr_sram_size,
|
||||||
|
output avr_read,
|
||||||
|
output avr_write,
|
||||||
|
output [7:0] avr_data_out,
|
||||||
|
input [7:0] avr_data_in,
|
||||||
|
output [7:0] spi_data_out,
|
||||||
|
input [31:0] spi_byte_cnt,
|
||||||
|
input [2:0] spi_bit_cnt,
|
||||||
|
output [23:0] addr_out,
|
||||||
|
output [3:0] mapper,
|
||||||
|
input endmessage,
|
||||||
|
input startmessage
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [3:0] MAPPER_BUF;
|
||||||
|
reg [3:0] SRAM_SIZE_BUF;
|
||||||
|
reg AVR_READ_BUF;
|
||||||
|
reg AVR_WRITE_BUF;
|
||||||
|
reg [23:0] ADDR_OUT_BUF;
|
||||||
|
reg [7:0] AVR_DATA_OUT_BUF;
|
||||||
|
reg [7:0] AVR_DATA_IN_BUF;
|
||||||
|
reg [1:0] avr_nextaddr_buf;
|
||||||
|
wire avr_nextaddr;
|
||||||
|
|
||||||
|
assign spi_data_out = AVR_DATA_IN_BUF;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
ADDR_OUT_BUF = 0;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (cmd_ready) begin
|
||||||
|
case (cmd_data[7:4])
|
||||||
|
4'h2:
|
||||||
|
SRAM_SIZE_BUF <= cmd_data[3:0];
|
||||||
|
4'h3:
|
||||||
|
MAPPER_BUF <= cmd_data[3:0];
|
||||||
|
4'h8:
|
||||||
|
AVR_DATA_IN_BUF <= avr_data_in;
|
||||||
|
endcase
|
||||||
|
end else if (param_ready) begin
|
||||||
|
case (cmd_data[7:4])
|
||||||
|
4'h0:
|
||||||
|
case (spi_byte_cnt)
|
||||||
|
32'h2: begin
|
||||||
|
ADDR_OUT_BUF[23:16] <= param_data;
|
||||||
|
ADDR_OUT_BUF[15:0] <= 16'b0;
|
||||||
|
end
|
||||||
|
32'h3:
|
||||||
|
ADDR_OUT_BUF[15:8] <= param_data;
|
||||||
|
32'h4:
|
||||||
|
ADDR_OUT_BUF[7:0] <= param_data;
|
||||||
|
endcase
|
||||||
|
4'h8:
|
||||||
|
AVR_DATA_IN_BUF <= avr_data_in;
|
||||||
|
4'h9:
|
||||||
|
AVR_DATA_OUT_BUF <= param_data;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
if (avr_nextaddr & (cmd_data[7:5] == 3'h4) && (cmd_data[0]) && (spi_byte_cnt > (32'h0+2*cmd_data[4])))
|
||||||
|
ADDR_OUT_BUF <= ADDR_OUT_BUF + 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (spi_bit_cnt == 3'h0)
|
||||||
|
avr_nextaddr_buf <= {avr_nextaddr_buf[0], 1'b1};
|
||||||
|
else
|
||||||
|
avr_nextaddr_buf <= {avr_nextaddr_buf[0], 1'b0};
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (spi_bit_cnt == 3'h1 & (cmd_data[7:4] == 4'h9) & (spi_byte_cnt > 32'h1))
|
||||||
|
AVR_WRITE_BUF <= 1'b0;
|
||||||
|
else
|
||||||
|
AVR_WRITE_BUF <= 1'b1;
|
||||||
|
|
||||||
|
if ((spi_bit_cnt == 3'h7) & (cmd_data[7:4] == 4'h8) & (spi_byte_cnt > 32'h0))
|
||||||
|
AVR_READ_BUF <= 1'b0;
|
||||||
|
else
|
||||||
|
AVR_READ_BUF <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
assign avr_nextaddr = avr_nextaddr_buf == 2'b01;
|
||||||
|
assign avr_read = AVR_READ_BUF;
|
||||||
|
assign avr_write = AVR_WRITE_BUF;
|
||||||
|
assign addr_out = ADDR_OUT_BUF;
|
||||||
|
assign avr_data_out = AVR_DATA_OUT_BUF;
|
||||||
|
assign avr_mapper = MAPPER_BUF;
|
||||||
|
assign avr_sram_size = SRAM_SIZE_BUF;
|
||||||
|
|
||||||
|
endmodule
|
||||||
643
verilog/sd2snes/main_tf2.v
Normal file
643
verilog/sd2snes/main_tf2.v
Normal file
@ -0,0 +1,643 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Company:
|
||||||
|
// Engineer:
|
||||||
|
//
|
||||||
|
// Create Date: 00:20:33 07/14/2009
|
||||||
|
// Design Name: main
|
||||||
|
// Module Name: /home/ikari/prj/sd2snes/verilog/sd2snes/main_tf2.v
|
||||||
|
// Project Name: sd2snes
|
||||||
|
// Target Device:
|
||||||
|
// Tool versions:
|
||||||
|
// Description:
|
||||||
|
//
|
||||||
|
// Verilog Test Fixture created by ISE for module: main
|
||||||
|
//
|
||||||
|
// Dependencies:
|
||||||
|
//
|
||||||
|
// Revision:
|
||||||
|
// Revision 0.01 - File Created
|
||||||
|
// Additional Comments:
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
module main_tf2;
|
||||||
|
|
||||||
|
// Inputs
|
||||||
|
reg CLKIN;
|
||||||
|
reg [23:0] SNES_ADDR;
|
||||||
|
reg SNES_READ;
|
||||||
|
reg SNES_WRITE;
|
||||||
|
reg SNES_CS;
|
||||||
|
reg SNES_CPU_CLK;
|
||||||
|
reg SNES_REFRESH;
|
||||||
|
reg SPI_MOSI;
|
||||||
|
reg SPI_SS;
|
||||||
|
reg SPI_SCK;
|
||||||
|
reg AVR_ENA;
|
||||||
|
|
||||||
|
// Outputs
|
||||||
|
wire SNES_DATABUS_OE;
|
||||||
|
wire SNES_DATABUS_DIR;
|
||||||
|
wire [19:0] SRAM_ADDR;
|
||||||
|
wire [3:0] ROM_SEL;
|
||||||
|
wire SRAM_OE;
|
||||||
|
wire SRAM_WE;
|
||||||
|
wire SPI_MISO;
|
||||||
|
wire MODE;
|
||||||
|
wire SPI_LSB;
|
||||||
|
wire SRAM_BHE;
|
||||||
|
wire SRAM_BLE;
|
||||||
|
|
||||||
|
// Bidirs
|
||||||
|
wire [7:0] SNES_DATA;
|
||||||
|
wire SNES_IRQ;
|
||||||
|
wire [15:0] SRAM_DATA;
|
||||||
|
|
||||||
|
reg [15:0] SRAM_DATA_BUF;
|
||||||
|
// Instantiate the Unit Under Test (UUT)
|
||||||
|
main uut (
|
||||||
|
.CLKIN(CLKIN),
|
||||||
|
.SNES_ADDR(SNES_ADDR),
|
||||||
|
.SNES_READ(SNES_READ),
|
||||||
|
.SNES_WRITE(SNES_WRITE),
|
||||||
|
.SNES_CS(SNES_CS),
|
||||||
|
.SNES_DATA(SNES_DATA),
|
||||||
|
.SNES_CPU_CLK(SNES_CPU_CLK),
|
||||||
|
.SNES_REFRESH(SNES_REFRESH),
|
||||||
|
.SNES_IRQ(SNES_IRQ),
|
||||||
|
.IRQ_DIR(IRQ_DIR),
|
||||||
|
.SNES_DATABUS_OE(SNES_DATABUS_OE),
|
||||||
|
.SNES_DATABUS_DIR(SNES_DATABUS_DIR),
|
||||||
|
.SRAM_DATA(SRAM_DATA),
|
||||||
|
.SRAM_ADDR(SRAM_ADDR),
|
||||||
|
.SRAM_CE2(ROM_SEL),
|
||||||
|
.SRAM_OE(SRAM_OE),
|
||||||
|
.SRAM_WE(SRAM_WE),
|
||||||
|
.SPI_MOSI(SPI_MOSI),
|
||||||
|
.SPI_MISO(SPI_MISO),
|
||||||
|
.SPI_SS(SPI_SS),
|
||||||
|
.SPI_SCK(SPI_SCK),
|
||||||
|
.AVR_ENA(AVR_ENA),
|
||||||
|
.SRAM_BHE(SRAM_BHE),
|
||||||
|
.SRAM_BLE(SRAM_BLE)
|
||||||
|
);
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
// Initialize Inputs
|
||||||
|
CLKIN = 0;
|
||||||
|
SNES_ADDR = 0;
|
||||||
|
SNES_READ = 1;
|
||||||
|
SNES_WRITE = 1;
|
||||||
|
SNES_CS = 0;
|
||||||
|
SNES_CPU_CLK = 0;
|
||||||
|
SNES_REFRESH = 0;
|
||||||
|
SPI_MOSI = 0;
|
||||||
|
SPI_SS = 1;
|
||||||
|
SPI_SCK = 0;
|
||||||
|
AVR_ENA = 0;
|
||||||
|
|
||||||
|
// Wait 100 ns for global reset to finish
|
||||||
|
#100;
|
||||||
|
// Wait for DCM to stabilize
|
||||||
|
#5000;
|
||||||
|
// Add stimulus here
|
||||||
|
// Add stimulus here
|
||||||
|
SPI_SS = 0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#100 SPI_SS=1;
|
||||||
|
#200;
|
||||||
|
SPI_SS=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_SS=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
#100 SPI_SS=1;
|
||||||
|
#200;
|
||||||
|
SPI_SS=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_SS=1;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* READ TEST
|
||||||
|
*/
|
||||||
|
AVR_ENA=1;
|
||||||
|
SPI_SS=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#100;
|
||||||
|
#100;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_SS=1;
|
||||||
|
#300;
|
||||||
|
SPI_SS=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
SPI_SS=1;
|
||||||
|
AVR_ENA=1;
|
||||||
|
#280;
|
||||||
|
// Initialize Inputs
|
||||||
|
SNES_ADDR = 24'h223456;
|
||||||
|
SNES_READ = 1;
|
||||||
|
SNES_WRITE = 1;
|
||||||
|
SNES_CS = 0;
|
||||||
|
AVR_ENA = 1;
|
||||||
|
SRAM_DATA_BUF = 8'hff;
|
||||||
|
// Wait for global reset to finish
|
||||||
|
#276;
|
||||||
|
SNES_ADDR <= 24'h123456;
|
||||||
|
SNES_READ <= 0;
|
||||||
|
#176;
|
||||||
|
SNES_READ <= 1;
|
||||||
|
#100;
|
||||||
|
SNES_WRITE <= 0;
|
||||||
|
#176;
|
||||||
|
SNES_WRITE <= 1;
|
||||||
|
#100;
|
||||||
|
SNES_READ <= 0;
|
||||||
|
#276;
|
||||||
|
// AVR_READ <= 1;
|
||||||
|
// Add stimulus here
|
||||||
|
SPI_SS = 0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=0;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
SPI_MOSI=1;
|
||||||
|
#100 SPI_SCK=1;
|
||||||
|
#100 SPI_SCK=0;
|
||||||
|
#100 SPI_SS=1;
|
||||||
|
#200;
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
always begin
|
||||||
|
#23 CLKIN = ~CLKIN;
|
||||||
|
end
|
||||||
|
always begin
|
||||||
|
#150 SNES_READ = ~SNES_READ;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
145
verilog/sd2snes/spi.v
Normal file
145
verilog/sd2snes/spi.v
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
`timescale 1ns / 1ps
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Company:
|
||||||
|
// Engineer:
|
||||||
|
//
|
||||||
|
// Create Date: 21:16:09 07/10/2009
|
||||||
|
// Design Name:
|
||||||
|
// Module Name: spi
|
||||||
|
// Project Name:
|
||||||
|
// Target Devices:
|
||||||
|
// Tool versions:
|
||||||
|
// Description:
|
||||||
|
//
|
||||||
|
// Dependencies:
|
||||||
|
//
|
||||||
|
// Revision:
|
||||||
|
// Revision 0.01 - File Created
|
||||||
|
// Additional Comments:
|
||||||
|
//
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
module spi(input clk,
|
||||||
|
input SCK,
|
||||||
|
input MOSI,
|
||||||
|
output MISO,
|
||||||
|
input SSEL,
|
||||||
|
output LED,
|
||||||
|
output cmd_ready,
|
||||||
|
output param_ready,
|
||||||
|
output [7:0] cmd_data,
|
||||||
|
output [7:0] param_data,
|
||||||
|
output endmessage,
|
||||||
|
output startmessage,
|
||||||
|
input [7:0] input_data,
|
||||||
|
output [31:0] byte_cnt,
|
||||||
|
output [2:0] bit_cnt);
|
||||||
|
|
||||||
|
reg [7:0] cmd_data_r;
|
||||||
|
reg [7:0] param_data_r;
|
||||||
|
|
||||||
|
// sync SCK to the FPGA clock using a 3-bits shift register
|
||||||
|
reg [2:0] SCKr; always @(posedge clk) SCKr <= {SCKr[1:0], SCK};
|
||||||
|
wire SCK_risingedge = (SCKr[2:1]==2'b01); // now we can detect SCK rising edges
|
||||||
|
wire SCK_fallingedge = (SCKr[2:1]==2'b10); // and falling edges
|
||||||
|
|
||||||
|
// same thing for SSEL
|
||||||
|
reg [2:0] SSELr; always @(posedge clk) SSELr <= {SSELr[1:0], SSEL};
|
||||||
|
wire SSEL_active = ~SSELr[1]; // SSEL is active low
|
||||||
|
wire SSEL_startmessage = (SSELr[2:1]==2'b10); // message starts at falling edge
|
||||||
|
wire SSEL_endmessage = (SSELr[2:1]==2'b01); // message stops at rising edge
|
||||||
|
assign endmessage = SSEL_endmessage;
|
||||||
|
assign startmessage = SSEL_startmessage;
|
||||||
|
|
||||||
|
// and for MOSI
|
||||||
|
reg [1:0] MOSIr; always @(posedge clk) MOSIr <= {MOSIr[0], MOSI};
|
||||||
|
wire MOSI_data = MOSIr[1];
|
||||||
|
|
||||||
|
// we handle SPI in 8-bits format, so we need a 3 bits counter to count the bits as they come in
|
||||||
|
reg [2:0] bitcnt;
|
||||||
|
reg [31:0] byte_cnt_r;
|
||||||
|
|
||||||
|
reg byte_received; // high when a byte has been received
|
||||||
|
reg [7:0] byte_data_received;
|
||||||
|
|
||||||
|
assign bit_cnt = bitcnt;
|
||||||
|
|
||||||
|
always @(posedge clk)
|
||||||
|
begin
|
||||||
|
if(~SSEL_active) begin
|
||||||
|
bitcnt <= 3'b000;
|
||||||
|
end else
|
||||||
|
if(SCK_risingedge)
|
||||||
|
begin
|
||||||
|
bitcnt <= bitcnt + 3'b001;
|
||||||
|
|
||||||
|
// implement a shift-left register (since we receive the data MSB first)
|
||||||
|
byte_data_received <= {byte_data_received[6:0], MOSI_data};
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) byte_received <= SSEL_active && SCK_risingedge && (bitcnt==3'b111);
|
||||||
|
|
||||||
|
// we use the LSB of the data received to control an LED
|
||||||
|
reg LEDr;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if(~SSEL_active)
|
||||||
|
byte_cnt_r <= 16'h0000;
|
||||||
|
else if(byte_received) begin
|
||||||
|
LEDr <= byte_data_received[0];
|
||||||
|
byte_cnt_r <= byte_cnt_r + 16'h0001;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assign LED = LEDr;
|
||||||
|
|
||||||
|
reg [7:0] byte_data_sent;
|
||||||
|
|
||||||
|
reg [7:0] cnt;
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if(SSEL_startmessage) cnt<=cnt+8'h1; // count the messages
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if(SSEL_active) begin
|
||||||
|
if(SSEL_startmessage)
|
||||||
|
byte_data_sent <= cnt; // first byte sent in a message is the message count
|
||||||
|
else
|
||||||
|
if(SCK_fallingedge) begin
|
||||||
|
if(bitcnt==3'b000)
|
||||||
|
byte_data_sent <= input_data; // after that, we send whatever we get
|
||||||
|
else
|
||||||
|
byte_data_sent <= {byte_data_sent[6:0], 1'b0};
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign MISO = SSEL_active ? byte_data_sent[7] : 1'bZ; // send MSB first
|
||||||
|
|
||||||
|
reg cmd_ready_r;
|
||||||
|
reg param_ready_r;
|
||||||
|
reg cmd_ready_r2;
|
||||||
|
reg param_ready_r2;
|
||||||
|
assign cmd_ready = cmd_ready_r;
|
||||||
|
assign param_ready = param_ready_r;
|
||||||
|
assign cmd_data = cmd_data_r;
|
||||||
|
assign param_data = param_data_r;
|
||||||
|
assign byte_cnt = byte_cnt_r;
|
||||||
|
|
||||||
|
always @(posedge clk) cmd_ready_r2 = byte_received && byte_cnt_r == 32'h0;
|
||||||
|
always @(posedge clk) param_ready_r2 = byte_received && byte_cnt_r > 32'h0;
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (SSEL_startmessage)
|
||||||
|
cmd_data_r <= 8'h00;
|
||||||
|
else if(cmd_ready_r2)
|
||||||
|
cmd_data_r <= byte_data_received;
|
||||||
|
else if(param_ready_r2)
|
||||||
|
param_data_r <= byte_data_received;
|
||||||
|
|
||||||
|
end
|
||||||
|
always @(posedge clk) begin
|
||||||
|
cmd_ready_r <= cmd_ready_r2;
|
||||||
|
param_ready_r <= param_ready_r2;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
Loading…
x
Reference in New Issue
Block a user