blob: ad3336192997a12863fd352235c691ca3549571b [file] [log] [blame]
module axi_spi_slave
#(
parameter AXI_ADDR_WIDTH = 32,
parameter AXI_DATA_WIDTH = 64,
parameter AXI_USER_WIDTH = 6,
parameter AXI_ID_WIDTH = 3,
parameter DUMMY_CYCLES = 32
)
(
test_mode,
spi_sclk,
spi_cs,
spi_mode,
spi_sdi0,
spi_sdi1,
spi_sdi2,
spi_sdi3,
spi_sdo0,
spi_sdo1,
spi_sdo2,
spi_sdo3,
axi_aclk,
axi_aresetn,
axi_master_aw_valid,
axi_master_aw_addr,
axi_master_aw_prot,
axi_master_aw_region,
axi_master_aw_len,
axi_master_aw_size,
axi_master_aw_burst,
axi_master_aw_lock,
axi_master_aw_cache,
axi_master_aw_qos,
axi_master_aw_id,
axi_master_aw_user,
axi_master_aw_ready,
axi_master_ar_valid,
axi_master_ar_addr,
axi_master_ar_prot,
axi_master_ar_region,
axi_master_ar_len,
axi_master_ar_size,
axi_master_ar_burst,
axi_master_ar_lock,
axi_master_ar_cache,
axi_master_ar_qos,
axi_master_ar_id,
axi_master_ar_user,
axi_master_ar_ready,
axi_master_w_valid,
axi_master_w_data,
axi_master_w_strb,
axi_master_w_user,
axi_master_w_last,
axi_master_w_ready,
axi_master_r_valid,
axi_master_r_data,
axi_master_r_resp,
axi_master_r_last,
axi_master_r_id,
axi_master_r_user,
axi_master_r_ready,
axi_master_b_valid,
axi_master_b_resp,
axi_master_b_id,
axi_master_b_user,
axi_master_b_ready
);
//parameter AXI_ADDR_WIDTH = 32;
//parameter AXI_DATA_WIDTH = 64;
//parameter AXI_USER_WIDTH = 6;
//parameter AXI_ID_WIDTH = 3;
//parameter DUMMY_CYCLES = 32;
input wire test_mode;
input wire spi_sclk;
input wire spi_cs;
output wire [1:0] spi_mode;
input wire spi_sdi0;
input wire spi_sdi1;
input wire spi_sdi2;
input wire spi_sdi3;
output wire spi_sdo0;
output wire spi_sdo1;
output wire spi_sdo2;
output wire spi_sdo3;
input wire axi_aclk;
input wire axi_aresetn;
output wire axi_master_aw_valid;
output wire [AXI_ADDR_WIDTH - 1:0] axi_master_aw_addr;
output wire [2:0] axi_master_aw_prot;
output wire [3:0] axi_master_aw_region;
output wire [7:0] axi_master_aw_len;
output wire [2:0] axi_master_aw_size;
output wire [1:0] axi_master_aw_burst;
output wire axi_master_aw_lock;
output wire [3:0] axi_master_aw_cache;
output wire [3:0] axi_master_aw_qos;
output wire [AXI_ID_WIDTH - 1:0] axi_master_aw_id;
output wire [AXI_USER_WIDTH - 1:0] axi_master_aw_user;
input wire axi_master_aw_ready;
output wire axi_master_ar_valid;
output wire [AXI_ADDR_WIDTH - 1:0] axi_master_ar_addr;
output wire [2:0] axi_master_ar_prot;
output wire [3:0] axi_master_ar_region;
output wire [7:0] axi_master_ar_len;
output wire [2:0] axi_master_ar_size;
output wire [1:0] axi_master_ar_burst;
output wire axi_master_ar_lock;
output wire [3:0] axi_master_ar_cache;
output wire [3:0] axi_master_ar_qos;
output wire [AXI_ID_WIDTH - 1:0] axi_master_ar_id;
output wire [AXI_USER_WIDTH - 1:0] axi_master_ar_user;
input wire axi_master_ar_ready;
output wire axi_master_w_valid;
output wire [AXI_DATA_WIDTH - 1:0] axi_master_w_data;
output wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_master_w_strb;
output wire [AXI_USER_WIDTH - 1:0] axi_master_w_user;
output wire axi_master_w_last;
input wire axi_master_w_ready;
input wire axi_master_r_valid;
input wire [AXI_DATA_WIDTH - 1:0] axi_master_r_data;
input wire [1:0] axi_master_r_resp;
input wire axi_master_r_last;
input wire [AXI_ID_WIDTH - 1:0] axi_master_r_id;
input wire [AXI_USER_WIDTH - 1:0] axi_master_r_user;
output wire axi_master_r_ready;
input wire axi_master_b_valid;
input wire [1:0] axi_master_b_resp;
input wire [AXI_ID_WIDTH - 1:0] axi_master_b_id;
input wire [AXI_USER_WIDTH - 1:0] axi_master_b_user;
output wire axi_master_b_ready;
wire en_quad;
wire [7:0] rx_counter;
wire rx_counter_upd;
wire [31:0] rx_data;
wire rx_data_valid;
wire [7:0] tx_counter;
wire tx_counter_upd;
wire [31:0] tx_data;
wire tx_data_valid;
wire ctrl_rd_wr;
wire [31:0] ctrl_addr;
wire ctrl_addr_valid;
wire [31:0] ctrl_data_rx;
wire ctrl_data_rx_valid;
wire ctrl_data_rx_ready;
wire [31:0] ctrl_data_tx;
wire ctrl_data_tx_valid;
wire ctrl_data_tx_ready;
wire [31:0] fifo_data_rx;
wire fifo_data_rx_valid;
wire fifo_data_rx_ready;
wire [31:0] fifo_data_tx;
wire fifo_data_tx_valid;
wire fifo_data_tx_ready;
wire [AXI_ADDR_WIDTH - 1:0] addr_sync;
wire addr_valid_sync;
wire cs_sync;
wire tx_done;
wire rd_wr_sync;
wire [15:0] wrap_length;
spi_slave_rx u_rxreg(
.sclk(spi_sclk),
.cs(spi_cs),
.sdi0(spi_sdi0),
.sdi1(spi_sdi1),
.sdi2(spi_sdi2),
.sdi3(spi_sdi3),
.en_quad_in(en_quad),
.counter_in(rx_counter),
.counter_in_upd(rx_counter_upd),
.data(rx_data),
.data_ready(rx_data_valid)
);
spi_slave_tx u_txreg(
.test_mode(test_mode),
.sclk(spi_sclk),
.cs(spi_cs),
.sdo0(spi_sdo0),
.sdo1(spi_sdo1),
.sdo2(spi_sdo2),
.sdo3(spi_sdo3),
.en_quad_in(en_quad),
.counter_in(tx_counter),
.counter_in_upd(tx_counter_upd),
.data(tx_data),
.data_valid(tx_data_valid),
.done(tx_done)
);
spi_slave_controller #(.DUMMY_CYCLES(DUMMY_CYCLES)) u_slave_sm(
.sclk(spi_sclk),
.sys_rstn(axi_aresetn),
.cs(spi_cs),
.en_quad(en_quad),
.pad_mode(spi_mode),
.rx_counter(rx_counter),
.rx_counter_upd(rx_counter_upd),
.rx_data(rx_data),
.rx_data_valid(rx_data_valid),
.tx_counter(tx_counter),
.tx_counter_upd(tx_counter_upd),
.tx_data(tx_data),
.tx_data_valid(tx_data_valid),
.tx_done(tx_done),
.ctrl_rd_wr(ctrl_rd_wr),
.ctrl_addr(ctrl_addr),
.ctrl_addr_valid(ctrl_addr_valid),
.ctrl_data_rx(ctrl_data_rx),
.ctrl_data_rx_valid(ctrl_data_rx_valid),
.ctrl_data_rx_ready(ctrl_data_rx_ready),
.ctrl_data_tx(ctrl_data_tx),
.ctrl_data_tx_valid(ctrl_data_tx_valid),
.ctrl_data_tx_ready(ctrl_data_tx_ready),
.wrap_length(wrap_length)
);
spi_slave_dc_fifo #(
.DATA_WIDTH(32),
.BUFFER_DEPTH(8)
) u_dcfifo_rx(
.clk_a(spi_sclk),
.rstn_a(axi_aresetn),
.data_a(ctrl_data_rx),
.valid_a(ctrl_data_rx_valid),
.ready_a(ctrl_data_rx_ready),
.clk_b(axi_aclk),
.rstn_b(axi_aresetn),
.data_b(fifo_data_rx),
.valid_b(fifo_data_rx_valid),
.ready_b(fifo_data_rx_ready)
);
spi_slave_dc_fifo #(
.DATA_WIDTH(32),
.BUFFER_DEPTH(8)
) u_dcfifo_tx(
.clk_a(axi_aclk),
.rstn_a(axi_aresetn),
.data_a(fifo_data_tx),
.valid_a(fifo_data_tx_valid),
.ready_a(fifo_data_tx_ready),
.clk_b(spi_sclk),
.rstn_b(axi_aresetn),
.data_b(ctrl_data_tx),
.valid_b(ctrl_data_tx_valid),
.ready_b(ctrl_data_tx_ready)
);
spi_slave_axi_plug #(
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.AXI_ID_WIDTH(AXI_ID_WIDTH)
) u_axiplug(
.axi_aclk(axi_aclk),
.axi_aresetn(axi_aresetn),
.axi_master_aw_valid(axi_master_aw_valid),
.axi_master_aw_addr(axi_master_aw_addr),
.axi_master_aw_prot(axi_master_aw_prot),
.axi_master_aw_region(axi_master_aw_region),
.axi_master_aw_len(axi_master_aw_len),
.axi_master_aw_size(axi_master_aw_size),
.axi_master_aw_burst(axi_master_aw_burst),
.axi_master_aw_lock(axi_master_aw_lock),
.axi_master_aw_cache(axi_master_aw_cache),
.axi_master_aw_qos(axi_master_aw_qos),
.axi_master_aw_id(axi_master_aw_id),
.axi_master_aw_user(axi_master_aw_user),
.axi_master_aw_ready(axi_master_aw_ready),
.axi_master_ar_valid(axi_master_ar_valid),
.axi_master_ar_addr(axi_master_ar_addr),
.axi_master_ar_prot(axi_master_ar_prot),
.axi_master_ar_region(axi_master_ar_region),
.axi_master_ar_len(axi_master_ar_len),
.axi_master_ar_size(axi_master_ar_size),
.axi_master_ar_burst(axi_master_ar_burst),
.axi_master_ar_lock(axi_master_ar_lock),
.axi_master_ar_cache(axi_master_ar_cache),
.axi_master_ar_qos(axi_master_ar_qos),
.axi_master_ar_id(axi_master_ar_id),
.axi_master_ar_user(axi_master_ar_user),
.axi_master_ar_ready(axi_master_ar_ready),
.axi_master_w_valid(axi_master_w_valid),
.axi_master_w_data(axi_master_w_data),
.axi_master_w_strb(axi_master_w_strb),
.axi_master_w_user(axi_master_w_user),
.axi_master_w_last(axi_master_w_last),
.axi_master_w_ready(axi_master_w_ready),
.axi_master_r_valid(axi_master_r_valid),
.axi_master_r_data(axi_master_r_data),
.axi_master_r_resp(axi_master_r_resp),
.axi_master_r_last(axi_master_r_last),
.axi_master_r_id(axi_master_r_id),
.axi_master_r_user(axi_master_r_user),
.axi_master_r_ready(axi_master_r_ready),
.axi_master_b_valid(axi_master_b_valid),
.axi_master_b_resp(axi_master_b_resp),
.axi_master_b_id(axi_master_b_id),
.axi_master_b_user(axi_master_b_user),
.axi_master_b_ready(axi_master_b_ready),
.rxtx_addr(addr_sync),
.rxtx_addr_valid(addr_valid_sync),
.start_tx(rd_wr_sync & addr_valid_sync),
.cs(cs_sync),
.tx_data(fifo_data_tx),
.tx_valid(fifo_data_tx_valid),
.tx_ready(fifo_data_tx_ready),
.rx_data(fifo_data_rx),
.rx_valid(fifo_data_rx_valid),
.rx_ready(fifo_data_rx_ready),
.wrap_length(wrap_length)
);
spi_slave_syncro #(.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH)) u_syncro(
.sys_clk(axi_aclk),
.rstn(axi_aresetn),
.cs(spi_cs),
.address(ctrl_addr),
.address_valid(ctrl_addr_valid),
.rd_wr(ctrl_rd_wr),
.cs_sync(cs_sync),
.address_sync(addr_sync),
.address_valid_sync(addr_valid_sync),
.rd_wr_sync(rd_wr_sync)
);
endmodule