Skip to content
Snippets Groups Projects
Select Git revision
  • b5b3c5c854fdbe1f2ffc360e66302babd7781a4b
  • master default protected
  • dither_on_off_disabled
  • yocto
  • pypcc2
  • pypcc3
  • 2020-12-07-the_only_working_copy
  • v2.1
  • v2.0
  • v1.0
  • v0.9
  • Working-RCU_ADC,ID
  • 2020-12-11-Holiday_Season_release
13 results

pypcc.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    ddr_testdriver.vhd 26.99 KiB
    -------------------------------------------------------------------------------
    --
    -- Copyright (C) 2009
    -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
    -- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>                  
    -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
    --
    -- This program is free software: you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation, either version 3 of the License, or
    -- (at your option) any later version.
    --
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    --
    -- You should have received a copy of the GNU General Public License
    -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
    --
    -------------------------------------------------------------------------------
    
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_ARITH.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    use work.tech_ddr_component_pkg.all;
    
    -- This module instantiates the Altera MegaWizard DDR3 controller and
    -- test driver for both modules.
    -- It adds a control state machine so the Nios can offload the task of
    -- monitoring the test progress.
    
    -- Nov 13th 2014
    -- name changed to ddr_testdriver
    -- added generic for technology independance
    -- added support for DDR4 in Arria10
    -- parameterise bus widths
    
    ENTITY ddr_testdriver IS
      generic (
    	g_SELECT_MODULE			: IN INTEGER := 5		-- 0 for original guess using 'normal' high peed controller,
    													-- 1 for Micron MT4JSF12864HZ-1G4D1 at 800MT/s using high speed controller II
    													-- 2 for Micron MT4JSF12864HZ-1G4D1 at 1066MT/s using high speed controller II
    													-- 3 for Micron MT8JSF12864HZ-1G4D1 at 800MT/s using high speed controller II
    													-- 4 for Micron MT8JSF12864HZ-1G4D1 at 1066MT/s using high speed controller II
    													-- 5 for Micron MT16JSF51264HZ-1G4D1 at 1066MT/s using high speed controller II
    													-- 6 for Micron MT8JSF12864HZ-1G4D1 at 1066MT/s using high speed controller II with bitwise pnf
    	);
      PORT (
        -- GENERAL
        CLK                    : IN    STD_LOGIC; -- System Clock
        reset_n                : IN    STD_LOGIC; -- active low reset
    
        -- SO-DIMM Memory Bank I
        MB_I_EVENT             : IN    STD_LOGIC;
        MB_I_DQ                : INOUT STD_LOGIC_VECTOR(63 DOWNTO 0);
        MB_I_A                 : OUT   STD_LOGIC_VECTOR(15 DOWNTO 0);
        MB_I_BA                : OUT   STD_LOGIC_VECTOR(2 DOWNTO 0);
        MB_I_DQS               : INOUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_I_DQS_N             : INOUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_I_DM                : OUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_I_CAS               : OUT   STD_LOGIC;
        MB_I_RAS               : OUT   STD_LOGIC;
        MB_I_WE                : OUT   STD_LOGIC;
        MB_I_RESET             : OUT   STD_LOGIC;
        MB_I_ODT               : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_I_CK                : INOUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_I_CK_N              : INOUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_I_CKE               : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_I_S                 : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_I_SCL               : OUT   STD_LOGIC;
        MB_I_SDA               : INOUT STD_LOGIC;
    
        -- SO-DIMM Memory Bank II
        MB_II_EVENT            : IN    STD_LOGIC;
        MB_II_DQ               : INOUT STD_LOGIC_VECTOR(63 DOWNTO 0);
        MB_II_A                : OUT   STD_LOGIC_VECTOR(15 DOWNTO 0);
        MB_II_BA               : OUT   STD_LOGIC_VECTOR(2 DOWNTO 0);
        MB_II_DQS              : INOUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_II_DQS_N            : INOUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_II_DM               : OUT   STD_LOGIC_VECTOR(7 DOWNTO 0);
        MB_II_CAS              : OUT   STD_LOGIC;
        MB_II_RAS              : OUT   STD_LOGIC;
        MB_II_WE               : OUT   STD_LOGIC;
        MB_II_RESET            : OUT   STD_LOGIC;
        MB_II_ODT              : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_II_CK               : INOUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_II_CK_N             : INOUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_II_CKE              : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_II_S                : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
        MB_II_SCL              : OUT   STD_LOGIC;
        MB_II_SDA              : INOUT STD_LOGIC;
    
    		-- avalon MM control interface
    		mm_clock            	: in  std_logic;
    		mm_writedata            : in  std_logic_vector(31 downto 0);
    		mm_readdata             : out  std_logic_vector(31 downto 0);
    		mm_write            	: in  std_logic;
    		mm_address             	: in  std_logic_vector(2 downto 0)
    
      );
    END ddr_testdriver;
    
    architecture archi of ddr_testdriver is
    
    
    	component ddr3_test_example_top_special_hsII1066_MT8 is 
            port (
                  -- inputs:
                     signal clock_source : IN STD_LOGIC;
                     signal global_reset_n : IN STD_LOGIC;
                     signal start_test : IN STD_LOGIC;
    
                  -- outputs:
                     signal mem_addr : OUT STD_LOGIC_VECTOR (13 DOWNTO 0);
                     signal mem_ba : OUT STD_LOGIC_VECTOR (2 DOWNTO 0);
                     signal mem_cas_n : OUT STD_LOGIC;
                     signal mem_cke : OUT STD_LOGIC_VECTOR (0 DOWNTO 0);
                     signal mem_clk : INOUT STD_LOGIC_VECTOR (1 DOWNTO 0);
                     signal mem_clk_n : INOUT STD_LOGIC_VECTOR (1 DOWNTO 0);
                     signal mem_cs_n : OUT STD_LOGIC_VECTOR (0 DOWNTO 0);
                     signal mem_dm : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
                     signal mem_dq : INOUT STD_LOGIC_VECTOR (63 DOWNTO 0);
                     signal mem_dqs : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
                     signal mem_dqsn : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
                     signal mem_odt : OUT STD_LOGIC_VECTOR (0 DOWNTO 0);
                     signal mem_ras_n : OUT STD_LOGIC;
                     signal mem_reset_n : OUT STD_LOGIC;
                     signal mem_we_n : OUT STD_LOGIC;
                     signal pnf : OUT STD_LOGIC;
                     signal pnf_per_byte : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
                     signal pnf_per_bit : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
                     signal data_per_bit : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
                     signal test_complete : OUT STD_LOGIC;
                     signal test_status : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
                  );
    	end component;
    
    			
    	
    	type driver_state_type is (
    			IDLE,
    			START_TEST,
    			WAIT_FOR_TEST,
    			STOP_ON_ERROR
    		);
    		
    
    	-- Signals for controlling the tests
    	signal driver_state_I		 	:  driver_state_type;
    	signal driver_state_II		 	:  driver_state_type;
    	signal control 	:  STD_LOGIC_VECTOR (31 DOWNTO 0);
    	signal itercount_I 	:  STD_LOGIC_VECTOR (63 DOWNTO 0);
    	signal itercount_II 	:  STD_LOGIC_VECTOR (63 DOWNTO 0);
    	signal testtimeout_I 	:  STD_LOGIC;
    	signal testtimeout_II 	:  STD_LOGIC;
    	signal timeoutcount_I 	:  STD_LOGIC_VECTOR (15 DOWNTO 0);
    	signal timeoutcount_II 	:  STD_LOGIC_VECTOR (15 DOWNTO 0);
    
    
    	-- signal to generate delays before initialising the modules
    	signal delay_count 		:  STD_LOGIC_VECTOR (23 DOWNTO 0);
    	signal delayed_resetn_I	:  STD_LOGIC;
    	signal delayed_resetn_II:  STD_LOGIC;
    
    	-- signals for controlling the tests
    	signal pnf_I_d1 	:  STD_LOGIC := '0';
    	signal pnf_I_d2 	:  STD_LOGIC := '0';
    	signal pnf_II_d1 	:  STD_LOGIC := '0';
    	signal pnf_II_d2 	:  STD_LOGIC := '0';
    	signal test_complete_I_d1 	:  STD_LOGIC := '0';
    	signal test_complete_I_d2 	:  STD_LOGIC := '0';
    	signal test_complete_II_d1 	:  STD_LOGIC := '0';
    	signal test_complete_II_d2 	:  STD_LOGIC := '0';
    	signal start_test_I 	:  STD_LOGIC := '0';
    	signal start_test_II 	:  STD_LOGIC := '0';
    	signal test_complete_I 	:  STD_LOGIC;
    	signal test_complete_II :  STD_LOGIC;
    	signal test_status_I 	:  STD_LOGIC_VECTOR (7 DOWNTO 0);
    	signal test_status_II 	:  STD_LOGIC_VECTOR (7 DOWNTO 0);
    	signal pnf_I 			:  STD_LOGIC;
    	signal pnf_II 			:  STD_LOGIC;
    	signal pnfperbyte_I 	:  STD_LOGIC_VECTOR (31 DOWNTO 0);
    	signal pnfperbyte_II 	:  STD_LOGIC_VECTOR (31 DOWNTO 0);
    	signal pnfperbit_I 		:  STD_LOGIC_VECTOR (31 DOWNTO 0) := X"00000000";
    	signal pnfperbit_II 	:  STD_LOGIC_VECTOR (31 DOWNTO 0) := X"00000000";
    	signal dataperbit_I 	:  STD_LOGIC_VECTOR (31 DOWNTO 0) := X"00000000";
    	signal dataperbit_II 	:  STD_LOGIC_VECTOR (31 DOWNTO 0) := X"00000000";
    	signal fsm_I 	:  STD_LOGIC_VECTOR (1 DOWNTO 0);
    	signal fsm_II 	:  STD_LOGIC_VECTOR (1 DOWNTO 0);
    
    
    begin
    
    -- Avalon MM control registers
    mm_interface: process(mm_clock)
    	variable arp_timeout_count	: integer := 0;
    begin
    	if mm_clock'event and mm_clock = '1' then
    		if mm_write = '1' then
    			case mm_address is
    				when "000" =>
    					control		<= mm_writedata;
    				when others	=>
    					
    			end case;
    		else
    			case mm_address is
    				when "001" =>
    					mm_readdata		<= test_status_I & X"0000" & "00" & fsm_I &"00" & testtimeout_I & pnf_I_d2;
    				when "010" =>
    					mm_readdata		<= itercount_I(31 downto 0);
    				when "011" =>
    					mm_readdata		<= itercount_I(63 downto 32);
    				when "100" =>
    					mm_readdata		<= test_status_II & X"0000" & "00" & fsm_II &"00" & testtimeout_II & pnf_II_d2;
    				when "101" =>
    					mm_readdata		<= itercount_II(31 downto 0);
    				when "110" =>
    					mm_readdata		<= itercount_II(63 downto 32);
    				when others	=>
    					mm_readdata		<= X"ffffffff";
    			end case;
    		end if;
    
    	end if;
    end process;
    	
    -- Test control process
    test_control_I: process(mm_clock)
    begin
    	if mm_clock'event and mm_clock = '1' then
    		if reset_n = '0' then
    			driver_state_I	  <= IDLE;
    			driver_state_II   <= IDLE;
    			itercount_I	  <= (others => '0');
    			itercount_II	  <= (others => '0');
    		        pnf_I_d1          <= '0'; 
    		        pnf_I_d2          <= '0'; 
    		        pnf_II_d1         <= '0'; 
    		        pnf_II_d2         <= '0'; 
    		        test_complete_I_d1          <= '0'; 
    		        test_complete_I_d2          <= '0'; 
    		        test_complete_II_d1         <= '0'; 
    		        test_complete_II_d2         <= '0'; 
    		else
                            -- reclock the control signals from the phy clock domains
                            pnf_I_d1          <= pnf_I;
                            pnf_I_d2          <= pnf_I_d1;
                            pnf_II_d1         <= pnf_II;
                            pnf_II_d2         <= pnf_II_d1;
                            test_complete_I_d1          <= test_complete_I;
                            test_complete_I_d2          <= test_complete_I_d1;
                            test_complete_II_d1         <= test_complete_II;
                            test_complete_II_d2         <= test_complete_II_d1;
    			
    			case driver_state_I is
    				when IDLE =>
    					fsm_I	<= "00";
    					if control(0) = '1' then
    						itercount_I	<= (others => '0');
    						driver_state_I		<= START_TEST;
    					end if;
    				when START_TEST =>
    					fsm_I	<= "01";
    					start_test_I		<= '1';
    					timeoutcount_I		<= (others => '0');
    					testtimeout_I		<= '0';
    					driver_state_I		<= WAIT_FOR_TEST;	
    				when WAIT_FOR_TEST =>
    					fsm_I	<= "10";
    					timeoutcount_I		<= timeoutcount_I + 1;
    					
    					if timeoutcount_I = X"000F" then
    					        start_test_I		<= '0';
    					end if;
    					if timeoutcount_I = X"FFFF" then
    						testtimeout_I <= '1';
    						driver_state_I		<= STOP_ON_ERROR;
    					end if;
    
    					if test_complete_I_d2 = '1' then
    						if pnf_I_d2 = '1' then
    							if control(0) = '1' then
    								driver_state_I		<= START_TEST;
    								itercount_I		<= itercount_I + 1;
    							else
    								driver_state_I		<= IDLE;
    							end if;
    						else
    							driver_state_I		<= STOP_ON_ERROR;
    						end if;
    					end if;
    				when STOP_ON_ERROR =>
    					fsm_I	<= "11";
    					if control(0) = '0' then
    						driver_state_I		<= IDLE;
    					end if;
    
    				when others =>
    					driver_state_I		<= IDLE;
    
    			end case;
    
    
    			case driver_state_II is
    				when IDLE =>
    					fsm_II	<= "00";
    					if control(1) = '1' then
    						itercount_II	<= (others => '0');
    						driver_state_II		<= START_TEST;
    					end if;
    				when START_TEST =>
    					fsm_II	<= "01";
    					start_test_II		<= '1';
    					timeoutcount_II		<= (others => '0');
    					testtimeout_II		<= '0';
    					driver_state_II		<= WAIT_FOR_TEST;	
    				when WAIT_FOR_TEST =>
    					fsm_II	<= "10";
    					timeoutcount_II		<= timeoutcount_II + 1;
    
    					if timeoutcount_II = X"000F" then
    					        start_test_II		<= '0';
    					end if;
    					
    					if timeoutcount_II = X"FFFF" then
    						testtimeout_II <= '1';
    						driver_state_II		<= STOP_ON_ERROR;
    					end if;
    
    					if test_complete_II_d2 = '1' then
    						if PNF_II_d2 = '1' then
    							if control(1) = '1' then
    								driver_state_II		<= START_TEST;
    								itercount_II		<= itercount_II + 1;
    							else
    								driver_state_II		<= IDLE;
    							end if;
    						else
    							driver_state_II		<= STOP_ON_ERROR;
    						end if;
    					end if;
    				when STOP_ON_ERROR =>
    					fsm_II	<= "11";
    					if control(1) = '0' then
    						driver_state_II		<= IDLE;
    					end if;
    
    				when others =>
    					driver_state_II		<= IDLE;
    			end case;
    
    		end if;
    	end if;
    end process;
    	
      -- instantiate the DDR3 test generator examples depending on the chosen module
    
      hsIgen: if g_SELECT_MODULE = 0 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(14 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE,
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S,
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT,
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(14 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE,
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S,
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT,
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	end GENERATE hsIgen;
    
      hsII800gen: if g_SELECT_MODULE = 1 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce_hsII800
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(13 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE,
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S,
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT,
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce_hsII800
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(13 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE,
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S,
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT,
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	end GENERATE hsII800gen;
    
      hsII1066gen: if g_SELECT_MODULE = 2 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce_hsII1066
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(13 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE,
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S,
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT,
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce_hsII1066
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(13 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE,
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S,
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT,
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	end GENERATE hsII1066gen;
    
      hsII800MT8gen: if g_SELECT_MODULE = 3 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce_hsII800_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(13 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE(0 downto 0),
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S(0 downto 0),
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	    
    	  MB_I_CKE(1)	<= '0';
    	  MB_I_S(1)		<= '0';
    	  MB_I_ODT(1)	<= '0';
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce_hsII800_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> reset_n,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(13 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE(0 downto 0),
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S(0 downto 0),
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	    
    	  MB_II_CKE(1)	<= '0';
    	  MB_II_S(1)	<= '0';
    	  MB_II_ODT(1)	<= '0';
    
    	 end GENERATE hsII800MT8gen;
    
      hsII1066MT8gen: if g_SELECT_MODULE = 4 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce_hsII1066_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_I,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(13 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE(0 downto 0),
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S(0 downto 0),
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	    
    	  MB_I_CKE(1)	<= '0';
    	  MB_I_S(1)		<= '0';
    	  MB_I_ODT(1)	<= '0';
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce_hsII1066_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_II,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(13 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE(0 downto 0),
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S(0 downto 0),
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	    
    	  MB_II_CKE(1)	<= '0';
    	  MB_II_S(1)	<= '0';
    	  MB_II_ODT(1)	<= '0';
    
    	 end GENERATE hsII1066MT8gen;
    
      hsII1066MT16gen: if g_SELECT_MODULE = 5 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_runonce_hsII1066_MT16
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_I,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(14 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE,
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S,
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT,
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	
    	  ddr3_test_II : ddr3_test_example_top_runonce_hsII1066_MT16
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_II,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(14 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE,
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S,
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT,
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	end GENERATE hsII1066MT16gen;
    
    
      hsII1066MT8specgen: if g_SELECT_MODULE = 6 GENERATE
    	  ddr3_test_I : ddr3_test_example_top_special_hsII1066_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_I,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_I_A(13 downto 0),
    	        mem_ba 		=> MB_I_BA,
    	        mem_cas_n 	=> MB_I_CAS,
    	        mem_cke 	=> MB_I_CKE(0 downto 0),
    	        mem_clk 	=> MB_I_CK ,
    	        mem_clk_n 	=> MB_I_CK_N,
    	        mem_cs_n	=> MB_I_S(0 downto 0),
    	        mem_dm 		=> MB_I_DM,
    	        mem_dq 		=> MB_I_DQ,
    	        mem_dqs 	=> MB_I_DQS ,
    	        mem_dqsn 	=> MB_I_DQS_N,
    	        mem_odt 	=> MB_I_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_I_RAS,
    	        mem_reset_n => MB_I_RESET,
    	        mem_we_n 	=> MB_I_WE,
    	        pnf 			=> pnf_I,
    	        pnf_per_byte 	=> pnfperbyte_I,
    	        pnf_per_bit 	=> pnfperbit_I,
    	        data_per_bit 	=> dataperbit_I,
    	        start_test 		=> start_test_I,
    	        test_complete 	=> test_complete_I,
    	        test_status 	=> test_status_I
    	    );
    	    
    	  MB_I_CKE(1)	<= '0';
    	  MB_I_S(1)		<= '0';
    	  MB_I_ODT(1)	<= '0';
    	
    	  ddr3_test_II : ddr3_test_example_top_special_hsII1066_MT8
    	    port map(
    	        -- inputs:
    	        clock_source 	=> CLK,
    	        global_reset_n 	=> delayed_resetn_II,
    	
    	        -- outputs:
    	        mem_addr 	=> MB_II_A(13 downto 0),
    	        mem_ba 		=> MB_II_BA,
    	        mem_cas_n 	=> MB_II_CAS,
    	        mem_cke 	=> MB_II_CKE(0 downto 0),
    	        mem_clk 	=> MB_II_CK ,
    	        mem_clk_n 	=> MB_II_CK_N,
    	        mem_cs_n	=> MB_II_S(0 downto 0),
    	        mem_dm 		=> MB_II_DM,
    	        mem_dq 		=> MB_II_DQ,
    	        mem_dqs 	=> MB_II_DQS ,
    	        mem_dqsn 	=> MB_II_DQS_N,
    	        mem_odt 	=> MB_II_ODT(0 downto 0),
    	        mem_ras_n 	=> MB_II_RAS,
    	        mem_reset_n => MB_II_RESET,
    	        mem_we_n 	=> MB_II_WE,
    	        pnf 			=> pnf_II,
    	        pnf_per_byte 	=> pnfperbyte_II,
    	        pnf_per_bit 	=> pnfperbit_II,
    	        data_per_bit 	=> dataperbit_II,
    	        start_test 		=> start_test_II,
    	        test_complete 	=> test_complete_II,
    	        test_status 	=> test_status_II
    	    );
    	    
    	  MB_II_CKE(1)	<= '0';
    	  MB_II_S(1)	<= '0';
    	  MB_II_ODT(1)	<= '0';
    
    	 end GENERATE hsII1066MT8specgen;
    
    
     
    
    	delay_proc : process(mm_clock)
    	begin
    		if rising_edge(mm_clock)then
    		  if reset_n = '0' then
    			delay_count 		<= (others => '0');
    			delayed_resetn_I 	<= '0';
    			delayed_resetn_II 	<= '0';
    		  else
    			if delayed_resetn_II = '0' then		-- stop counter after module II enabled
    			  delay_count <= delay_count + 1;
    			end if;
    			if delay_count = X"4C4B40" then		-- 100ms
    --			if delay_count = X"4C" then
        		  delayed_resetn_I 	<= '1';
    			end if;
    			if delay_count = X"989680" then		-- 200ms
    --			if delay_count = X"4C" then
    			  delayed_resetn_II	<= '1';
    			end if;
    		  end if;
    		end if;
    	end process;
    
    
    
    
    
    
    end archi;