89 lines
3.3 KiB
Systemverilog
89 lines
3.3 KiB
Systemverilog
|
//+FHDR--------------------------------------------------------------------------------------------------------
|
||
|
// Company:
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// File Name : spi_bus_decoder.v
|
||
|
// Department :
|
||
|
// Author : PWY
|
||
|
// Author's Tel :
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Relese History
|
||
|
// Version Date Author Description
|
||
|
// 0.1 2024-03-13 PWY Serial Peripheral Interface BUS Decoder
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Keywords :
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Parameter
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Purpose :
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Target Device:
|
||
|
// Tool versions:
|
||
|
//-----------------------------------------------------------------------------------------------------------------
|
||
|
// Reuse Issues
|
||
|
// Reset Strategy:
|
||
|
// Clock Domains:
|
||
|
// Critical Timing:
|
||
|
// Asynchronous I/F:
|
||
|
// Synthesizable (y/n):
|
||
|
// Other:
|
||
|
//-FHDR--------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
module spi_bus_decoder #(
|
||
|
parameter SLVNUM = 32
|
||
|
,parameter SPIBUS_CMD_REG = 1
|
||
|
,parameter SPIBUS_OUT_REG = 1
|
||
|
)(
|
||
|
input clk
|
||
|
,input rst_n
|
||
|
,sram_if.slave mst
|
||
|
,sram_if.master slv [SLVNUM-1:0] //s and m exchange
|
||
|
);
|
||
|
|
||
|
|
||
|
generate
|
||
|
genvar i;
|
||
|
logic [SLVNUM-1:0] cs_slv;
|
||
|
logic [31 :0] dtemp[SLVNUM-1:0];
|
||
|
|
||
|
for(i=0;i<SLVNUM;i=i+1) begin
|
||
|
//generating device chip select signal
|
||
|
//the largest 5bit addr is used to select among 32 SRAM
|
||
|
assign cs_slv[i] = (mst.addr[24:20] == i );
|
||
|
//generating device read/write signal
|
||
|
if(SPIBUS_CMD_REG == 1) begin :CMD_REG
|
||
|
sirv_gnrl_dffr #(25) rwaddr_dffr ({25{cs_slv[i]}} & {5'b0,mst.addr[19:0]} ,slv[i].addr, clk, rst_n);
|
||
|
sirv_gnrl_dffr #(32) wrdata_dffr ({32{cs_slv[i]}} & mst.din ,slv[i].din, clk, rst_n);
|
||
|
sirv_gnrl_dffr #(1) wren_dffr (cs_slv[i] & mst.wren ,slv[i].wren, clk, rst_n);
|
||
|
sirv_gnrl_dffr #(1) reen_dffr (cs_slv[i] & mst.rden ,slv[i].rden, clk, rst_n);
|
||
|
end
|
||
|
else begin :CMD_DONT_REG
|
||
|
assign slv[i].addr = {25{cs_slv[i]}} & {5'b0,mst.addr[19:0]};
|
||
|
assign slv[i].wren = cs_slv[i] & mst.wren;
|
||
|
assign slv[i].rden = cs_slv[i] & mst.rden;
|
||
|
assign slv[i].din = {32{cs_slv[i]}} & mst.din;
|
||
|
end
|
||
|
|
||
|
assign slv[i].wben = {32{cs_slv[i]}} & mst.din;
|
||
|
|
||
|
if(i==0) begin
|
||
|
assign dtemp[i] = (cs_slv[i]) ? slv[i].dout : 32'b0;
|
||
|
end
|
||
|
else begin
|
||
|
assign dtemp[i] = (cs_slv[i]) ? slv[i].dout : dtemp[i-1];
|
||
|
end
|
||
|
end
|
||
|
//read data from register
|
||
|
if(SPIBUS_OUT_REG == 1) begin :OUT_REG
|
||
|
sirv_gnrl_dffr #(32) rddata_dffr (dtemp[SLVNUM-1], mst.dout, clk, rst_n);
|
||
|
end
|
||
|
else begin : OUT_DONT_REG
|
||
|
assign mst.dout = dtemp[SLVNUM-1];
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
endmodule
|
||
|
|