diff --git a/verilog/sd2snes/avr_cmd.v b/verilog/sd2snes/avr_cmd.v index 5065213..fe986e9 100644 --- a/verilog/sd2snes/avr_cmd.v +++ b/verilog/sd2snes/avr_cmd.v @@ -67,9 +67,24 @@ module mcu_cmd( output msu_status_reset_we, input [31:0] msu_addressrq, input [15:0] msu_trackrq, - input [7:0] msu_volumerq + input [7:0] msu_volumerq, + output [13:0] msu_ptr_out, + output msu_reset_out, + + // SNES sync/clk + input snes_sysclk ); + +wire [31:0] snes_sysclk_freq; + +clk_test snes_clk_test ( + .clk(clk), + .sysclk(snes_sysclk), + .snes_sysclk_freq(snes_sysclk_freq) + ); + + reg [3:0] MAPPER_BUF; reg [3:0] SRAM_SIZE_BUF; reg MCU_READ_BUF; @@ -81,9 +96,14 @@ reg DAC_VOL_LATCH_BUF; reg DAC_PLAY_OUT_BUF; reg DAC_RESET_OUT_BUF; reg [13:0] MSU_ADDR_OUT_BUF; +reg [13:0] MSU_PTR_OUT_BUF; reg [5:0] msu_status_set_out_buf; reg [5:0] msu_status_reset_out_buf; reg msu_status_reset_we_buf; +reg MSU_RESET_OUT_BUF; + +reg [31:0] SNES_SYSCLK_FREQ_BUF; + reg [7:0] MCU_DATA_OUT_BUF; reg [7:0] MCU_DATA_IN_BUF; reg [1:0] mcu_nextaddr_buf; @@ -248,6 +268,19 @@ always @(posedge clk) begin 32'h3: DAC_RESET_OUT_BUF <= 1'b0; endcase + 8'he4: // reset MSU read buffer pointer + case (spi_byte_cnt) + 32'h2: begin + MSU_PTR_OUT_BUF[13:8] <= param_data[5:0]; + MSU_PTR_OUT_BUF[7:0] <= 8'h0; + end + 32'h3: begin + MSU_PTR_OUT_BUF[7:0] <= param_data; + MSU_RESET_OUT_BUF <= 1'b1; + end + 32'h4: + MSU_RESET_OUT_BUF <= 1'b0; + endcase endcase end if (SD_DMA_NEXTADDR | (mcu_nextaddr & (cmd_data[7:5] == 3'h4) && (cmd_data[0]) && (spi_byte_cnt > (32'h1+cmd_data[4])))) begin @@ -284,13 +317,26 @@ always @(posedge clk) begin endcase else if (cmd_data[7:0] == 8'hF3) case (spi_byte_cnt) - 23'h1: + 32'h1: MCU_DATA_IN_BUF <= msu_trackrq[15:8]; - 23'h2: + 32'h2: MCU_DATA_IN_BUF <= msu_trackrq[7:0]; endcase else if (cmd_data[7:0] == 8'hF4) MCU_DATA_IN_BUF <= msu_volumerq; + else if (cmd_data[7:0] == 8'hFE) + case (spi_byte_cnt) + 32'h1: + SNES_SYSCLK_FREQ_BUF <= snes_sysclk_freq; + 32'h2: + MCU_DATA_IN_BUF <= SNES_SYSCLK_FREQ_BUF[31:24]; + 32'h3: + MCU_DATA_IN_BUF <= SNES_SYSCLK_FREQ_BUF[23:16]; + 32'h4: + MCU_DATA_IN_BUF <= SNES_SYSCLK_FREQ_BUF[15:8]; + 32'h5: + MCU_DATA_IN_BUF <= SNES_SYSCLK_FREQ_BUF[7:0]; + endcase else if (cmd_data[7:0] == 8'hFF) MCU_DATA_IN_BUF <= param_data; else if (cmd_data[7:4] == 4'h8) @@ -339,10 +385,12 @@ assign dac_reset_out = DAC_RESET_OUT_BUF; assign msu_status_reset_we = msu_status_reset_we_buf; assign msu_status_reset_out = msu_status_reset_out_buf; assign msu_status_set_out = msu_status_set_out_buf; +assign msu_reset_out = MSU_RESET_OUT_BUF; +assign msu_ptr_out = MSU_PTR_OUT_BUF; assign mcu_data_out = SD_DMA_STATUS ? SD_DMA_SRAM_DATA : MCU_DATA_OUT_BUF; assign mcu_mapper = MAPPER_BUF; assign mcu_sram_size = SRAM_SIZE_BUF; assign rom_mask_out = ROM_MASK; assign saveram_mask_out = SAVERAM_MASK; - + endmodule diff --git a/verilog/sd2snes/clk_test.v b/verilog/sd2snes/clk_test.v new file mode 100644 index 0000000..10b54cf --- /dev/null +++ b/verilog/sd2snes/clk_test.v @@ -0,0 +1,52 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 22:40:46 12/20/2010 +// Design Name: +// Module Name: clk_test +// Project Name: +// Target Devices: +// Tool versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// +module clk_test( + input clk, + input sysclk, + output [31:0] snes_sysclk_freq + ); + +reg [31:0] snes_sysclk_freq_r; +assign snes_sysclk_freq = snes_sysclk_freq_r; + +reg [31:0] sysclk_counter; +reg [31:0] sysclk_value; + +initial snes_sysclk_freq_r = 32'hFFFFFFFF; +initial sysclk_counter = 0; +initial sysclk_value = 0; + +reg [1:0] sysclk_sreg; +always @(posedge clk) sysclk_sreg <= {sysclk_sreg[0], sysclk}; +wire sysclk_rising = (sysclk_sreg == 2'b01); + +always @(posedge clk) begin + if(sysclk_counter < 90315789) begin + sysclk_counter <= sysclk_counter + 1; + if(sysclk_rising) sysclk_value <= sysclk_value + 1; + end else begin + snes_sysclk_freq_r <= sysclk_value; + sysclk_counter <= 0; + sysclk_value <= 0; + end +end + +endmodule diff --git a/verilog/sd2snes/dac_test.v b/verilog/sd2snes/dac_test.v index b268eec..40d16d8 100644 --- a/verilog/sd2snes/dac_test.v +++ b/verilog/sd2snes/dac_test.v @@ -90,7 +90,7 @@ initial begin vol_valid = 1'b0; vol_latch_reg = 1'b0; vol_reg = 8'h0; - vol_target_reg = 8'h0; + vol_target_reg = 8'hff; samples <= 16'h0; end diff --git a/verilog/sd2snes/ipcore_dir/dac_buf.xise b/verilog/sd2snes/ipcore_dir/dac_buf.xise index 7c8d125..31cc58d 100644 --- a/verilog/sd2snes/ipcore_dir/dac_buf.xise +++ b/verilog/sd2snes/ipcore_dir/dac_buf.xise @@ -36,330 +36,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - diff --git a/verilog/sd2snes/main.ucf b/verilog/sd2snes/main.ucf index b0d7ce1..0afd06b 100644 --- a/verilog/sd2snes/main.ucf +++ b/verilog/sd2snes/main.ucf @@ -510,3 +510,6 @@ NET "SD_DAT[0]" IOSTANDARD = LVCMOS33; NET "SD_DAT[1]" IOSTANDARD = LVCMOS33; NET "SD_DAT[2]" IOSTANDARD = LVCMOS33; NET "SD_DAT[3]" IOSTANDARD = LVCMOS33; + +NET "SNES_SYSCLK" LOC = P180; +NET "SNES_SYSCLK" IOSTANDARD = LVCMOS33; \ No newline at end of file diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index fac4ee3..cfc5dda 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -34,6 +34,7 @@ module main( output SNES_DATABUS_OE, output SNES_DATABUS_DIR, output IRQ_DIR, + input SNES_SYSCLK, /* SRAM signals */ inout [15:0] ROM_DATA, @@ -89,7 +90,8 @@ wire [7:0] msu_volumerq_out; wire [6:0] msu_status_out; wire [31:0] msu_addressrq_out; wire [15:0] msu_trackrq_out; -wire [13:0] msu_addr; +wire [13:0] msu_write_addr; +wire [13:0] msu_ptr_addr; wire [7:0] MSU_SNES_DATA_IN; wire [7:0] MSU_SNES_DATA_OUT; wire [5:0] msu_status_reset_bits; @@ -128,7 +130,7 @@ dac_test snes_dac_test(.clkin(CLK2), msu snes_msu ( .clkin(CLK2), .enable(msu_enable), - .pgm_address(msu_addr), + .pgm_address(msu_write_addr), .pgm_data(SD_DMA_SRAM_DATA), .pgm_we(SD_DMA_TGT==2'b10 ? SD_DMA_SRAM_WE : 1'b1), .reg_addr(SNES_ADDR), @@ -143,7 +145,9 @@ msu snes_msu ( .track_out(msu_trackrq_out), .status_reset_bits(msu_status_reset_bits), .status_set_bits(msu_status_set_bits), - .status_reset_we(msu_status_reset_we) + .status_reset_we(msu_status_reset_we), + .msu_address_ext(msu_ptr_addr), + .msu_address_ext_write(msu_addr_reset) ); spi snes_spi(.clk(CLK2), @@ -164,6 +168,7 @@ spi snes_spi(.clk(CLK2), mcu_cmd snes_mcu_cmd( .clk(CLK2), + .snes_sysclk(SNES_SYSCLK), .cmd_ready(spi_cmd_ready), .param_ready(spi_param_ready), .cmd_data(spi_cmd_data), @@ -197,14 +202,16 @@ mcu_cmd snes_mcu_cmd( // .dac_volume_latch_out(dac_vol_latch), .dac_play_out(dac_play), .dac_reset_out(dac_reset), - .msu_addr_out(msu_addr), + .msu_addr_out(msu_write_addr), .MSU_STATUS(msu_status_out), .msu_status_reset_out(msu_status_reset_bits), .msu_status_set_out(msu_status_set_bits), .msu_status_reset_we(msu_status_reset_we), .msu_volumerq(msu_volumerq_out), .msu_addressrq(msu_addressrq_out), - .msu_trackrq(msu_trackrq_out) + .msu_trackrq(msu_trackrq_out), + .msu_ptr_out(msu_ptr_addr), + .msu_reset_out(msu_addr_reset) ); // dcm1: dfs 4x diff --git a/verilog/sd2snes/msu.v b/verilog/sd2snes/msu.v index 26a2eab..cbaeef9 100644 --- a/verilog/sd2snes/msu.v +++ b/verilog/sd2snes/msu.v @@ -36,7 +36,9 @@ module msu( output [15:0] track_out, input [5:0] status_reset_bits, input [5:0] status_set_bits, - input status_reset_we + input status_reset_we, + input [13:0] msu_address_ext, + input msu_address_ext_write ); reg [1:0] status_reset_we_r; @@ -49,9 +51,13 @@ wire [13:0] msu_address = msu_address_r; wire [7:0] msu_data; reg [7:0] msu_data_r; +reg [1:0] msu_address_ext_write_sreg; +always @(posedge clkin) msu_address_ext_write_sreg <= {msu_address_ext_write_sreg[0], msu_address_ext_write}; +wire msu_address_ext_write_rising = (msu_address_ext_write_sreg[1:0] == 2'b01); + reg [5:0] reg_oe_sreg; always @(posedge clkin) reg_oe_sreg <= {reg_oe_sreg[4:0], reg_oe}; -wire reg_oe_falling = (reg_oe_sreg[5:0] == 6'b111110); +wire reg_oe_falling = (reg_oe_sreg[5:0] == 6'b100000); wire reg_oe_rising = (reg_oe_sreg[5:0] == 6'b000001); reg [1:0] reg_we_sreg; @@ -86,7 +92,7 @@ end assign status_out = {msu_address_r[13], audio_start_r, data_start_r, volume_start_r, audio_ctrl_r, ctrl_start_r}; -initial msu_address_r = 14'h0000; +initial msu_address_r = 14'h1234; msu_databuf snes_msu_databuf ( .clka(clkin), @@ -165,7 +171,9 @@ always @(posedge clkin) begin end always @(posedge clkin) begin - if(reg_oe_falling && enable && reg_addr == 3'h1) begin + if(msu_address_ext_write_rising) + msu_address_r <= msu_address_ext; + else if(enable && reg_addr == 3'h1 && reg_oe_falling) begin msu_address_r <= msu_address_r + 1; msu_data_r <= msu_data; end diff --git a/verilog/sd2snes/sd2snes.xise b/verilog/sd2snes/sd2snes.xise index c777896..06f4f6b 100644 --- a/verilog/sd2snes/sd2snes.xise +++ b/verilog/sd2snes/sd2snes.xise @@ -62,6 +62,10 @@ + + + + diff --git a/verilog/sd2snes/sd_dma.v b/verilog/sd2snes/sd_dma.v index 0f0397a..1a0b3d0 100644 --- a/verilog/sd2snes/sd_dma.v +++ b/verilog/sd2snes/sd_dma.v @@ -118,7 +118,7 @@ always @(posedge CLK) begin SD_DMA_NEXTADDRr <= 1'b0; // 3'h2: 3'h3: - if(cyclecnt>=SD_DMA_STARTr && cyclecnt <= SD_DMA_ENDr) SD_DMA_SRAM_WEr <= 1'b0; + if(cyclecnt>=SD_DMA_STARTr && cyclecnt < SD_DMA_ENDr) SD_DMA_SRAM_WEr <= 1'b0; 3'h4: SD_DMA_SRAM_DATAr[3:0] <= SD_DAT; // 3'h5: