From a053fd8239545e7d581e6ea2852afa3d40e73d58 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 18 Mar 2019 15:35:02 +0100 Subject: [PATCH] [C64] Register SDRAM outputs for Fast Output Register use --- cores/c64/C64_mist.qsf | 138 ++++++++++++++++++-------------- cores/c64/rtl/mist/c64_mist.vhd | 11 +-- cores/c64/rtl/mist/sdram.v | 40 +++++---- 3 files changed, 102 insertions(+), 87 deletions(-) diff --git a/cores/c64/C64_mist.qsf b/cores/c64/C64_mist.qsf index d10e57f..17b86e7 100644 --- a/cores/c64/C64_mist.qsf +++ b/cores/c64/C64_mist.qsf @@ -238,68 +238,84 @@ set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[12] set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[13] set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[14] set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[15] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[0] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[1] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[2] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[3] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[4] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[5] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[6] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[7] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[8] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[9] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[10] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[11] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[12] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[13] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[14] +set_instance_assignment -name FAST_INPUT_REGISTER ON -to SDRAM_DQ[15] # Fitter Assignments # ================== -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[2] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[3] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[4] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[5] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[6] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[7] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[8] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[9] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[10] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[11] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_A[12] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[2] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[3] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[4] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[5] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[6] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[7] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[8] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[9] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[10] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[11] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[12] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[13] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[14] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQ[15] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_BA[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQML -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_DQMH -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nRAS -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCAS -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nWE -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_nCS -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to SDRAM_CKE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_A[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQ[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_BA[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQML +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_DQMH +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nRAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCAS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nWE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_nCS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CKE set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_CLK -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[5] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[4] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[3] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[2] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_R[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[5] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[4] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[3] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[2] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_G[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[5] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[4] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[3] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[2] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[1] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_B[0] -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_HS -set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to VGA_VS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_R[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_G[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_B[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_HS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to VGA_VS set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to LED set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_L set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to AUDIO_R @@ -385,5 +401,7 @@ set_global_assignment -name QIP_FILE rtl/mist/rom_reconfig_ntsc.qip set_global_assignment -name SIGNALTAP_FILE output_files/pll.stp set_location_assignment PIN_46 -to UART_TX set_location_assignment PIN_31 -to UART_RX -set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top -set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll \ No newline at end of file +set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_instance_assignment -name CURRENT_STRENGTH_NEW 4MA -to UART_TX + +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/cores/c64/rtl/mist/c64_mist.vhd b/cores/c64/rtl/mist/c64_mist.vhd index 5f99781..55dfbac 100644 --- a/cores/c64/rtl/mist/c64_mist.vhd +++ b/cores/c64/rtl/mist/c64_mist.vhd @@ -81,6 +81,7 @@ component sdram is port ( -- interface to the MT48LC16M16 chip sd_addr : out std_logic_vector(12 downto 0); + sd_data : inout std_logic_vector(15 downto 0); sd_cs : out std_logic; sd_ba : out std_logic_vector(1 downto 0); sd_we : out std_logic; @@ -93,6 +94,8 @@ component sdram is port -- cpu/chipset interface addr : in std_logic_vector(24 downto 0); + din : in std_logic_vector( 7 downto 0); + dout : out std_logic_vector( 7 downto 0); refresh : in std_logic; we : in std_logic; ce : in std_logic @@ -887,11 +890,6 @@ begin end if; end process; - SDRAM_DQ(15 downto 8) <= (others => 'Z') when sdram_we='0' else (others => '0'); - SDRAM_DQ(7 downto 0) <= (others => 'Z') when sdram_we='0' else sdram_data_out; - - -- read from sdram - c64_data_in <= SDRAM_DQ(7 downto 0); -- clock is always enabled and memory is never masked as we only -- use one byte SDRAM_CKE <= '1'; @@ -900,6 +898,7 @@ begin sdr: sdram port map( sd_addr => SDRAM_A, + sd_data => SDRAM_DQ, sd_ba => SDRAM_BA, sd_cs => SDRAM_nCS, sd_we => SDRAM_nWE, @@ -908,6 +907,8 @@ begin clk => clk_ram, addr => sdram_addr, + din => sdram_data_out, + dout => c64_data_in, init => not pll_locked, we => sdram_we, refresh => idle, diff --git a/cores/c64/rtl/mist/sdram.v b/cores/c64/rtl/mist/sdram.v index f8497d5..321986e 100644 --- a/cores/c64/rtl/mist/sdram.v +++ b/cores/c64/rtl/mist/sdram.v @@ -23,8 +23,9 @@ module sdram ( // interface to the MT48LC16M16 chip - output [12:0] sd_addr, // 13 bit multiplexed address bus - output [1:0] sd_ba, // two banks + output reg [12:0] sd_addr, // 13 bit multiplexed address bus + inout reg [15:0] sd_data, + output reg [ 1:0] sd_ba, // two banks output sd_cs, // a single chip select output sd_we, // write enable output sd_ras, // row address select @@ -34,8 +35,10 @@ module sdram ( input init, // init signal after FPGA config to initialize RAM input clk, // sdram is accessed at up to 128MHz -// input [15:0] addr, // 25 bit byte address - input [24:0] addr, // 25 bit byte address + input [24:0] addr, // 25 bit byte address + input [ 7:0] din, + output [ 7:0] dout, + input refresh, // refresh cycle input ce, // cpu/chipset access input we // cpu/chipset requests write @@ -56,8 +59,8 @@ localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, B // --------------------------------------------------------------------- localparam STATE_IDLE = 3'd0; // first state in cycle -localparam STATE_CMD_START = 3'd1; // state in which a new command can be started -localparam STATE_CMD_CONT = STATE_CMD_START + RASCAS_DELAY - 3'd1; // 4 command can be continued +localparam STATE_CMD_START = 3'd0; // state in which a new command can be started +localparam STATE_CMD_CONT = STATE_CMD_START + RASCAS_DELAY; // 2 command can be continued localparam STATE_LAST = 3'd7; // last state in cycle reg [2:0] q /* synthesis noprune */; @@ -104,17 +107,21 @@ localparam CMD_LOAD_MODE = 4'b0000; reg [3:0] sd_cmd; // current command sent to sd ram +assign dout = sd_data[7:0]; + // drive control signals according to current command assign sd_cs = sd_cmd[3]; assign sd_ras = sd_cmd[2]; assign sd_cas = sd_cmd[1]; assign sd_we = sd_cmd[0]; - -// assign sd_data = we?{din, din}:16'bZZZZZZZZZZZZZZZZ; -// assign dout = sd_data[7:0]; +wire [12:0] reset_addr = (reset == 13)?13'b0010000000000:MODE; +wire [12:0] run_addr = (q == STATE_CMD_START)?addr[20:8]:{ 4'b0010, addr[23], addr[7:0]}; always @(posedge clk) begin - sd_cmd <= CMD_INHIBIT; + sd_cmd <= CMD_INHIBIT; + sd_addr <= (reset != 0)?reset_addr:run_addr; + sd_ba <= addr[22:21]; + sd_data <= 16'bZZZZZZZZZZZZZZZZ; if(reset != 0) begin if(q == STATE_IDLE) begin @@ -128,20 +135,9 @@ always @(posedge clk) begin end else if((q == STATE_CMD_CONT)&&(!refresh)) begin if(we) sd_cmd <= CMD_WRITE; else if(ce) sd_cmd <= CMD_READ; + if(we) sd_data <= {din, din}; end end end - -wire [12:0] reset_addr = (reset == 13)?13'b0010000000000:MODE; - -wire [12:0] run_addr = -// (q == STATE_CMD_START)?{ 5'b00000, addr[15:8]}:{ 5'b00100, addr[7:0]}; -//(q == STATE_CMD_START)?addr[21:9]:{ 4'b0010, addr[8:0]}; //possibly try this LCA 6mar17 - (q == STATE_CMD_START)?addr[20:8]:{ 4'b0010, addr[23], addr[7:0]}; - -assign sd_addr = (reset != 0)?reset_addr:run_addr; - -//assign sd_ba = 2'b00; -assign sd_ba = addr[22:21]; endmodule