diff --git a/verilog/sd2snes/address.v b/verilog/sd2snes/address.v index ea359a2..9695d1e 100644 --- a/verilog/sd2snes/address.v +++ b/verilog/sd2snes/address.v @@ -41,6 +41,7 @@ module address( output use_bsx, input [14:0] bsx_regs, output dspx_enable, + output dspx_dp_enable, output dspx_a0 ); @@ -73,8 +74,9 @@ assign IS_ROM = ((!SNES_ADDR[22] & SNES_ADDR[15]) assign IS_SAVERAM = SAVERAM_MASK[0] &(featurebits[FEAT_ST0010] - ?(SNES_ADDR[22:19] == 4'b1101 - && SNES_ADDR[15:12] == 4'b0000) + ?((SNES_ADDR[22:19] == 4'b1101) + & &(~SNES_ADDR[15:12]) + & SNES_ADDR[11]) :((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b110 @@ -220,6 +222,10 @@ wire dspx_enable_w = ?(SNES_ADDR[22] & SNES_ADDR[21] & ~SNES_ADDR[20] & &(~SNES_ADDR[19:16]) & ~SNES_ADDR[15]) :1'b0; +wire dspx_dp_enable_w = featurebits[FEAT_ST0010] + &(SNES_ADDR[22:19] == 4'b1101 + && SNES_ADDR[15:11] == 5'b00000); + assign dspx_a0 = featurebits[FEAT_DSPX] ?((MAPPER == 3'b001) ? SNES_ADDR[14] :(MAPPER == 3'b000) ? SNES_ADDR[12] @@ -228,6 +234,11 @@ assign dspx_a0 = featurebits[FEAT_DSPX] ?SNES_ADDR[0] :1'b1; +reg [7:0] dspx_dp_enable_r; +initial dspx_dp_enable_r = 8'b00000000; +always @(posedge CLK) dspx_dp_enable_r <= {dspx_dp_enable_r[6:0], dspx_dp_enable_w}; +assign dspx_dp_enable = &dspx_dp_enable_r[5:2]; + reg [7:0] dspx_enable_r; initial dspx_enable_r = 8'b00000000; always @(posedge CLK) dspx_enable_r <= {dspx_enable_r[6:0], dspx_enable_w}; diff --git a/verilog/sd2snes/data.v b/verilog/sd2snes/data.v index 85d7a03..a1c72c0 100644 --- a/verilog/sd2snes/data.v +++ b/verilog/sd2snes/data.v @@ -46,7 +46,8 @@ module data( input msu_enable, input bsx_data_ovr, input srtc_enable, - input dspx_enable + input dspx_enable, + input dspx_dp_enable ); reg [7:0] SNES_IN_MEM; @@ -67,6 +68,7 @@ assign SNES_DATA = SNES_READ ? 8'bZ : bsx_data_ovr ? BSX_DATA_OUT : srtc_enable ? SRTC_DATA_OUT : dspx_enable ? DSPX_DATA_OUT + : dspx_dp_enable ? DSPX_DATA_OUT : SNES_OUT_MEM) ); diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datram.v b/verilog/sd2snes/ipcore_dir/upd77c25_datram.v index 42af65f..ac34494 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datram.v +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datram.v @@ -42,26 +42,36 @@ module upd77c25_datram( wea, addra, dina, - douta + douta, + clkb, + web, + addrb, + dinb, + doutb ); input clka; input [0 : 0] wea; -input [7 : 0] addra; +input [9 : 0] addra; input [15 : 0] dina; output [15 : 0] douta; +input clkb; +input [0 : 0] web; +input [10 : 0] addrb; +input [7 : 0] dinb; +output [7 : 0] doutb; // synthesis translate_off BLK_MEM_GEN_V6_1 #( - .C_ADDRA_WIDTH(8), - .C_ADDRB_WIDTH(8), + .C_ADDRA_WIDTH(10), + .C_ADDRB_WIDTH(11), .C_ALGORITHM(1), .C_AXI_ID_WIDTH(4), .C_AXI_SLAVE_TYPE(0), .C_AXI_TYPE(1), .C_BYTE_SIZE(9), - .C_COMMON_CLK(0), + .C_COMMON_CLK(1), .C_DEFAULT_DATA("0"), .C_DISABLE_WARN_BHV_COLL(0), .C_DISABLE_WARN_BHV_RANGE(0), @@ -85,13 +95,13 @@ output [15 : 0] douta; .C_INITB_VAL("0"), .C_INTERFACE_TYPE(0), .C_LOAD_INIT_FILE(0), - .C_MEM_TYPE(0), + .C_MEM_TYPE(2), .C_MUX_PIPELINE_STAGES(0), .C_PRIM_TYPE(1), - .C_READ_DEPTH_A(256), - .C_READ_DEPTH_B(256), + .C_READ_DEPTH_A(1024), + .C_READ_DEPTH_B(2048), .C_READ_WIDTH_A(16), - .C_READ_WIDTH_B(16), + .C_READ_WIDTH_B(8), .C_RST_PRIORITY_A("CE"), .C_RST_PRIORITY_B("CE"), .C_RST_TYPE("SYNC"), @@ -105,12 +115,12 @@ output [15 : 0] douta; .C_USE_SOFTECC(0), .C_WEA_WIDTH(1), .C_WEB_WIDTH(1), - .C_WRITE_DEPTH_A(256), - .C_WRITE_DEPTH_B(256), + .C_WRITE_DEPTH_A(1024), + .C_WRITE_DEPTH_B(2048), .C_WRITE_MODE_A("WRITE_FIRST"), .C_WRITE_MODE_B("WRITE_FIRST"), .C_WRITE_WIDTH_A(16), - .C_WRITE_WIDTH_B(16), + .C_WRITE_WIDTH_B(8), .C_XDEVICEFAMILY("spartan3") ) inst ( @@ -119,17 +129,17 @@ output [15 : 0] douta; .ADDRA(addra), .DINA(dina), .DOUTA(douta), + .CLKB(clkb), + .WEB(web), + .ADDRB(addrb), + .DINB(dinb), + .DOUTB(doutb), .RSTA(), .ENA(), .REGCEA(), - .CLKB(), .RSTB(), .ENB(), .REGCEB(), - .WEB(), - .ADDRB(), - .DINB(), - .DOUTB(), .INJECTSBITERR(), .INJECTDBITERR(), .SBITERR(), diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datram.xco b/verilog/sd2snes/ipcore_dir/upd77c25_datram.xco index 14b0488..6ca0c10 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datram.xco +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datram.xco @@ -1,7 +1,7 @@ ############################################################## # # Xilinx Core Generator version 13.1 -# Date: Mon Jun 13 22:15:19 2011 +# Date: Sun Jun 19 20:18:04 2011 # ############################################################## # @@ -37,7 +37,7 @@ SELECT Block_Memory_Generator xilinx.com:ip:blk_mem_gen:6.1 # BEGIN Parameters CSET additional_inputs_for_power_estimation=false CSET algorithm=Minimum_Area -CSET assume_synchronous_clk=false +CSET assume_synchronous_clk=true CSET axi_id_width=4 CSET axi_slave_type=Memory_Slave CSET axi_type=AXI4_Full @@ -55,7 +55,7 @@ CSET error_injection_type=Single_Bit_Error_Injection CSET fill_remaining_memory_locations=false CSET interface_type=Native CSET load_init_file=false -CSET memory_type=Single_Port_RAM +CSET memory_type=True_Dual_Port_RAM CSET operating_mode_a=WRITE_FIRST CSET operating_mode_b=WRITE_FIRST CSET output_reset_value_a=0 @@ -64,12 +64,12 @@ CSET pipeline_stages=0 CSET port_a_clock=100 CSET port_a_enable_rate=100 CSET port_a_write_rate=50 -CSET port_b_clock=0 -CSET port_b_enable_rate=0 -CSET port_b_write_rate=0 +CSET port_b_clock=100 +CSET port_b_enable_rate=100 +CSET port_b_write_rate=50 CSET primitive=8kx2 CSET read_width_a=16 -CSET read_width_b=16 +CSET read_width_b=8 CSET register_porta_input_of_softecc=false CSET register_porta_output_of_memory_core=false CSET register_porta_output_of_memory_primitives=false @@ -90,12 +90,12 @@ CSET use_regcea_pin=false CSET use_regceb_pin=false CSET use_rsta_pin=false CSET use_rstb_pin=false -CSET write_depth_a=256 +CSET write_depth_a=1024 CSET write_width_a=16 -CSET write_width_b=16 +CSET write_width_b=8 # END Parameters # BEGIN Extra information MISC pkg_timestamp=2011-02-03T22:20:43.000Z # END Extra information GENERATE -# CRC: 47f41c0a +# CRC: 78e2bfe1 diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datram.xise b/verilog/sd2snes/ipcore_dir/upd77c25_datram.xise index a3a9453..bf1c887 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datram.xise +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datram.xise @@ -16,18 +16,18 @@ - + - + - + @@ -57,8 +57,8 @@ - - + + diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xise b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xise index 42d3a55..4841bfe 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xise +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xise @@ -36,333 +36,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index 230eab6..045e87e 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -73,8 +73,8 @@ module main( , output p113_out ); - -assign p113_out = SNES_READ; +wire dspx_dp_enable; +assign p113_out = dspx_dp_enable; wire [7:0] spi_cmd_data; wire [7:0] spi_param_data; @@ -260,7 +260,9 @@ upd77c25 snes_dspx ( .PGM_WR_ADDR(dspx_pgm_addr), .DAT_WR(dspx_dat_we), .DAT_DI(dspx_dat_data), - .DAT_WR_ADDR(dspx_dat_addr) + .DAT_WR_ADDR(dspx_dat_addr), + .DP_nCS(~dspx_dp_enable), + .DP_ADDR(SNES_ADDR[10:0]) ); mcu_cmd snes_mcu_cmd( @@ -396,6 +398,7 @@ address snes_addr( .srtc_enable(srtc_enable), //uPD77C25 .dspx_enable(dspx_enable), + .dspx_dp_enable(dspx_dp_enable), .dspx_a0(DSPX_A0) ); @@ -432,7 +435,8 @@ data snes_data( .msu_enable(msu_enable), .bsx_data_ovr(bsx_data_ovr), .srtc_enable(srtc_enable), - .dspx_enable(dspx_enable) + .dspx_enable(dspx_enable), + .dspx_dp_enable(dspx_dp_enable) ); parameter MODE_SNES = 1'b0; @@ -624,7 +628,7 @@ assign ROM_BLE = !ROM_WE ? !ROM_ADDR0 : 1'b0; //assign SRAM_WE = !MCU_ENA ? MCU_WRITE : 1'b1; //assign SNES_DATABUS_OE = (!IS_SAVERAM & SNES_CS) | (SNES_READ & SNES_WRITE); -assign SNES_DATABUS_OE = dspx_enable ? 1'b0 : +assign SNES_DATABUS_OE = (dspx_enable | dspx_dp_enable) ? 1'b0 : msu_enable ? 1'b0 : bsx_data_ovr ? (SNES_READ & SNES_WRITE) : srtc_enable ? (SNES_READ & SNES_WRITE) : diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise index 5a39501..e9b2558 100644 --- a/verilog/sd2snes/sd2snes.xise +++ b/verilog/sd2snes/sd2snes.xise @@ -204,7 +204,7 @@ - + @@ -381,8 +381,8 @@ - - + + diff --git a/verilog/sd2snes/upd77c25.v b/verilog/sd2snes/upd77c25.v index d0361c5..b91894a 100644 --- a/verilog/sd2snes/upd77c25.v +++ b/verilog/sd2snes/upd77c25.v @@ -34,6 +34,9 @@ module upd77c25( input [15:0] DAT_DI, input [10:0] DAT_WR_ADDR, + input DP_nCS, + input [10:0] DP_ADDR, + // debug output [15:0] DR, output [15:0] SR, @@ -73,6 +76,7 @@ reg [10:0] pc; // program counter reg [7:0] insn_state; // execute state +reg [1:0] regs_dpb; reg [3:0] regs_dph; reg [3:0] regs_dpl; @@ -122,17 +126,48 @@ upd77c25_datrom datrom ( .doutb(dat_doutb) // output [15 : 0] doutb ); -wire [15:0] ram_douta; -wire [7:0] ram_addra; -upd77c25_datram datram ( - .clka(CLK), - .wea(ram_wea), // Bus [0 : 0] - .addra(ram_addra), // Bus [7 : 0] - .dina(ram_dina), // Bus [15 : 0] - .douta(ram_douta)); // Bus [15 : 0] +reg [7:0] reg_nCS_sreg; +initial reg_nCS_sreg = 8'b11111111; +always @(posedge CLK) reg_nCS_sreg <= {reg_nCS_sreg[6:0], nCS}; +reg [5:0] reg_oe_sreg; +initial reg_oe_sreg = 6'b111111; +always @(posedge CLK) reg_oe_sreg <= {reg_oe_sreg[4:0], nRD}; +wire reg_oe_rising = !reg_nCS_sreg[4] && (reg_oe_sreg[5:0] == 6'b000001); +wire reg_oe_falling = (reg_oe_sreg[5:0] == 6'b100000); + +reg [7:0] reg_DP_nCS_sreg; +initial reg_DP_nCS_sreg = 8'b11111111; +always @(posedge CLK) reg_DP_nCS_sreg <= {reg_DP_nCS_sreg[6:0], DP_nCS}; + +reg [5:0] reg_we_sreg; +initial reg_we_sreg = 6'b111111; +always @(posedge CLK) reg_we_sreg <= {reg_we_sreg[4:0], nWR}; +wire reg_we_rising = !reg_nCS_sreg[4] && (reg_we_sreg[5:0] == 6'b000001); +wire reg_dp_we_rising = !reg_DP_nCS_sreg[2] && (reg_we_sreg[5:0] == 6'b000011); + +wire [15:0] ram_douta; +wire [9:0] ram_addra; +reg [7:0] DP_DOr; +wire [7:0] DP_DO; +wire [7:0] UPD_DO; + + +upd77c25_datram datram ( + .clka(CLK), // input clka + .wea(ram_wea), // input [0 : 0] wea + .addra(ram_addra), // input [9 : 0] addra + .dina(ram_dina), // input [15 : 0] dina + .douta(ram_douta), // output [15 : 0] douta + .clkb(CLK), // input clkb + .web(reg_dp_we_rising), // input [0 : 0] web + .addrb(DP_ADDR), // input [10 : 0] addrb + .dinb(DI), // input [7 : 0] dinb + .doutb(DP_DO) // output [7 : 0] doutb +); assign ram_wea = ((op != I_JP) && op_dst == 4'b1111 && insn_state == STATE_NEXT); -assign ram_addra = {regs_dph | ((insn_state == STATE_ALU2 && op_dst == 4'b1100) +assign ram_addra = {regs_dpb, + regs_dph | ((insn_state == STATE_ALU2 && op_dst == 4'b1100) ? 4'b0100 : 4'b0000), regs_dpl}; @@ -186,6 +221,7 @@ initial begin pc = 11'b0; regs_sr = 16'b0; regs_rp = 16'h0000; + regs_dpb = 2'b0; regs_dph = 4'b0; regs_dpl = 4'b0; regs_k = 16'b0; @@ -203,24 +239,6 @@ initial begin regs_dr = 16'b0; end -always @(posedge CLK) begin - -end - -reg [7:0] reg_nCS_sreg; -initial reg_nCS_sreg = 8'b11111111; -always @(posedge CLK) reg_nCS_sreg <= {reg_nCS_sreg[6:0], nCS}; - -reg [5:0] reg_oe_sreg; -initial reg_oe_sreg = 6'b111111; -always @(posedge CLK) reg_oe_sreg <= {reg_oe_sreg[4:0], nRD}; -wire reg_oe_rising = !reg_nCS_sreg[4] && (reg_oe_sreg[5:0] == 6'b000001); - -reg [5:0] reg_we_sreg; -initial reg_we_sreg = 6'b111111; -always @(posedge CLK) reg_we_sreg <= {reg_we_sreg[4:0], nWR}; -wire reg_we_rising = !reg_nCS_sreg[4] && (reg_we_sreg[5:0] == 6'b000001); - reg [7:0] A0r; initial A0r = 8'b11111111; always @(posedge CLK) A0r <= {A0r[6:0], A0}; @@ -303,7 +321,12 @@ always @(posedge CLK) begin end end -assign DO = (A0 ? regs_sr[15:8] : (regs_sr[SR_DRC] ? regs_dr[7:0] : (regs_sr[SR_DRS] ? regs_dr[15:8] : regs_dr[7:0]))); +always @(posedge CLK) begin + if(reg_oe_falling) DP_DOr <= DP_DO; +end + +assign UPD_DO = (A0 ? regs_sr[15:8] : (regs_sr[SR_DRC] ? regs_dr[7:0] : (regs_sr[SR_DRS] ? regs_dr[15:8] : regs_dr[7:0]))); +assign DO = !DP_nCS ? DP_DOr : UPD_DO; always @(posedge CLK) begin if(RST) begin @@ -338,7 +361,7 @@ always @(posedge CLK) begin 4'b0001: idb <= regs_ab[0]; 4'b0010: idb <= regs_ab[1]; 4'b0011: idb <= regs_tr; - 4'b0100: idb <= {regs_dph,regs_dpl}; + 4'b0100: idb <= {regs_dpb,regs_dph,regs_dpl}; 4'b0101: idb <= regs_rp; 4'b0110: idb <= dat_doutb; // Address: [regs_rp] 4'b0111: idb <= flags_s1[0] ? 16'h7fff : 16'h8000; @@ -410,7 +433,7 @@ always @(posedge CLK) begin alu_store <= 2'b01; end 4'b0011: regs_tr <= idb; - 4'b0100: {regs_dph,regs_dpl} <= idb[7:0]; + 4'b0100: {regs_dpb,regs_dph,regs_dpl} <= idb[9:0]; 4'b0101: regs_rp <= idb; // 4'b0110: regs_dr <= idb; 4'b0111: begin @@ -481,7 +504,7 @@ always @(posedge CLK) begin 4'b0001: regs_ab[0] <= ld_id; 4'b0010: regs_ab[1] <= ld_id; 4'b0011: regs_tr <= ld_id; - 4'b0100: {regs_dph,regs_dpl} <= ld_id[7:0]; + 4'b0100: {regs_dpb,regs_dph,regs_dpl} <= ld_id[9:0]; 4'b0101: regs_rp <= ld_id; // 4'b0110: regs_dr <= ld_id; 4'b0111: begin @@ -599,6 +622,7 @@ always @(posedge CLK) begin regs_sr[8] <= 0; regs_sr[7] <= 0; regs_rp <= 16'h0000; + regs_dpb <= 2'b0; regs_dph <= 4'b0; regs_dpl <= 4'b0; regs_k <= 16'b0;