From dc26fdfd5374a43a2be29e961e2480b0ad6e58b2 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 5 Jan 2020 06:15:21 +0800 Subject: [PATCH 1/4] Update sys. --- sys/hps_io.v | 9 +++++++++ sys/sys_top.v | 25 +++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/sys/hps_io.v b/sys/hps_io.v index acef6b4..f70929f 100644 --- a/sys/hps_io.v +++ b/sys/hps_io.v @@ -58,6 +58,9 @@ module hps_io #(parameter STRLEN=0, PS2DIV=0, WIDE=0, VDNUM=1, PS2WE=0) input status_set, input [15:0] status_menumask, + input info_req, + input [7:0] info, + //toggle to force notify of video mode change input new_vmode, @@ -220,6 +223,8 @@ always@(posedge clk_sys) begin reg old_status_set = 0; reg [7:0] cd_req = 0; reg old_cd = 0; + reg old_info = 0; + reg [7:0] info_n = 0; old_status_set <= status_set; if(~old_status_set & status_set) begin @@ -227,6 +232,9 @@ always@(posedge clk_sys) begin status_req <= status_in; end + old_info <= info_req; + if(~old_info & info_req) info_n <= info; + old_cd <= cd_in[48]; if(old_cd ^ cd_in[48]) cd_req <= cd_req + 1'd1; @@ -273,6 +281,7 @@ always@(posedge clk_sys) begin 'h2F: io_dout <= 1; 'h32: io_dout <= gamma_bus[21]; 'h34: io_dout <= cd_req; + 'h36: begin io_dout <= info_n; info_n <= 0; end endcase sd_buff_addr <= 0; diff --git a/sys/sys_top.v b/sys/sys_top.v index 6997370..b13e287 100644 --- a/sys/sys_top.v +++ b/sys/sys_top.v @@ -266,6 +266,7 @@ reg [15:0] cfg; reg cfg_got = 0; reg cfg_set = 0; +wire vga_fb = cfg[12]; wire [1:0] hdmi_limited = {cfg[11],cfg[8]}; wire direct_video = cfg[10]; wire dvi_mode = cfg[7]; @@ -835,6 +836,9 @@ osd hdmi_osd .osd_status(osd_status) ); +wire hdmi_cs_osd; +csync csync_hdmi(clk_hdmi, hdmi_hs_osd, hdmi_vs_osd, hdmi_cs_osd); + reg [23:0] dv_data; reg dv_hs, dv_vs, dv_de; always @(posedge clk_vid) begin @@ -879,7 +883,7 @@ end wire hdmi_tx_clk; cyclonev_clkselect hdmi_clk_sw ( - .clkselect({1'b1, direct_video}), + .clkselect({1'b1, ~vga_fb & direct_video}), .inclk({clk_vid, hdmi_clk_out, 2'b00}), .outclk(hdmi_tx_clk) ); @@ -918,10 +922,10 @@ always @(posedge hdmi_tx_clk) begin reg hs,vs,de; reg [23:0] d; - hs <= direct_video ? dv_hs : hdmi_hs_osd; - vs <= direct_video ? dv_vs : hdmi_vs_osd; - de <= direct_video ? dv_de : hdmi_de_osd; - d <= direct_video ? dv_data : hdmi_data_osd; + hs <= (~vga_fb & direct_video) ? dv_hs : (direct_video & csync_en) ? hdmi_cs_osd : hdmi_hs_osd; + vs <= (~vga_fb & direct_video) ? dv_vs : hdmi_vs_osd; + de <= (~vga_fb & direct_video) ? dv_de : hdmi_de_osd; + d <= (~vga_fb & direct_video) ? dv_data : hdmi_data_osd; hdmi_out_hs <= hs; hdmi_out_vs <= vs; @@ -985,15 +989,12 @@ csync csync_vga(clk_vid, vga_hs_osd, vga_vs_osd, vga_cs_osd); .ypbpr_full(0), .ypbpr_en(ypbpr_en), .dout(vga_o), - .din(vga_scaler ? {24{hdmi_de_osd}} & hdmi_data_osd : vga_data_osd) + .din((vga_fb | vga_scaler) ? {24{hdmi_de_osd}} & hdmi_data_osd : vga_data_osd) ); - wire hdmi_cs_osd; - csync csync_hdmi(clk_hdmi, hdmi_hs_osd, hdmi_vs_osd, hdmi_cs_osd); - - wire vs1 = vga_scaler ? hdmi_vs_osd : vga_vs_osd; - wire hs1 = vga_scaler ? hdmi_hs_osd : vga_hs_osd; - wire cs1 = vga_scaler ? hdmi_cs_osd : vga_cs_osd; + wire vs1 = (vga_fb | vga_scaler) ? hdmi_vs_osd : vga_vs_osd; + wire hs1 = (vga_fb | vga_scaler) ? hdmi_hs_osd : vga_hs_osd; + wire cs1 = (vga_fb | vga_scaler) ? hdmi_cs_osd : vga_cs_osd; assign VGA_VS = (VGA_EN | SW[3]) ? 1'bZ : csync_en ? 1'b1 : ~vs1; assign VGA_HS = (VGA_EN | SW[3]) ? 1'bZ : csync_en ? ~cs1 : ~hs1; From 2db31a0f8350aed6101afda307c792e7c2be580c Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 5 Jan 2020 06:17:41 +0800 Subject: [PATCH 2/4] jt12: fix keyon. --- jt12/jt12_kon.v | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/jt12/jt12_kon.v b/jt12/jt12_kon.v index 6b0d608..d867cf6 100644 --- a/jt12/jt12_kon.v +++ b/jt12/jt12_kon.v @@ -61,14 +61,29 @@ if(num_ch==6) begin always @(posedge clk) if( clk_en ) keyon_I <= (csm&&next_ch==3'd2&&overflow2) || csr_out; - wire key_upnow = up_keyon && (keyon_ch==next_ch) && (next_op == 2'd3); + reg up_keyon_reg; + reg [3:0] tkeyon_op; + reg [2:0] tkeyon_ch; + always @(posedge clk) if( clk_en ) begin + if (rst) + up_keyon_reg <= 1'b0; + if (up_keyon) begin + up_keyon_reg <= 1'b1; + tkeyon_op <= keyon_op; + tkeyon_ch <= keyon_ch; end + else if (key_upnow) + up_keyon_reg <= 1'b0; + end + + wire key_upnow = up_keyon_reg && (tkeyon_ch==next_ch) && (next_op == 2'd3); + wire middle1; wire middle2; wire middle3; - wire din = key_upnow ? keyon_op[3] : csr_out; - wire mid_din2 = key_upnow ? keyon_op[1] : middle1; - wire mid_din3 = key_upnow ? keyon_op[2] : middle2; - wire mid_din4 = key_upnow ? keyon_op[0] : middle3; + wire din = key_upnow ? tkeyon_op[3] : csr_out; + wire mid_din2 = key_upnow ? tkeyon_op[1] : middle1; + wire mid_din3 = key_upnow ? tkeyon_op[2] : middle2; + wire mid_din4 = key_upnow ? tkeyon_op[0] : middle3; jt12_sh_rst #(.width(1),.stages(6),.rstval(1'b0)) u_konch0( .clk ( clk ), From 3a8422ec15d6eef747ea2d6fc405f93e7408bca3 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 5 Jan 2020 07:02:21 +0800 Subject: [PATCH 3/4] Cleanup, optimization. --- Genesis.qsf | 2 +- Genesis.sv | 29 +++++++++------------------ ddram.sv | 58 ++++++++++++++++++++++++++--------------------------- sdram.sv | 31 +++++++++------------------- system.sv | 16 +++------------ 5 files changed, 52 insertions(+), 84 deletions(-) diff --git a/Genesis.qsf b/Genesis.qsf index d34753e..0b4fb69 100644 --- a/Genesis.qsf +++ b/Genesis.qsf @@ -49,7 +49,7 @@ set_global_assignment -name PERIPHERY_TO_CORE_PLACEMENT_AND_ROUTING_OPTIMIZATION set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING ON set_global_assignment -name ALM_REGISTER_PACKING_EFFORT LOW set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER 2.0 -set_global_assignment -name SEED 1337 +set_global_assignment -name SEED 1 source sys/sys.tcl source sys/sys_analog.tcl diff --git a/Genesis.sv b/Genesis.sv index 628036f..458aeba 100644 --- a/Genesis.sv +++ b/Genesis.sv @@ -433,7 +433,6 @@ system system .ROM_ADDR(rom_addr), .ROM_DATA(use_sdr ? sdrom_data : ddrom_data), .ROM_WDATA(rom_wdata), - .ROM_RD(rom_rd), .ROM_WE(rom_we), .ROM_BE(rom_be), .ROM_REQ(rom_req), @@ -562,7 +561,6 @@ sdram sdram .addr0(ioctl_addr[24:1]), .din0({ioctl_data[7:0],ioctl_data[15:8]}), .dout0(), - .rd0(0), .wrl0(1), .wrh0(1), .req0(rom_wr), @@ -571,7 +569,6 @@ sdram sdram .addr1(rom_addr), .din1(rom_wdata), .dout1(sdrom_data), - .rd1(rom_rd), .wrl1(rom_we & rom_be[0]), .wrh1(rom_we & rom_be[1]), .req1(rom_req), @@ -580,7 +577,6 @@ sdram sdram .addr2(0), .din2(0), .dout2(), - .rd2(0), .wrl2(0), .wrh2(0), .req2(0), @@ -590,13 +586,13 @@ sdram sdram wire [24:1] rom_addr, rom_addr2; wire [15:0] sdrom_data, ddrom_data, rom_data2, rom_wdata; wire [1:0] rom_be; -wire rom_req, rom_rd, sdrom_rdack, ddrom_rdack, rom_rd2, rom_rdack2, rom_we; +wire rom_req, sdrom_rdack, ddrom_rdack, rom_rd2, rom_rdack2, rom_we; assign DDRAM_CLK = clk_ram; ddram ddram ( .*, - .wraddr(ioctl_addr), + .wraddr(ioctl_addr[24:1]), .din({ioctl_data[7:0],ioctl_data[15:8]}), .we_req(rom_wr), .we_ack(ddrom_wrack), @@ -618,7 +614,7 @@ ddram ddram reg use_sdr; always @(posedge clk_sys) use_sdr <= (!status[36:35]) ? |sdram_sz[2:0] : status[35]; -reg rom_wr; +reg rom_wr = 0; wire sdrom_wrack, ddrom_wrack; reg [24:0] rom_sz; always @(posedge clk_sys) begin @@ -627,20 +623,13 @@ always @(posedge clk_sys) begin old_reset <= reset; if(~old_reset && reset) ioctl_wait <= 0; - if (old_download & ~cart_download) begin - rom_sz <= ioctl_addr[24:0]; - ioctl_wait <= 0; - end + if (old_download & ~cart_download) rom_sz <= ioctl_addr[24:0]; - if(~old_download && cart_download) - rom_wr <= 0; - else if (cart_download) begin - if(ioctl_wr) begin - ioctl_wait <= 1; - rom_wr <= ~rom_wr; - end else if(ioctl_wait && (rom_wr == sdrom_wrack) && (rom_wr == ddrom_wrack)) begin - ioctl_wait <= 0; - end + if (cart_download & ioctl_wr) begin + ioctl_wait <= 1; + rom_wr <= ~rom_wr; + end else if(ioctl_wait && (rom_wr == sdrom_wrack) && (rom_wr == ddrom_wrack)) begin + ioctl_wait <= 0; end end diff --git a/ddram.sv b/ddram.sv index bce1ae4..6fc0a19 100644 --- a/ddram.sv +++ b/ddram.sv @@ -1,6 +1,6 @@ // // ddram.v -// Copyright (c) 2017 Sorgelig +// Copyright (c) 2017,2019 Sorgelig // // // This source file is free software: you can redistribute it and/or modify @@ -19,7 +19,7 @@ // ------------------------------------------ // -// 8-bit version +// 16-bit version module ddram ( @@ -35,7 +35,7 @@ module ddram output [7:0] DDRAM_BE, output DDRAM_WE, - input [27:0] wraddr, + input [27:1] wraddr, input [15:0] din, input we_req, output reg we_ack, @@ -55,22 +55,22 @@ module ddram ); assign DDRAM_BURSTCNT = ram_burst; -assign DDRAM_BE = ({6'd0,ram_be}<<{ram_address[2:1],1'b0}) | {8{ram_read}}; -assign DDRAM_ADDR = {4'b0011, ram_address[27:3]}; // RAM at 0x30000000 +assign DDRAM_BE = ram_be | {8{ram_read}}; +assign DDRAM_ADDR = {4'b0011, ram_address}; // RAM at 0x30000000 assign DDRAM_RD = ram_read; assign DDRAM_DIN = ram_data; assign DDRAM_WE = ram_write; -assign dout = (rdaddr[27:1] < wraddr[27:1]) ? ram_q[{rdaddr[2:1], 4'b0000} +:16] : 16'd0; -assign dout2 = (rdaddr2[27:1] < wraddr[27:1]) ? ram_q2[{rdaddr2[2:1], 4'b0000} +:16] : 16'd0; +assign dout = (rdaddr < wraddr) ? ram_q[{rdaddr[2:1], 4'b0000} +:16] : 16'd0; +assign dout2 = (rdaddr2 < wraddr) ? ram_q2[{rdaddr2[2:1], 4'b0000} +:16] : 16'd0; reg [7:0] ram_burst; reg [63:0] ram_q, next_q, ram_q2, next_q2; reg [63:0] ram_data; -reg [27:0] ram_address, cache_addr, cache_addr2; +reg [27:3] ram_address, cache_addr, cache_addr2; reg ram_read = 0; reg ram_write = 0; -reg [1:0] ram_be = 0; +reg [7:0] ram_be = 0; reg [1:0] state = 0; reg ch = 0; @@ -83,9 +83,9 @@ always @(posedge DDRAM_CLK) begin case(state) 0: if(we_ack != we_req) begin - ram_be <= 3; + ram_be <= 8'd3<<{wraddr[2:1],1'b0}; ram_data <= {4{din}}; - ram_address <= wraddr; + ram_address <= wraddr[27:3]; ram_write <= 1; ram_burst <= 1; ch <= 1; @@ -93,28 +93,28 @@ always @(posedge DDRAM_CLK) begin end else if(rom_req != rom_ack) begin if(rom_we) begin - ram_be <= rom_be; + ram_be <= {6'd0,rom_be}<<{rdaddr[2:1],1'b0}; ram_data <= {4{rom_din}}; - ram_address <= {rdaddr[27:1],1'b0}; + ram_address <= rdaddr[27:3]; ram_write <= 1; ram_burst <= 1; ch <= 0; state <= 1; end - else if(cache_addr[27:3] == rdaddr[27:3]) rom_ack <= rom_req; - else if((cache_addr[27:3]+1'd1) == rdaddr[27:3]) begin + else if(cache_addr == rdaddr[27:3]) rom_ack <= rom_req; + else if((cache_addr+1'd1) == rdaddr[27:3]) begin rom_ack <= rom_req; ram_q <= next_q; - cache_addr <= {rdaddr[27:3],3'b000}; - ram_address <= {rdaddr[27:3]+1'd1,3'b000}; + cache_addr <= rdaddr[27:3]; + ram_address <= rdaddr[27:3]+1'd1; ram_read <= 1; ram_burst <= 1; ch <= 0; state <= 3; end else begin - ram_address <= {rdaddr[27:3],3'b000}; - cache_addr <= {rdaddr[27:3],3'b000}; + ram_address <= rdaddr[27:3]; + cache_addr <= rdaddr[27:3]; ram_read <= 1; ram_burst <= 2; ch <= 0; @@ -122,20 +122,20 @@ always @(posedge DDRAM_CLK) begin end end else if(rd_req2 != rd_ack2) begin - if(cache_addr2[27:3] == rdaddr2[27:3]) rd_ack2 <= rd_req2; - else if((cache_addr2[27:3]+1'd1) == rdaddr2[27:3]) begin + if(cache_addr2 == rdaddr2[27:3]) rd_ack2 <= rd_req2; + else if((cache_addr2+1'd1) == rdaddr2[27:3]) begin rd_ack2 <= rd_req2; ram_q2 <= next_q2; - cache_addr2 <= {rdaddr2[27:3],3'b000}; - ram_address <= {rdaddr2[27:3]+1'd1,3'b000}; + cache_addr2 <= rdaddr2[27:3]; + ram_address <= rdaddr2[27:3]+1'd1; ram_read <= 1; ram_burst <= 1; ch <= 1; state <= 3; end else begin - ram_address <= {rdaddr2[27:3],3'b000}; - cache_addr2 <= {rdaddr2[27:3],3'b000}; + ram_address <= rdaddr2[27:3]; + cache_addr2 <= rdaddr2[27:3]; ram_read <= 1; ram_burst <= 2; ch <= 1; @@ -144,10 +144,10 @@ always @(posedge DDRAM_CLK) begin end 1: begin - cache_addr <= '1; - cache_addr2 <= '1; - cache_addr[3:0] <= 0; - cache_addr2[3:0] <= 0; + cache_addr <= '1; + cache_addr2 <= '1; + cache_addr[3] <= 0; + cache_addr2[3] <= 0; if(ch) we_ack <= we_req; else rom_ack <= rom_req; state <= 0; diff --git a/sdram.sv b/sdram.sv index 0faee3f..e9b3a97 100644 --- a/sdram.sv +++ b/sdram.sv @@ -39,7 +39,6 @@ module sdram input clk, // sdram is accessed at up to 128MHz input [24:1] addr0, - input rd0, input wrl0, input wrh0, input [15:0] din0, @@ -48,7 +47,6 @@ module sdram output reg ack0, input [24:1] addr1, - input rd1, input wrl1, input wrh1, input [15:0] din1, @@ -57,7 +55,6 @@ module sdram output reg ack1, input [24:1] addr2, - input rd2, input wrl2, input wrh2, input [15:0] din2, @@ -94,7 +91,6 @@ reg [1:0] dqm; reg active = 0; reg [2:0] ram_req = 0; wire [2:0] wr = {wrl2|wrh2,wrl1|wrh1,wrl0|wrh0}; -wire [2:0] rd = {rd2,rd1,rd0}; reg [15:0] dout; @@ -106,22 +102,21 @@ assign dout2 = dout; // access manager always @(posedge clk) begin - reg [2:0] old_rd, old_wr; reg [9:0] rfs_cnt; - reg rfs; + reg rfs, rfs2; rfs_cnt <= rfs_cnt + 1'd1; if (rfs_cnt == 850) begin rfs <= 1; rfs_cnt <= 0; end - - old_rd <= old_rd & rd; - old_wr <= old_wr & wr; + + if (rfs_cnt == 425) rfs2 <= 1; if(state == STATE_IDLE && mode == MODE_NORMAL) begin if (rfs) begin rfs <= 0; + rfs2 <= 0; rfs_cnt <= 0; we <= 0; dqm <= 2'b00; @@ -129,40 +124,34 @@ always @(posedge clk) begin state <= STATE_START; end else if (ack0 != req0) begin - old_rd[0] <= rd[0]; - old_wr[0] <= wr[0]; {ba,a} <= addr0; data <= din0; we <= wr[0]; dqm <= wr[0] ? ~{wrh0,wrl0} : 2'b00; active <= 1; - state <= STATE_START; ram_req[0] <= 1; - rfs <= rd[0]; + rfs <= rfs2; + state <= STATE_START; end else if (ack1 != req1) begin - old_rd[1] <= rd[1]; - old_wr[1] <= wr[1]; {ba,a} <= addr1; data <= din1; we <= wr[1]; dqm <= wr[1] ? ~{wrh1,wrl1} : 2'b00; active <= 1; - state <= STATE_START; ram_req[1] <= 1; - rfs <= rd[1]; + rfs <= rfs2; + state <= STATE_START; end else if (ack2 != req2) begin - old_rd[2] <= rd[2]; - old_wr[2] <= wr[2]; {ba,a} <= addr2; data <= din2; we <= wr[2]; dqm <= wr[2] ? ~{wrh2,wrl2} : 2'b00; active <= 1; - state <= STATE_START; ram_req[2] <= 1; - rfs <= rd[2]; + rfs <= rfs2; + state <= STATE_START; end end diff --git a/system.sv b/system.sv index 71abeee..2952aab 100644 --- a/system.sv +++ b/system.sv @@ -97,7 +97,6 @@ module system output [24:1] ROM_ADDR, input [15:0] ROM_DATA, output [15:0] ROM_WDATA, - output reg ROM_RD, output reg ROM_WE, output [1:0] ROM_BE, output reg ROM_REQ, @@ -110,10 +109,7 @@ module system input EN_HIFI_PCM, input LADDER, - input OBJ_LIMIT_HIGH, - - output [23:0] DBG_M68K_A, - output [23:0] DBG_MBUS_A + input OBJ_LIMIT_HIGH ); reg reset; @@ -561,10 +557,6 @@ end assign ROM_BE = ~{MBUS_UDS_N, MBUS_LDS_N}; assign ROM_WDATA = MBUS_DO; -assign DBG_MBUS_A = {MBUS_A,1'b0}; -assign DBG_M68K_A = {M68K_A,1'b0}; - - //----------------------------------------------------------------------- // 64KB SRAM / 128KB SVP DRAM //----------------------------------------------------------------------- @@ -825,7 +817,7 @@ always @(posedge MCLK) begin MBUS_DO <= {Z80_DO,Z80_DO}; MBUS_RNW <= Z80_WR_N; mstate <= MBUS_Z80_PREREAD; - cycle_cnt = 2'd1; + cycle_cnt <= 2'd1; end end @@ -833,7 +825,7 @@ always @(posedge MCLK) begin begin if (!cycle_cnt) begin mstate <= MBUS_SELECT; - cycle_cnt = 2'd1; + cycle_cnt <= 2'd1; end end @@ -878,7 +870,6 @@ always @(posedge MCLK) begin else if (MBUS_A < ROMSZ) begin if (PIER_QUIRK) BANK_MODE <= (MBUS_A >= 23'h140000) ? 3'h3 : 3'h0; if (SVP_QUIRK && msrc == MSRC_VDP) MBUS_A <= MBUS_A - 1'd1; - ROM_RD <= 1; ROM_WE <= 0; ROM_REQ <= ~ROM_ACK; mstate <= MBUS_ROM_READ; @@ -1031,7 +1022,6 @@ always @(posedge MCLK) begin if (ROM_REQ == ROM_ACK) begin data <= ROM_DATA; if(msrc == MSRC_M68K) NO_DATA <= ROM_DATA; - ROM_RD <= 0; if (msrc != MSRC_Z80 || !cycle_cnt) mstate <= MBUS_FINISH; end From 1a6beae70c3ebb69f04b097456966091539c1c06 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Mon, 6 Jan 2020 00:20:40 +0800 Subject: [PATCH 4/4] Release 20200105. --- releases/Genesis_20200105.rbf | Bin 0 -> 3638640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 releases/Genesis_20200105.rbf diff --git a/releases/Genesis_20200105.rbf b/releases/Genesis_20200105.rbf new file mode 100644 index 0000000000000000000000000000000000000000..ba816f3d7c52ff128c0d01beb8dd12ee885c44ed GIT binary patch literal 3638640 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