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