diff --git a/verilog/sd2snes/address.v b/verilog/sd2snes/address.v index eb755e9..2cda379 100644 --- a/verilog/sd2snes/address.v +++ b/verilog/sd2snes/address.v @@ -52,7 +52,9 @@ wire [23:0] SRAM_ADDR_FULL; 000 HiROM 001 LoROM 010 ExHiROM (48-64Mbit) - 011 BS-X + 011 BS-X + 100 DSPx (HiROM - 00-0f:6000-7fff) + 101 DSPx (LoROM - 30-3f:8000-ffff) 110 brainfuck interleaved 96MBit Star Ocean =) 111 menu (ROM in upper SRAM) */ @@ -66,28 +68,30 @@ assign IS_ROM = ( (MAPPER == 3'b000) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) |(SNES_ADDR[22])) : (MAPPER == 3'b010) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) |(SNES_ADDR[22])) - : (MAPPER == 3'b011) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) - |(SNES_ADDR[22])) - : (MAPPER == 3'b110) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) - |(SNES_ADDR[22])) + : (MAPPER == 3'b011) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) + |(SNES_ADDR[22])) + : (MAPPER == 3'b100) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) + |(SNES_ADDR[22])) + : (MAPPER == 3'b101) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) + |(SNES_ADDR[22])) + : (MAPPER == 3'b110) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) + |(SNES_ADDR[22])) : (MAPPER == 3'b111) ? ((!SNES_ADDR[22] & SNES_ADDR[15]) |(SNES_ADDR[22])) : 1'b0); -assign IS_SAVERAM = ((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b110 || MAPPER == 3'b111) ? (!SNES_ADDR[22] - & SNES_ADDR[21:20] +assign IS_SAVERAM = ((MAPPER == 3'b000 || MAPPER == 3'b010 || MAPPER == 3'b100 || MAPPER == 3'b110 || MAPPER == 3'b111) ? (!SNES_ADDR[22] + & &SNES_ADDR[21:20] & &SNES_ADDR[14:13] & !SNES_ADDR[15] - & SNES_CS ) /* LoROM: SRAM @ Bank 0x70-0x7d, 0xf0-0xfd Offset 0000-7fff TODO: 0000-ffff for small ROMs */ - :(MAPPER == 3'b001) ? (&SNES_ADDR[22:20] + :(MAPPER == 3'b001 || MAPPER == 3'b101) ? (&SNES_ADDR[22:20] & (SNES_ADDR[19:16] < 4'b1110) - & !SNES_ADDR[15] - & !SNES_CS) + & !SNES_ADDR[15]) /* BS-X: SRAM @ Bank 0x10-0x17 Offset 5000-5fff */ :(MAPPER == 3'b011) ? ((SNES_ADDR[23:19] == 5'b00010) @@ -118,10 +122,10 @@ assign IS_WRITABLE = IS_SAVERAM | ( */ assign SRAM_ADDR_FULL = (MODE) ? MCU_ADDR - : ((MAPPER == 3'b000) ? + : ((MAPPER[1:0] == 2'b00) ? (IS_SAVERAM ? 24'hE00000 + ((SNES_ADDR[14:0] - 15'h6000) & SAVERAM_MASK) : ({1'b0, SNES_ADDR[22:0]} & ROM_MASK)) - :(MAPPER == 3'b001) ? + :(MAPPER[1:0] == 2'b01) ? (IS_SAVERAM ? 24'hE00000 + (SNES_ADDR[14:0] & SAVERAM_MASK) : ({2'b00, SNES_ADDR[22:16], SNES_ADDR[14:0]} & ROM_MASK)) :(MAPPER == 3'b010) ? @@ -156,8 +160,20 @@ assign use_bsx = (MAPPER == 3'b011); assign srtc_enable = (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfffe) == 16'h2800)); -// DSP1 1mb lorom: DR=20-3f:8000-bfff; SR=20-3f:c000-ffff -assign dspx_enable = (MAPPER == 3'b001) && (!SNES_ADDR[22] && SNES_ADDR[21] && (SNES_ADDR[15] == 1'b1)); -assign dspx_a0 = SNES_ADDR[14]; +// DSP1 LoROM: DR=30-3f:8000-bfff; SR=30-3f:c000-ffff +// or DR=60-6f:0000-3fff; SR=60-6f:4000-7fff +// DSP1 HiROM: DR=00-0f:6000-6fff; SR=00-0f:7000-7fff +assign dspx_enable = + (MAPPER == 3'b101) ? + (ROM_MASK[20] ? + (SNES_ADDR[22] & SNES_ADDR[21] & ~SNES_ADDR[20] & ~SNES_ADDR[15]) + :(~SNES_ADDR[22] & SNES_ADDR[21] & SNES_ADDR[20] & SNES_ADDR[15]) + ) + :(MAPPER == 3'b100) ? + (~SNES_ADDR[22] & ~SNES_ADDR[21] & ~SNES_ADDR[20] & &SNES_ADDR[14:13]/* & CS */) + :1'b0; +assign dspx_a0 = (MAPPER == 3'b101) ? SNES_ADDR[14] + :(MAPPER == 3'b100) ? SNES_ADDR[12] + :1'b1; endmodule diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.v b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.v index 96c7b56..7d09e28 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.v +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.v @@ -39,13 +39,21 @@ module upd77c25_datrom( clka, + wea, addra, - douta + dina, + clkb, + addrb, + doutb ); input clka; +input [0 : 0] wea; input [9 : 0] addra; -output [15 : 0] douta; +input [15 : 0] dina; +input clkb; +input [9 : 0] addrb; +output [15 : 0] doutb; // synthesis translate_off @@ -57,7 +65,7 @@ output [15 : 0] douta; .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), @@ -81,7 +89,7 @@ output [15 : 0] douta; .C_INITB_VAL("0"), .C_INTERFACE_TYPE(0), .C_LOAD_INIT_FILE(1), - .C_MEM_TYPE(3), + .C_MEM_TYPE(1), .C_MUX_PIPELINE_STAGES(0), .C_PRIM_TYPE(1), .C_READ_DEPTH_A(1024), @@ -111,21 +119,21 @@ output [15 : 0] douta; ) inst ( .CLKA(clka), + .WEA(wea), .ADDRA(addra), - .DOUTA(douta), + .DINA(dina), + .CLKB(clkb), + .ADDRB(addrb), + .DOUTB(doutb), .RSTA(), .ENA(), .REGCEA(), - .WEA(), - .DINA(), - .CLKB(), + .DOUTA(), .RSTB(), .ENB(), .REGCEB(), .WEB(), - .ADDRB(), .DINB(), - .DOUTB(), .INJECTSBITERR(), .INJECTDBITERR(), .SBITERR(), diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xco b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xco index 5c48fdb..60283e6 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xco +++ b/verilog/sd2snes/ipcore_dir/upd77c25_datrom.xco @@ -1,7 +1,7 @@ ############################################################## # # Xilinx Core Generator version 13.1 -# Date: Thu Jun 2 00:42:40 2011 +# Date: Thu Jun 9 10:19:40 2011 # ############################################################## # @@ -37,12 +37,12 @@ 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 CSET byte_size=9 -CSET coe_file=/home/ikari/prj/sd2snes/verilog/sd2snes/dsp1b_datrom.coe +CSET coe_file=/home/ikari/prj/sd2snes/verilog/sd2snes/dsp4_dat.coe CSET collision_warnings=ALL CSET component_name=upd77c25_datrom CSET disable_collision_warnings=false @@ -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=true -CSET memory_type=Single_Port_ROM +CSET memory_type=Simple_Dual_Port_RAM CSET operating_mode_a=WRITE_FIRST CSET operating_mode_b=WRITE_FIRST CSET output_reset_value_a=0 @@ -63,9 +63,9 @@ CSET output_reset_value_b=0 CSET pipeline_stages=0 CSET port_a_clock=100 CSET port_a_enable_rate=100 -CSET port_a_write_rate=0 -CSET port_b_clock=0 -CSET port_b_enable_rate=0 +CSET port_a_write_rate=50 +CSET port_b_clock=100 +CSET port_b_enable_rate=100 CSET port_b_write_rate=0 CSET primitive=8kx2 CSET read_width_a=16 @@ -98,4 +98,4 @@ CSET write_width_b=16 MISC pkg_timestamp=2011-02-03T22:20:43.000Z # END Extra information GENERATE -# CRC: d64159b2 +# CRC: 9cef39ed diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.v b/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.v index 483030c..ae2e83a 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.v +++ b/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.v @@ -111,8 +111,8 @@ output [23 : 0] doutb; .C_WEB_WIDTH(1), .C_WRITE_DEPTH_A(2048), .C_WRITE_DEPTH_B(2048), - .C_WRITE_MODE_A("NO_CHANGE"), - .C_WRITE_MODE_B("NO_CHANGE"), + .C_WRITE_MODE_A("WRITE_FIRST"), + .C_WRITE_MODE_B("WRITE_FIRST"), .C_WRITE_WIDTH_A(24), .C_WRITE_WIDTH_B(24), .C_XDEVICEFAMILY("spartan3") diff --git a/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.xco b/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.xco index c0b1aa0..d3288bc 100644 --- a/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.xco +++ b/verilog/sd2snes/ipcore_dir/upd77c25_pgmrom.xco @@ -1,7 +1,7 @@ ############################################################## # # Xilinx Core Generator version 13.1 -# Date: Tue May 31 20:54:32 2011 +# Date: Thu Jun 9 08:57:56 2011 # ############################################################## # @@ -20,7 +20,7 @@ SET createndf = false SET designentry = Advanced SET device = xc3s400 SET devicefamily = spartan3 -SET flowvendor = Foundation_ISE +SET flowvendor = Other SET formalverification = false SET foundationsym = false SET implementationfiletype = Ngc @@ -42,7 +42,7 @@ CSET axi_id_width=4 CSET axi_slave_type=Memory_Slave CSET axi_type=AXI4_Full CSET byte_size=9 -CSET coe_file=/home/ikari/prj/sd2snes/verilog/sd2snes/dsp1b_pgmrom.coe +CSET coe_file=/home/ikari/prj/sd2snes/verilog/sd2snes/dsp4_pgm.coe CSET collision_warnings=ALL CSET component_name=upd77c25_pgmrom CSET disable_collision_warnings=false @@ -56,8 +56,8 @@ CSET fill_remaining_memory_locations=false CSET interface_type=Native CSET load_init_file=true CSET memory_type=Simple_Dual_Port_RAM -CSET operating_mode_a=NO_CHANGE -CSET operating_mode_b=NO_CHANGE +CSET operating_mode_a=WRITE_FIRST +CSET operating_mode_b=WRITE_FIRST CSET output_reset_value_a=0 CSET output_reset_value_b=0 CSET pipeline_stages=0 @@ -98,4 +98,4 @@ CSET write_width_b=24 MISC pkg_timestamp=2011-02-03T22:20:43.000Z # END Extra information GENERATE -# CRC: f1fd9704 +# CRC: 85a39b6f diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index ed5e611..893d9fd 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -121,6 +121,14 @@ wire [7:0] SRTC_SNES_DATA_OUT; wire [7:0] DSPX_SNES_DATA_IN; wire [7:0] DSPX_SNES_DATA_OUT; +wire [23:0] dspx_pgm_data; +wire [10:0] dspx_pgm_addr; +wire dspx_pgm_we; + +wire [15:0] dspx_dat_data; +wire [9:0] dspx_dat_addr; +wire dspx_dat_we; + //wire SD_DMA_EN; //SPI_DMA_CTRL; sd_dma snes_sd_dma(.CLK(CLK2), @@ -238,14 +246,14 @@ upd77c25 snes_dspx ( .nCS(~dspx_enable), .nRD(SNES_READ), .nWR(SNES_WRITE), - .RST(1'b1 /* XXX DSPX_RST*/), + .RST(~dspx_reset), .CLK(CLK2), - .PGM_WR(DSPX_PGM_WR), - .PGM_DI(DSPX_PGM_DI), - .PGM_WR_ADDR(DSPX_PGM_WR_ADDR), - .DAT_WR(DSPX_DAT_WR), - .DAT_DI(DSPX_DAT_DI), - .DAT_WR_ADDR(DSPX_DAT_WR_ADDR) + .PGM_WR(dspx_pgm_we), + .PGM_DI(dspx_pgm_data), + .PGM_WR_ADDR(dspx_pgm_addr), + .DAT_WR(dspx_dat_we), + .DAT_DI(dspx_dat_data), + .DAT_WR_ADDR(dspx_dat_addr) ); mcu_cmd snes_mcu_cmd( @@ -299,7 +307,14 @@ mcu_cmd snes_mcu_cmd( .bsx_regs_reset_we(bsx_regs_reset_we), .rtc_data_out(rtc_data_in), .rtc_pgm_we(rtc_pgm_we), - .srtc_reset(srtc_reset) + .srtc_reset(srtc_reset), + .dspx_pgm_data_out(dspx_pgm_data), + .dspx_pgm_addr_out(dspx_pgm_addr), + .dspx_pgm_we_out(dspx_pgm_we), + .dspx_dat_data_out(dspx_dat_data), + .dspx_dat_addr_out(dspx_dat_addr), + .dspx_dat_we_out(dspx_dat_we), + .dspx_reset_out(dspx_reset) ); // dcm1: dfs 4x @@ -689,7 +704,8 @@ 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 = msu_enable ? (SNES_READ & SNES_WRITE) : +assign SNES_DATABUS_OE = dspx_enable ? 1'b0 : + msu_enable ? (SNES_READ & SNES_WRITE) : bsx_data_ovr ? (SNES_READ & SNES_WRITE) : srtc_enable ? (SNES_READ & SNES_WRITE) : ((IS_ROM & SNES_CS) | (!IS_ROM & !IS_SAVERAM & !IS_WRITABLE & !IS_FLASHWR) | (SNES_READ & SNES_WRITE)); assign SNES_DATABUS_DIR = !SNES_READ ? 1'b1 : 1'b0; diff --git a/verilog/sd2snes/mcu_cmd.v b/verilog/sd2snes/mcu_cmd.v index c335a67..ca984a8 100644 --- a/verilog/sd2snes/mcu_cmd.v +++ b/verilog/sd2snes/mcu_cmd.v @@ -82,11 +82,27 @@ module mcu_cmd( // S-RTC output srtc_reset, - + + // uPD77C25 + output reg [23:0] dspx_pgm_data_out, + output reg [10:0] dspx_pgm_addr_out, + output reg dspx_pgm_we_out, + + output reg [15:0] dspx_dat_data_out, + output reg [9:0] dspx_dat_addr_out, + output reg dspx_dat_we_out, + + output reg dspx_reset_out, + // SNES sync/clk input snes_sysclk - ); +); +initial begin + dspx_pgm_addr_out = 11'b00000000000; + dspx_dat_addr_out = 9'b000000000; + dspx_reset_out = 1'b1; +end wire [31:0] snes_sysclk_freq; @@ -172,6 +188,7 @@ initial begin DAC_VOL_LATCH_BUF = 0; spi_dma_nextaddr_r = 0; SD_DMA_ENr = 0; + MAPPER_BUF = 1; end // command interpretation @@ -346,7 +363,41 @@ always @(posedge clk) begin srtc_reset_buf <= 1'b0; end endcase + 8'he8: begin// reset DSPx PGM+DAT address + case (spi_byte_cnt) + 32'h2: begin + dspx_pgm_addr_out <= 11'b00000000000; + dspx_dat_addr_out <= 9'b000000000; + end + endcase + end + 8'he9:// write DSPx PGM w/ increment + case (spi_byte_cnt) + 32'h2: dspx_pgm_data_out[23:16] <= param_data[7:0]; + 32'h3: dspx_pgm_data_out[15:8] <= param_data[7:0]; + 32'h4: dspx_pgm_data_out[7:0] <= param_data[7:0]; + 32'h5: dspx_pgm_we_out <= 1'b1; + 32'h6: begin + dspx_pgm_we_out <= 1'b0; + dspx_pgm_addr_out <= dspx_pgm_addr_out + 1; + end + endcase + 8'hea:// write DSPx DAT w/ increment + case (spi_byte_cnt) + 32'h2: dspx_dat_data_out[15:8] <= param_data[7:0]; + 32'h3: dspx_dat_data_out[7:0] <= param_data[7:0]; + 32'h4: dspx_dat_we_out <= 1'b1; + 32'h5: begin + dspx_dat_we_out <= 1'b0; + dspx_dat_addr_out <= dspx_dat_addr_out + 1; + end + endcase + 8'heb: // put DSPx into reset + dspx_reset_out <= 1'b1; + 8'hec: // release DSPx reset + dspx_reset_out <= 1'b0; endcase + end if (SD_DMA_NEXTADDR | (mcu_nextaddr & (cmd_data[7:5] == 3'h4) && (cmd_data[3]) && (spi_byte_cnt > (32'h1+cmd_data[4])))) begin case (SD_DMA_TGTr) diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise index 4cb9517..b2bc485 100644 --- a/verilog/sd2snes/sd2snes.xise +++ b/verilog/sd2snes/sd2snes.xise @@ -9,132 +9,145 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + - + - - - - + - + - + + + + + + + - - - - - - + - @@ -146,7 +159,6 @@ - @@ -157,10 +169,8 @@ - - @@ -170,49 +180,36 @@ - + - - - - - - - - - - + - - + + - - - - @@ -223,34 +220,26 @@ - - - + + - + - + - - - - - - - + + - - @@ -258,47 +247,35 @@ - + - - - - - - - - + + + - - - - - - - + - - + + - - - + + @@ -307,14 +284,10 @@ - - - - - - + + @@ -328,33 +301,27 @@ - - - - - - + + - - - - - - + + + + @@ -362,70 +329,54 @@ - - - - - + - - + - - - - - - - - + - - + - - - - - - - + + + + + + - - @@ -439,34 +390,29 @@ - - - - + + + + + + - - - - + + - - - - - + - @@ -475,7 +421,6 @@ - @@ -484,56 +429,49 @@ - - - - + - - - - - - - - - + + - - + + + - + - - + + - + + + diff --git a/verilog/sd2snes/upd77c25.v b/verilog/sd2snes/upd77c25.v index 270d2e8..530ad2d 100644 --- a/verilog/sd2snes/upd77c25.v +++ b/verilog/sd2snes/upd77c25.v @@ -13,7 +13,7 @@ // Dependencies: // // Revision: -// Revision 0.1 - core fully operational, no firmware download +// Revision 0.2 - core fully operational, firmware download // ////////////////////////////////////////////////////////////////////////////////// module upd77c25( @@ -78,10 +78,15 @@ wire [10:0] pgm_addra; wire [23:0] pgm_dina; wire [23:0] pgm_doutb; -pgmrom pgmrom ( - .clka(CLK), - .addra(pc), // Bus [10 : 0] - .douta(pgm_doutb)); // Bus [23 : 0] +upd77c25_pgmrom pgmrom ( + .clka(CLK), // input clka + .wea(PGM_WR), // input [0 : 0] wea + .addra(PGM_WR_ADDR), // input [10 : 0] addra + .dina(PGM_DI), // input [23 : 0] dina + .clkb(CLK), // input clkb + .addrb(pc), // input [10 : 0] addrb + .doutb(pgm_doutb) // output [23 : 0] doutb +); wire [23:0] opcode_w = pgm_doutb; reg [23:0] opcode; @@ -100,9 +105,14 @@ wire [15:0] dat_dina; wire [15:0] dat_doutb; upd77c25_datrom datrom ( - .clka(CLK), - .addra(regs_rp), // Bus [9 : 0] - .douta(dat_doutb)); // Bus [15 : 0] + .clka(CLK), // input clka + .wea(DAT_WR), // input [0 : 0] wea + .addra(DAT_WR_ADDR), // input [9 : 0] addra + .dina(DAT_DI), // input [15 : 0] dina + .clkb(CLK), // input clkb + .addrb(regs_rp), // input [9 : 0] addrb + .doutb(dat_doutb) // output [15 : 0] doutb +); wire [15:0] ram_douta; wire [7:0] ram_addra; @@ -149,14 +159,14 @@ reg [15:0] idb; reg [15:0] regs_ab [1:0]; -/*assign DR = regs_dr; +assign DR = regs_dr; assign SR = regs_sr; assign PC = pc; assign A = regs_ab[0]; assign B = regs_ab[1]; assign FL_A = {flags_s1[0],flags_s0[0],flags_c[0],flags_z[0],flags_ov1[0],flags_ov0[0]}; assign FL_B = {flags_s1[1],flags_s0[1],flags_c[1],flags_z[1],flags_ov1[1],flags_ov0[1]}; -*/ + initial begin alu_store = 2'b11; @@ -186,22 +196,25 @@ always @(posedge CLK) begin end +reg [5:0] reg_nCS_sreg; +initial reg_nCS_sreg = 6'b111111; +always @(posedge CLK) reg_nCS_sreg <= {reg_nCS_sreg[4: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_falling = !nCS && (reg_oe_sreg[3:0] == 4'b1110); +wire reg_oe_falling = !nCS && (reg_oe_sreg[3:0] == 4'b1000); -reg [3:0] reg_we_sreg; -initial reg_we_sreg = 4'b1111; -always @(posedge CLK) reg_we_sreg <= {reg_we_sreg[2:0], nWR}; -wire reg_we_rising = !nCS && (reg_we_sreg[3:0] == 4'b0001); +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 = !nCS && (reg_we_sreg[5:0] == 6'b000001); always @(posedge CLK) begin if(RST) begin if((op_src == 4'b1000 && op[1] == 1'b0 && insn_state == 3'b011) || (op_dst == 4'b0110 && op != 2'b10 && insn_state == 3'b011)) regs_sr[SR_RQM] <= 1'b1; - else if(reg_we_rising && A0 == 1'b0) begin + if((reg_we_rising) && (A0 == 1'b0)) begin if(!regs_sr[SR_DRC]) begin if(regs_sr[SR_DRS] == 1'b1) begin regs_sr[SR_RQM] <= 1'b0; @@ -209,9 +222,10 @@ always @(posedge CLK) begin end else begin regs_sr[SR_RQM] <= 1'b0; end - end else if(reg_oe_falling) begin - case(A0) - 1'b0: begin + end + else if(reg_oe_falling && (A0 == 1'b0)) begin +// case(A0) +// 1'b0: begin if(!regs_sr[SR_DRC]) begin if(regs_sr[SR_DRS] == 1'b1) begin regs_sr[SR_RQM] <= 1'b0; @@ -219,9 +233,9 @@ always @(posedge CLK) begin end else begin regs_sr[SR_RQM] <= 1'b0; end - end - endcase - end +// end +// endcase + end end else begin regs_sr[SR_RQM] <= 1'b0; end @@ -229,31 +243,62 @@ end always @(posedge CLK) begin if(RST) begin - if(ld_dst == 4'b0110 && insn_state == 3'b011) begin - if (op == I_OP || op == I_RT) regs_dr <= idb; - else if (op == I_LD) regs_dr <= ld_id; - end - else if(reg_we_rising && A0 == 1'b0) begin + if(reg_we_rising && (A0 == 1'b0)) begin if(!regs_sr[SR_DRC]) begin if(regs_sr[SR_DRS] == 1'b0) begin regs_sr[SR_DRS] <= 1'b1; - regs_dr[7:0] <= DI; end else begin regs_sr[SR_DRS] <= 1'b0; - regs_dr[15:8] <= DI; end - end else begin - regs_dr[7:0] <= DI; - end + end end else if(reg_oe_falling) begin case(A0) 1'b0: begin if(!regs_sr[SR_DRC]) begin if(regs_sr[SR_DRS] == 1'b0) begin regs_sr[SR_DRS] <= 1'b1; - DO <= regs_dr[7:0]; end else begin regs_sr[SR_DRS] <= 1'b0; + end + end + end + endcase + end + end else begin + regs_sr[SR_DRS] <= 1'b0; + end +end + +always @(posedge CLK) begin + if(RST) begin + if(reg_we_rising && (A0 == 1'b0)) begin + if(!regs_sr[SR_DRC]) begin + if(regs_sr[SR_DRS] == 1'b0) begin + regs_dr[7:0] <= DI; + end else begin + regs_dr[15:8] <= DI; + end + end else begin + regs_dr[7:0] <= DI; + end + end else if(ld_dst == 4'b0110 && insn_state == 3'b011) begin + if (op == I_OP || op == I_RT) regs_dr <= idb; + else if (op == I_LD) regs_dr <= ld_id; + end + end else begin + regs_dr <= 16'h0000; + end +end + +always @(posedge CLK) begin + if(RST) begin + if(reg_oe_falling) begin + case(A0) + 1'b0: begin + if(!regs_sr[SR_DRC]) begin + if(regs_sr[SR_DRS] == 1'b0) begin + DO <= regs_dr[7:0]; + end else begin DO <= regs_dr[15:8]; end end else begin @@ -264,8 +309,6 @@ always @(posedge CLK) begin endcase end end else begin - regs_sr[SR_DRS] <= 1'b0; - regs_dr <= 16'h0000; DO <= 8'h00; end end @@ -285,7 +328,7 @@ always @(posedge CLK) begin op_rpdcr <= opcode_w[8]; op_src <= opcode_w[7:4]; op_dst <= opcode_w[3:0]; - jp_brch = opcode_w[21:13]; + jp_brch <= opcode_w[21:13]; jp_na <= opcode_w[12:2]; ld_id <= opcode_w[21:6]; @@ -579,6 +622,21 @@ always @(posedge CLK) begin flags_s1 <= 2'b0; regs_tr <= 16'b0; regs_trb <= 16'b0; + opcode <= 23'b0; + op_pselect <= 2'b0; + op_alu <= 4'b0; + op_asl <= 1'b0; + op_dpl <= 2'b0; + op_dphm <= 4'b0; + op_rpdcr <= 1'b0; + op_src <= 4'b0; + op_dst <= 4'b0; + jp_brch <= 9'b0; + jp_na <= 11'b0; + ld_id <= 16'b0; + ld_dst <= 4'b0; + regs_m <= 16'b0; + regs_n <= 16'b0; end end