added some functionality to read a single sram through wishbone. Testing is remaining
diff --git a/verilog/rtl/openram_testchip.v b/verilog/rtl/openram_testchip.v index a8cc3d9..2d03699 100644 --- a/verilog/rtl/openram_testchip.v +++ b/verilog/rtl/openram_testchip.v
@@ -21,6 +21,17 @@ input gpio_scan, input gpio_sram_load, input global_csb, + // wishbone related control signals + input wb_clk_i, + input wb_rst_i, + input wbs_stb_i, + input wbs_cyc_i, + input wbs_we_i, + input [3:0] wbs_sel_i, + input [31:0] wbs_dat_i, + input [31:0] wbs_adr_i, + output wbs_ack_o, + output [31:0] wbs_dat_o, // SRAM data outputs to be captured input [`DATA_SIZE-1:0] sram0_data0, input [`DATA_SIZE-1:0] sram0_data1, @@ -112,25 +123,74 @@ // Splitting register bits into fields always @(*) begin - chip_select = sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE]; + if(wbs_stb_i && wbs_cyc_i) begin + chip_select = 0; + addr0 = ram_addr0; + din0 = ram_din0; + web0 = ram_web0; + wmask0 = ram_wmask0; + // dont cares for now since we are just testing single port for now + addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2]; + din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2]; + csb1_temp = global_csb | sram_register[`WMASK_SIZE+1]; + web1 = sram_register[`WMASK_SIZE]; + wmask1 = sram_register[`WMASK_SIZE-1:0]; + end + else begin + chip_select = sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE]; - addr0 = sram_register[`ADDR_SIZE+`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+1:`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+2]; - din0 = sram_register[`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+1:`PORT_SIZE+`WMASK_SIZE+2]; - csb0_temp = global_csb | sram_register[`PORT_SIZE+`WMASK_SIZE+1]; - web0 = sram_register[`PORT_SIZE+`WMASK_SIZE]; - wmask0 = sram_register[`PORT_SIZE+`WMASK_SIZE-1:`PORT_SIZE]; + addr0 = sram_register[`ADDR_SIZE+`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+1:`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+2]; + din0 = sram_register[`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+1:`PORT_SIZE+`WMASK_SIZE+2]; + csb0_temp = global_csb | sram_register[`PORT_SIZE+`WMASK_SIZE+1]; + web0 = sram_register[`PORT_SIZE+`WMASK_SIZE]; + wmask0 = sram_register[`PORT_SIZE+`WMASK_SIZE-1:`PORT_SIZE]; - addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2]; - din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2]; - csb1_temp = global_csb | sram_register[`WMASK_SIZE+1]; - web1 = sram_register[`WMASK_SIZE]; - wmask1 = sram_register[`WMASK_SIZE-1:0]; + addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2]; + din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2]; + csb1_temp = global_csb | sram_register[`WMASK_SIZE+1]; + web1 = sram_register[`WMASK_SIZE]; + wmask1 = sram_register[`WMASK_SIZE-1:0]; + end end +// Using the wishbone signals for enabling memories + wire ram_clk0; + wire ram_csb0; + wire ram_web0; + wire ram_wmask0; + wire ram_addr0; + wire ram_din0; + wire ram_dout0; + wishbone_wrapper WRAPPER( + .wb_clk_i(wb_clk_i), + .wb_rst_i(wb_rst_i), + .wbs_stb_i(wbs_stb_i), + .wbs_cyc_i(wbs_cyc_i), + .wbs_we_i(wbs_we_i), + .wbs_sel_i(wbs_sel_i), + .wbs_dat_i(wbs_dat_i), + .wbs_adr_i(wbs_adr_i), + .wbs_ack_o(wbs_ack_o), + .wbs_dat_o(wbs_dat_o), + // OpenRAM interface + .ram_clk0(ram_clk0), // (output) clock + .ram_csb0(ram_csb0), // (output) active low chip select + .ram_web0(ram_web0), // (output) active low write control + .ram_wmask0(ram_wmask0), // (output) write (byte) mask + .ram_addr0(ram_addr0), // (output) + .ram_din0(read_data0), // (input) read from sram and sent through wb + .ram_dout0(ram_din0) // (output) read from wb and sent to sram + ); // Apply the correct CSB always @(*) begin - csb0 = ~( (~{15'b111111111111111, csb0_temp}) << chip_select); - csb1 = ~( (~{15'b111111111111111, csb1_temp}) << chip_select); + if(wbs_stb_i && wbs_cyc_i) begin + csb0 = 16'b1111111111111110; + csb1 = 16'b1111111111111111; + end + else begin + csb0 = ~( (~{15'b111111111111111, csb0_temp}) << chip_select); + csb1 = ~( (~{15'b111111111111111, csb1_temp}) << chip_select); + end end // Mux value of correct SRAM data input to feed into
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v index 22a8315..2b3f08b 100644 --- a/verilog/rtl/user_project_wrapper.v +++ b/verilog/rtl/user_project_wrapper.v
@@ -121,9 +121,9 @@ case (in_select) 2'b00 : clk = la_clk; 2'b01 : clk = gpio_clk; + 2'b10 : clk = wb_clk_i; default : clk = 0; endcase - //clk = in_select ? gpio_clk : la_clk; end // global csb is low with either GPIO or LA csb @@ -137,16 +137,27 @@ .resetn(rstn), .clk(clk), .global_csb(global_csb), + // gpio related control signals .gpio_scan(gpio_scan), .gpio_sram_load(gpio_sram_load), .gpio_in(gpio_in), .gpio_out(gpio_out), - + // la related control signals .la_in_load(la_in_load), .la_sram_load(la_sram_load), .la_data_in(la_data_in[111:0]), .la_data_out(la_data_out[111:0]), - + // wishbone related control signals + .wb_clk_i(wb_clk_i), + .wb_rst_i(wb_rst_i), + .wbs_stb_i(wbs_stb_i), + .wbs_cyc_i(wbs_cyc_i), + .wbs_we_i(wbs_we_i), + .wbs_sel_i(wbs_sel_i), + .wbs_dat_i(wbs_dat_i), + .wbs_adr_i(wbs_adr_i), + .wbs_ack_o(wbs_ack_o), + .wbs_dat_o(wbs_dat_o), // Shared control/data to the SRAMs .addr0(addr0), .din0(din0),