Line 97... |
Line 97... |
// Reg Bus Interface Signal
|
// Reg Bus Interface Signal
|
//---------------------------------
|
//---------------------------------
|
input reg_cs ;
|
input reg_cs ;
|
input reg_wr ;
|
input reg_wr ;
|
input [3:0] reg_addr ;
|
input [3:0] reg_addr ;
|
input [31:0] reg_wdata ;
|
input [7:0] reg_wdata ;
|
input [3:0] reg_be ;
|
input reg_be ;
|
|
|
// Outputs
|
// Outputs
|
output [31:0] reg_rdata ;
|
output [7:0] reg_rdata ;
|
output reg_ack ;
|
output reg_ack ;
|
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
Line 113... |
Line 113... |
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
|
|
wire sw_rd_en;
|
wire sw_rd_en;
|
wire sw_wr_en;
|
wire sw_wr_en;
|
wire [3:0] sw_addr ; // addressing 16 registers
|
wire [3:0] sw_addr ; // addressing 16 registers
|
wire [3:0] wr_be ;
|
wire wr_be ;
|
|
|
reg [31:0] reg_rdata ;
|
reg [7:0] reg_rdata;
|
reg reg_ack ;
|
reg reg_ack ;
|
|
|
wire [31:0] reg_0; // Software_Reg_0
|
wire [31:0] spi_ctrl; // Software-Reg_12
|
wire [31:0] reg_1; // Software-Reg_1
|
wire [7:0] reg_12; // Software-Reg_12
|
wire [31:0] reg_2; // Software-Reg_2
|
wire [7:0] reg_13; // Software-Reg_13
|
wire [31:0] reg_3; // Software-Reg_3
|
wire [7:0] reg_14; // Software-Reg_14
|
wire [31:0] reg_4; // Software-Reg_4
|
wire [7:0] reg_15; // Software-Reg_15
|
wire [31:0] reg_5; // Software-Reg_5
|
reg [7:0] reg_out;
|
wire [31:0] reg_6; // Software-Reg_6
|
|
wire [31:0] reg_7; // Software-Reg_7
|
|
wire [31:0] reg_8; // Software-Reg_8
|
|
wire [31:0] reg_9; // Software-Reg_9
|
|
wire [31:0] reg_10; // Software-Reg_10
|
|
wire [31:0] reg_11; // Software-Reg_11
|
|
wire [31:0] reg_12; // Software-Reg_12
|
|
wire [31:0] reg_13; // Software-Reg_13
|
|
wire [31:0] reg_14; // Software-Reg_14
|
|
wire [31:0] reg_15; // Software-Reg_15
|
|
reg [31:0] reg_out;
|
|
|
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
// Main code starts here
|
// Main code starts here
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
|
|
Line 157... |
Line 146... |
|
|
always @ (posedge mclk or negedge reset_n)
|
always @ (posedge mclk or negedge reset_n)
|
begin : preg_out_Seq
|
begin : preg_out_Seq
|
if (reset_n == 1'b0)
|
if (reset_n == 1'b0)
|
begin
|
begin
|
reg_rdata [31:0] <= 32'h0000_0000;
|
reg_rdata [7:0] <= 8'h00;
|
reg_ack <= 1'b0;
|
reg_ack <= 1'b0;
|
end
|
end
|
else if (sw_rd_en && !reg_ack)
|
else if (sw_rd_en && !reg_ack)
|
begin
|
begin
|
reg_rdata [31:0] <= reg_out [31:0];
|
reg_rdata [7:0] <= reg_out [7:0];
|
reg_ack <= 1'b1;
|
reg_ack <= 1'b1;
|
end
|
end
|
else if (sw_wr_en && !reg_ack)
|
else if (sw_wr_en && !reg_ack)
|
reg_ack <= 1'b1;
|
reg_ack <= 1'b1;
|
else
|
else
|
Line 214... |
Line 203... |
|
|
|
|
always @( *)
|
always @( *)
|
begin : preg_sel_Com
|
begin : preg_sel_Com
|
|
|
reg_out [31:0] = 32'd0;
|
reg_out [7:0] = 8'd0;
|
|
|
case (sw_addr [3:0])
|
case (sw_addr [3:0])
|
4'b0000 : reg_out [31:0] = reg_0 [31:0];
|
4'b0000 : reg_out [7:0] = spi_ctrl [7:0];
|
4'b0001 : reg_out [31:0] = reg_1 [31:0];
|
4'b0001 : reg_out [7:0] = spi_ctrl [15:8];
|
4'b0010 : reg_out [31:0] = reg_2 [31:0];
|
4'b0010 : reg_out [7:0] = spi_ctrl [23:16];
|
4'b0011 : reg_out [31:0] = reg_3 [31:0];
|
4'b0011 : reg_out [7:0] = spi_ctrl [31:24];
|
4'b0100 : reg_out [31:0] = reg_4 [31:0];
|
4'b0100 : reg_out [7:0] = cfg_datain [7:0];
|
4'b0101 : reg_out [31:0] = reg_5 [31:0];
|
4'b0101 : reg_out [7:0] = cfg_datain [15:8];
|
4'b0110 : reg_out [31:0] = reg_6 [31:0];
|
4'b0110 : reg_out [7:0] = cfg_datain [23:16];
|
4'b0111 : reg_out [31:0] = reg_7 [31:0];
|
4'b0111 : reg_out [7:0] = cfg_datain [31:24];
|
4'b1000 : reg_out [31:0] = reg_8 [31:0];
|
4'b1000 : reg_out [7:0] = cfg_dataout [7:0];
|
4'b1001 : reg_out [31:0] = reg_9 [31:0];
|
4'b1001 : reg_out [7:0] = cfg_dataout [15:8];
|
4'b1010 : reg_out [31:0] = reg_10 [31:0];
|
4'b1010 : reg_out [7:0] = cfg_dataout [23:16];
|
4'b1011 : reg_out [31:0] = reg_11 [31:0];
|
4'b1011 : reg_out [7:0] = cfg_dataout [31:24];
|
4'b1100 : reg_out [31:0] = reg_12 [31:0];
|
4'b1100 : reg_out [7:0] = reg_12 [7:0];
|
4'b1101 : reg_out [31:0] = reg_13 [31:0];
|
4'b1101 : reg_out [7:0] = reg_13 [7:0];
|
4'b1110 : reg_out [31:0] = reg_14 [31:0];
|
4'b1110 : reg_out [7:0] = reg_14 [7:0];
|
4'b1111 : reg_out [31:0] = reg_15 [31:0];
|
4'b1111 : reg_out [7:0] = reg_15 [7:0];
|
endcase
|
endcase
|
end
|
end
|
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
// Individual register assignments
|
// Individual register assignments
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
// Logic for Register 0 : SPI Control Register
|
// Logic for Register 0 : SPI Control Register
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
wire cfg_op_req = reg_0[31]; // cpu request
|
wire cfg_op_req = spi_ctrl[31]; // cpu request
|
wire [1:0] cfg_tgt_sel = reg_0[24:23]; // target chip select
|
wire [1:0] cfg_tgt_sel = spi_ctrl[24:23]; // target chip select
|
wire [1:0] cfg_op_type = reg_0[22:21]; // SPI operation type
|
wire [1:0] cfg_op_type = spi_ctrl[22:21]; // SPI operation type
|
wire [1:0] cfg_transfer_size = reg_0[20:19]; // SPI transfer size
|
wire [1:0] cfg_transfer_size = spi_ctrl[20:19]; // SPI transfer size
|
wire [5:0] cfg_sck_period = reg_0[18:13]; // sck clock period
|
wire [5:0] cfg_sck_period = spi_ctrl[18:13]; // sck clock period
|
wire [4:0] cfg_sck_cs_period = reg_0[12:8]; // cs setup/hold period
|
wire [4:0] cfg_sck_cs_period = spi_ctrl[12:8]; // cs setup/hold period
|
wire [7:0] cfg_cs_byte = reg_0[7:0]; // cs bit information
|
wire [7:0] cfg_cs_byte = spi_ctrl[7:0]; // cs bit information
|
|
|
|
|
generic_register #(8,0 ) u_spi_ctrl_be0 (
|
generic_register #(8,0 ) u_spi_ctrl_be0 (
|
.we ({8{sw_wr_en_0 &
|
.we ({8{sw_wr_en_0 & wr_be }} ),
|
wr_be[0] }} ),
|
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[7:0] ),
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_0[7:0] )
|
.data_out (spi_ctrl[7:0] )
|
);
|
);
|
|
|
generic_register #(8,0 ) u_spi_ctrl_be1 (
|
generic_register #(8,0 ) u_spi_ctrl_be1 (
|
.we ({8{sw_wr_en_0 &
|
.we ({8{sw_wr_en_1 & wr_be }} ),
|
wr_be[1] }} ),
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[15:8] ),
|
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_0[15:8] )
|
.data_out (spi_ctrl[15:8] )
|
);
|
);
|
|
|
generic_register #(8,0 ) u_spi_ctrl_be2 (
|
generic_register #(8,0 ) u_spi_ctrl_be2 (
|
.we ({8{sw_wr_en_0 &
|
.we ({8{sw_wr_en_2 & wr_be}} ),
|
wr_be[2] }} ),
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[23:16] ),
|
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_0[23:16] )
|
.data_out (spi_ctrl[23:16] )
|
);
|
);
|
|
|
assign reg_0[30:24] = 7'h0;
|
assign spi_ctrl[30:24] = 7'h0;
|
|
|
req_register #(0 ) u_spi_ctrl_req (
|
req_register #(0 ) u_spi_ctrl_req (
|
.cpu_we ({sw_wr_en_0 &
|
.cpu_we ({sw_wr_en_3 & wr_be}),
|
wr_be[3] } ),
|
.cpu_req (reg_wdata[7] ),
|
.cpu_req (reg_wdata[31] ),
|
|
.hware_ack (hware_op_done ),
|
.hware_ack (hware_op_done ),
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_0[31] )
|
.data_out (spi_ctrl[31] )
|
);
|
);
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
// Logic for Register 1 : SPI Data In Register
|
// Logic for Register 1 : SPI Data In Register
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
wire [31:0] cfg_datain = reg_1[31:0];
|
|
|
|
generic_register #(8,0 ) u_spi_din_be0 (
|
generic_register #(8,0 ) u_spi_din_be0 (
|
.we ({8{sw_wr_en_1 &
|
.we ({8{sw_wr_en_4 & wr_be }} ),
|
wr_be[0] }} ),
|
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[7:0] ),
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_1[7:0] )
|
.data_out (cfg_datain[7:0] )
|
);
|
);
|
|
|
generic_register #(8,0 ) u_spi_din_be1 (
|
generic_register #(8,0 ) u_spi_din_be1 (
|
.we ({8{sw_wr_en_1 &
|
.we ({8{sw_wr_en_5 & wr_be }} ),
|
wr_be[1] }} ),
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[15:8] ),
|
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_1[15:8] )
|
.data_out (cfg_datain[15:8] )
|
);
|
);
|
|
|
generic_register #(8,0 ) u_spi_din_be2 (
|
generic_register #(8,0 ) u_spi_din_be2 (
|
.we ({8{sw_wr_en_1 &
|
.we ({8{sw_wr_en_6 & wr_be }} ),
|
wr_be[2] }} ),
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[23:16] ),
|
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_1[23:16] )
|
.data_out (cfg_datain[23:16] )
|
);
|
);
|
|
|
|
|
generic_register #(8,0 ) u_spi_din_be3 (
|
generic_register #(8,0 ) u_spi_din_be3 (
|
.we ({8{sw_wr_en_1 &
|
.we ({8{sw_wr_en_7 & wr_be }} ),
|
wr_be[3] }} ),
|
.data_in (reg_wdata[7:0] ),
|
.data_in (reg_wdata[31:24] ),
|
|
.reset_n (reset_n ),
|
.reset_n (reset_n ),
|
.clk (mclk ),
|
.clk (mclk ),
|
|
|
//List of Outs
|
//List of Outs
|
.data_out (reg_1[31:24] )
|
.data_out (cfg_datain[31:24] )
|
);
|
);
|
|
|
|
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
// Logic for Register 2 : SPI Data output Register
|
// Logic for Register : SPI Data output Register
|
//-----------------------------------------------------------------------
|
//-----------------------------------------------------------------------
|
assign reg_2 = cfg_dataout;
|
assign reg_2 = cfg_dataout;
|
|
|
|
|
|
|