diff options
author | root <root@artemis.panaceas.org> | 2013-10-14 19:56:36 +0100 |
---|---|---|
committer | root <root@artemis.panaceas.org> | 2013-10-14 19:56:36 +0100 |
commit | 9ddb6a83a8e0f29876c427be70b5ef3eff665ba9 (patch) | |
tree | 8aee920eac9b9658fffc3025ab712f87487809e0 | |
download | sdram_test-9ddb6a83a8e0f29876c427be70b5ef3eff665ba9.tar.gz sdram_test-9ddb6a83a8e0f29876c427be70b5ef3eff665ba9.tar.bz2 sdram_test-9ddb6a83a8e0f29876c427be70b5ef3eff665ba9.zip |
fish
-rw-r--r-- | .gitignore | 33 | ||||
-rw-r--r-- | Makefile | 112 | ||||
-rw-r--r-- | async_16bit_bus_adapter_hw/async_16bit_bus_adapter_hw.tcl | 145 | ||||
-rw-r--r-- | async_16bit_bus_adapter_hw/hdl/async_16bit_bus_adapter.vhd | 54 | ||||
-rw-r--r-- | pllx2.vhd | 365 | ||||
-rw-r--r-- | sdram_ctrl.vhd | 615 | ||||
-rw-r--r-- | sdram_test.qpf | 30 | ||||
-rw-r--r-- | sdram_test.qsf | 154 | ||||
-rw-r--r-- | sdram_test.vhd | 177 | ||||
-rw-r--r-- | sdram_test_mcu.qsys | 543 | ||||
-rw-r--r-- | sdram_util.vhd | 50 | ||||
-rw-r--r-- | src/sdram_test.c | 56 | ||||
-rwxr-xr-x | tools/wrap | 15 |
13 files changed, 2349 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cdb6e7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +db +incremental_db +*.qws +*.rpt +*.bak +*.pof +*.sof +*.done +*.fit.summary +*.jdi +*.map.summary +*.sta.summary +*.sopcinfo +script/ +*~ +src/*.elf +src/*.objdump +src/*.map +bsp +*.swp +elf.flash +sof.flash +*.stamp +src/Makefile +src/obj +*.pin +.qsys_edit +.sopc_builder +*.bsf +sdram_mcu/ +sdram_mcu.cmp +sdram_mcu.html +*.smsg diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9f28202 --- /dev/null +++ b/Makefile @@ -0,0 +1,112 @@ +PROJ=sdram_test + +SRCS=$(wildcard *.vhd *.v *.qsf *.qpf ) +SRCS += $(shell find async_16bit_bus_adapter_hw -type f -print ) + +BSP_DIR=bsp +QSYS=sdram_test_mcu +SOPC_FILE=${QSYS}.sopcinfo +BSP_TYPE=hal +NIOS2_BSP_ARGS="" +CPU_NAME= + +ELF=src/${PROJ}.elf +SOF=${PROJ}.sof + +default: run + +run: load_elf.stamp + tools/wrap nios2-terminal + +build: ${ELF} ${SOF} + +#default: load_sof.stamp + + +sta.stamp:asm.stamp + tools/wrap quartus_sta ${PROJ} -c ${PROJ} + touch $@ + +asm.stamp:fit.stamp + tools/wrap quartus_asm --read_settings_files=off --write_settings_files=off ${PROJ} -c ${PROJ} + touch $@ + +${SOF}:asm.stamp + +fit.stamp: ans.stamp + tools/wrap quartus_fit --read_settings_files=off --write_settings_files=off ${PROJ} -c ${PROJ} + touch $@ + +#ans.stamp: source.stamp ${SOPC_FILE} +ans.stamp: source.stamp + tools/wrap quartus_map --read_settings_files=on --write_settings_files=off ${PROJ} -c ${PROJ} + touch $@ + +${SOPC_FILE}:asm.stamp + +#${SOPC_FILE}:${QSYS}.qsys +# rm -rf ${QSYS} +# tools/wrap ip-generate --project-directory=. --output-directory=${QSYS}/synthesis --file-set=QUARTUS_SYNTH --report-file=sopcinfo:${SOPC_FILE} --report-file=html:${QSYS}.html --report-file=qip:${QSYS}.qip --report-file=cmp:${QSYS}.cmp --report-file=svd --system-info=DEVICE_FAMILY="Cyclone II" --system-info=DEVICE=EP2C8Q208C8 --system-info=DEVICE_SPEEDGRADE=8 --component-file=${QSYS}.qsys --language=VHDL +# + +source.stamp:${SRCS} + touch source.stamp + +${ELF}: src/Makefile $(wildcard src/*.c) + tools/wrap make -C src + +elf.stamp:${ELF} + touch $@ + +src/Makefile: bsp.stamp + tools/wrap nios2-app-generate-makefile --bsp-dir bsp --src-rdir src --app-dir src --elf-name ${PROJ}.elf + +bsp.stamp:${SOPC_FILE} + /bin/rm -rf ${BSP_DIR} + mkdir -p ${BSP_DIR} + tools/wrap nios2-bsp ${BSP_TYPE} ${BSP_DIR} ${SOPC_FILE} ${NIOS2_BSP_ARGS} ${CPU_NAME} +# tools/wrap nios2-bsp-update-settings --bsp-dir ${BSP_DIR} --settings bsp/settings.bsp \ +# --set hal.sys_clk_timer none \ +# --set hal.max_file_descriptors 4 \ +# --set hal.enable_c_plus_plus 0 \ +# --set hal.make.bsp_cflags_optimization -Os \ +# --set hal.enable_exit 0 \ +# --set hal.enable_small_c_library 1 \ +# --set hal.enable_clean_exit 0 \ +# --set hal.enable_reduced_device_drivers 1 \ +# --set hal.enable_lightweight_device_driver_api 1 +# tools/wrap nios2-bsp-generate-files --bsp-dir ${BSP_DIR} --settings bsp/settings.bsp + tools/wrap make -C ${BSP_DIR} + touch $@ + +load_elf.stamp:${ELF} load_sof.stamp + tools/wrap nios2-download ${ELF} -g + +load_sof.stamp: ${SOF} + tools/wrap quartus_pgm -m JTAG -o "p;${SOF}" + touch $@ + +sof.flash: ${SOF} + tools/wrap sof2flash --input=$< --output=$@ --epcs --verbose + +elf.flash: ${ELF} sof.flash + tools/wrap elf2flash --input=${ELF} --output=$@ --epcs --after=sof.flash --verbose + +qsys: + tools/wrap qsys-edit ${QSYS}.qsys --project-dir=${PWD} --system-info=DEVICE_FAMILY="Cyclone II" --system-info=DEVICE=EP2C8Q208C8 --system-info=DEVICE_SPEEDGRADE=8 --host-controller + +${BSP_DIR}/system.h:bsp.stamp + +flash: load_sof.stamp sof.flash elf.flash ${BSP_DIR}/system.h + BASE=` grep EPCS_FLASH_CONTROLLER_0_BASE ${BSP_DIR}/system.h | awk '{print $$3}' ` && \ + tools/wrap nios2-flash-programmer sof.flash --base=$${BASE} --epcs --accept-bad-sysid --device=1 --instance=0 --program --verbose && \ + tools/wrap nios2-flash-programmer elf.flash --base=$${BASE} --epcs --accept-bad-sysid --device=1 --instance=0 --program --verbose -g + +clean: + /bin/rm -rf ${BSP_DIR} db incremental_db src/obj ${QSYS} + /bin/rm -f ${SOPC_FILE} src/Makefile elf.flash sof.flash *.stamp ${SOF} ${ELF} *.rpt *.html *.summary *.pin *.jdi *.qws *.pof *.done *.cmp *.qdi *.bsf + /bin/rm -f src/${PROJ}.objdump src/${PROJ}.map + /bin/rm -f sopc_builder_log.txt *.qip *.smsg + + + diff --git a/async_16bit_bus_adapter_hw/async_16bit_bus_adapter_hw.tcl b/async_16bit_bus_adapter_hw/async_16bit_bus_adapter_hw.tcl new file mode 100644 index 0000000..d18a0ed --- /dev/null +++ b/async_16bit_bus_adapter_hw/async_16bit_bus_adapter_hw.tcl @@ -0,0 +1,145 @@ +# TCL File Generated by Component Editor 13.0sp1 +# Mon Oct 14 19:47:04 BST 2013 +# DO NOT MODIFY + + +# +# async_16bit_bus_adapter "async_16bit_bus_adapter" v1.0 +# 2013.10.14.19:47:04 +# +# + +# +# request TCL package from ACDS 13.1 +# +package require -exact qsys 13.1 + + +# +# module async_16bit_bus_adapter +# +set_module_property DESCRIPTION "" +set_module_property NAME async_16bit_bus_adapter +set_module_property VERSION 1.0 +set_module_property INTERNAL false +set_module_property OPAQUE_ADDRESS_MAP true +set_module_property GROUP my_lib +set_module_property AUTHOR "" +set_module_property DISPLAY_NAME async_16bit_bus_adapter +set_module_property INSTANTIATE_IN_SYSTEM_MODULE true +set_module_property EDITABLE true +set_module_property ANALYZE_HDL AUTO +set_module_property REPORT_TO_TALKBACK false +set_module_property ALLOW_GREYBOX_GENERATION false + + +# +# file sets +# +add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" "" +set_fileset_property QUARTUS_SYNTH TOP_LEVEL async_16bit_bus_adapter +set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false +add_fileset_file async_16bit_bus_adapter.vhd VHDL PATH hdl/async_16bit_bus_adapter.vhd TOP_LEVEL_FILE + + +# +# parameters +# +add_parameter AUTO_CLOCK_CLOCK_RATE STRING -1 "" +set_parameter_property AUTO_CLOCK_CLOCK_RATE DEFAULT_VALUE -1 +set_parameter_property AUTO_CLOCK_CLOCK_RATE DISPLAY_NAME AUTO_CLOCK_CLOCK_RATE +set_parameter_property AUTO_CLOCK_CLOCK_RATE WIDTH "" +set_parameter_property AUTO_CLOCK_CLOCK_RATE TYPE STRING +set_parameter_property AUTO_CLOCK_CLOCK_RATE UNITS None +set_parameter_property AUTO_CLOCK_CLOCK_RATE DESCRIPTION "" +set_parameter_property AUTO_CLOCK_CLOCK_RATE HDL_PARAMETER true + + +# +# display items +# + + +# +# connection point clock +# +add_interface clock clock end +set_interface_property clock clockRate 0 +set_interface_property clock ENABLED true +set_interface_property clock EXPORT_OF "" +set_interface_property clock PORT_NAME_MAP "" +set_interface_property clock SVD_ADDRESS_GROUP "" + +add_interface_port clock clk clk Input 1 + + +# +# connection point avalon_slave +# +add_interface avalon_slave avalon end +set_interface_property avalon_slave addressUnits WORDS +set_interface_property avalon_slave associatedClock clock +set_interface_property avalon_slave associatedReset reset +set_interface_property avalon_slave bitsPerSymbol 8 +set_interface_property avalon_slave burstOnBurstBoundariesOnly false +set_interface_property avalon_slave burstcountUnits WORDS +set_interface_property avalon_slave explicitAddressSpan 0 +set_interface_property avalon_slave holdTime 0 +set_interface_property avalon_slave linewrapBursts false +set_interface_property avalon_slave maximumPendingReadTransactions 0 +set_interface_property avalon_slave readLatency 0 +set_interface_property avalon_slave readWaitTime 1 +set_interface_property avalon_slave setupTime 0 +set_interface_property avalon_slave timingUnits Cycles +set_interface_property avalon_slave writeWaitTime 0 +set_interface_property avalon_slave ENABLED true +set_interface_property avalon_slave EXPORT_OF "" +set_interface_property avalon_slave PORT_NAME_MAP "" +set_interface_property avalon_slave SVD_ADDRESS_GROUP "" + +add_interface_port avalon_slave cs_n chipselect_n Input 1 +add_interface_port avalon_slave address address Input 16 +add_interface_port avalon_slave writedata writedata Input 16 +add_interface_port avalon_slave wr_n write_n Input 1 +add_interface_port avalon_slave rd_n read_n Input 1 +add_interface_port avalon_slave wait_n waitrequest_n Output 1 +add_interface_port avalon_slave readdata readdata Output 16 +set_interface_assignment avalon_slave embeddedsw.configuration.isFlash 0 +set_interface_assignment avalon_slave embeddedsw.configuration.isMemoryDevice 0 +set_interface_assignment avalon_slave embeddedsw.configuration.isNonVolatileStorage 0 +set_interface_assignment avalon_slave embeddedsw.configuration.isPrintableDevice 0 + + +# +# connection point sbb +# +add_interface sbb conduit end +set_interface_property sbb associatedClock clock +set_interface_property sbb associatedReset "" +set_interface_property sbb ENABLED true +set_interface_property sbb EXPORT_OF "" +set_interface_property sbb PORT_NAME_MAP "" +set_interface_property sbb SVD_ADDRESS_GROUP "" + +add_interface_port sbb b_reset_n export Output 1 +add_interface_port sbb b_cs_n export Output 1 +add_interface_port sbb b_rnw export Output 1 +add_interface_port sbb b_wait_n export Input 1 +add_interface_port sbb b_addr export Output 16 +add_interface_port sbb b_data_in export Input 16 +add_interface_port sbb b_data_out export Output 16 + + +# +# connection point reset +# +add_interface reset reset end +set_interface_property reset associatedClock clock +set_interface_property reset synchronousEdges DEASSERT +set_interface_property reset ENABLED true +set_interface_property reset EXPORT_OF "" +set_interface_property reset PORT_NAME_MAP "" +set_interface_property reset SVD_ADDRESS_GROUP "" + +add_interface_port reset rst_n reset_n Input 1 + diff --git a/async_16bit_bus_adapter_hw/hdl/async_16bit_bus_adapter.vhd b/async_16bit_bus_adapter_hw/hdl/async_16bit_bus_adapter.vhd new file mode 100644 index 0000000..9c8a806 --- /dev/null +++ b/async_16bit_bus_adapter_hw/hdl/async_16bit_bus_adapter.vhd @@ -0,0 +1,54 @@ +-- async_8bit_bus_adapter.vhd + +-- This file was auto-generated as a prototype implementation of a module +-- created in component editor. It ties off all outputs to ground and +-- ignores all inputs. It needs to be edited to make it do something +-- useful. +-- +-- This file will not be automatically regenerated. You should check it in +-- to your version control system if you want to keep it. + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity async_8bit_bus_adapter is + generic ( + AUTO_CLOCK_CLOCK_RATE : string := "-1" + ); + port ( + clk : in std_logic := '0'; -- clock.clk + rst_n : in std_logic := '0'; -- reset.reset_n + cs_n : in std_logic := '0'; -- avalon_slave.chipselect_n + address : in std_logic_vector(15 downto 0) := (others => '0'); -- .address + writedata : in std_logic_vector(15 downto 0) := (others => '0'); -- .writedata + wr_n : in std_logic := '0'; -- .write_n + rd_n : in std_logic := '0'; -- .read_n + wait_n : out std_logic; -- .waitrequest_n + readdata : out std_logic_vector(15 downto 0); -- .readdata + b_reset_n : out std_logic; -- eight_bit_bus.export + b_cs_n : out std_logic; -- .export + b_rnw : out std_logic; -- .export + b_wait_n : in std_logic := '0'; -- .export + b_addr : out std_logic_vector(15 downto 0); -- .export + b_data_in : in std_logic_vector(15 downto 0) := (others => '0'); -- .export + b_data_out : out std_logic_vector(15 downto 0) -- .export + ); +end entity async_8bit_bus_adapter; + +architecture rtl of async_8bit_bus_adapter is + +signal state:std_logic_vector(2 downto 0); +begin + + b_addr <= address; + readdata <= b_data_in; + b_data_out <= writedata; + + b_reset_n <= rst_n; + b_cs_n <= cs_n or ( wr_n and rd_n ); + b_rnw <= wr_n; + wait_n <= b_wait_n; + + +end architecture rtl; -- of async_8bit_bus_adapter diff --git a/pllx2.vhd b/pllx2.vhd new file mode 100644 index 0000000..6fa7af2 --- /dev/null +++ b/pllx2.vhd @@ -0,0 +1,365 @@ +-- megafunction wizard: %ALTPLL%
+-- GENERATION: STANDARD
+-- VERSION: WM1.0
+-- MODULE: altpll
+
+-- ============================================================
+-- File Name: pllx2.vhd
+-- Megafunction Name(s):
+-- altpll
+--
+-- Simulation Library Files(s):
+-- altera_mf
+-- ============================================================
+-- ************************************************************
+-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
+--
+-- 9.1 Build 222 10/21/2009 SJ Web Edition
+-- ************************************************************
+
+
+--Copyright (C) 1991-2009 Altera Corporation
+--Your use of Altera Corporation's design tools, logic functions
+--and other software and tools, and its AMPP partner logic
+--functions, and any output files from any of the foregoing
+--(including device programming or simulation files), and any
+--associated documentation or information are expressly subject
+--to the terms and conditions of the Altera Program License
+--Subscription Agreement, Altera MegaCore Function License
+--Agreement, or other applicable license agreement, including,
+--without limitation, that your use is for the sole purpose of
+--programming logic devices manufactured by Altera and sold by
+--Altera or its authorized distributors. Please refer to the
+--applicable agreement for further details.
+
+
+LIBRARY ieee;
+USE ieee.std_logic_1164.all;
+
+LIBRARY altera_mf;
+USE altera_mf.all;
+
+ENTITY pllx2 IS
+ PORT
+ (
+ areset : IN STD_LOGIC := '0';
+ inclk0 : IN STD_LOGIC := '0';
+ c0 : OUT STD_LOGIC ;
+ locked : OUT STD_LOGIC
+ );
+END pllx2;
+
+
+ARCHITECTURE SYN OF pllx2 IS
+
+ SIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0);
+ SIGNAL sub_wire1 : STD_LOGIC ;
+ SIGNAL sub_wire2 : STD_LOGIC ;
+ SIGNAL sub_wire3 : STD_LOGIC ;
+ SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0);
+ SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0);
+ SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0);
+
+
+
+ COMPONENT altpll
+ GENERIC (
+ clk0_divide_by : NATURAL;
+ clk0_duty_cycle : NATURAL;
+ clk0_multiply_by : NATURAL;
+ clk0_phase_shift : STRING;
+ compensate_clock : STRING;
+ gate_lock_signal : STRING;
+ inclk0_input_frequency : NATURAL;
+ intended_device_family : STRING;
+ invalid_lock_multiplier : NATURAL;
+ lpm_hint : STRING;
+ lpm_type : STRING;
+ operation_mode : STRING;
+ port_activeclock : STRING;
+ port_areset : STRING;
+ port_clkbad0 : STRING;
+ port_clkbad1 : STRING;
+ port_clkloss : STRING;
+ port_clkswitch : STRING;
+ port_configupdate : STRING;
+ port_fbin : STRING;
+ port_inclk0 : STRING;
+ port_inclk1 : STRING;
+ port_locked : STRING;
+ port_pfdena : STRING;
+ port_phasecounterselect : STRING;
+ port_phasedone : STRING;
+ port_phasestep : STRING;
+ port_phaseupdown : STRING;
+ port_pllena : STRING;
+ port_scanaclr : STRING;
+ port_scanclk : STRING;
+ port_scanclkena : STRING;
+ port_scandata : STRING;
+ port_scandataout : STRING;
+ port_scandone : STRING;
+ port_scanread : STRING;
+ port_scanwrite : STRING;
+ port_clk0 : STRING;
+ port_clk1 : STRING;
+ port_clk2 : STRING;
+ port_clk3 : STRING;
+ port_clk4 : STRING;
+ port_clk5 : STRING;
+ port_clkena0 : STRING;
+ port_clkena1 : STRING;
+ port_clkena2 : STRING;
+ port_clkena3 : STRING;
+ port_clkena4 : STRING;
+ port_clkena5 : STRING;
+ port_extclk0 : STRING;
+ port_extclk1 : STRING;
+ port_extclk2 : STRING;
+ port_extclk3 : STRING;
+ valid_lock_multiplier : NATURAL
+ );
+ PORT (
+ inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0);
+ locked : OUT STD_LOGIC ;
+ areset : IN STD_LOGIC ;
+ clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0)
+ );
+ END COMPONENT;
+
+BEGIN
+ sub_wire5_bv(0 DOWNTO 0) <= "0";
+ sub_wire5 <= To_stdlogicvector(sub_wire5_bv);
+ sub_wire1 <= sub_wire0(0);
+ c0 <= sub_wire1;
+ locked <= sub_wire2;
+ sub_wire3 <= inclk0;
+ sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3;
+
+ altpll_component : altpll
+ GENERIC MAP (
+ clk0_divide_by => 2,
+ clk0_duty_cycle => 50,
+ clk0_multiply_by => 5,
+ clk0_phase_shift => "0",
+ compensate_clock => "CLK0",
+ gate_lock_signal => "NO",
+ inclk0_input_frequency => 41666,
+ intended_device_family => "Cyclone II",
+ invalid_lock_multiplier => 5,
+ lpm_hint => "CBX_MODULE_PREFIX=pllx2",
+ lpm_type => "altpll",
+ operation_mode => "NORMAL",
+ port_activeclock => "PORT_UNUSED",
+ port_areset => "PORT_USED",
+ port_clkbad0 => "PORT_UNUSED",
+ port_clkbad1 => "PORT_UNUSED",
+ port_clkloss => "PORT_UNUSED",
+ port_clkswitch => "PORT_UNUSED",
+ port_configupdate => "PORT_UNUSED",
+ port_fbin => "PORT_UNUSED",
+ port_inclk0 => "PORT_USED",
+ port_inclk1 => "PORT_UNUSED",
+ port_locked => "PORT_USED",
+ port_pfdena => "PORT_UNUSED",
+ port_phasecounterselect => "PORT_UNUSED",
+ port_phasedone => "PORT_UNUSED",
+ port_phasestep => "PORT_UNUSED",
+ port_phaseupdown => "PORT_UNUSED",
+ port_pllena => "PORT_UNUSED",
+ port_scanaclr => "PORT_UNUSED",
+ port_scanclk => "PORT_UNUSED",
+ port_scanclkena => "PORT_UNUSED",
+ port_scandata => "PORT_UNUSED",
+ port_scandataout => "PORT_UNUSED",
+ port_scandone => "PORT_UNUSED",
+ port_scanread => "PORT_UNUSED",
+ port_scanwrite => "PORT_UNUSED",
+ port_clk0 => "PORT_USED",
+ port_clk1 => "PORT_UNUSED",
+ port_clk2 => "PORT_UNUSED",
+ port_clk3 => "PORT_UNUSED",
+ port_clk4 => "PORT_UNUSED",
+ port_clk5 => "PORT_UNUSED",
+ port_clkena0 => "PORT_UNUSED",
+ port_clkena1 => "PORT_UNUSED",
+ port_clkena2 => "PORT_UNUSED",
+ port_clkena3 => "PORT_UNUSED",
+ port_clkena4 => "PORT_UNUSED",
+ port_clkena5 => "PORT_UNUSED",
+ port_extclk0 => "PORT_UNUSED",
+ port_extclk1 => "PORT_UNUSED",
+ port_extclk2 => "PORT_UNUSED",
+ port_extclk3 => "PORT_UNUSED",
+ valid_lock_multiplier => 1
+ )
+ PORT MAP (
+ inclk => sub_wire4,
+ areset => areset,
+ clk => sub_wire0,
+ locked => sub_wire2
+ );
+
+
+
+END SYN;
+
+-- ============================================================
+-- CNX file retrieval info
+-- ============================================================
+-- Retrieval info: PRIVATE: ACTIVECLK_CHECK STRING "0"
+-- Retrieval info: PRIVATE: BANDWIDTH STRING "1.000"
+-- Retrieval info: PRIVATE: BANDWIDTH_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: BANDWIDTH_FREQ_UNIT STRING "MHz"
+-- Retrieval info: PRIVATE: BANDWIDTH_PRESET STRING "Low"
+-- Retrieval info: PRIVATE: BANDWIDTH_USE_AUTO STRING "1"
+-- Retrieval info: PRIVATE: BANDWIDTH_USE_CUSTOM STRING "0"
+-- Retrieval info: PRIVATE: BANDWIDTH_USE_PRESET STRING "0"
+-- Retrieval info: PRIVATE: CLKBAD_SWITCHOVER_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CLKLOSS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CLKSWITCH_CHECK STRING "1"
+-- Retrieval info: PRIVATE: CNX_NO_COMPENSATE_RADIO STRING "0"
+-- Retrieval info: PRIVATE: CREATE_CLKBAD_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CREATE_INCLK1_CHECK STRING "0"
+-- Retrieval info: PRIVATE: CUR_DEDICATED_CLK STRING "c0"
+-- Retrieval info: PRIVATE: CUR_FBIN_CLK STRING "e0"
+-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "7"
+-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1"
+-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000"
+-- Retrieval info: PRIVATE: EFF_OUTPUT_FREQ_VALUE0 STRING "32.000000"
+-- Retrieval info: PRIVATE: EXPLICIT_SWITCHOVER_COUNTER STRING "0"
+-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0"
+-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: GLOCKED_MODE_CHECK STRING "0"
+-- Retrieval info: PRIVATE: GLOCK_COUNTER_EDIT NUMERIC "1048575"
+-- Retrieval info: PRIVATE: HAS_MANUAL_SWITCHOVER STRING "1"
+-- Retrieval info: PRIVATE: INCLK0_FREQ_EDIT STRING "24.000"
+-- Retrieval info: PRIVATE: INCLK0_FREQ_UNIT_COMBO STRING "MHz"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT STRING "100.000"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_EDIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_CHANGED STRING "1"
+-- Retrieval info: PRIVATE: INCLK1_FREQ_UNIT_COMBO STRING "MHz"
+-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
+-- Retrieval info: PRIVATE: INT_FEEDBACK__MODE_RADIO STRING "1"
+-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1"
+-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1"
+-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "312.000"
+-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0"
+-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg"
+-- Retrieval info: PRIVATE: MIG_DEVICE_SPEED_GRADE STRING "Any"
+-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0"
+-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1"
+-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "32.00000000"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1"
+-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz"
+-- Retrieval info: PRIVATE: PHASE_RECONFIG_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: PHASE_RECONFIG_INPUTS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000"
+-- Retrieval info: PRIVATE: PHASE_SHIFT_STEP_ENABLED_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg"
+-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "1"
+-- Retrieval info: PRIVATE: PLL_AUTOPLL_CHECK NUMERIC "1"
+-- Retrieval info: PRIVATE: PLL_ENA_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_ENHPLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_FASTPLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_FBMIMIC_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_LVDS_PLL_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PLL_PFDENA_CHECK STRING "0"
+-- Retrieval info: PRIVATE: PLL_TARGET_HARCOPY_CHECK NUMERIC "0"
+-- Retrieval info: PRIVATE: PRIMARY_CLK_COMBO STRING "inclk0"
+-- Retrieval info: PRIVATE: RECONFIG_FILE STRING "pllx2.mif"
+-- Retrieval info: PRIVATE: SACN_INPUTS_CHECK STRING "0"
+-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: SELF_RESET_LOCK_LOSS STRING "0"
+-- Retrieval info: PRIVATE: SHORT_SCAN_RADIO STRING "0"
+-- Retrieval info: PRIVATE: SPREAD_FEATURE_ENABLED STRING "0"
+-- Retrieval info: PRIVATE: SPREAD_FREQ STRING "50.000"
+-- Retrieval info: PRIVATE: SPREAD_FREQ_UNIT STRING "KHz"
+-- Retrieval info: PRIVATE: SPREAD_PERCENT STRING "0.500"
+-- Retrieval info: PRIVATE: SPREAD_USE STRING "0"
+-- Retrieval info: PRIVATE: SRC_SYNCH_COMP_RADIO STRING "0"
+-- Retrieval info: PRIVATE: STICKY_CLK0 STRING "1"
+-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1"
+-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "1"
+-- Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
+-- Retrieval info: PRIVATE: USE_CLK0 STRING "1"
+-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0"
+-- Retrieval info: PRIVATE: USE_MIL_SPEED_GRADE NUMERIC "0"
+-- Retrieval info: PRIVATE: ZERO_DELAY_RADIO STRING "0"
+-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
+-- Retrieval info: CONSTANT: CLK0_DIVIDE_BY NUMERIC "3"
+-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50"
+-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "4"
+-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0"
+-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0"
+-- Retrieval info: CONSTANT: GATE_LOCK_SIGNAL STRING "NO"
+-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "41666"
+-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II"
+-- Retrieval info: CONSTANT: INVALID_LOCK_MULTIPLIER NUMERIC "5"
+-- Retrieval info: CONSTANT: LPM_TYPE STRING "altpll"
+-- Retrieval info: CONSTANT: OPERATION_MODE STRING "NORMAL"
+-- Retrieval info: CONSTANT: PORT_ACTIVECLOCK STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_ARESET STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_CLKBAD0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKBAD1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKLOSS STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CLKSWITCH STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_CONFIGUPDATE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_FBIN STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_INCLK0 STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_INCLK1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_LOCKED STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_PFDENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASECOUNTERSELECT STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASEDONE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASESTEP STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PHASEUPDOWN STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_PLLENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANACLR STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANCLK STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANCLKENA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDATA STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDATAOUT STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANDONE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANREAD STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_SCANWRITE STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk0 STRING "PORT_USED"
+-- Retrieval info: CONSTANT: PORT_clk1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk4 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clk5 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena4 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_clkena5 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk0 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk1 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk2 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: PORT_extclk3 STRING "PORT_UNUSED"
+-- Retrieval info: CONSTANT: VALID_LOCK_MULTIPLIER NUMERIC "1"
+-- Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT_CLK_EXT VCC "@clk[5..0]"
+-- Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT_CLK_EXT VCC "@extclk[3..0]"
+-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT_CLK_EXT VCC "@inclk[1..0]"
+-- Retrieval info: USED_PORT: areset 0 0 0 0 INPUT GND "areset"
+-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT_CLK_EXT VCC "c0"
+-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT_CLK_EXT GND "inclk0"
+-- Retrieval info: USED_PORT: locked 0 0 0 0 OUTPUT GND "locked"
+-- Retrieval info: CONNECT: locked 0 0 0 0 @locked 0 0 0 0
+-- Retrieval info: CONNECT: @inclk 0 0 1 0 inclk0 0 0 0 0
+-- Retrieval info: CONNECT: c0 0 0 0 0 @clk 0 0 1 0
+-- Retrieval info: CONNECT: @inclk 0 0 1 1 GND 0 0 0 0
+-- Retrieval info: CONNECT: @areset 0 0 0 0 areset 0 0 0 0
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2.vhd TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2.ppf TRUE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2.inc FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2.cmp FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2.bsf FALSE
+-- Retrieval info: GEN_FILE: TYPE_NORMAL pllx2_inst.vhd FALSE
+-- Retrieval info: LIB_FILE: altera_mf
+-- Retrieval info: CBX_MODULE_PREFIX: ON
diff --git a/sdram_ctrl.vhd b/sdram_ctrl.vhd new file mode 100644 index 0000000..b0b4a1f --- /dev/null +++ b/sdram_ctrl.vhd @@ -0,0 +1,615 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +library work; +use work.sdram_util.ALL; + +-- a simple dram controller (no pipelineing) +-- that looks like a slow static ram + +entity sdram_ctrl is + port + ( + clock_100 : in std_logic; + reset_n : in std_logic; + + bus_cs_n : in std_logic; + bus_rnw : in std_logic; + + bus_wait_n : out std_logic; + + bus_addr : in addr_t; + bus_data_in : in data_t; + bus_data_out : out data_t; + + sdram_clk : out std_logic; + sdram_cke : out std_logic; + + sdram_cs_n : out std_logic; + + sdram_cas_n : out std_logic; + sdram_ras_n : out std_logic; + sdram_we_n : out std_logic; + + sdram_addr : out std_logic_vector(12 downto 0); + sdram_ba : out std_logic_vector(1 downto 0); + + sdram_dq : inout data_t; + sdram_dqm : out dqm_t; + + debug : out std_logic_vector(7 downto 0) + ); +end entity; + + +architecture rtl of sdram_ctrl is + + + signal clock : std_logic; + + + constant DEBUG_0 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#3F#,7)); + constant DEBUG_1 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#06#,7)); + constant DEBUG_2 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#5B#,7)); + constant DEBUG_3 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#4F#,7)); + constant DEBUG_4 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#66#,7)); + constant DEBUG_5 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#6D#,7)); + constant DEBUG_6 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#7D#,7)); + constant DEBUG_7 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#07#,7)); + constant DEBUG_8 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#7F#,7)); + constant DEBUG_9 : std_logic_vector(6 downto 0) := std_logic_vector(to_unsigned(16#6F#,7)); + + -- bits in the MEM_CMD register RAS_N CAS_N WE_N + + constant MEM_CMD_NOP : std_logic_vector(2 downto 0 ):="111"; + constant MEM_CMD_READ : std_logic_vector(2 downto 0 ):="101"; + constant MEM_CMD_WRIT : std_logic_vector(2 downto 0 ):="100"; + constant MEM_CMD_ACTV : std_logic_vector(2 downto 0 ):="011"; + constant MEM_CMD_PRE : std_logic_vector(2 downto 0 ):="010"; + constant MEM_CMD_REF : std_logic_vector(2 downto 0 ):="001"; + constant MEM_CMD_MRS : std_logic_vector(2 downto 0 ):="000"; + + constant MEM_CS_N_ALL : cs_n_t := "0"; + constant MEM_CS_N_NONE : cs_n_t := "1"; + + -- refresh logic + + signal need_refresh : std_logic; + signal refresh_counter : uint13_t; + + -- init logic + + signal init_done : std_logic; + signal i_addr : std_logic_vector(12 downto 0); + signal i_cs_n: cs_n_t; + signal i_cmd : std_logic_vector(2 downto 0); + signal i_count : uint4_t; + signal i_next : uint3_t; + signal i_refs : uint3_t; + + -- debuging + signal i_debug : std_logic_vector(6 downto 0); + signal m_debug : std_logic_vector(7 downto 0); + signal b_debug : std_logic_vector(7 downto 0); + + -- init fsm + signal i_state :uint3_t; + + constant I_ST_RESET_WAIT : uint3_t:=0; + constant I_ST_PRECHARGE : uint3_t :=1; + constant I_ST_REFRESH : uint3_t :=2; + constant I_ST_WAIT_COUNT : uint3_t :=3; + constant I_ST_SET_MODE : uint3_t :=4; + constant I_ST_DONE : uint3_t :=5; + + -- memory interface wires + signal mem_cs_n : cs_n_t; + signal mem_bank : std_logic_vector(1 downto 0); + signal mem_cmd : std_logic_vector(2 downto 0); + signal mem_addr : std_logic_vector(12 downto 0); + signal mem_data_out : data_t; + signal mem_data_in : data_t; + signal mem_dqm : dqm_t; + signal mem_oe: std_logic; + + -- main logic + signal ack_refresh : std_logic; + signal ack_request : std_logic; + signal m_count: uint3_t; + + signal active_cs_n : cs_n_t; + signal active_addr : addr_t; + signal active_data : data_t; + signal active_rnw : std_logic; + signal active_dqm : dqm_t; + + -- main fsm + signal m_state : std_logic_vector(9 downto 0); + signal m_next : std_logic_vector(9 downto 0); + + constant M_ST_WAITING_INIT : std_logic_vector(9 downto 0 ):="0000000001"; + constant M_ST_IDLE : std_logic_vector(9 downto 0 ):="0000000010"; + constant M_ST_RAS : std_logic_vector(9 downto 0 ):="0000000100"; + constant M_ST_NOP_COUNT : std_logic_vector(9 downto 0 ):="0000001000"; + constant M_ST_READ : std_logic_vector(9 downto 0 ):="0000010000"; + constant M_ST_WRITE : std_logic_vector(9 downto 0 ):="0000100000"; + constant M_ST_ACTIVE : std_logic_vector(9 downto 0 ):="0001000000"; + constant M_ST_WAIT_FOR_PRECHARGE : std_logic_vector(9 downto 0 ):="0010000000"; + constant M_ST_PRECHARGE : std_logic_vector(9 downto 0 ):="0100000000"; + constant M_ST_REFRESH : std_logic_vector(9 downto 0 ):="1000000000"; + + + -- request logic + signal request_pending: std_logic; + signal request_cs_n : cs_n_t; + signal request_addr : addr_t; + signal request_data : data_t; + signal request_rnw : std_logic; + signal request_dqm : dqm_t; + + -- read state logic + signal r_data_valid: std_logic_vector(3 downto 0); + + -- bus logic + signal post_request: std_logic; + + -- bus fsm + signal b_state : std_logic_vector(4 downto 0); + + constant B_ST_WAIT_CS_N_LOW : std_logic_vector(4 downto 0):="00001"; + constant B_ST_LODGE_REQUEST : std_logic_vector(4 downto 0):="00010"; + constant B_ST_WAIT_ACK : std_logic_vector(4 downto 0):="00100"; + constant B_ST_WAIT_DATA : std_logic_vector(4 downto 0):="01000"; + constant B_ST_WAIT_CS_N_HIGH : std_logic_vector(4 downto 0):="10000"; + + -- convert boolean to active high logic + function b2l_ah(constant val : in boolean) return std_logic is begin + if val then + return '1'; + else + return '0'; + end if; + end function; + + + -- convert active high logic to boolean value + function l2b_ah(constant val : in std_logic) return boolean is begin + return val='1'; + end function; + + function l2b_al(constant val : in std_logic) return boolean is begin + return val='0'; + end function; + + + function same_bank_and_row ( constant a1: in addr_t; constant a2: in addr_t ) return boolean is begin + return a1(23 downto 9) = a2(23 downto 9); + end function; + +begin + + clock<=clock_100; + + refresh_counter_process: process(reset_n,clock) begin + if l2b_al(reset_n) then + refresh_counter <= 8000; + elsif rising_edge(clock) then + if refresh_counter = 0 then + refresh_counter <= 624; + else + refresh_counter <= refresh_counter - 1; + end if; + end if; + end process; + + + need_refresh_process: process(reset_n,clock,refresh_counter,need_refresh,init_done,ack_refresh) begin + if l2b_al(reset_n) then + need_refresh <= '0'; + elsif rising_edge(clock) then + need_refresh <= (b2l_ah(refresh_counter = 0) or need_refresh) and init_done and not ack_refresh; + end if; + end process; + + request_pending_process: process(reset_n, clock, post_request, request_pending,ack_request,refresh_counter) begin + if l2b_al(reset_n) then + request_pending <= '0'; + elsif rising_edge(clock) then + --request_pending <= post_request or (request_pending and not b2l_ah(refresh_counter = 0 )); + request_pending <= post_request or (request_pending and not ack_request); + end if; + end process; + + + init_done_process: process (reset_n,clock,i_state) begin + if l2b_al(reset_n) then + init_done <= '0'; + elsif rising_edge(clock) then + init_done <= init_done or b2l_ah(i_state = I_ST_DONE ); + end if; + end process; + + init_fsm: process (reset_n,clock,i_state,i_count,i_next,refresh_counter) begin + if l2b_al(reset_n) then + i_state <= I_ST_RESET_WAIT; + i_next <= I_ST_RESET_WAIT; + i_cs_n <=MEM_CS_N_NONE; + i_cmd <= MEM_CMD_NOP; + i_addr <= (others => '1'); + i_count <= 0; + i_debug <= DEBUG_0; + elsif rising_edge(clock) then + + if i_state = I_ST_RESET_WAIT then + i_debug <= DEBUG_1; + -- after reset wait until the refresh_counter ticks over for RAM to stabalize + i_cs_n <=MEM_CS_N_NONE; + i_cmd <= MEM_CMD_NOP; + i_refs <= 0; + if refresh_counter=0 then + i_state <= I_ST_PRECHARGE; + end if; + elsif i_state = I_ST_PRECHARGE then + i_debug <= DEBUG_2; + -- precharge all banks, wait one clock, then go to refresh + i_cs_n <=MEM_CS_N_ALL; + i_cmd <=MEM_CMD_PRE; + i_state <= I_ST_WAIT_COUNT; + i_count <= 1; + i_next <= I_ST_REFRESH; + elsif i_state =I_ST_REFRESH then + i_debug <= DEBUG_3; + -- repeat 7 times { refresh, wait 5 counts } + i_cs_n <=MEM_CS_N_ALL; + i_cmd <=MEM_CMD_REF; + i_refs <= i_refs + 1; + + i_state <= I_ST_WAIT_COUNT; + i_count <= 5; + + if i_refs = 7 then + i_next <= I_ST_SET_MODE; + else + i_next <= I_ST_REFRESH; + end if; + elsif i_state = I_ST_WAIT_COUNT then + i_debug <= DEBUG_4; + -- wait i_count ticks then goto state i_next + i_cs_n <=MEM_CS_N_ALL; + i_cmd <= MEM_CMD_NOP; + if (i_count > 1) then + i_count <= i_count -1; + else + i_state <= i_next; + end if; + + elsif i_state=I_ST_SET_MODE then + i_debug <= DEBUG_5; + -- set mode, wait 3 ticks then goto done + i_cs_n <=MEM_CS_N_ALL; + i_cmd <= MEM_CMD_MRS; + + -- reserverd 000 + -- opcode burst read/write 0 + -- reserved 00 + -- cas latency 3 011 + -- sequential burst 0 + -- burst length 1 000 + + i_addr <= "0000000110000"; + i_count <= 3; + i_next <= I_ST_DONE; + i_state <= I_ST_WAIT_COUNT; + + elsif i_state=I_ST_DONE then + i_debug <= DEBUG_6; + i_state <= I_ST_DONE; + else + i_state <= I_ST_RESET_WAIT; + end if; + end if; + end process; + + main_fsm: process (reset_n,clock,m_state,need_refresh,request_pending,request_addr,request_data,request_cs_n,request_rnw,request_dqm,i_debug) begin + + if reset_n ='0' then + m_state <= M_ST_WAITING_INIT; + m_next <= M_ST_WAITING_INIT; + mem_cmd <= MEM_CMD_NOP; + mem_cs_n <= MEM_CS_N_NONE; + mem_bank <= (others => '0'); + mem_addr <= (others => '0'); + mem_data_out <= (others => '0'); + mem_dqm <= (others => '0'); + m_count <= 0; + ack_refresh <= '0'; + ack_request <= '0'; + mem_oe <= '0'; + m_debug(6 downto 0) <=(others =>'0'); + m_debug(7) <='1'; + elsif rising_edge(clock) then + if m_state =M_ST_WAITING_INIT then + m_debug(6 downto 0) <= i_debug; + m_debug(7) <='1'; + mem_addr <= i_addr; + mem_cmd <= i_cmd; + mem_cs_n <= i_cs_n; + + if l2b_ah(init_done) then + m_state <= M_ST_IDLE; + end if; + elsif m_state = M_ST_IDLE then + m_debug(6 downto 0) <= DEBUG_1; + m_debug(7) <='0'; + mem_cmd <= MEM_CMD_NOP; + + ack_refresh <='0'; + + if l2b_ah(need_refresh) then + -- If we got here needing a refresh + -- we may have come straight from a + -- read so leave CS on so we get + -- that data + + mem_cs_n<=MEM_CS_N_ALL; + + -- precharge everyone (putting back + -- the open row if we did come from a read + -- or write) then refresh everyone. + + m_state <= M_ST_PRECHARGE; + m_next <= M_ST_REFRESH; + else + -- idle to all chips (MEM_CMD_IGN) + mem_cs_n<=MEM_CS_N_NONE; + + -- find out if anyone wants us + if l2b_ah(request_pending) then + active_cs_n <= request_cs_n; + active_rnw <= request_rnw; + active_addr <= request_addr; + active_data <= request_data; + active_dqm <= request_dqm; + m_state <= M_ST_RAS; + ack_request <='1'; + end if; + end if; + elsif m_state = M_ST_RAS then + m_debug(6 downto 0) <= DEBUG_2; + -- activate the relevant ROW, wait 3 clocks, then go and do the read or write + + ack_request <='0'; + + mem_cs_n <= active_cs_n; + mem_cmd <= MEM_CMD_ACTV; + mem_bank(1) <= active_addr(23); + mem_bank(0) <= active_addr(9); + mem_addr <= active_addr(22 downto 10); + mem_data_out <= active_data; + mem_dqm <= active_dqm; + + m_state <= M_ST_NOP_COUNT; + m_count <= 2; --t 3 clocks : FIXME + if l2b_ah(active_rnw) then + m_next <= M_ST_READ; + else + m_next <= M_ST_WRITE; + end if; + elsif m_state = M_ST_NOP_COUNT then + m_debug(6 downto 0) <= DEBUG_3; + -- send nops for m_count, then go to state m_next + mem_cmd <=MEM_CMD_NOP; + if m_count > 1 then + m_count <= m_count - 1; + else + m_state <= m_next; + end if; + elsif m_state = M_ST_READ then + m_debug(6 downto 0) <= DEBUG_4; + ack_request <='0'; + + mem_cmd <=MEM_CMD_READ; + + mem_addr(12 downto 9) <= (others => '0'); + mem_addr(8 downto 0) <= active_addr(8 downto 0); + + m_state <= M_ST_ACTIVE; + elsif m_state = M_ST_WRITE then + m_debug(6 downto 0) <= DEBUG_5; + ack_request <='0'; + + mem_cmd<=MEM_CMD_WRIT; + + mem_addr(12 downto 9) <= (others => '0'); + mem_addr(8 downto 0) <= active_addr(8 downto 0); + + mem_oe <= '1'; + mem_data_out <= active_data; + + m_state <=M_ST_ACTIVE; + elsif m_state = M_ST_ACTIVE then + m_debug(6 downto 0) <= DEBUG_6; + -- turn off drivers (we might have come from a write) + mem_oe <= '0'; + + -- sit doing NOPS on this row until either we get a new request + -- or we need a refresh + mem_cmd <= MEM_CMD_NOP; + + if l2b_ah(need_refresh) then + -- the refresh will first precharge everything, so no need to precharge + -- just this row. + m_state <= M_ST_NOP_COUNT; + m_next <= M_ST_IDLE; + m_count <= 1; + elsif l2b_ah(request_pending) then + if (active_cs_n = request_cs_n) and (active_rnw = request_rnw) and same_bank_and_row(active_addr,request_addr) then + -- this request matches our currently active row + -- we can process it + + active_addr <= request_addr; + active_data <= request_data; + active_dqm <= request_dqm; + + ack_request <='1'; + + if l2b_ah(request_rnw) then + m_state <= M_ST_READ; + else + m_state <= M_ST_WRITE; + end if; + else + -- new request doesn't match, precharge and go to idle + m_state <= M_ST_WAIT_FOR_PRECHARGE; + m_next <= M_ST_IDLE; + end if; + end if; + + elsif m_state = M_ST_WAIT_FOR_PRECHARGE then + m_debug(6 downto 0) <= DEBUG_7; + -- wait count then do a precharge + mem_cmd <= MEM_CMD_NOP; + if m_count > 1 then + m_count <= m_count -1; + else + m_state<=M_ST_PRECHARGE; + end if; + elsif m_state = M_ST_PRECHARGE then + m_debug(6 downto 0) <= DEBUG_8; + -- do a precharge, wait two clocks, then goto m_next + mem_addr <= (others => '1'); + mem_cmd <= MEM_CMD_PRE; + m_count <= 1; + m_state <= M_ST_NOP_COUNT; + elsif m_state=M_ST_REFRESH then + m_debug(6 downto 0) <= DEBUG_9; + -- do a refresh, wait six clocks, return to idle + + mem_cmd <= MEM_CMD_REF; + m_count <=5; + m_next <=M_ST_IDLE; + m_state <= M_ST_NOP_COUNT; + + -- tell the gubbins we did the refresh + ack_refresh <= '1'; + else + -- shouldn't be here - crash + m_debug(7) <='1'; + m_debug(6 downto 0) <= DEBUG_9; + mem_cmd <=MEM_CMD_NOP; + mem_cs_n <= MEM_CS_N_NONE; + mem_oe <= '0'; + end if; + end if; + + end process; + + -- drive the memory lines + sdram_clk <= clock; + sdram_cke <= '1'; + sdram_cs_n <= mem_cs_n(0); + sdram_ras_n <= mem_cmd(2); + sdram_cas_n <= mem_cmd(1); + sdram_we_n <= mem_cmd(0); + sdram_addr <= mem_addr; + sdram_ba <= mem_bank; + + sdram_dq_tristate: process(mem_oe,mem_data_out) begin + if l2b_ah(mem_oe) then + sdram_dq <= mem_data_out; + else + sdram_dq <= (others => 'Z' ); + end if; + end process; + + mem_data_in <= sdram_dq; + + sdram_dqm <= mem_dqm; + + -- a shift register to track the reads + read_process: process(reset_n,clock, mem_cmd) begin + if l2b_al(reset_n) then + r_data_valid <= (others => '0'); + elsif rising_edge(clock) then + r_data_valid(2 downto 0)<=r_data_valid(3 downto 1); + r_data_valid(3) <= b2l_ah(mem_cmd = MEM_CMD_READ); + end if; + end process; + + + bus_fsm: process (reset_n,clock,b_state,bus_cs_n,bus_rnw,bus_addr,bus_data_in,ack_request,r_data_valid) begin + if l2b_al(reset_n) then + bus_data_out <= (others => '0'); + request_data <= (others => '0'); + request_addr <= (others => '0'); + request_rnw <= '0'; + request_cs_n <= MEM_CS_N_NONE; + request_dqm <= "00"; + b_state <= B_ST_WAIT_CS_N_LOW; + b_debug(6 downto 0) <= DEBUG_0; + b_debug(7) <='0'; + bus_wait_n <= '0'; + elsif rising_edge(clock) then + if b_state = B_ST_WAIT_CS_N_LOW then + b_debug(6 downto 0) <= DEBUG_1; + bus_wait_n <= '0'; + if l2b_al(bus_cs_n) then + -- new request ship it to the main state machine + post_request <='1'; + request_addr <= bus_addr; + request_rnw <= bus_rnw; + request_data <= bus_data_in; + + -- send to first chip and all bytes + request_cs_n <= "0"; -- (others => '1'); + request_dqm <= "00"; + + b_state <= B_ST_LODGE_REQUEST; + end if; + elsif b_state =B_ST_LODGE_REQUEST then + b_debug(6 downto 0) <= DEBUG_2; + post_request <='0'; + b_state <= B_ST_WAIT_ACK; + elsif b_state =B_ST_WAIT_ACK then + b_debug(6 downto 0) <= DEBUG_3; + if not l2b_ah(request_pending) then + -- the logic has pushed the request to the ram + if l2b_al(request_rnw) then + -- if it's a write we're all done + b_state <= B_ST_WAIT_CS_N_HIGH; + else + -- if it's a read we have to wait for the data + b_state <= B_ST_WAIT_DATA; + end if; + end if; + elsif b_state = B_ST_WAIT_DATA then + b_debug(6 downto 0) <= DEBUG_4; + if l2b_ah(r_data_valid(0)) then + bus_data_out <= mem_data_in; +-- bus_data_out <= request_addr(15 downto 0); + b_state <= B_ST_WAIT_CS_N_HIGH; + end if; + elsif b_state = B_ST_WAIT_CS_N_HIGH then + b_debug(6 downto 0) <= DEBUG_5; + b_debug(7) <='1'; + bus_wait_n <= '1'; + if not l2b_al(bus_cs_n) then + b_state <=B_ST_WAIT_CS_N_LOW; + end if; + else + b_state <=B_ST_WAIT_CS_N_LOW; + end if; + end if; + + end process; +-- debug <=b_debug; + debug <= m_debug; + + +end; + + + + + diff --git a/sdram_test.qpf b/sdram_test.qpf new file mode 100644 index 0000000..9ad2991 --- /dev/null +++ b/sdram_test.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 1991-2012 Altera Corporation
+# Your use of Altera Corporation's design tools, logic functions
+# and other software and tools, and its AMPP partner logic
+# functions, and any output files from any of the foregoing
+# (including device programming or simulation files), and any
+# associated documentation or information are expressly subject
+# to the terms and conditions of the Altera Program License
+# Subscription Agreement, Altera MegaCore Function License
+# Agreement, or other applicable license agreement, including,
+# without limitation, that your use is for the sole purpose of
+# programming logic devices manufactured by Altera and sold by
+# Altera or its authorized distributors. Please refer to the
+# applicable agreement for further details.
+#
+# -------------------------------------------------------------------------- #
+#
+# Quartus II 32-bit
+# Version 12.0 Build 178 05/31/2012 SJ Web Edition
+# Date created = 21:48:38 September 12, 2013
+#
+# -------------------------------------------------------------------------- #
+
+QUARTUS_VERSION = "12.0"
+DATE = "21:48:38 September 12, 2013"
+
+# Revisions
+
+PROJECT_REVISION = "sdram_test"
diff --git a/sdram_test.qsf b/sdram_test.qsf new file mode 100644 index 0000000..a90ba5d --- /dev/null +++ b/sdram_test.qsf @@ -0,0 +1,154 @@ +# -------------------------------------------------------------------------- #
+#
+# Copyright (C) 1991-2012 Altera Corporation
+# Your use of Altera Corporation's design tools, logic functions
+# and other software and tools, and its AMPP partner logic
+# functions, and any output files from any of the foregoing
+# (including device programming or simulation files), and any
+# associated documentation or information are expressly subject
+# to the terms and conditions of the Altera Program License
+# Subscription Agreement, Altera MegaCore Function License
+# Agreement, or other applicable license agreement, including,
+# without limitation, that your use is for the sole purpose of
+# programming logic devices manufactured by Altera and sold by
+# Altera or its authorized distributors. Please refer to the
+# applicable agreement for further details.
+#
+# -------------------------------------------------------------------------- #
+#
+# Quartus II 32-bit
+# Version 12.0 Build 178 05/31/2012 SJ Web Edition
+# Date created = 21:48:38 September 12, 2013
+#
+# -------------------------------------------------------------------------- #
+#
+# Notes:
+#
+# 1) The default values for assignments are stored in the file:
+# sdram.qdf
+# If this file doesn't exist, see file:
+# assignment_defaults.qdf
+#
+# 2) Altera recommends that you do not modify this file. This
+# file is updated automatically by the Quartus II software
+# and any changes you make may be lost or overwritten.
+#
+# -------------------------------------------------------------------------- #
+
+
+set_global_assignment -name FAMILY "Cyclone II" +set_global_assignment -name DEVICE EP2C8Q208C8 +set_global_assignment -name TOP_LEVEL_ENTITY sdram_test
+set_global_assignment -name ORIGINAL_QUARTUS_VERSION 12.0 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:48:38 SEPTEMBER 12, 2013" +set_global_assignment -name LAST_QUARTUS_VERSION "13.0 SP1" +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE "ANY QFP" +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 208 +set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 8 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1 +set_location_assignment PIN_41 -to seven_seg[7] +set_location_assignment PIN_40 -to seven_seg[6] +set_location_assignment PIN_37 -to seven_seg[5] +set_location_assignment PIN_43 -to seven_seg[4] +set_location_assignment PIN_44 -to seven_seg[3] +set_location_assignment PIN_39 -to seven_seg[2] +set_location_assignment PIN_35 -to seven_seg[1] +set_location_assignment PIN_34 -to seven_seg[0] +set_location_assignment PIN_23 -to clock_50 +set_location_assignment PIN_27 -to reset_n +set_location_assignment PIN_92 -to sdram_addr[12] +set_location_assignment PIN_90 -to sdram_addr[11] +set_location_assignment PIN_75 -to sdram_addr[10] +set_location_assignment PIN_89 -to sdram_addr[9] +set_location_assignment PIN_88 -to sdram_addr[8] +set_location_assignment PIN_87 -to sdram_addr[7] +set_location_assignment PIN_86 -to sdram_addr[6] +set_location_assignment PIN_84 -to sdram_addr[5] +set_location_assignment PIN_82 -to sdram_addr[4] +set_location_assignment PIN_81 -to sdram_addr[3] +set_location_assignment PIN_80 -to sdram_addr[2] +set_location_assignment PIN_77 -to sdram_addr[1] +set_location_assignment PIN_76 -to sdram_addr[0] +set_location_assignment PIN_74 -to sdram_ba[1] +set_location_assignment PIN_72 -to sdram_ba[0] +set_location_assignment PIN_69 -to sdram_cas_n +set_location_assignment PIN_46 -to sdram_cke +set_location_assignment PIN_47 -to sdram_clk +set_location_assignment PIN_45 -to sdram_cs_n +set_location_assignment PIN_94 -to sdram_dq[15] +set_location_assignment PIN_95 -to sdram_dq[14] +set_location_assignment PIN_96 -to sdram_dq[13] +set_location_assignment PIN_97 -to sdram_dq[12] +set_location_assignment PIN_99 -to sdram_dq[11] +set_location_assignment PIN_101 -to sdram_dq[10] +set_location_assignment PIN_102 -to sdram_dq[9] +set_location_assignment PIN_103 -to sdram_dq[8] +set_location_assignment PIN_57 -to sdram_dq[7] +set_location_assignment PIN_58 -to sdram_dq[6] +set_location_assignment PIN_59 -to sdram_dq[5] +set_location_assignment PIN_60 -to sdram_dq[4] +set_location_assignment PIN_61 -to sdram_dq[3] +set_location_assignment PIN_63 -to sdram_dq[2] +set_location_assignment PIN_64 -to sdram_dq[1] +set_location_assignment PIN_67 -to sdram_dq[0] +set_location_assignment PIN_104 -to sdram_dqm[1] +set_location_assignment PIN_56 -to sdram_dqm[0] +set_location_assignment PIN_70 -to sdram_ras_n +set_location_assignment PIN_68 -to sdram_we_n +set_location_assignment PIN_41 -to seg[7] +set_location_assignment PIN_160 -to dm9000_cmd +set_location_assignment PIN_165 -to dm9000_cs_n +set_location_assignment PIN_144 -to dm9000_data[15] +set_location_assignment PIN_145 -to dm9000_data[14] +set_location_assignment PIN_146 -to dm9000_data[13] +set_location_assignment PIN_147 -to dm9000_data[12] +set_location_assignment PIN_149 -to dm9000_data[11] +set_location_assignment PIN_150 -to dm9000_data[10] +set_location_assignment PIN_151 -to dm9000_data[9] +set_location_assignment PIN_152 -to dm9000_data[8] +set_location_assignment PIN_135 -to dm9000_data[7] +set_location_assignment PIN_134 -to dm9000_data[6] +set_location_assignment PIN_138 -to dm9000_data[5] +set_location_assignment PIN_137 -to dm9000_data[4] +set_location_assignment PIN_141 -to dm9000_data[3] +set_location_assignment PIN_139 -to dm9000_data[2] +set_location_assignment PIN_143 -to dm9000_data[1] +set_location_assignment PIN_142 -to dm9000_data[0] +set_location_assignment PIN_162 -to dm9000_rd_n +set_location_assignment PIN_163 -to dm9000_wr_n +set_location_assignment PIN_164 -to dm9000_rst_n +set_location_assignment PIN_161 -to dm9000_int +set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top +set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top +set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top +set_global_assignment -name SEARCH_PATH sdram_test_mcu/synthesis/ -tag from_archive +set_global_assignment -name SEARCH_PATH sdram_test_mcu/synthesis/submodules/ -tag from_archive +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL" +set_location_assignment PIN_108 -to vga_red[0] +set_location_assignment PIN_113 -to vga_red[1] +set_location_assignment PIN_112 -to vga_red[2] +set_location_assignment PIN_128 -to vga_hs +set_location_assignment PIN_115 -to vga_green[0] +set_location_assignment PIN_114 -to vga_green[1] +set_location_assignment PIN_117 -to vga_green[2] +set_location_assignment PIN_116 -to vga_blue[0] +set_location_assignment PIN_127 -to vga_blue[1] +set_location_assignment PIN_118 -to vga_blue[2] +set_location_assignment PIN_133 -to vga_vs + +set_global_assignment -name USE_CONFIGURATION_DEVICE ON +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "USE AS REGULAR IO" +set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "USE AS REGULAR IO" + + +set_global_assignment -name PIN_FILE sdram_test.pin +set_global_assignment -name VHDL_FILE sdram_test.vhd +set_global_assignment -name VHDL_FILE sdram_util.vhd +set_global_assignment -name VHDL_FILE sdram_ctrl.vhd +set_global_assignment -name VHDL_FILE pllx2.vhd +set_global_assignment -name QSYS_FILE sdram_test_mcu.qsys + + +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top diff --git a/sdram_test.vhd b/sdram_test.vhd new file mode 100644 index 0000000..156ca28 --- /dev/null +++ b/sdram_test.vhd @@ -0,0 +1,177 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +library work; +use work.sdram_util.ALL; + +entity sdram is +port ( + clock_50 : in std_logic; + reset_n : in std_logic; + seven_seg : out std_logic_vector(7 downto 0); + + sdram_clk : out std_logic; + + sdram_cs_n : out std_logic; + sdram_cas_n : out std_logic; + sdram_ras_n : out std_logic; + sdram_we_n : out std_logic; + sdram_cke : out std_logic; + + sdram_addr : out std_logic_vector(12 downto 0); + sdram_ba : out std_logic_vector(1 downto 0); + + sdram_dq : inout std_logic_vector(15 downto 0); + sdram_dqm : out std_logic_vector(1 downto 0) +); +end entity; + +architecture rtl of sdram is + +component pllx2 IS + PORT + ( + areset : IN STD_LOGIC := '0'; + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +end component; + + + +component sdram_test_mcu is + port ( + clk_clk : in std_logic := 'X'; -- clk + reset_reset_n : in std_logic := 'X'; -- reset_n + pio_0_d_export : out std_logic_vector(7 downto 0); -- export + sbb_0_reset_n : out std_logic -- reset_n + sbb_0_cs_n : out std_logic; -- cs_n + sbb_0_rnw : out std_logic; -- rnw + sbb_0_wait_n : in std_logic := 'X'; -- wait_n + sbb_0_addr : out std_logic_vector(15 downto 0); -- addr + sbb_0_data_in : in std_logic_vector(15 downto 0) := (others => 'X'); -- data_in + sbb_0_data_out : out std_logic_vector(15 downto 0); -- data_out + ); +end component sdram_mcu; + +component sdram_ctrl is + port + ( + clock_100 : in std_logic; + reset_n : in std_logic; + + bus_cs_n : in std_logic; + bus_rnw : in std_logic; + + bus_wait_n : out std_logic; + + bus_addr : in addr_t; + bus_data_in : in data_t; + bus_data_out : out data_t; + + sdram_clk : out std_logic; + sdram_cke : out std_logic; + + sdram_cs_n : out std_logic; + + sdram_cas_n : out std_logic; + sdram_ras_n : out std_logic; + sdram_we_n : out std_logic; + + sdram_addr : out std_logic_vector(12 downto 0); + sdram_ba : out std_logic_vector(1 downto 0); + + sdram_dq : inout data_t; + sdram_dqm : out dqm_t; + + debug : out std_logic_vector(7 downto 0) + ); +end component; + +signal b_data_in8 : std_logic_vector(7 downto 0); +signal b_data_out8 : std_logic_vector(7 downto 0); +signal b_addr16: std_logic_vector(15 downto 0); + +signal b_addr : addr_t; +signal b_data_in : data_t; +signal b_data_out : data_t; +signal b_cs_n : std_logic; +signal b_rnw : std_logic; +signal b_wait_n : std_logic; + +signal pll_reset : std_logic; +signal mcu_clock : std_logic; +signal clock_100 : std_logic; +signal pll_locked : std_logic; +signal debug : std_logic_vector(7 downto 0); + +signal global_reset_n : std_logic; +signal b_reset_n : std_logic; + +signal buf8 : std_logic_vector(7 downto 0); + + +begin + + pll: pllx2 port map ( + pll_reset, + clock_50, + clock_100, + pll_locked ); + + mcu_clock <= clock_50; + + u0 : component sdram_mcu port map ( + clk_clk => mcu_clock, -- clk.clk + reset_reset_n => global_reset_n, -- reset.reset_n + pio_0_d_export => seven_seg, -- pio_0_d.export + sbb_0_reset_n => b_reset_n + sbb_0_cs_n => b_cs_n, -- ebb_0.cs_n + sbb_0_rnw => b_rnw, -- .rnw + sbb_0_wait_n => b_wait_n, -- .wait_n + sbb_0_addr => b_addr16, -- .addr + sbb_0_data_in => b_data_in, -- .data + sbb_0_data_out => b_data_out, -- .data + ); + + -- bodge buses together + + b_addr(15 downto 0) <= b_addr16; + b_addr(23 downto 16) <= (others => '0'); + + sdram_ctrl0: sdram_ctrl port map ( + clock_100 => clock_50, + reset_n => b_reset_n, + + bus_cs_n => b_cs_n, + bus_rnw => b_rnw, + + bus_wait_n => b_wait_n, + + bus_addr => b_addr, + bus_data_in => b_data_in, + bus_data_out => b_data_out, + + sdram_clk => sdram_clk, + sdram_cke => sdram_cke, + + sdram_cs_n => sdram_cs_n, + sdram_cas_n => sdram_cas_n, + sdram_ras_n => sdram_ras_n, + sdram_we_n => sdram_we_n, + + sdram_addr => sdram_addr, + sdram_ba => sdram_ba, + + sdram_dq => sdram_dq, + sdram_dqm => sdram_dqm, + + debug => debug + ); + + pll_reset <= '0'; + global_reset_n <= reset_n and pll_locked; + +end architecture; diff --git a/sdram_test_mcu.qsys b/sdram_test_mcu.qsys new file mode 100644 index 0000000..c0cba01 --- /dev/null +++ b/sdram_test_mcu.qsys @@ -0,0 +1,543 @@ +<?xml version="1.0" encoding="UTF-8"?> +<system name="$${FILENAME}"> + <component + name="$${FILENAME}" + displayName="$${FILENAME}" + version="1.0" + description="" + tags="" + categories="System" /> + <parameter name="bonusData"><![CDATA[bonusData +{ + element $${FILENAME} + { + } + element async_16bit_bus_adapter_0 + { + datum _sortIndex + { + value = "6"; + type = "int"; + } + } + element jtag_uart_0.avalon_jtag_slave + { + datum baseAddress + { + value = "270432"; + type = "String"; + } + } + element async_16bit_bus_adapter_0.avalon_slave + { + datum baseAddress + { + value = "131072"; + type = "String"; + } + } + element clk_0 + { + datum _sortIndex + { + value = "0"; + type = "int"; + } + } + element epcs_flash_controller_0.epcs_control_port + { + datum baseAddress + { + value = "266240"; + type = "String"; + } + } + element epcs_flash_controller_0 + { + datum _sortIndex + { + value = "2"; + type = "int"; + } + datum megawizard_uipreferences + { + value = "{}"; + type = "String"; + } + } + element nios2_qsys_0.jtag_debug_module + { + datum baseAddress + { + value = "268288"; + type = "String"; + } + } + element jtag_uart_0 + { + datum _sortIndex + { + value = "5"; + type = "int"; + } + } + element nios2_qsys_0 + { + datum _sortIndex + { + value = "1"; + type = "int"; + } + } + element pio_0 + { + datum _sortIndex + { + value = "4"; + type = "int"; + } + } + element timer_0.s1 + { + datum baseAddress + { + value = "270368"; + type = "String"; + } + } + element pio_0.s1 + { + datum baseAddress + { + value = "270416"; + type = "String"; + } + } + element timer_0 + { + datum _sortIndex + { + value = "3"; + type = "int"; + } + } +} +]]></parameter> + <parameter name="clockCrossingAdapter" value="HANDSHAKE" /> + <parameter name="device" value="EP2C8Q208C8" /> + <parameter name="deviceFamily" value="Cyclone II" /> + <parameter name="deviceSpeedGrade" value="8" /> + <parameter name="fabricMode" value="QSYS" /> + <parameter name="generateLegacySim" value="false" /> + <parameter name="generationId" value="0" /> + <parameter name="globalResetBus" value="false" /> + <parameter name="hdlLanguage" value="VERILOG" /> + <parameter name="maxAdditionalLatency" value="1" /> + <parameter name="projectName" value="sdram_test.qpf" /> + <parameter name="sopcBorderPoints" value="false" /> + <parameter name="systemHash" value="1" /> + <parameter name="timeStamp" value="1381776549910" /> + <parameter name="useTestBenchNamingPattern" value="false" /> + <instanceScript></instanceScript> + <interface name="clk" internal="clk_0.clk_in" type="clock" dir="end" /> + <interface name="reset" internal="clk_0.clk_in_reset" type="reset" dir="end" /> + <interface + name="pio_0_d" + internal="pio_0.external_connection" + type="conduit" + dir="end" /> + <interface + name="sbb_0" + internal="async_16bit_bus_adapter_0.sbb" + type="conduit" + dir="end" /> + <module kind="clock_source" version="13.0" enabled="1" name="clk_0"> + <parameter name="clockFrequency" value="80000000" /> + <parameter name="clockFrequencyKnown" value="true" /> + <parameter name="inputClockFrequency" value="0" /> + <parameter name="resetSynchronousEdges" value="NONE" /> + </module> + <module + kind="altera_nios2_qsys" + version="13.0" + enabled="1" + name="nios2_qsys_0"> + <parameter name="setting_showUnpublishedSettings" value="false" /> + <parameter name="setting_showInternalSettings" value="false" /> + <parameter name="setting_preciseSlaveAccessErrorException" value="false" /> + <parameter name="setting_preciseIllegalMemAccessException" value="false" /> + <parameter name="setting_preciseDivisionErrorException" value="false" /> + <parameter name="setting_performanceCounter" value="false" /> + <parameter name="setting_illegalMemAccessDetection" value="false" /> + <parameter name="setting_illegalInstructionsTrap" value="false" /> + <parameter name="setting_fullWaveformSignals" value="false" /> + <parameter name="setting_extraExceptionInfo" value="false" /> + <parameter name="setting_exportPCB" value="false" /> + <parameter name="setting_debugSimGen" value="false" /> + <parameter name="setting_clearXBitsLDNonBypass" value="true" /> + <parameter name="setting_bit31BypassDCache" value="true" /> + <parameter name="setting_bigEndian" value="false" /> + <parameter name="setting_export_large_RAMs" value="false" /> + <parameter name="setting_asic_enabled" value="false" /> + <parameter name="setting_asic_synopsys_translate_on_off" value="false" /> + <parameter name="setting_oci_export_jtag_signals" value="false" /> + <parameter name="setting_bhtIndexPcOnly" value="false" /> + <parameter name="setting_avalonDebugPortPresent" value="false" /> + <parameter name="setting_alwaysEncrypt" value="true" /> + <parameter name="setting_allowFullAddressRange" value="false" /> + <parameter name="setting_activateTrace" value="true" /> + <parameter name="setting_activateTestEndChecker" value="false" /> + <parameter name="setting_activateMonitors" value="true" /> + <parameter name="setting_activateModelChecker" value="false" /> + <parameter name="setting_HDLSimCachesCleared" value="true" /> + <parameter name="setting_HBreakTest" value="false" /> + <parameter name="muldiv_divider" value="false" /> + <parameter name="mpu_useLimit" value="false" /> + <parameter name="mpu_enabled" value="false" /> + <parameter name="mmu_enabled" value="false" /> + <parameter name="mmu_autoAssignTlbPtrSz" value="true" /> + <parameter name="manuallyAssignCpuID" value="true" /> + <parameter name="debug_triggerArming" value="true" /> + <parameter name="debug_embeddedPLL" value="true" /> + <parameter name="debug_debugReqSignals" value="false" /> + <parameter name="debug_assignJtagInstanceID" value="false" /> + <parameter name="dcache_omitDataMaster" value="false" /> + <parameter name="cpuReset" value="false" /> + <parameter name="is_hardcopy_compatible" value="false" /> + <parameter name="setting_shadowRegisterSets" value="0" /> + <parameter name="mpu_numOfInstRegion" value="8" /> + <parameter name="mpu_numOfDataRegion" value="8" /> + <parameter name="mmu_TLBMissExcOffset" value="0" /> + <parameter name="debug_jtagInstanceID" value="0" /> + <parameter name="resetOffset" value="0" /> + <parameter name="exceptionOffset" value="32" /> + <parameter name="cpuID" value="0" /> + <parameter name="cpuID_stored" value="0" /> + <parameter name="breakOffset" value="32" /> + <parameter name="userDefinedSettings" value="" /> + <parameter name="resetSlave">async_16bit_bus_adapter_0.avalon_slave</parameter> + <parameter name="mmu_TLBMissExcSlave" value="" /> + <parameter name="exceptionSlave">async_16bit_bus_adapter_0.avalon_slave</parameter> + <parameter name="breakSlave">nios2_qsys_0.jtag_debug_module</parameter> + <parameter name="setting_perfCounterWidth" value="32" /> + <parameter name="setting_interruptControllerType" value="Internal" /> + <parameter name="setting_branchPredictionType" value="Automatic" /> + <parameter name="setting_bhtPtrSz" value="8" /> + <parameter name="muldiv_multiplierType" value="EmbeddedMulFast" /> + <parameter name="mpu_minInstRegionSize" value="12" /> + <parameter name="mpu_minDataRegionSize" value="12" /> + <parameter name="mmu_uitlbNumEntries" value="4" /> + <parameter name="mmu_udtlbNumEntries" value="6" /> + <parameter name="mmu_tlbPtrSz" value="7" /> + <parameter name="mmu_tlbNumWays" value="16" /> + <parameter name="mmu_processIDNumBits" value="8" /> + <parameter name="impl" value="Tiny" /> + <parameter name="icache_size" value="2048" /> + <parameter name="icache_tagramBlockType" value="Automatic" /> + <parameter name="icache_ramBlockType" value="Automatic" /> + <parameter name="icache_numTCIM" value="0" /> + <parameter name="icache_burstType" value="None" /> + <parameter name="dcache_bursts" value="false" /> + <parameter name="dcache_victim_buf_impl" value="ram" /> + <parameter name="debug_level" value="Level1" /> + <parameter name="debug_OCIOnchipTrace" value="_128" /> + <parameter name="dcache_size" value="1024" /> + <parameter name="dcache_tagramBlockType" value="Automatic" /> + <parameter name="dcache_ramBlockType" value="Automatic" /> + <parameter name="dcache_numTCDM" value="0" /> + <parameter name="dcache_lineSize" value="32" /> + <parameter name="setting_exportvectors" value="false" /> + <parameter name="setting_ecc_present" value="false" /> + <parameter name="regfile_ramBlockType" value="Automatic" /> + <parameter name="ocimem_ramBlockType" value="Automatic" /> + <parameter name="mmu_ramBlockType" value="Automatic" /> + <parameter name="bht_ramBlockType" value="Automatic" /> + <parameter name="instAddrWidth" value="19" /> + <parameter name="dataAddrWidth" value="19" /> + <parameter name="tightlyCoupledDataMaster0AddrWidth" value="1" /> + <parameter name="tightlyCoupledDataMaster1AddrWidth" value="1" /> + <parameter name="tightlyCoupledDataMaster2AddrWidth" value="1" /> + <parameter name="tightlyCoupledDataMaster3AddrWidth" value="1" /> + <parameter name="tightlyCoupledInstructionMaster0AddrWidth" value="1" /> + <parameter name="tightlyCoupledInstructionMaster1AddrWidth" value="1" /> + <parameter name="tightlyCoupledInstructionMaster2AddrWidth" value="1" /> + <parameter name="tightlyCoupledInstructionMaster3AddrWidth" value="1" /> + <parameter name="instSlaveMapParam"><![CDATA[<address-map><slave name='async_16bit_bus_adapter_0.avalon_slave' start='0x20000' end='0x40000' /><slave name='epcs_flash_controller_0.epcs_control_port' start='0x41000' end='0x41800' /><slave name='nios2_qsys_0.jtag_debug_module' start='0x41800' end='0x42000' /><slave name='timer_0.s1' start='0x42020' end='0x42040' /><slave name='pio_0.s1' start='0x42050' end='0x42060' /></address-map>]]></parameter> + <parameter name="dataSlaveMapParam"><![CDATA[<address-map><slave name='async_16bit_bus_adapter_0.avalon_slave' start='0x20000' end='0x40000' /><slave name='epcs_flash_controller_0.epcs_control_port' start='0x41000' end='0x41800' /><slave name='nios2_qsys_0.jtag_debug_module' start='0x41800' end='0x42000' /><slave name='timer_0.s1' start='0x42020' end='0x42040' /><slave name='pio_0.s1' start='0x42050' end='0x42060' /><slave name='jtag_uart_0.avalon_jtag_slave' start='0x42060' end='0x42068' /></address-map>]]></parameter> + <parameter name="clockFrequency" value="80000000" /> + <parameter name="deviceFamilyName" value="Cyclone II" /> + <parameter name="internalIrqMaskSystemInfo" value="7" /> + <parameter name="customInstSlavesSystemInfo" value="<info/>" /> + <parameter name="deviceFeaturesSystemInfo">ADDRESS_STALL 1 CELL_LEVEL_BACK_ANNOTATION_DISABLED 0 COMPILER_SUPPORT 1 DSP 0 DSP_SHIFTER_BLOCK 0 DUMP_ASM_LAB_BITS_FOR_POWER 1 EMUL 1 ENABLE_ADVANCED_IO_ANALYSIS_GUI_FEATURES 0 EPCS 1 ESB 0 FAKE1 0 FAKE2 0 FAKE3 0 FAMILY_LEVEL_INSTALLATION_ONLY 1 FITTER_USE_FALLING_EDGE_DELAY 0 GENERATE_DC_ON_CURRENT_WARNING_FOR_INTERNAL_CLAMPING_DIODE 0 HARDCOPY 0 HAS_18_BIT_MULTS 0 HAS_ACE_SUPPORT 1 HAS_ADJUSTABLE_OUTPUT_IO_TIMING_MEAS_POINT 0 HAS_ADVANCED_IO_INVERTED_CORNER 0 HAS_ADVANCED_IO_POWER_SUPPORT 0 HAS_ADVANCED_IO_TIMING_SUPPORT 0 HAS_ALM_SUPPORT 0 HAS_ATOM_AND_ROUTING_POWER_MODELED_TOGETHER 0 HAS_AUTO_DERIVE_CLOCK_UNCERTAINTY_SUPPORT 0 HAS_AUTO_FIT_SUPPORT 1 HAS_BALANCED_OPT_TECHNIQUE_SUPPORT 1 HAS_BENEFICIAL_SKEW_SUPPORT 0 HAS_BITLEVEL_DRIVE_STRENGTH_CONTROL 0 HAS_BSDL_FILE_GENERATION 0 HAS_CGA_SUPPORT 1 HAS_CHECK_NETLIST_SUPPORT 1 HAS_CLOCK_REGION_CHECKER_ENABLED 1 HAS_CORE_JUNCTION_TEMP_DERATING 1 HAS_CROSSTALK_SUPPORT 0 HAS_CUSTOM_REGION_SUPPORT 1 HAS_DAP_JTAG_FROM_HPS 0 HAS_DATA_DRIVEN_ACVQ_HSSI_SUPPORT 0 HAS_DDB_FDI_SUPPORT 0 HAS_DESIGN_ANALYZER_SUPPORT 1 HAS_DETAILED_IO_RAIL_POWER_MODEL 1 HAS_DETAILED_LEIM_STATIC_POWER_MODEL 0 HAS_DETAILED_LE_POWER_MODEL 1 HAS_DETAILED_ROUTING_MUX_STATIC_POWER_MODEL 0 HAS_DETAILED_THERMAL_CIRCUIT_PARAMETER_SUPPORT 1 HAS_DEVICE_MIGRATION_SUPPORT 1 HAS_DIAGONAL_MIGRATION_SUPPORT 0 HAS_EMIF_TOOLKIT_SUPPORT 0 HAS_ERROR_DETECTION_SUPPORT 0 HAS_FAMILY_VARIANT_MIGRATION_SUPPORT 0 HAS_FANOUT_FREE_NODE_SUPPORT 1 HAS_FAST_FIT_SUPPORT 1 HAS_FITTER_EARLY_TIMING_ESTIMATE_SUPPORT 1 HAS_FITTER_ECO_SUPPORT 1 HAS_FIT_NETLIST_OPT_RETIME_SUPPORT 1 HAS_FIT_NETLIST_OPT_SUPPORT 1 HAS_FORMAL_VERIFICATION_SUPPORT 1 HAS_FPGA_XCHANGE_SUPPORT 1 HAS_FSAC_LUTRAM_REGISTER_PACKING_SUPPORT 0 HAS_FULL_DAT_MIN_TIMING_SUPPORT 1 HAS_FULL_INCREMENTAL_DESIGN_SUPPORT 1 HAS_FUNCTIONAL_SIMULATION_SUPPORT 1 HAS_FUNCTIONAL_VERILOG_SIMULATION_SUPPORT 0 HAS_FUNCTIONAL_VHDL_SIMULATION_SUPPORT 0 HAS_GLITCH_FILTERING_SUPPORT 1 HAS_HC_READY_SUPPORT 0 HAS_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_HOLD_TIME_AVOIDANCE_ACROSS_CLOCK_SPINE_SUPPORT 1 HAS_HSPICE_WRITER_SUPPORT 0 HAS_HSSI_POWER_CALCULATOR 0 HAS_IBISO_WRITER_SUPPORT 1 HAS_INCREMENTAL_DAT_SUPPORT 0 HAS_INCREMENTAL_SYNTHESIS_SUPPORT 1 HAS_INTERFACE_PLANNER_SUPPORT 0 HAS_IO_ASSIGNMENT_ANALYSIS_SUPPORT 1 HAS_IO_DECODER 0 HAS_IO_PLACEMENT_OPTIMIZATION_SUPPORT 1 HAS_IO_SMART_RECOMPILE_SUPPORT 1 HAS_JITTER_SUPPORT 0 HAS_JTAG_SLD_HUB_SUPPORT 1 HAS_LIMITED_TCL_FITTER_SUPPORT 0 HAS_LOGIC_LOCK_SUPPORT 1 HAS_MICROPROCESSOR 0 HAS_MIF_SMART_COMPILE_SUPPORT 1 HAS_MINMAX_TIMING_MODELING_SUPPORT 0 HAS_MIN_TIMING_ANALYSIS_SUPPORT 1 HAS_MUX_RESTRUCTURE_SUPPORT 1 HAS_NEW_HC_FLOW_SUPPORT 0 HAS_NEW_SERDES_MAX_RESOURCE_COUNT_REPORTING_SUPPORT 0 HAS_NEW_VPR_SUPPORT 1 HAS_NONSOCKET_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_NO_HARDBLOCK_PARTITION_SUPPORT 0 HAS_NO_JTAG_USERCODE_SUPPORT 0 HAS_OPERATING_SETTINGS_AND_CONDITIONS_REPORTING_SUPPORT 1 HAS_PAD_LOCATION_ASSIGNMENT_SUPPORT 1 HAS_PARTIAL_RECONFIG_SUPPORT 0 HAS_PHYSICAL_NETLIST_OUTPUT 0 HAS_PHYSICAL_ROUTING_SUPPORT 0 HAS_PIN_SPECIFIC_VOLTAGE_SUPPORT 0 HAS_PLDM_REF_SUPPORT 1 HAS_POWER_ESTIMATION_SUPPORT 1 HAS_PRELIMINARY_CLOCK_UNCERTAINTY_NUMBERS 0 HAS_PRE_FITTER_FPP_SUPPORT 0 HAS_PRE_FITTER_LUTRAM_NETLIST_CHECKER_ENABLED 0 HAS_PVA_SUPPORT 1 HAS_RCF_SUPPORT 1 HAS_RCF_SUPPORT_FOR_DEBUGGING 0 HAS_RED_BLACK_SEPARATION_SUPPORT 0 HAS_RE_LEVEL_TIMING_GRAPH_SUPPORT 0 HAS_RISEFALL_DELAY_SUPPORT 1 HAS_SIGNAL_PROBE_SUPPORT 1 HAS_SIGNAL_TAP_SUPPORT 1 HAS_SIMULATOR_SUPPORT 1 HAS_SPLIT_IO_SUPPORT 0 HAS_SPLIT_LC_SUPPORT 1 HAS_SYNTH_FSYN_NETLIST_OPT_SUPPORT 0 HAS_SYNTH_NETLIST_OPT_RETIME_SUPPORT 1 HAS_SYNTH_NETLIST_OPT_SUPPORT 1 HAS_TCL_FITTER_SUPPORT 0 HAS_TECHNOLOGY_MIGRATION_SUPPORT 0 HAS_TEMPLATED_REGISTER_PACKING_SUPPORT 1 HAS_TIME_BORROWING_SUPPORT 0 HAS_TIMING_DRIVEN_SYNTHESIS_SUPPORT 1 HAS_TIMING_INFO_SUPPORT 1 HAS_TIMING_OPERATING_CONDITIONS 0 HAS_TIMING_SIMULATION_SUPPORT 1 HAS_TITAN_BASED_MAC_REGISTER_PACKER_SUPPORT 0 HAS_U2B2_SUPPORT 0 HAS_USER_HIGH_SPEED_LOW_POWER_TILE_SUPPORT 0 HAS_USE_FITTER_INFO_SUPPORT 1 HAS_VCCPD_POWER_RAIL 0 HAS_VERTICAL_MIGRATION_SUPPORT 1 HAS_VIEWDRAW_SYMBOL_SUPPORT 1 HAS_VIO_SUPPORT 1 HAS_VIRTUAL_DEVICES 0 HAS_WYSIWYG_DFFEAS_SUPPORT 0 HAS_XIBISO_WRITER_SUPPORT 0 IFP_USE_LEGACY_IO_CHECKER 0 INCREMENTAL_DESIGN_SUPPORTS_COMPATIBLE_CONSTRAINTS 0 INSTALLED 0 IS_CONFIG_ROM 0 IS_DEFAULT_FAMILY 0 IS_HARDCOPY_FAMILY 0 LVDS_IO 0 M10K_MEMORY 0 M144K_MEMORY 0 M20K_MEMORY 0 M4K_MEMORY 1 M512_MEMORY 0 M9K_MEMORY 0 MLAB_MEMORY 0 MRAM_MEMORY 0 NOT_LISTED 0 NO_RPE_SUPPORT 0 NO_SUPPORT_FOR_LOGICLOCK_CONTENT_BACK_ANNOTATION 0 NO_SUPPORT_FOR_STA_CLOCK_UNCERTAINTY_CHECK 1 NO_TDC_SUPPORT 0 POSTFIT_BAK_DATABASE_EXPORT_ENABLED 1 POSTMAP_BAK_DATABASE_EXPORT_ENABLED 1 PROGRAMMER_SUPPORT 1 QFIT_IN_DEVELOPMENT 0 QMAP_IN_DEVELOPMENT 0 RAM_LOGICAL_NAME_CHECKING_IN_CUT_ENABLED 1 REPORTS_METASTABILITY_MTBF 0 REQUIRES_INSTALLATION_PATCH 0 REQUIRES_LIST_OF_TEMPERATURE_AND_VOLTAGE_OPERATING_CONDITIONS 0 RESERVES_SIGNAL_PROBE_PINS 0 RESOLVE_MAX_FANOUT_EARLY 1 RESOLVE_MAX_FANOUT_LATE 0 RESPECTS_FIXED_SIZED_LOCKED_LOCATION_LOGICLOCK 1 RESTRICTED_USER_SELECTION 0 RISEFALL_SUPPORT_IS_HIDDEN 1 STRICT_TIMING_DB_CHECKS 0 SUPPORTS_ADDITIONAL_OPTIONS_FOR_UNUSED_IO 1 SUPPORTS_CRC 1 SUPPORTS_DIFFERENTIAL_AIOT_BOARD_TRACE_MODEL 0 SUPPORTS_DSP_BALANCING_BACK_ANNOTATION 0 SUPPORTS_GENERATION_OF_EARLY_POWER_ESTIMATOR_FILE 1 SUPPORTS_GLOBAL_SIGNAL_BACK_ANNOTATION 0 SUPPORTS_MAC_CHAIN_OUT_ADDER 0 SUPPORTS_RAM_PACKING_BACK_ANNOTATION 0 SUPPORTS_REG_PACKING_BACK_ANNOTATION 0 SUPPORTS_SIGNALPROBE_REGISTER_PIPELINING 1 SUPPORTS_SINGLE_ENDED_AIOT_BOARD_TRACE_MODEL 0 SUPPORTS_USER_MANUAL_LOGIC_DUPLICATION 1 TMV_RUN_CUSTOMIZABLE_VIEWER 1 TMV_RUN_INTERNAL_DETAILS 1 TMV_RUN_INTERNAL_DETAILS_ON_IO 1 TMV_RUN_INTERNAL_DETAILS_ON_IOBUF 0 TMV_RUN_INTERNAL_DETAILS_ON_LCELL 0 TMV_RUN_INTERNAL_DETAILS_ON_LRAM 0 TRANSCEIVER_3G_BLOCK 0 TRANSCEIVER_6G_BLOCK 0 USES_ACV_FOR_FLED 1 USES_ADB_FOR_BACK_ANNOTATION 0 USES_ALTERA_LNSIM 0 USES_ASIC_ROUTING_POWER_CALCULATOR 0 USES_DATA_DRIVEN_PLL_COMPUTATION_UTIL 1 USES_DEV 1 USES_ICP_FOR_ECO_FITTER 0 USES_LIBERTY_TIMING 0 USES_POWER_SIGNAL_ACTIVITIES 1 USES_THIRD_GENERATION_TIMING_MODELS_TIS 0 USES_U2B2_TIMING_MODELS 0 USE_ADVANCED_IO_POWER_BY_DEFAULT 0 USE_ADVANCED_IO_TIMING_BY_DEFAULT 0 USE_BASE_FAMILY_DDB_PATH 0 USE_OCT_AUTO_CALIBRATION 0 USE_RELAX_IO_ASSIGNMENT_RULES 1 USE_RISEFALL_ONLY 0 USE_SEPARATE_LIST_FOR_TECH_MIGRATION 0 USE_SINGLE_COMPILER_PASS_PLL_MIF_FILE_WRITER 0 USE_TITAN_IO_BASED_IO_REGISTER_PACKER_UTIL 0 WYSIWYG_BUS_WIDTH_CHECKING_IN_CUT_ENABLED 0</parameter> + <parameter name="tightlyCoupledDataMaster0MapParam" value="" /> + <parameter name="tightlyCoupledDataMaster1MapParam" value="" /> + <parameter name="tightlyCoupledDataMaster2MapParam" value="" /> + <parameter name="tightlyCoupledDataMaster3MapParam" value="" /> + <parameter name="tightlyCoupledInstructionMaster0MapParam" value="" /> + <parameter name="tightlyCoupledInstructionMaster1MapParam" value="" /> + <parameter name="tightlyCoupledInstructionMaster2MapParam" value="" /> + <parameter name="tightlyCoupledInstructionMaster3MapParam" value="" /> + </module> + <module + kind="altera_avalon_epcs_flash_controller" + version="13.0.1.99.2" + enabled="1" + name="epcs_flash_controller_0"> + <parameter name="autoSelectASMIAtom" value="true" /> + <parameter name="useASMIAtom" value="true" /> + <parameter name="clockRate" value="80000000" /> + <parameter name="deviceFamilyString" value="Cyclone II" /> + <parameter name="autoInitializationFileName">$${FILENAME}_epcs_flash_controller_0</parameter> + </module> + <module + kind="altera_avalon_timer" + version="13.0.1.99.2" + enabled="1" + name="timer_0"> + <parameter name="alwaysRun" value="false" /> + <parameter name="counterSize" value="32" /> + <parameter name="fixedPeriod" value="false" /> + <parameter name="period" value="1" /> + <parameter name="periodUnits" value="MSEC" /> + <parameter name="resetOutput" value="false" /> + <parameter name="snapshot" value="true" /> + <parameter name="timeoutPulseOutput" value="false" /> + <parameter name="systemFrequency" value="80000000" /> + </module> + <module + kind="altera_avalon_pio" + version="13.0.1.99.2" + enabled="1" + name="pio_0"> + <parameter name="bitClearingEdgeCapReg" value="false" /> + <parameter name="bitModifyingOutReg" value="false" /> + <parameter name="captureEdge" value="false" /> + <parameter name="direction" value="Output" /> + <parameter name="edgeType" value="RISING" /> + <parameter name="generateIRQ" value="false" /> + <parameter name="irqType" value="LEVEL" /> + <parameter name="resetValue" value="0" /> + <parameter name="simDoTestBenchWiring" value="false" /> + <parameter name="simDrivenValue" value="0" /> + <parameter name="width" value="8" /> + <parameter name="clockRate" value="80000000" /> + </module> + <module + kind="altera_avalon_jtag_uart" + version="13.0.1.99.2" + enabled="1" + name="jtag_uart_0"> + <parameter name="allowMultipleConnections" value="false" /> + <parameter name="hubInstanceID" value="0" /> + <parameter name="readBufferDepth" value="64" /> + <parameter name="readIRQThreshold" value="8" /> + <parameter name="simInputCharacterStream" value="" /> + <parameter name="simInteractiveOptions">INTERACTIVE_ASCII_OUTPUT</parameter> + <parameter name="useRegistersForReadBuffer" value="false" /> + <parameter name="useRegistersForWriteBuffer" value="false" /> + <parameter name="useRelativePathForSimFile" value="false" /> + <parameter name="writeBufferDepth" value="64" /> + <parameter name="writeIRQThreshold" value="8" /> + <parameter name="avalonSpec" value="2.0" /> + </module> + <module + kind="async_16bit_bus_adapter" + version="1.0" + enabled="1" + name="async_16bit_bus_adapter_0"> + <parameter name="AUTO_CLOCK_CLOCK_RATE" value="-1" /> + <parameter name="AUTO_CLOCK_CLOCK_RATE_1" value="80000000" /> + </module> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.instruction_master" + end="nios2_qsys_0.jtag_debug_module"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00041800" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="nios2_qsys_0.jtag_debug_module"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00041800" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="reset" + version="13.0" + start="clk_0.clk_reset" + end="nios2_qsys_0.reset_n" /> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="nios2_qsys_0.reset_n" /> + <connection kind="clock" version="13.0" start="clk_0.clk" end="nios2_qsys_0.clk" /> + <connection + kind="reset" + version="13.0" + start="clk_0.clk_reset" + end="epcs_flash_controller_0.reset" /> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="epcs_flash_controller_0.reset" /> + <connection + kind="clock" + version="13.0" + start="clk_0.clk" + end="epcs_flash_controller_0.clk" /> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.instruction_master" + end="epcs_flash_controller_0.epcs_control_port"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00041000" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="epcs_flash_controller_0.epcs_control_port"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00041000" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection kind="clock" version="13.0" start="clk_0.clk" end="timer_0.clk" /> + <connection + kind="reset" + version="13.0" + start="clk_0.clk_reset" + end="timer_0.reset" /> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="timer_0.reset" /> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="timer_0.s1"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00042020" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.instruction_master" + end="timer_0.s1"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00042020" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection kind="clock" version="13.0" start="clk_0.clk" end="pio_0.clk" /> + <connection kind="reset" version="13.0" start="clk_0.clk_reset" end="pio_0.reset" /> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="pio_0.s1"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00042050" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.instruction_master" + end="pio_0.s1"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00042050" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="pio_0.reset" /> + <connection kind="clock" version="13.0" start="clk_0.clk" end="jtag_uart_0.clk" /> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="jtag_uart_0.reset" /> + <connection + kind="reset" + version="13.0" + start="clk_0.clk_reset" + end="jtag_uart_0.reset" /> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="jtag_uart_0.avalon_jtag_slave"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00042060" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="interrupt" + version="13.0" + start="nios2_qsys_0.d_irq" + end="epcs_flash_controller_0.irq"> + <parameter name="irqNumber" value="0" /> + </connection> + <connection + kind="interrupt" + version="13.0" + start="nios2_qsys_0.d_irq" + end="timer_0.irq"> + <parameter name="irqNumber" value="1" /> + </connection> + <connection + kind="interrupt" + version="13.0" + start="nios2_qsys_0.d_irq" + end="jtag_uart_0.irq"> + <parameter name="irqNumber" value="2" /> + </connection> + <connection + kind="clock" + version="13.0" + start="clk_0.clk" + end="async_16bit_bus_adapter_0.clock" /> + <connection + kind="reset" + version="13.0" + start="clk_0.clk_reset" + end="async_16bit_bus_adapter_0.reset" /> + <connection + kind="reset" + version="13.0" + start="nios2_qsys_0.jtag_debug_module_reset" + end="async_16bit_bus_adapter_0.reset" /> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.instruction_master" + end="async_16bit_bus_adapter_0.avalon_slave"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00020000" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <connection + kind="avalon" + version="13.0" + start="nios2_qsys_0.data_master" + end="async_16bit_bus_adapter_0.avalon_slave"> + <parameter name="arbitrationPriority" value="1" /> + <parameter name="baseAddress" value="0x00020000" /> + <parameter name="defaultConnection" value="false" /> + </connection> + <interconnectRequirement for="$system" name="qsys_mm.clockCrossingAdapter" value="HANDSHAKE" /> + <interconnectRequirement for="$system" name="qsys_mm.maxAdditionalLatency" value="1" /> +</system> diff --git a/sdram_util.vhd b/sdram_util.vhd new file mode 100644 index 0000000..7dfcb47 --- /dev/null +++ b/sdram_util.vhd @@ -0,0 +1,50 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +package sdram_util is + +subtype uint3_t is integer range 0 to 7; +subtype uint4_t is integer range 0 to 15; +subtype uint8_t is integer range 0 to 255; +subtype uint13_t is integer range 0 to 8191; +subtype cs_n_t is std_logic_vector(0 downto 0); +subtype addr_t is std_logic_vector(23 downto 0); +subtype data_t is std_logic_vector(15 downto 0); +subtype dqm_t is std_logic_vector(1 downto 0); + + + function b2l_ah(constant val : in boolean) return std_logic; + function l2b_ah(constant val : in std_logic) return boolean; + function l2b_al(constant val : in std_logic) return boolean; + +end package; + + +package body sdram_util is + + -- convert boolean to active high logic + function b2l_ah(constant val : in boolean) return std_logic is begin + if val then + return '1'; + else + return '0'; + end if; + end function; + + + -- convert active high logic to boolean value + function l2b_ah(constant val : in std_logic) return boolean is begin + return val='1'; + end function; + + function l2b_al(constant val : in std_logic) return boolean is begin + return val='0'; + end function; + +end package body; + + + + + diff --git a/src/sdram_test.c b/src/sdram_test.c new file mode 100644 index 0000000..ba1be8d --- /dev/null +++ b/src/sdram_test.c @@ -0,0 +1,56 @@ +#include <io.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include "system.h" + + +#define msleep(msec) usleep(1000*msec); + +pio_write (unsigned int data) +{ + IOWR (PIO_0_BASE, 0, data); +} + +static void +show (int v) +{ + // int to seven segment lookup: MSB dp g f e d c b a LSB + const uint8_t lookup[10] = + { 0x3F, 0x6, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F }; + + uint8_t pio = 0; + + // show negative with DP + if (v < 0) + { + pio |= 0x80; + v = -v; + } + + if (v > 9) + v = 9; + + pio |= lookup[v]; + + pio_write (pio); +} + + + +int +main (void) +{ + int i; + printf ("Working...\n"); + for (;;) { + for (i=-9;i<10;++i) { + printf("Showing %d\n",i); + show(i); + msleep(1000); + } + } + +} diff --git a/tools/wrap b/tools/wrap new file mode 100755 index 0000000..26a0640 --- /dev/null +++ b/tools/wrap @@ -0,0 +1,15 @@ +#!/bin/bash + +AD=/software/apps/altera/quartus_ii_13.0sp1 +if [ $(uname -m ) == "x86_64" ]; then + LL=linux64 +else + LL=linux +fi +QUARTUS_ROOTDIR="${AD}/quartus" +PATH="${AD}/quartus/bin:${AD}/quartus/sopc_builder/bin:${AD}/nios2eds/sdk2/bin:${AD}/nios2eds/bin:${AD}/nios2eds/bin/gnu/H-i686-pc-linux-gnu/bin:${PATH}" +LD_LIBRARY_PATH="${AD}/quartus/${LL}:${LD_LIBRARY_PATH}" + +export LD_LIBRARY_PATH PATH QUARTUS_ROOTDIR + +"$@" |