From e33b2b2bc7fa654c57cb7dfbd74c34d9a23eefee Mon Sep 17 00:00:00 2001 From: Maximilian Rehkopf Date: Mon, 9 Jul 2012 01:37:57 +0200 Subject: [PATCH] FPGA: simple SNES address input filtering --- verilog/sd2snes/address.v | 31 ++++--- verilog/sd2snes/main.ucf | 144 ++++++++++++++++----------------- verilog/sd2snes/main.v | 37 +++++++-- verilog/sd2snes/msu.v | 6 +- verilog/sd2snes_cx4/address.v | 10 +-- verilog/sd2snes_cx4/main.ucf | 148 +++++++++++++++++----------------- verilog/sd2snes_cx4/main.v | 14 +++- verilog/sd2snes_cx4/msu.v | 2 +- verilog/sd2sneslite/main.ucf | 144 ++++++++++++++++----------------- verilog/sd2sneslite/main.v | 19 +++-- 10 files changed, 296 insertions(+), 259 deletions(-) diff --git a/verilog/sd2snes/address.v b/verilog/sd2snes/address.v index 58d9bb7..f8af2bb 100644 --- a/verilog/sd2snes/address.v +++ b/verilog/sd2snes/address.v @@ -194,14 +194,19 @@ assign ROM_ADDR = SRAM_SNES_ADDR; assign ROM_SEL = 1'b0; assign msu_enable_w = featurebits[FEAT_MSU1] & (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfff8) == 16'h2000)); -reg [5:0] msu_enable_r; -initial msu_enable_r = 6'b000000; -always @(posedge CLK) msu_enable_r <= {msu_enable_r[4:0], msu_enable_w}; -assign msu_enable = &msu_enable_r[5:2]; +//reg [5:0] msu_enable_r; +//initial msu_enable_r = 6'b000000; +//always @(posedge CLK) msu_enable_r <= {msu_enable_r[4:0], msu_enable_w}; +assign msu_enable = msu_enable_w /*&msu_enable_r[5:2]*/; assign use_bsx = (MAPPER == 3'b011); -assign srtc_enable = featurebits[FEAT_SRTC] & (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfffe) == 16'h2800)); +assign srtc_enable_w = (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfffe) == 16'h2800)); +//reg [5:0] srtc_enable_r; +//initial srtc_enable_r = 6'b000000; +//always @(posedge CLK) srtc_enable_r <= {srtc_enable_r[4:0], srtc_enable_w}; +assign srtc_enable = srtc_enable_w /*&srtc_enable_r[3:0]*/ & featurebits[FEAT_SRTC]; + // DSP1 LoROM: DR=30-3f:8000-bfff; SR=30-3f:c000-ffff // or DR=60-6f:0000-3fff; SR=60-6f:4000-7fff @@ -235,16 +240,16 @@ assign dspx_a0 = featurebits[FEAT_DSPX] assign dspx_dp_enable = dspx_dp_enable_w; -reg [5:0] dspx_enable_r; -initial dspx_enable_r = 6'b000000; -always @(posedge CLK) dspx_enable_r <= {dspx_enable_r[4:0], dspx_enable_w}; -assign dspx_enable = &dspx_enable_r[5:2]; +//reg [5:0] dspx_enable_r; +//initial dspx_enable_r = 6'b000000; +//always @(posedge CLK) dspx_enable_r <= {dspx_enable_r[4:0], dspx_enable_w}; +assign dspx_enable = dspx_enable_w /*&dspx_enable_r[5:1]*/; wire r213f_enable_w = (SNES_PA == 8'h3f); -reg [5:0] r213f_enable_r; -initial r213f_enable_r = 6'b000000; -always @(posedge CLK) r213f_enable_r <= {r213f_enable_r[4:0], r213f_enable_w}; -assign r213f_enable = &r213f_enable_r[5:2] & featurebits[FEAT_213F]; +//reg [5:0] r213f_enable_r; +//initial r213f_enable_r = 6'b000000; +//always @(posedge CLK) r213f_enable_r <= {r213f_enable_r[4:0], r213f_enable_w}; +assign r213f_enable = r213f_enable_w /*&r213f_enable_r[5:2]*/ & featurebits[FEAT_213F]; wire snescmd_rd_enable_w = (SNES_PA[7:4] == 4'b1111); //reg [5:0] snescmd_rd_enable_r; diff --git a/verilog/sd2snes/main.ucf b/verilog/sd2snes/main.ucf index 8aaa266..9b3ac7c 100644 --- a/verilog/sd2snes/main.ucf +++ b/verilog/sd2snes/main.ucf @@ -33,30 +33,30 @@ NET "ROM_CE" LOC = P172; NET "ROM_CE" IOSTANDARD = LVCMOS33; NET "ROM_CE" DRIVE = 8; -NET "SNES_ADDR[0]" LOC = P119; -NET "SNES_ADDR[10]" LOC = P146; -NET "SNES_ADDR[11]" LOC = P148; -NET "SNES_ADDR[12]" LOC = P147; -NET "SNES_ADDR[13]" LOC = P144; -NET "SNES_ADDR[14]" LOC = P141; -NET "SNES_ADDR[15]" LOC = P139; -NET "SNES_ADDR[16]" LOC = P137; -NET "SNES_ADDR[17]" LOC = P133; -NET "SNES_ADDR[18]" LOC = P131; -NET "SNES_ADDR[19]" LOC = P128; -NET "SNES_ADDR[1]" LOC = P122; -NET "SNES_ADDR[20]" LOC = P125; -NET "SNES_ADDR[21]" LOC = P123; -NET "SNES_ADDR[22]" LOC = P120; -NET "SNES_ADDR[23]" LOC = P117; -NET "SNES_ADDR[2]" LOC = P124; -NET "SNES_ADDR[3]" LOC = P126; -NET "SNES_ADDR[4]" LOC = P130; -NET "SNES_ADDR[5]" LOC = P132; -NET "SNES_ADDR[6]" LOC = P135; -NET "SNES_ADDR[7]" LOC = P138; -NET "SNES_ADDR[8]" LOC = P140; -NET "SNES_ADDR[9]" LOC = P143; +NET "SNES_ADDR_IN[0]" LOC = P119; +NET "SNES_ADDR_IN[10]" LOC = P146; +NET "SNES_ADDR_IN[11]" LOC = P148; +NET "SNES_ADDR_IN[12]" LOC = P147; +NET "SNES_ADDR_IN[13]" LOC = P144; +NET "SNES_ADDR_IN[14]" LOC = P141; +NET "SNES_ADDR_IN[15]" LOC = P139; +NET "SNES_ADDR_IN[16]" LOC = P137; +NET "SNES_ADDR_IN[17]" LOC = P133; +NET "SNES_ADDR_IN[18]" LOC = P131; +NET "SNES_ADDR_IN[19]" LOC = P128; +NET "SNES_ADDR_IN[1]" LOC = P122; +NET "SNES_ADDR_IN[20]" LOC = P125; +NET "SNES_ADDR_IN[21]" LOC = P123; +NET "SNES_ADDR_IN[22]" LOC = P120; +NET "SNES_ADDR_IN[23]" LOC = P117; +NET "SNES_ADDR_IN[2]" LOC = P124; +NET "SNES_ADDR_IN[3]" LOC = P126; +NET "SNES_ADDR_IN[4]" LOC = P130; +NET "SNES_ADDR_IN[5]" LOC = P132; +NET "SNES_ADDR_IN[6]" LOC = P135; +NET "SNES_ADDR_IN[7]" LOC = P138; +NET "SNES_ADDR_IN[8]" LOC = P140; +NET "SNES_ADDR_IN[9]" LOC = P143; NET "SNES_DATA[0]" LOC = P107; NET "SNES_DATA[1]" LOC = P102; NET "SNES_DATA[2]" LOC = P100; @@ -379,54 +379,54 @@ NET "ROM_WE" LOC = P190; NET "ROM_WE" IOSTANDARD = LVCMOS33; NET "ROM_WE" DRIVE = 8; -NET "SNES_ADDR[0]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[0]" DRIVE = 8; -NET "SNES_ADDR[10]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[10]" DRIVE = 8; -NET "SNES_ADDR[11]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[11]" DRIVE = 8; -NET "SNES_ADDR[12]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[12]" DRIVE = 8; -NET "SNES_ADDR[13]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[13]" DRIVE = 8; -NET "SNES_ADDR[14]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[14]" DRIVE = 8; -NET "SNES_ADDR[15]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[15]" DRIVE = 8; -NET "SNES_ADDR[16]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[16]" DRIVE = 8; -NET "SNES_ADDR[17]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[17]" DRIVE = 8; -NET "SNES_ADDR[18]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[18]" DRIVE = 8; -NET "SNES_ADDR[19]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[19]" DRIVE = 8; -NET "SNES_ADDR[1]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[1]" DRIVE = 8; -NET "SNES_ADDR[20]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[20]" DRIVE = 8; -NET "SNES_ADDR[21]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[21]" DRIVE = 8; -NET "SNES_ADDR[22]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[22]" DRIVE = 8; -NET "SNES_ADDR[23]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[23]" DRIVE = 8; -NET "SNES_ADDR[2]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[2]" DRIVE = 8; -NET "SNES_ADDR[3]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[3]" DRIVE = 8; -NET "SNES_ADDR[4]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[4]" DRIVE = 8; -NET "SNES_ADDR[5]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[5]" DRIVE = 8; -NET "SNES_ADDR[6]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[6]" DRIVE = 8; -NET "SNES_ADDR[7]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[7]" DRIVE = 8; -NET "SNES_ADDR[8]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[8]" DRIVE = 8; -NET "SNES_ADDR[9]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[9]" DRIVE = 8; +NET "SNES_ADDR_IN[0]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[0]" DRIVE = 8; +NET "SNES_ADDR_IN[10]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[10]" DRIVE = 8; +NET "SNES_ADDR_IN[11]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[11]" DRIVE = 8; +NET "SNES_ADDR_IN[12]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[12]" DRIVE = 8; +NET "SNES_ADDR_IN[13]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[13]" DRIVE = 8; +NET "SNES_ADDR_IN[14]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[14]" DRIVE = 8; +NET "SNES_ADDR_IN[15]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[15]" DRIVE = 8; +NET "SNES_ADDR_IN[16]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[16]" DRIVE = 8; +NET "SNES_ADDR_IN[17]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[17]" DRIVE = 8; +NET "SNES_ADDR_IN[18]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[18]" DRIVE = 8; +NET "SNES_ADDR_IN[19]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[19]" DRIVE = 8; +NET "SNES_ADDR_IN[1]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[1]" DRIVE = 8; +NET "SNES_ADDR_IN[20]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[20]" DRIVE = 8; +NET "SNES_ADDR_IN[21]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[21]" DRIVE = 8; +NET "SNES_ADDR_IN[22]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[22]" DRIVE = 8; +NET "SNES_ADDR_IN[23]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[23]" DRIVE = 8; +NET "SNES_ADDR_IN[2]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[2]" DRIVE = 8; +NET "SNES_ADDR_IN[3]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[3]" DRIVE = 8; +NET "SNES_ADDR_IN[4]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[4]" DRIVE = 8; +NET "SNES_ADDR_IN[5]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[5]" DRIVE = 8; +NET "SNES_ADDR_IN[6]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[6]" DRIVE = 8; +NET "SNES_ADDR_IN[7]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[7]" DRIVE = 8; +NET "SNES_ADDR_IN[8]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[8]" DRIVE = 8; +NET "SNES_ADDR_IN[9]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[9]" DRIVE = 8; NET "SNES_CPU_CLK" LOC = P95; diff --git a/verilog/sd2snes/main.v b/verilog/sd2snes/main.v index 1ab88ba..7e7a5fc 100644 --- a/verilog/sd2snes/main.v +++ b/verilog/sd2snes/main.v @@ -23,7 +23,7 @@ module main( input CLKIN, /* SNES signals */ - input [23:0] SNES_ADDR, + input [23:0] SNES_ADDR_IN, input SNES_READ, input SNES_WRITE, input SNES_CS, @@ -76,6 +76,17 @@ module main( /* debug */ output p113_out ); + +wire CLK2; + +reg [23:0] SNES_ADDR_r [2:0]; +always @(posedge CLK2) begin + SNES_ADDR_r[2] <= SNES_ADDR_r[1]; + SNES_ADDR_r[1] <= SNES_ADDR_r[0]; + SNES_ADDR_r[0] <= SNES_ADDR_IN; +end +wire [23:0] SNES_ADDR = SNES_ADDR_r[2] & SNES_ADDR_r[1]; + wire dspx_dp_enable; wire [7:0] spi_cmd_data; @@ -639,28 +650,38 @@ always @(posedge CLK2) begin end end +reg ROM_WE_1; +reg MCU_WRITE_1; + +always @(posedge CLK2) begin + ROM_WE_1 <= ROM_WE; + MCU_WRITE_1<= MCU_WRITE; +end + assign ROM_DATA[7:0] = ROM_ADDR0 - ?(SD_DMA_TO_ROM ? (!MCU_WRITE ? MCU_DOUT : 8'bZ) - : (!ROM_WE ? ROM_DOUTr : 8'bZ) + ?(SD_DMA_TO_ROM ? (!MCU_WRITE_1 ? MCU_DOUT : 8'bZ) + /*: ((~SNES_WRITE & (IS_WRITABLE | IS_FLASHWR)) ? SNES_DATA */ + : (ROM_DOUT_ENr ? ROM_DOUTr : 8'bZ) //) ) :8'bZ; assign ROM_DATA[15:8] = ROM_ADDR0 ? 8'bZ - :(SD_DMA_TO_ROM ? (!MCU_WRITE ? MCU_DOUT : 8'bZ) - : (!ROM_WE ? ROM_DOUTr : 8'bZ) + :(SD_DMA_TO_ROM ? (!MCU_WRITE_1 ? MCU_DOUT : 8'bZ) + /*: ((~SNES_WRITE & (IS_WRITABLE | IS_FLASHWR)) ? SNES_DATA */ + : (ROM_DOUT_ENr ? ROM_DOUTr : 8'bZ) //) ); assign ROM_WE = SD_DMA_TO_ROM ?MCU_WRITE - :ROM_WEr | (ASSERT_SNES_ADDR & ~snes_wr_cycle); + :/*(SNES_FAKE_CLK & (IS_WRITABLE | IS_FLASHWR)) ? SNES_WRITE :*/ ROM_WEr; // OE always active. Overridden by WE when needed. assign ROM_OE = 1'b0; assign ROM_CE = 1'b0; -assign ROM_BHE = !ROM_WE ? ROM_ADDR0 : 1'b0; -assign ROM_BLE = !ROM_WE ? !ROM_ADDR0 : 1'b0; +assign ROM_BHE = /*(~SD_DMA_TO_ROM & ~ROM_WE & ~ROM_SA) ?*/ ROM_ADDR0 /*: 1'b0*/; +assign ROM_BLE = /*(~SD_DMA_TO_ROM & ~ROM_WE & ~ROM_SA) ?*/ !ROM_ADDR0 /*: 1'b0*/; assign SNES_DATABUS_OE = (dspx_enable | dspx_dp_enable) ? 1'b0 : msu_enable ? 1'b0 : diff --git a/verilog/sd2snes/msu.v b/verilog/sd2snes/msu.v index 32b106a..213d285 100644 --- a/verilog/sd2snes/msu.v +++ b/verilog/sd2snes/msu.v @@ -124,8 +124,8 @@ reg [7:0] data_out_r; assign reg_data_out = data_out_r; always @(posedge clkin) begin - case(reg_addr_r[3]) - 3'h0: data_out_r <= {data_busy_r, audio_busy_r, audio_status_r, 4'b0001}; + case(reg_addr_r[1]) + 3'h0: data_out_r <= {data_busy_r, audio_busy_r, audio_status_r, audio_error_r, 3'b001}; 3'h1: data_out_r <= msu_data; 3'h2: data_out_r <= 8'h53; 3'h3: data_out_r <= 8'h2d; @@ -138,7 +138,7 @@ end always @(posedge clkin) begin if(reg_we_rising) begin - case(reg_addr_r[3]) + case(reg_addr_r[1]) 3'h0: addr_out_r[7:0] <= reg_data_in; 3'h1: addr_out_r[15:8] <= reg_data_in; 3'h2: addr_out_r[23:16] <= reg_data_in; diff --git a/verilog/sd2snes_cx4/address.v b/verilog/sd2snes_cx4/address.v index dd9331e..1e3a823 100644 --- a/verilog/sd2snes_cx4/address.v +++ b/verilog/sd2snes_cx4/address.v @@ -56,16 +56,10 @@ assign ROM_ADDR = SRAM_SNES_ADDR; assign ROM_SEL = 1'b0; wire msu_enable_w = use_msu1 & (!SNES_ADDR[22] && ((SNES_ADDR[15:0] & 16'hfff8) == 16'h2000)); -reg [5:0] msu_enable_r; -initial msu_enable_r = 6'b000000; -always @(posedge CLK) msu_enable_r <= {msu_enable_r[4:0], msu_enable_w}; -assign msu_enable = &msu_enable_r[5:2]; +assign msu_enable = msu_enable_w; wire cx4_enable_w = (!SNES_ADDR[22] && (SNES_ADDR[15:13] == 3'b011)); -reg [5:0] cx4_enable_r; -initial cx4_enable_r = 6'b000000; -always @(posedge CLK) cx4_enable_r <= {cx4_enable_r[4:0], cx4_enable_w}; -assign cx4_enable = &cx4_enable_r[5:2]; +assign cx4_enable = cx4_enable_w; assign cx4_vect_enable = &SNES_ADDR[15:5]; diff --git a/verilog/sd2snes_cx4/main.ucf b/verilog/sd2snes_cx4/main.ucf index 0a2a7e4..d764a86 100644 --- a/verilog/sd2snes_cx4/main.ucf +++ b/verilog/sd2snes_cx4/main.ucf @@ -35,30 +35,30 @@ NET "ROM_CE" LOC = P172; NET "ROM_CE" IOSTANDARD = LVCMOS33; NET "ROM_CE" DRIVE = 8; -NET "SNES_ADDR[0]" LOC = P119; -NET "SNES_ADDR[10]" LOC = P146; -NET "SNES_ADDR[11]" LOC = P148; -NET "SNES_ADDR[12]" LOC = P147; -NET "SNES_ADDR[13]" LOC = P144; -NET "SNES_ADDR[14]" LOC = P141; -NET "SNES_ADDR[15]" LOC = P139; -NET "SNES_ADDR[16]" LOC = P137; -NET "SNES_ADDR[17]" LOC = P133; -NET "SNES_ADDR[18]" LOC = P131; -NET "SNES_ADDR[19]" LOC = P128; -NET "SNES_ADDR[1]" LOC = P122; -NET "SNES_ADDR[20]" LOC = P125; -NET "SNES_ADDR[21]" LOC = P123; -NET "SNES_ADDR[22]" LOC = P120; -NET "SNES_ADDR[23]" LOC = P117; -NET "SNES_ADDR[2]" LOC = P124; -NET "SNES_ADDR[3]" LOC = P126; -NET "SNES_ADDR[4]" LOC = P130; -NET "SNES_ADDR[5]" LOC = P132; -NET "SNES_ADDR[6]" LOC = P135; -NET "SNES_ADDR[7]" LOC = P138; -NET "SNES_ADDR[8]" LOC = P140; -NET "SNES_ADDR[9]" LOC = P143; +NET "SNES_ADDR_IN[0]" LOC = P119; +NET "SNES_ADDR_IN[10]" LOC = P146; +NET "SNES_ADDR_IN[11]" LOC = P148; +NET "SNES_ADDR_IN[12]" LOC = P147; +NET "SNES_ADDR_IN[13]" LOC = P144; +NET "SNES_ADDR_IN[14]" LOC = P141; +NET "SNES_ADDR_IN[15]" LOC = P139; +NET "SNES_ADDR_IN[16]" LOC = P137; +NET "SNES_ADDR_IN[17]" LOC = P133; +NET "SNES_ADDR_IN[18]" LOC = P131; +NET "SNES_ADDR_IN[19]" LOC = P128; +NET "SNES_ADDR_IN[1]" LOC = P122; +NET "SNES_ADDR_IN[20]" LOC = P125; +NET "SNES_ADDR_IN[21]" LOC = P123; +NET "SNES_ADDR_IN[22]" LOC = P120; +NET "SNES_ADDR_IN[23]" LOC = P117; +NET "SNES_ADDR_IN[2]" LOC = P124; +NET "SNES_ADDR_IN[3]" LOC = P126; +NET "SNES_ADDR_IN[4]" LOC = P130; +NET "SNES_ADDR_IN[5]" LOC = P132; +NET "SNES_ADDR_IN[6]" LOC = P135; +NET "SNES_ADDR_IN[7]" LOC = P138; +NET "SNES_ADDR_IN[8]" LOC = P140; +NET "SNES_ADDR_IN[9]" LOC = P143; NET "SNES_DATA[0]" LOC = P107; NET "SNES_DATA[1]" LOC = P102; NET "SNES_DATA[2]" LOC = P100; @@ -381,54 +381,54 @@ NET "ROM_WE" LOC = P190; NET "ROM_WE" IOSTANDARD = LVCMOS33; NET "ROM_WE" DRIVE = 8; -NET "SNES_ADDR[0]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[0]" DRIVE = 8; -NET "SNES_ADDR[10]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[10]" DRIVE = 8; -NET "SNES_ADDR[11]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[11]" DRIVE = 8; -NET "SNES_ADDR[12]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[12]" DRIVE = 8; -NET "SNES_ADDR[13]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[13]" DRIVE = 8; -NET "SNES_ADDR[14]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[14]" DRIVE = 8; -NET "SNES_ADDR[15]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[15]" DRIVE = 8; -NET "SNES_ADDR[16]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[16]" DRIVE = 8; -NET "SNES_ADDR[17]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[17]" DRIVE = 8; -NET "SNES_ADDR[18]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[18]" DRIVE = 8; -NET "SNES_ADDR[19]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[19]" DRIVE = 8; -NET "SNES_ADDR[1]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[1]" DRIVE = 8; -NET "SNES_ADDR[20]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[20]" DRIVE = 8; -NET "SNES_ADDR[21]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[21]" DRIVE = 8; -NET "SNES_ADDR[22]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[22]" DRIVE = 8; -NET "SNES_ADDR[23]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[23]" DRIVE = 8; -NET "SNES_ADDR[2]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[2]" DRIVE = 8; -NET "SNES_ADDR[3]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[3]" DRIVE = 8; -NET "SNES_ADDR[4]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[4]" DRIVE = 8; -NET "SNES_ADDR[5]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[5]" DRIVE = 8; -NET "SNES_ADDR[6]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[6]" DRIVE = 8; -NET "SNES_ADDR[7]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[7]" DRIVE = 8; -NET "SNES_ADDR[8]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[8]" DRIVE = 8; -NET "SNES_ADDR[9]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[9]" DRIVE = 8; +NET "SNES_ADDR_IN[0]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[0]" DRIVE = 8; +NET "SNES_ADDR_IN[10]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[10]" DRIVE = 8; +NET "SNES_ADDR_IN[11]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[11]" DRIVE = 8; +NET "SNES_ADDR_IN[12]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[12]" DRIVE = 8; +NET "SNES_ADDR_IN[13]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[13]" DRIVE = 8; +NET "SNES_ADDR_IN[14]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[14]" DRIVE = 8; +NET "SNES_ADDR_IN[15]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[15]" DRIVE = 8; +NET "SNES_ADDR_IN[16]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[16]" DRIVE = 8; +NET "SNES_ADDR_IN[17]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[17]" DRIVE = 8; +NET "SNES_ADDR_IN[18]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[18]" DRIVE = 8; +NET "SNES_ADDR_IN[19]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[19]" DRIVE = 8; +NET "SNES_ADDR_IN[1]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[1]" DRIVE = 8; +NET "SNES_ADDR_IN[20]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[20]" DRIVE = 8; +NET "SNES_ADDR_IN[21]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[21]" DRIVE = 8; +NET "SNES_ADDR_IN[22]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[22]" DRIVE = 8; +NET "SNES_ADDR_IN[23]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[23]" DRIVE = 8; +NET "SNES_ADDR_IN[2]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[2]" DRIVE = 8; +NET "SNES_ADDR_IN[3]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[3]" DRIVE = 8; +NET "SNES_ADDR_IN[4]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[4]" DRIVE = 8; +NET "SNES_ADDR_IN[5]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[5]" DRIVE = 8; +NET "SNES_ADDR_IN[6]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[6]" DRIVE = 8; +NET "SNES_ADDR_IN[7]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[7]" DRIVE = 8; +NET "SNES_ADDR_IN[8]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[8]" DRIVE = 8; +NET "SNES_ADDR_IN[9]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[9]" DRIVE = 8; NET "SNES_CPU_CLK" LOC = P95; @@ -546,8 +546,8 @@ NET "SNES_SYSCLK" LOC = P180; NET "SNES_SYSCLK" IOSTANDARD = LVCMOS33; #Created by Constraints Editor (xc3s400-pq208-4) - 2011/10/28 TIMEGRP "msu_track_out_r" = FFS("snes_msu/track_out_r<0>") FFS("snes_msu/track_out_r<1>") FFS("snes_msu/track_out_r<2>") FFS("snes_msu/track_out_r<3>") FFS("snes_msu/track_out_r<4>") FFS("snes_msu/track_out_r<5>") FFS("snes_msu/track_out_r<6>") FFS("snes_msu/track_out_r<7>") FFS("snes_msu/track_out_r<8>") FFS("snes_msu/track_out_r<9>") FFS("snes_msu/track_out_r<10>") FFS("snes_msu/track_out_r<11>") FFS("snes_msu/track_out_r<12>") FFS("snes_msu/track_out_r<13>") FFS("snes_msu/track_out_r<14>") FFS("snes_msu/track_out_r<15>"); -TIMEGRP "msu_addr_r" = FFS("snes_msu/addr_out_r<0>") FFS("snes_msu/addr_out_r<1>") FFS("snes_msu/addr_out_r<2>") FFS("snes_msu/addr_out_r<3>") FFS("snes_msu/addr_out_r<4>") FFS("snes_msu/addr_out_r<5>") FFS("snes_msu/addr_out_r<6>") FFS("snes_msu/addr_out_r<7>") FFS("snes_msu/addr_out_r<8>") FFS("snes_msu/addr_out_r<9>") FFS("snes_msu/addr_out_r<10>") FFS("snes_msu/addr_out_r<11>") FFS("snes_msu/addr_out_r<12>") FFS("snes_msu/addr_out_r<13>") FFS("snes_msu/addr_out_r<14>") FFS("snes_msu/addr_out_r<15>") FFS("snes_msu/addr_out_r<16>") FFS("snes_msu/addr_out_r<17>") FFS("snes_msu/addr_out_r<18>") FFS("snes_msu/addr_out_r<19>") FFS("snes_msu/addr_out_r<20>") FFS("snes_msu/addr_out_r<21>") FFS("snes_msu/addr_out_r<22>") FFS("snes_msu/addr_out_r<23>") FFS("snes_msu/addr_out_r<24>") FFS("snes_msu/addr_out_r<25>") FFS("snes_msu/addr_out_r<26>") FFS("snes_msu/addr_out_r<27>") FFS("snes_msu/addr_out_r<28>") FFS("snes_msu/addr_out_r<29>") FFS("snes_msu/addr_out_r<30>") FFS("snes_msu/addr_out_r<31>"); -TIMEGRP "mcu_cmd_msu_addr_out" = FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<0>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<1>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<2>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<3>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<4>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<5>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<6>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<7>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<8>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<9>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<10>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<11>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<12>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<13>"); +# TIMEGRP "msu_addr_r" = FFS("snes_msu/addr_out_r<0>") FFS("snes_msu/addr_out_r<1>") FFS("snes_msu/addr_out_r<2>") FFS("snes_msu/addr_out_r<3>") FFS("snes_msu/addr_out_r<4>") FFS("snes_msu/addr_out_r<5>") FFS("snes_msu/addr_out_r<6>") FFS("snes_msu/addr_out_r<7>") FFS("snes_msu/addr_out_r<8>") FFS("snes_msu/addr_out_r<9>") FFS("snes_msu/addr_out_r<10>") FFS("snes_msu/addr_out_r<11>") FFS("snes_msu/addr_out_r<12>") FFS("snes_msu/addr_out_r<13>") FFS("snes_msu/addr_out_r<14>") FFS("snes_msu/addr_out_r<15>") FFS("snes_msu/addr_out_r<16>") FFS("snes_msu/addr_out_r<17>") FFS("snes_msu/addr_out_r<18>") FFS("snes_msu/addr_out_r<19>") FFS("snes_msu/addr_out_r<20>") FFS("snes_msu/addr_out_r<21>") FFS("snes_msu/addr_out_r<22>") FFS("snes_msu/addr_out_r<23>") FFS("snes_msu/addr_out_r<24>") FFS("snes_msu/addr_out_r<25>") FFS("snes_msu/addr_out_r<26>") FFS("snes_msu/addr_out_r<27>") FFS("snes_msu/addr_out_r<28>") FFS("snes_msu/addr_out_r<29>") FFS("snes_msu/addr_out_r<30>") FFS("snes_msu/addr_out_r<31>"); +# TIMEGRP "mcu_cmd_msu_addr_out" = FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<0>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<1>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<2>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<3>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<4>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<5>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<6>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<7>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<8>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<9>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<10>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<11>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<12>") FFS("snes_mcu_cmd/MSU_ADDR_OUT_BUF<13>"); TIMEGRP "cx4_cache_src_addr" = FFS("snes_cx4/CACHE_SRC_ADDRr<0>") FFS("snes_cx4/CACHE_SRC_ADDRr<1>") FFS("snes_cx4/CACHE_SRC_ADDRr<2>") FFS("snes_cx4/CACHE_SRC_ADDRr<3>") FFS("snes_cx4/CACHE_SRC_ADDRr<4>") FFS("snes_cx4/CACHE_SRC_ADDRr<5>") FFS("snes_cx4/CACHE_SRC_ADDRr<6>") FFS("snes_cx4/CACHE_SRC_ADDRr<7>") FFS("snes_cx4/CACHE_SRC_ADDRr<8>") FFS("snes_cx4/CACHE_SRC_ADDRr<9>") FFS("snes_cx4/CACHE_SRC_ADDRr<10>") FFS("snes_cx4/CACHE_SRC_ADDRr<11>") FFS("snes_cx4/CACHE_SRC_ADDRr<12>") FFS("snes_cx4/CACHE_SRC_ADDRr<13>") FFS("snes_cx4/CACHE_SRC_ADDRr<14>") FFS("snes_cx4/CACHE_SRC_ADDRr<15>") FFS("snes_cx4/CACHE_SRC_ADDRr<16>") FFS("snes_cx4/CACHE_SRC_ADDRr<17>") FFS("snes_cx4/CACHE_SRC_ADDRr<18>") FFS("snes_cx4/CACHE_SRC_ADDRr<19>") FFS("snes_cx4/CACHE_SRC_ADDRr<20>") FFS("snes_cx4/CACHE_SRC_ADDRr<21>") FFS("snes_cx4/CACHE_SRC_ADDRr<22>") FFS("snes_cx4/CACHE_SRC_ADDRr<23>"); TIMEGRP "cx4_cpu_busaddr" = FFS("snes_cx4/cpu_busaddr<0>") FFS("snes_cx4/cpu_busaddr<1>") FFS("snes_cx4/cpu_busaddr<2>") FFS("snes_cx4/cpu_busaddr<3>") FFS("snes_cx4/cpu_busaddr<4>") FFS("snes_cx4/cpu_busaddr<5>") FFS("snes_cx4/cpu_busaddr<6>") FFS("snes_cx4/cpu_busaddr<7>") FFS("snes_cx4/cpu_busaddr<8>") FFS("snes_cx4/cpu_busaddr<9>") FFS("snes_cx4/cpu_busaddr<10>") FFS("snes_cx4/cpu_busaddr<11>") FFS("snes_cx4/cpu_busaddr<12>") FFS("snes_cx4/cpu_busaddr<13>") FFS("snes_cx4/cpu_busaddr<14>") FFS("snes_cx4/cpu_busaddr<15>") FFS("snes_cx4/cpu_busaddr<16>") FFS("snes_cx4/cpu_busaddr<17>") FFS("snes_cx4/cpu_busaddr<18>") FFS("snes_cx4/cpu_busaddr<19>") FFS("snes_cx4/cpu_busaddr<20>") FFS("snes_cx4/cpu_busaddr<21>") FFS("snes_cx4/cpu_busaddr<22>") FFS("snes_cx4/cpu_busaddr<23>"); TIMEGRP "cx4_cpu_ramaddr" = FFS("snes_cx4/cpu_ramaddr<0>") FFS("snes_cx4/cpu_ramaddr<1>") FFS("snes_cx4/cpu_ramaddr<2>") FFS("snes_cx4/cpu_ramaddr<3>") FFS("snes_cx4/cpu_ramaddr<4>") FFS("snes_cx4/cpu_ramaddr<5>") FFS("snes_cx4/cpu_ramaddr<6>") FFS("snes_cx4/cpu_ramaddr<7>") FFS("snes_cx4/cpu_ramaddr<8>") FFS("snes_cx4/cpu_ramaddr<9>") FFS("snes_cx4/cpu_ramaddr<10>") FFS("snes_cx4/cpu_ramaddr<11>") FFS("snes_cx4/cpu_ramaddr<12>") FFS("snes_cx4/cpu_ramaddr<13>") FFS("snes_cx4/cpu_ramaddr<14>") FFS("snes_cx4/cpu_ramaddr<15>") FFS("snes_cx4/cpu_ramaddr<16>") FFS("snes_cx4/cpu_ramaddr<17>") FFS("snes_cx4/cpu_ramaddr<18>") FFS("snes_cx4/cpu_ramaddr<19>") FFS("snes_cx4/cpu_ramaddr<20>") FFS("snes_cx4/cpu_ramaddr<21>") FFS("snes_cx4/cpu_ramaddr<22>") FFS("snes_cx4/cpu_ramaddr<23>"); diff --git a/verilog/sd2snes_cx4/main.v b/verilog/sd2snes_cx4/main.v index fd97aa6..283293c 100644 --- a/verilog/sd2snes_cx4/main.v +++ b/verilog/sd2snes_cx4/main.v @@ -23,7 +23,7 @@ module main( input CLKIN, /* SNES signals */ - input [23:0] SNES_ADDR, + input [23:0] SNES_ADDR_IN, input SNES_READ, input SNES_WRITE, input SNES_CS, @@ -38,7 +38,7 @@ module main( input [7:0] SNES_PA, input SNES_PARD, input SNES_PAWR, - + /* SRAM signals */ /* Bus 1: PSRAM, 128Mbit, 16bit, 70ns */ inout [15:0] ROM_DATA, @@ -77,6 +77,16 @@ module main( output p113_out ); +wire CLK2; + +reg [23:0] SNES_ADDR_r [2:0]; +always @(posedge CLK2) begin + SNES_ADDR_r[2] <= SNES_ADDR_r[1]; + SNES_ADDR_r[1] <= SNES_ADDR_r[0]; + SNES_ADDR_r[0] <= SNES_ADDR_IN; +end +wire [23:0] SNES_ADDR = SNES_ADDR_r[2] & SNES_ADDR_r[1]; + wire [7:0] spi_cmd_data; wire [7:0] spi_param_data; wire [7:0] spi_input_data; diff --git a/verilog/sd2snes_cx4/msu.v b/verilog/sd2snes_cx4/msu.v index 32b106a..2cf3711 100644 --- a/verilog/sd2snes_cx4/msu.v +++ b/verilog/sd2snes_cx4/msu.v @@ -138,7 +138,7 @@ end always @(posedge clkin) begin if(reg_we_rising) begin - case(reg_addr_r[3]) + case(reg_addr_r[1]) 3'h0: addr_out_r[7:0] <= reg_data_in; 3'h1: addr_out_r[15:8] <= reg_data_in; 3'h2: addr_out_r[23:16] <= reg_data_in; diff --git a/verilog/sd2sneslite/main.ucf b/verilog/sd2sneslite/main.ucf index 284bcc8..3ccab02 100644 --- a/verilog/sd2sneslite/main.ucf +++ b/verilog/sd2sneslite/main.ucf @@ -34,30 +34,30 @@ NET "ROM_CE" LOC = P172; NET "ROM_CE" IOSTANDARD = LVCMOS33; NET "ROM_CE" DRIVE = 8; -NET "SNES_ADDR[0]" LOC = P119; -NET "SNES_ADDR[10]" LOC = P146; -NET "SNES_ADDR[11]" LOC = P148; -NET "SNES_ADDR[12]" LOC = P147; -NET "SNES_ADDR[13]" LOC = P144; -NET "SNES_ADDR[14]" LOC = P141; -NET "SNES_ADDR[15]" LOC = P139; -NET "SNES_ADDR[16]" LOC = P137; -NET "SNES_ADDR[17]" LOC = P133; -NET "SNES_ADDR[18]" LOC = P131; -NET "SNES_ADDR[19]" LOC = P128; -NET "SNES_ADDR[1]" LOC = P122; -NET "SNES_ADDR[20]" LOC = P125; -NET "SNES_ADDR[21]" LOC = P123; -NET "SNES_ADDR[22]" LOC = P120; -NET "SNES_ADDR[23]" LOC = P117; -NET "SNES_ADDR[2]" LOC = P124; -NET "SNES_ADDR[3]" LOC = P126; -NET "SNES_ADDR[4]" LOC = P130; -NET "SNES_ADDR[5]" LOC = P132; -NET "SNES_ADDR[6]" LOC = P135; -NET "SNES_ADDR[7]" LOC = P138; -NET "SNES_ADDR[8]" LOC = P140; -NET "SNES_ADDR[9]" LOC = P143; +NET "SNES_ADDR_IN[0]" LOC = P119; +NET "SNES_ADDR_IN[10]" LOC = P146; +NET "SNES_ADDR_IN[11]" LOC = P148; +NET "SNES_ADDR_IN[12]" LOC = P147; +NET "SNES_ADDR_IN[13]" LOC = P144; +NET "SNES_ADDR_IN[14]" LOC = P141; +NET "SNES_ADDR_IN[15]" LOC = P139; +NET "SNES_ADDR_IN[16]" LOC = P137; +NET "SNES_ADDR_IN[17]" LOC = P133; +NET "SNES_ADDR_IN[18]" LOC = P131; +NET "SNES_ADDR_IN[19]" LOC = P128; +NET "SNES_ADDR_IN[1]" LOC = P122; +NET "SNES_ADDR_IN[20]" LOC = P125; +NET "SNES_ADDR_IN[21]" LOC = P123; +NET "SNES_ADDR_IN[22]" LOC = P120; +NET "SNES_ADDR_IN[23]" LOC = P117; +NET "SNES_ADDR_IN[2]" LOC = P124; +NET "SNES_ADDR_IN[3]" LOC = P126; +NET "SNES_ADDR_IN[4]" LOC = P130; +NET "SNES_ADDR_IN[5]" LOC = P132; +NET "SNES_ADDR_IN[6]" LOC = P135; +NET "SNES_ADDR_IN[7]" LOC = P138; +NET "SNES_ADDR_IN[8]" LOC = P140; +NET "SNES_ADDR_IN[9]" LOC = P143; NET "SNES_DATA[0]" LOC = P107; NET "SNES_DATA[1]" LOC = P102; NET "SNES_DATA[2]" LOC = P100; @@ -380,54 +380,54 @@ NET "ROM_WE" LOC = P190; NET "ROM_WE" IOSTANDARD = LVCMOS33; NET "ROM_WE" DRIVE = 8; -NET "SNES_ADDR[0]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[0]" DRIVE = 8; -NET "SNES_ADDR[10]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[10]" DRIVE = 8; -NET "SNES_ADDR[11]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[11]" DRIVE = 8; -NET "SNES_ADDR[12]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[12]" DRIVE = 8; -NET "SNES_ADDR[13]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[13]" DRIVE = 8; -NET "SNES_ADDR[14]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[14]" DRIVE = 8; -NET "SNES_ADDR[15]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[15]" DRIVE = 8; -NET "SNES_ADDR[16]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[16]" DRIVE = 8; -NET "SNES_ADDR[17]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[17]" DRIVE = 8; -NET "SNES_ADDR[18]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[18]" DRIVE = 8; -NET "SNES_ADDR[19]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[19]" DRIVE = 8; -NET "SNES_ADDR[1]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[1]" DRIVE = 8; -NET "SNES_ADDR[20]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[20]" DRIVE = 8; -NET "SNES_ADDR[21]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[21]" DRIVE = 8; -NET "SNES_ADDR[22]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[22]" DRIVE = 8; -NET "SNES_ADDR[23]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[23]" DRIVE = 8; -NET "SNES_ADDR[2]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[2]" DRIVE = 8; -NET "SNES_ADDR[3]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[3]" DRIVE = 8; -NET "SNES_ADDR[4]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[4]" DRIVE = 8; -NET "SNES_ADDR[5]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[5]" DRIVE = 8; -NET "SNES_ADDR[6]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[6]" DRIVE = 8; -NET "SNES_ADDR[7]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[7]" DRIVE = 8; -NET "SNES_ADDR[8]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[8]" DRIVE = 8; -NET "SNES_ADDR[9]" IOSTANDARD = LVCMOS33; -NET "SNES_ADDR[9]" DRIVE = 8; +NET "SNES_ADDR_IN[0]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[0]" DRIVE = 8; +NET "SNES_ADDR_IN[10]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[10]" DRIVE = 8; +NET "SNES_ADDR_IN[11]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[11]" DRIVE = 8; +NET "SNES_ADDR_IN[12]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[12]" DRIVE = 8; +NET "SNES_ADDR_IN[13]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[13]" DRIVE = 8; +NET "SNES_ADDR_IN[14]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[14]" DRIVE = 8; +NET "SNES_ADDR_IN[15]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[15]" DRIVE = 8; +NET "SNES_ADDR_IN[16]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[16]" DRIVE = 8; +NET "SNES_ADDR_IN[17]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[17]" DRIVE = 8; +NET "SNES_ADDR_IN[18]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[18]" DRIVE = 8; +NET "SNES_ADDR_IN[19]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[19]" DRIVE = 8; +NET "SNES_ADDR_IN[1]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[1]" DRIVE = 8; +NET "SNES_ADDR_IN[20]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[20]" DRIVE = 8; +NET "SNES_ADDR_IN[21]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[21]" DRIVE = 8; +NET "SNES_ADDR_IN[22]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[22]" DRIVE = 8; +NET "SNES_ADDR_IN[23]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[23]" DRIVE = 8; +NET "SNES_ADDR_IN[2]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[2]" DRIVE = 8; +NET "SNES_ADDR_IN[3]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[3]" DRIVE = 8; +NET "SNES_ADDR_IN[4]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[4]" DRIVE = 8; +NET "SNES_ADDR_IN[5]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[5]" DRIVE = 8; +NET "SNES_ADDR_IN[6]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[6]" DRIVE = 8; +NET "SNES_ADDR_IN[7]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[7]" DRIVE = 8; +NET "SNES_ADDR_IN[8]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[8]" DRIVE = 8; +NET "SNES_ADDR_IN[9]" IOSTANDARD = LVCMOS33; +NET "SNES_ADDR_IN[9]" DRIVE = 8; NET "SNES_CPU_CLK" LOC = P95; diff --git a/verilog/sd2sneslite/main.v b/verilog/sd2sneslite/main.v index 0e2dbf7..5b08d75 100644 --- a/verilog/sd2sneslite/main.v +++ b/verilog/sd2sneslite/main.v @@ -23,7 +23,7 @@ module main( input CLKIN, /* SNES signals */ - input [23:0] SNES_ADDR, + input [23:0] SNES_ADDR_IN, input SNES_READ, input SNES_WRITE, input SNES_CS, @@ -73,12 +73,19 @@ module main( output p113_out ); -assign DAC_MCLK = 1'b0; -assign DAC_LRCK = 1'b0; -assign DAC_SDOUT = 1'b0; +assign DAC_MCLK = 0; +assign DAC_LRCK = 0; +assign DAC_SDOUT = 0; -assign SD_CMD = 1'bZ; -assign SD_CLK = 1'bZ; +wire CLK2; + +reg [23:0] SNES_ADDR_r [2:0]; +always @(posedge CLK2) begin + SNES_ADDR_r[2] <= SNES_ADDR_r[1]; + SNES_ADDR_r[1] <= SNES_ADDR_r[0]; + SNES_ADDR_r[0] <= SNES_ADDR_IN; +end +wire [23:0] SNES_ADDR = SNES_ADDR_r[2] & SNES_ADDR_r[1]; wire [7:0] spi_cmd_data; wire [7:0] spi_param_data;