OpenCores
URL https://opencores.org/ocsvn/sdram_ctrl/sdram_ctrl/trunk

Subversion Repositories sdram_ctrl

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 7 to Rev 8
    Reverse comparison

Rev 7 → Rev 8

/tags/V10/test_bench/old/cpu_simulator_file_based.vhd File deleted \ No newline at end of file
/tags/V10/test_bench/old/nios.dat File deleted \ No newline at end of file
/tags/V10/test_bench/cpu_simulator.vhd File deleted \ No newline at end of file
/tags/V10/doc/sdram_ctrl.sxw Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
tags/V10/doc/sdram_ctrl.sxw Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: tags/V10/src/sdram_ctrl.vhd =================================================================== --- tags/V10/src/sdram_ctrl.vhd (revision 7) +++ tags/V10/src/sdram_ctrl.vhd (nonexistent) @@ -1,441 +0,0 @@ ------------------------------------------------------------------- --- --- sdram_ctrl.vhd --- --- Module Description: --- SDRAM small&fast controller --- --- --- To Do: --- multichipselect support --- configurable times --- nios simulation support --- --- Author(s): --- Aleksey Kuzmenok, ntpqa@opencores.org --- ------------------------------------------------------------------- --- --- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG --- --- This module is free software; you can redistribute it and/or --- modify it under the terms of the GNU Lesser General Public --- License as published by the Free Software Foundation; either --- version 2.1 of the License, or (at your option) any later version. --- --- This module 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 --- Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public --- License along with this software; if not, write to the Free Software --- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --- ------------------------------------------------------------------- --- Test results --- FPGA SDRAM CLK (not less than) --- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz --- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz --- ------------------------------------------------------------------- - -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; -LIBRARY altera_mf; -USE altera_mf.altera_mf_components.all; - -entity sdram_ctrl is - generic( - DATA_WIDTH: integer:=32; - BANK_WIDTH: integer:=4; - ROW_WIDTH: integer:=12; - COLUMN_WIDTH: integer:=8; - - clk_MHz: integer:=120 - ); - port( - signal clk : IN STD_LOGIC; - signal reset : IN STD_LOGIC; - - -- IMPORTANT: for this Avalon(tm) interface - -- 'Minimum Arbitration Shares'=1 - -- 'Max Pending Read Transactions'=9 - signal avs_nios_chipselect : IN STD_LOGIC; - signal avs_nios_address : IN STD_LOGIC_VECTOR ((BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); - signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); - signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_write : IN STD_LOGIC; - signal avs_nios_read : IN STD_LOGIC; - signal avs_nios_waitrequest : OUT STD_LOGIC; - signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_readdatavalid : OUT STD_LOGIC; - - -- global export signals - signal sdram_cke : OUT STD_LOGIC; -- This pin has fixed state '1' - signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); - signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); - signal sdram_cs_n : OUT STD_LOGIC; -- This pin has fixed state '0' - signal sdram_ras_n : OUT STD_LOGIC; - signal sdram_cas_n : OUT STD_LOGIC; - signal sdram_we_n : OUT STD_LOGIC; - signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) - ); -end sdram_ctrl; - -architecture behaviour of sdram_ctrl is - - CONSTANT FIFO_WIDTH: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - - CONSTANT MODE: std_logic_vector(11 downto 0):="000000110000"; -- 1 word burst, CAS latency=3 - -- Only two times are configurable - -- tINIT delay between powerup and load mode register = 100 us - -- tREF refresh period = 15.625 us (64ms/4096rows) - CONSTANT INIT_PAUSE_CLOCKS: integer:=(clk_MHz*10000)/91; -- 109.9 us just to be on the save side - CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*1000)/65; -- 15.384 us the same purpose - CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! - - COMPONENT scfifo - GENERIC ( - add_ram_output_register : STRING; - intended_device_family : STRING; - lpm_numwords : NATURAL; - lpm_showahead : STRING; - lpm_type : STRING; - lpm_width : NATURAL; - lpm_widthu : NATURAL; - overflow_checking : STRING; - underflow_checking : STRING; - use_eab : STRING - ); - PORT ( - rdreq : IN STD_LOGIC ; - empty : OUT STD_LOGIC ; - aclr : IN STD_LOGIC ; - clock : IN STD_LOGIC ; - q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - wrreq : IN STD_LOGIC ; - data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - full : OUT STD_LOGIC - ); - END COMPONENT; - - -- If you ask me why there are so many states, I'll answer that all times are fixed. - -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. - -- tRP PRECHARGE command period = 3 clocks - -- tRFC AUTO REFRESH period = 10 clocks - -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks - -- tRCD ACTIVE to READ or WRITE delay = 3 clocks - -- tRAS ACTIVE to PRECHARGE command = 7 clocks - -- tRC ACTIVE to ACTIVE command period = 10 clocks - -- tWR2 Write recovery time = 2 clocks - type states is ( - INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, - INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, - INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, - REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, - REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, - ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, - IDLE,READ0,WRITE0); - signal operation: states; - - signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); - - signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); - signal refresh_counter: unsigned(15 downto 0); - signal active_counter: unsigned(2 downto 0); - signal active_address: unsigned((BANK_WIDTH+ROW_WIDTH-1) downto 0); - - signal bank: std_logic_vector((sdram_ba'length-1) downto 0); - signal row: std_logic_vector((sdram_addr'length-1) downto 0); - signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); - signal be: std_logic_vector((sdram_dqm'length-1) downto 0); - signal data: std_logic_vector((sdram_dq'length-1) downto 0); - - signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; - - signal fifo_rdreq,fifo_empty: std_logic; - - signal read_latency: std_logic_vector(CAS_LATENCY downto 0); - - signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); - signal fifo_wrreq,fifo_wrfull: std_logic; - - signal i_command : STD_LOGIC_VECTOR(4 downto 0); - CONSTANT NOP: STD_LOGIC_VECTOR(4 downto 0):="10111"; - CONSTANT ACTIVE: STD_LOGIC_VECTOR(4 downto 0):="10011"; - CONSTANT READ: STD_LOGIC_VECTOR(4 downto 0):="10101"; - CONSTANT WRITE: STD_LOGIC_VECTOR(4 downto 0):="10100"; - CONSTANT PRECHARGE: STD_LOGIC_VECTOR(4 downto 0):="10010"; - CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR(4 downto 0):="10001"; - CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR(4 downto 0):="10000"; - - signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); - signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); - signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); - signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); - attribute ALTERA_ATTRIBUTE : string; - attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; -begin - (sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; - sdram_addr <= i_address; - sdram_ba <= i_bank; - sdram_dqm <= i_dqm; - sdram_dq <= i_data; - - fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; - fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; - - avs_nios_waitrequest<=fifo_wrfull; - - fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; - - do_active<='0' when active_address=unsigned((fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length)))) else '1'; - read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; - ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; - - operation_machine:process(reset,clk) - begin - if reset='1' - then - operation<=INIT0; - active_address<=(others=>'1'); - elsif rising_edge(clk) - then - - bank<=fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length)); - row<=fifo_q((fifo_q'length-bank'length-1) downto (fifo_q'length-bank'length-row'length)); - column<=fifo_q((column'length+data'length+be'length+2-1) downto (data'length+be'length+2)); - data<=fifo_q((data'length+be'length+2-1) downto (be'length+2)); - be<=fifo_q((be'length+2-1) downto 2); - - case operation is - when INIT0=> - if do_init='1' - then operation<=INIT1;row(10)<='1'; - end if; - when INIT1=>operation<=INIT2; - when INIT2=>operation<=INIT3; - when INIT3=>operation<=INIT4; - when INIT4=>operation<=INIT5; - when INIT5=>operation<=INIT6; - when INIT6=>operation<=INIT7; - when INIT7=>operation<=INIT8; - when INIT8=>operation<=INIT9; - when INIT9=>operation<=INIT10; - when INIT10=>operation<=INIT11; - when INIT11=>operation<=INIT12; - when INIT12=>operation<=INIT13; - when INIT13=>operation<=INIT14; - when INIT14=>operation<=INIT15; - when INIT15=>operation<=INIT16; - when INIT16=>operation<=INIT17; - when INIT17=>operation<=INIT18; - when INIT18=>operation<=INIT19; - when INIT19=>operation<=INIT20; - when INIT20=>operation<=INIT21; - when INIT21=>operation<=INIT22; - when INIT22=>operation<=INIT23; - when INIT23=>operation<=INIT24;row<=MODE((row'length-1) downto 0); - when INIT24=>operation<=IDLE; - - when REFRESH0=>operation<=REFRESH1; - when REFRESH1=>operation<=REFRESH2; - when REFRESH2=>operation<=REFRESH3; - when REFRESH3=>operation<=REFRESH4; - when REFRESH4=>operation<=REFRESH5; - when REFRESH5=>operation<=REFRESH6; - when REFRESH6=>operation<=REFRESH7; - when REFRESH7=>operation<=REFRESH8; - when REFRESH8=>operation<=REFRESH9; - when REFRESH9=>operation<=REFRESH10; - when REFRESH10=>operation<=REFRESH11; - when REFRESH11=>operation<=REFRESH12; - when REFRESH12=>operation<=REFRESH13; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); - when REFRESH13=>operation<=REFRESH14; - when REFRESH14=>operation<=IDLE; - - when ACTIVE0=>operation<=ACTIVE1; - when ACTIVE1=>operation<=ACTIVE2; - when ACTIVE2=>operation<=ACTIVE3; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); - when ACTIVE3=>operation<=ACTIVE4; - when ACTIVE4=>operation<=IDLE; - - when others=> - if do_refresh='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=REFRESH0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif do_active='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=ACTIVE0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif fifo_empty='1' - then - operation<=IDLE; - elsif fifo_q(1)='1' --write - then - if read_latency(CAS_LATENCY-1 downto 0)>"000" - then operation<=IDLE; - else operation<=WRITE0; - end if; - elsif fifo_q(0)='1' --read - then - operation<=READ0; - end if; - end case; - end if; - end process; - - control_latency:process(reset,clk) - begin - if reset='1' - then - read_latency<=(others=>'0'); - elsif rising_edge(clk) - then - read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); - if operation=READ0 - then read_latency(0)<='1'; - else read_latency(0)<='0'; - end if; - end if; - end process; - latch_readdata:process(reset,clk) - begin - if reset='1' - then - avs_nios_readdata<=(others=>'0'); - avs_nios_readdatavalid<='0'; - elsif rising_edge(clk) - then - avs_nios_readdata<=sdram_dq; - avs_nios_readdatavalid<=read_latency(CAS_LATENCY); - end if; - end process; - initialization:process(reset,clk) - begin - if rising_edge(clk) - then - if init_counter>0 - then - init_counter<=init_counter-1; - else do_init<='1'; - end if; - end if; - end process; - refreshing:process(clk,reset) - begin - if reset='1' - then - refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='0'; - elsif rising_edge(clk) - then - if refresh_counter=to_unsigned(0,refresh_counter'length) - then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='1'; - else refresh_counter<=refresh_counter-1; - end if; - if operation=REFRESH0 or operation=REFRESH5 - then do_refresh<='0'; - end if; - end if; - end process; - active_period:process(reset,clk) - begin - if reset='1' - then - active_counter<=(others=>'0'); - tRCD_not_expired<='0'; - elsif rising_edge(clk) - then - if operation=ACTIVE3 or operation=REFRESH13 - then active_counter<=to_unsigned(5,active_counter'length); - elsif active_counter>0 - then active_counter<=active_counter-1; - end if; - end if; - if active_counter>0 - then tRCD_not_expired<='1'; - else tRCD_not_expired<='0'; - end if; - end process; - latch_controls:process(clk,reset) - begin - if reset='1' - then - i_command<=NOP; - i_address<=(others=>'0'); - i_bank<=(others=>'0'); - i_dqm<=(others=>'0'); - i_data<=(others=>'Z'); - elsif rising_edge(clk) - then - i_command<=NOP; - i_bank<=bank; - i_address<=(others=>'0'); - i_address((column'length-1) downto 0)<=column; - i_data<=(others=>'Z'); - i_dqm<=(others=>'0'); - - case operation is - when INIT1|REFRESH0|ACTIVE0 => - i_command<=PRECHARGE; - i_address<=row; - when INIT4|INIT14|REFRESH3 => - i_command<=AUTO_REFRESH; - when INIT24=> - i_command<=LOAD_MODE_REGISTER; - i_address<=row; - when ACTIVE3|REFRESH13 => - i_command<=ACTIVE; - i_address<=row; - when READ0 => - i_command<=READ; - when WRITE0 => - i_command<=WRITE; - i_dqm<=not be; - i_data<=data; - when OTHERS => - end case; - end if; - end process; - - fifo: scfifo - GENERIC MAP ( - add_ram_output_register => "ON", - intended_device_family => "Cyclone", - lpm_numwords => 4, - lpm_showahead => "ON", - lpm_type => "scfifo", - lpm_width => FIFO_WIDTH, - lpm_widthu => 2, - overflow_checking => "ON", - underflow_checking => "ON", - use_eab => "ON" - ) - PORT MAP ( - rdreq => fifo_rdreq, - aclr => reset, - clock => clk, - wrreq => fifo_wrreq, - data => fifo_data, - empty => fifo_empty, - q => fifo_q, - full => fifo_wrfull - ); -end behaviour; Index: trunk/test_bench/mt48lc4m32b2.vhd =================================================================== --- trunk/test_bench/mt48lc4m32b2.vhd (revision 7) +++ trunk/test_bench/mt48lc4m32b2.vhd (nonexistent) @@ -1,1134 +0,0 @@ ------------------------------------------------------------------------------------------ --- --- File Name: MT48LC4M32B2.VHD --- Version: 2.0 --- Date: January 24th, 2002 --- Model: Behavioral --- Simulator: Model Technology --- --- Dependencies: None --- --- Email: modelsupport@micron.com --- Company: Micron Technology, Inc. --- Part Number: MT48LC4M32A2 (1Mb x 32 x 4 Banks) --- --- Description: Micron 128Mb SDRAM --- --- Limitation: - Doesn't check for 4096-cycle refresh --- --- Note: - Set simulator resolution to "ps" accuracy --- --- Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY --- WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY --- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR --- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. --- --- Copyright (c) 1998 Micron Semiconductor Products, Inc. --- All rights researved --- --- Rev Author Date Changes --- --- -------------------------- ------------------------------------- --- 2.0 SH 01/24/2002 - Second Release --- Micron Technology Inc. --- --------------------------------------------------------------------------- - -LIBRARY IEEE; - USE IEEE.STD_LOGIC_1164.ALL; - USE IEEE.STD_LOGIC_UNSIGNED.ALL; - USE IEEE.STD_LOGIC_ARITH.ALL; - -ENTITY mt48lc4m32b2 IS - GENERIC ( - -- Timing Parameters for -75 (PC133) and CL = 3 - tAC : TIME := 5.4 ns; - tHZ : TIME := 5.4 ns; - tOH : TIME := 2.7 ns; - tMRD : INTEGER := 2; -- 2 Clk Cycles - tRAS : TIME := 44.0 ns; - tRC : TIME := 66.0 ns; - tRCD : TIME := 20.0 ns; - tRFC : TIME := 66.0 ns; - tRP : TIME := 20.0 ns; - tRRD : TIME := 15.0 ns; - tWRa : TIME := 7.5 ns; -- Auto precharge - tWRm : TIME := 15.0 ns; -- Manual Precharge - - tAH : TIME := 0.8 ns; - tAS : TIME := 1.5 ns; - tCH : TIME := 2.5 ns; - tCL : TIME := 2.5 ns; - tCK : TIME := 7.5 ns; - tDH : TIME := 0.8 ns; - tDS : TIME := 1.5 ns; - tCKH : TIME := 0.8 ns; - tCKS : TIME := 1.5 ns; - tCMH : TIME := 0.8 ns; - tCMS : TIME := 1.5 ns; - - addr_bits : INTEGER := 12; - data_bits : INTEGER := 32; - col_bits : INTEGER := 8 - ); - PORT ( - Dq : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z'); - Addr : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); - Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; - Clk : IN STD_LOGIC := '0'; - Cke : IN STD_LOGIC := '1'; - Cs_n : IN STD_LOGIC := '1'; - Ras_n : IN STD_LOGIC := '1'; - Cas_n : IN STD_LOGIC := '1'; - We_n : IN STD_LOGIC := '1'; - Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" - ); -END mt48lc4m32b2; - -ARCHITECTURE behave OF mt48lc4m32b2 IS - TYPE State IS (BST, NOP, PRECH, READ, WRITE); - TYPE Array4xI IS ARRAY (3 DOWNTO 0) OF INTEGER; - TYPE Array4xT IS ARRAY (3 DOWNTO 0) OF TIME; - TYPE Array4xB IS ARRAY (3 DOWNTO 0) OF STD_LOGIC; - TYPE Array4x2BV IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0); - TYPE Array4xCBV IS ARRAY (4 DOWNTO 0) OF STD_LOGIC_VECTOR (Col_bits - 1 DOWNTO 0); - TYPE Array_state IS ARRAY (4 DOWNTO 0) OF State; - SIGNAL Mode_reg : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); - SIGNAL Active_enable, Aref_enable, Burst_term : STD_LOGIC := '0'; - SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : STD_LOGIC := '0'; - SIGNAL Burst_length_1, Burst_length_2, Burst_length_4, Burst_length_8 : STD_LOGIC := '0'; - SIGNAL Cas_latency_1, Cas_latency_2, Cas_latency_3 : STD_LOGIC := '0'; - SIGNAL Cs_in, Ras_in, Cas_in, We_in : STD_LOGIC := '0'; - SIGNAL Write_burst_mode : STD_LOGIC := '0'; - SIGNAL Sys_clk, CkeZ : STD_LOGIC := '0'; - -BEGIN - -- Strip the strength - Cs_in <= To_X01 (Cs_n); - Ras_in <= To_X01 (Ras_n); - Cas_in <= To_X01 (Cas_n); - We_in <= To_X01 (We_n); - - -- Commands Decode - Active_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND We_in; - Aref_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND We_in; - Burst_term <= NOT(Cs_in) AND Ras_in AND Cas_in AND NOT(We_in); - Mode_reg_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in); - Prech_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND NOT(We_in); - Read_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND We_in; - Write_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND NOT(We_in); - - -- Burst Length Decode - Burst_length_1 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND NOT(Mode_reg(0)); - Burst_length_2 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND Mode_reg(0); - Burst_length_4 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND NOT(Mode_reg(0)); - Burst_length_8 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND Mode_reg(0); - - -- CAS Latency Decode - Cas_latency_1 <= NOT(Mode_reg(6)) AND NOT(Mode_reg(5)) AND Mode_reg(4); - Cas_latency_2 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND NOT(Mode_reg(4)); - Cas_latency_3 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND Mode_reg(4); - - -- Write Burst Mode - Write_burst_mode <= Mode_reg(9); - - -- System Clock - int_clk : PROCESS (Clk) - BEGIN - IF Clk'LAST_VALUE = '0' AND Clk = '1' THEN - CkeZ <= Cke; - END IF; - Sys_clk <= CkeZ AND Clk; - END PROCESS; - - state_register : PROCESS - TYPE ram_type IS ARRAY (2**col_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0); - TYPE ram_pntr IS ACCESS ram_type; - TYPE ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF ram_pntr; - VARIABLE Bank0 : ram_stor; - VARIABLE Bank1 : ram_stor; - VARIABLE Bank2 : ram_stor; - VARIABLE Bank3 : ram_stor; - VARIABLE Row_index, Col_index : INTEGER := 0; - VARIABLE Dq_temp : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => '0'); - - VARIABLE Col_addr : Array4xCBV; - VARIABLE Bank_addr : Array4x2BV; - VARIABLE Dqm_reg0, Dqm_reg1 : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000"; - - VARIABLE Bank, Prev_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; - VARIABLE B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); - VARIABLE Col_brst : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); - VARIABLE Row : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); - VARIABLE Col : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); - VARIABLE Burst_counter : INTEGER := 0; - - VARIABLE Command : Array_state; - VARIABLE Bank_precharge : Array4x2BV; - VARIABLE A10_precharge : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE Auto_precharge : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE Read_precharge : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE Write_precharge : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE RW_interrupt_read : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE RW_interrupt_write : Array4xB := ('0' & '0' & '0' & '0'); - VARIABLE RW_interrupt_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; - VARIABLE RW_interrupt_counter : Array4xI := (0 & 0 & 0 & 0); - VARIABLE Count_precharge : Array4xI := (0 & 0 & 0 & 0); - - VARIABLE Data_in_enable, Data_out_enable : STD_LOGIC := '0'; - VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : STD_LOGIC := '0'; - VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : STD_LOGIC := '1'; - - -- Timing Check - VARIABLE MRD_chk : INTEGER := 0; - VARIABLE RFC_chk : TIME := 0 ns; - VARIABLE RRD_chk : TIME := 0 ns; - VARIABLE WR_chkm : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns); - VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3 : TIME := 0 ns; - VARIABLE RC_chk0, RC_chk1, RC_chk2, RC_chk3 : TIME := 0 ns; - VARIABLE RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3 : TIME := 0 ns; - VARIABLE RP_chk0, RP_chk1, RP_chk2, RP_chk3 : TIME := 0 ns; - - -- Initialize empty rows - PROCEDURE Init_mem (Bank : STD_LOGIC_VECTOR (1 DOWNTO 0); Row_index : INTEGER) IS - VARIABLE i, j : INTEGER := 0; - BEGIN - IF Bank = "00" THEN - IF Bank0 (Row_index) = NULL THEN -- Check to see if row empty - Bank0 (Row_index) := NEW ram_type; -- Open new row for access - FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP -- Filled row with zeros - FOR j IN (data_bits - 1) DOWNTO 0 LOOP - Bank0 (Row_index) (i) (j) := '0'; - END LOOP; - END LOOP; - END IF; - ELSIF Bank = "01" THEN - IF Bank1 (Row_index) = NULL THEN - Bank1 (Row_index) := NEW ram_type; - FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP - FOR j IN (data_bits - 1) DOWNTO 0 LOOP - Bank1 (Row_index) (i) (j) := '0'; - END LOOP; - END LOOP; - END IF; - ELSIF Bank = "10" THEN - IF Bank2 (Row_index) = NULL THEN - Bank2 (Row_index) := NEW ram_type; - FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP - FOR j IN (data_bits - 1) DOWNTO 0 LOOP - Bank2 (Row_index) (i) (j) := '0'; - END LOOP; - END LOOP; - END IF; - ELSIF Bank = "11" THEN - IF Bank3 (Row_index) = NULL THEN - Bank3 (Row_index) := NEW ram_type; - FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP - FOR j IN (data_bits - 1) DOWNTO 0 LOOP - Bank3 (Row_index) (i) (j) := '0'; - END LOOP; - END LOOP; - END IF; - END IF; - END; - - -- Burst Counter - PROCEDURE Burst_decode IS - VARIABLE Col_int : INTEGER := 0; - VARIABLE Col_vec, Col_temp : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); - BEGIN - -- Advance Burst Counter - Burst_counter := Burst_counter + 1; - - -- Burst Type - IF Mode_reg (3) = '0' THEN - Col_int := conv_integer(Col) + 1; - Col_temp := CONV_STD_LOGIC_VECTOR(Col_int, col_bits); - ELSIF Mode_reg (3) = '1' THEN - Col_vec := CONV_STD_LOGIC_VECTOR(Burst_counter, col_bits); - Col_temp (2) := Col_vec (2) XOR Col_brst (2); - Col_temp (1) := Col_vec (1) XOR Col_brst (1); - Col_temp (0) := Col_vec (0) XOR Col_brst (0); - END IF; - - -- Burst Length - IF Burst_length_2 = '1' THEN - Col (0) := Col_temp (0); - ELSIF Burst_length_4 = '1' THEN - Col (1 DOWNTO 0) := Col_temp (1 DOWNTO 0); - ELSIF Burst_length_8 = '1' THEN - Col (2 DOWNTO 0) := Col_temp (2 DOWNTO 0); - ELSE - Col := Col_temp; - END IF; - - -- Burst Read Single Write - IF Write_burst_mode = '1' AND Data_in_enable = '1' THEN - Data_in_enable := '0'; - END IF; - - -- Data counter - IF Burst_length_1 = '1' THEN - IF Burst_counter >= 1 THEN - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - ELSIF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - ELSIF Burst_length_2 = '1' THEN - IF Burst_counter >= 2 THEN - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - ELSIF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - ELSIF Burst_length_4 = '1' THEN - IF Burst_counter >= 4 THEN - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - ELSIF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - ELSIF Burst_length_8 = '1' THEN - IF Burst_counter >= 8 THEN - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - ELSIF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - END IF; - END; - - BEGIN - WAIT ON Sys_clk; - IF Sys_clk'event AND Sys_clk = '1' THEN - -- Internal Pipeline - Command(0) := Command(1); - Command(1) := Command(2); - Command(2) := Command(3); - Command(3) := NOP; - - Col_addr(0) := Col_addr(1); - Col_addr(1) := Col_addr(2); - Col_addr(2) := Col_addr(3); - Col_addr(3) := (OTHERS => '0'); - - Bank_addr(0) := Bank_addr(1); - Bank_addr(1) := Bank_addr(2); - Bank_addr(2) := Bank_addr(3); - Bank_addr(3) := "00"; - - Bank_precharge(0) := Bank_precharge(1); - Bank_precharge(1) := Bank_precharge(2); - Bank_precharge(2) := Bank_precharge(3); - Bank_precharge(3) := "00"; - - A10_precharge(0) := A10_precharge(1); - A10_precharge(1) := A10_precharge(2); - A10_precharge(2) := A10_precharge(3); - A10_precharge(3) := '0'; - - -- Dqm pipeline for Read - Dqm_reg0 := Dqm_reg1; - Dqm_reg1 := Dqm; - - -- Read or Write with Auto Precharge Counter - IF Auto_precharge (0) = '1' THEN - Count_precharge (0) := Count_precharge (0) + 1; - END IF; - IF Auto_precharge (1) = '1' THEN - Count_precharge (1) := Count_precharge (1) + 1; - END IF; - IF Auto_precharge (2) = '1' THEN - Count_precharge (2) := Count_precharge (2) + 1; - END IF; - IF Auto_precharge (3) = '1' THEN - Count_precharge (3) := Count_precharge (3) + 1; - END IF; - - -- Read or Write Interrupt Counter - IF RW_interrupt_write (0) = '1' THEN - RW_interrupt_counter (0) := RW_interrupt_counter (0) + 1; - END IF; - IF RW_interrupt_write (1) = '1' THEN - RW_interrupt_counter (1) := RW_interrupt_counter (1) + 1; - END IF; - IF RW_interrupt_write (2) = '1' THEN - RW_interrupt_counter (2) := RW_interrupt_counter (2) + 1; - END IF; - IF RW_interrupt_write (3) = '1' THEN - RW_interrupt_counter (3) := RW_interrupt_counter (3) + 1; - END IF; - - -- tMRD Counter - MRD_chk := MRD_chk + 1; - - -- Auto Refresh - IF Aref_enable = '1' THEN - -- Auto Refresh to Auto Refresh - ASSERT (NOW - RFC_chk >= tRFC) - REPORT "tRFC violation during Auto Refresh" - SEVERITY WARNING; - - -- Precharge to Auto Refresh - ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR - (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) - REPORT "tRP violation during Auto Refresh" - SEVERITY WARNING; - - -- Precharge to Auto Refresh - ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') - REPORT "All banks must be Precharge before Auto Refresh" - SEVERITY WARNING; - - -- Load Mode Register to Auto Refresh - ASSERT (MRD_chk >= tMRD) - REPORT "tMRD violation during Auto Refresh" - SEVERITY WARNING; - - -- Record current tRFC time - RFC_chk := NOW; - END IF; - - -- Load Mode Register - IF Mode_reg_enable = '1' THEN - -- Register Mode - Mode_reg <= Addr; - - -- Precharge to Load Mode Register - ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') - REPORT "All banks must be Precharge before Load Mode Register" - SEVERITY WARNING; - - -- Precharge to Load Mode Register - ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR - (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) - REPORT "tRP violation during Load Mode Register" - SEVERITY WARNING; - - -- Auto Refresh to Load Mode Register - ASSERT (NOW - RFC_chk >= tRFC) - REPORT "tRFC violation during Load Mode Register" - SEVERITY WARNING; - - -- Load Mode Register to Load Mode Register - ASSERT (MRD_chk >= tMRD) - REPORT "tMRD violation during Load Mode Register" - SEVERITY WARNING; - - -- Record current tMRD time - MRD_chk := 0; - END IF; - - -- Active Block (Latch Bank and Row Address) - IF Active_enable = '1' THEN - -- Activate an OPEN bank can corrupt data - ASSERT ((Ba = "00" AND Act_b0 = '0') OR (Ba = "01" AND Act_b1 = '0') OR - (Ba = "10" AND Act_b2 = '0') OR (Ba = "11" AND Act_b3 = '0')) - REPORT "Bank is already activated - data can be corrupted" - SEVERITY WARNING; - - -- Activate Bank 0 - IF Ba = "00" AND Pc_b0 = '1' THEN - -- Activate to Activate (same bank) - ASSERT (NOW - RC_chk0 >= tRC) - REPORT "tRC violation during Activate Bank 0" - SEVERITY WARNING; - - -- Precharge to Activate - ASSERT (NOW - RP_chk0 >= tRP) - REPORT "tRP violation during Activate Bank 0" - SEVERITY WARNING; - - -- Record variables for checking violation - Act_b0 := '1'; - Pc_b0 := '0'; - B0_row_addr := Addr; - RAS_chk0 := NOW; - RC_chk0 := NOW; - RCD_chk0 := NOW; - END IF; - - -- Activate Bank 1 - IF Ba = "01" AND Pc_b1 = '1' THEN - -- Activate to Activate (same bank) - ASSERT (NOW - RC_chk1 >= tRC) - REPORT "tRC violation during Activate Bank 1" - SEVERITY WARNING; - - -- Precharge to Activate - ASSERT (NOW - RP_chk1 >= tRP) - REPORT "tRP violation during Activate Bank 1" - SEVERITY WARNING; - - -- Record variables for checking violation - Act_b1 := '1'; - Pc_b1 := '0'; - B1_row_addr := Addr; - RAS_chk1 := NOW; - RC_chk1 := NOW; - RCD_chk1 := NOW; - END IF; - - -- Activate Bank 2 - IF Ba = "10" AND Pc_b2 = '1' THEN - -- Activate to Activate (same bank) - ASSERT (NOW - RC_chk2 >= tRC) - REPORT "tRC violation during Activate Bank 2" - SEVERITY WARNING; - - -- Precharge to Activate - ASSERT (NOW - RP_chk2 >= tRP) - REPORT "tRP violation during Activate Bank 2" - SEVERITY WARNING; - - -- Record variables for checking violation - Act_b2 := '1'; - Pc_b2 := '0'; - B2_row_addr := Addr; - RAS_chk2 := NOW; - RC_chk2 := NOW; - RCD_chk2 := NOW; - END IF; - - -- Activate Bank 3 - IF Ba = "11" AND Pc_b3 = '1' THEN - -- Activate to Activate (same bank) - ASSERT (NOW - RC_chk3 >= tRC) - REPORT "tRC violation during Activate Bank 3" - SEVERITY WARNING; - - -- Precharge to Activate - ASSERT (NOW - RP_chk3 >= tRP) - REPORT "tRP violation during Activate Bank 3" - SEVERITY WARNING; - - -- Record variables for checking violation - Act_b3 := '1'; - Pc_b3 := '0'; - B3_row_addr := Addr; - RAS_chk3 := NOW; - RC_chk3 := NOW; - RCD_chk3 := NOW; - END IF; - - -- Activate to Activate (different bank) - IF (Prev_bank /= Ba) THEN - ASSERT (NOW - RRD_chk >= tRRD) - REPORT "tRRD violation during Activate" - SEVERITY WARNING; - END IF; - - -- Auto Refresh to Activate - ASSERT (NOW - RFC_chk >= tRFC) - REPORT "tRFC violation during Activate" - SEVERITY WARNING; - - -- Load Mode Register to Activate - ASSERT (MRD_chk >= tMRD) - REPORT "tMRD violation during Activate" - SEVERITY WARNING; - - -- Record variable for checking violation - RRD_chk := NOW; - Prev_Bank := Ba; - END IF; - - -- Precharge Block - IF Prech_enable = '1' THEN - -- Load Mode Register to Precharge - ASSERT (MRD_chk >= tMRD) - REPORT "tMRD violation during Precharge" - SEVERITY WARNING; - - -- Precharge Bank 0 - IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "00")) AND Act_b0 = '1') THEN - Act_b0 := '0'; - Pc_b0 := '1'; - RP_chk0 := NOW; - - -- Activate to Precharge - ASSERT (NOW - RAS_chk0 >= tRAS) - REPORT "tRAS violation during Precharge" - SEVERITY WARNING; - - -- tWR violation check for Write - ASSERT (NOW - WR_chkm(0) >= tWRm) - REPORT "tWR violation during Precharge" - SEVERITY WARNING; - END IF; - - -- Precharge Bank 1 - IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "01")) AND Act_b1 = '1') THEN - Act_b1 := '0'; - Pc_b1 := '1'; - RP_chk1 := NOW; - - -- Activate to Precharge - ASSERT (NOW - RAS_chk1 >= tRAS) - REPORT "tRAS violation during Precharge" - SEVERITY WARNING; - - -- tWR violation check for Write - ASSERT (NOW - WR_chkm(1) >= tWRm) - REPORT "tWR violation during Precharge" - SEVERITY WARNING; - END IF; - - -- Precharge Bank 2 - IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "10")) AND Act_b2 = '1') THEN - Act_b2 := '0'; - Pc_b2 := '1'; - RP_chk2 := NOW; - - -- Activate to Precharge - ASSERT (NOW - RAS_chk2 >= tRAS) - REPORT "tRAS violation during Precharge" - SEVERITY WARNING; - - -- tWR violation check for Write - ASSERT (NOW - WR_chkm(2) >= tWRm) - REPORT "tWR violation during Precharge" - SEVERITY WARNING; - END IF; - - -- Precharge Bank 3 - IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "11")) AND Act_b3 = '1') THEN - Act_b3 := '0'; - Pc_b3 := '1'; - RP_chk3 := NOW; - - -- Activate to Precharge - ASSERT (NOW - RAS_chk3 >= tRAS) - REPORT "tRAS violation during Precharge" - SEVERITY WARNING; - - -- tWR violation check for Write - ASSERT (NOW - WR_chkm(3) >= tWRm) - REPORT "tWR violation during Precharge" - SEVERITY WARNING; - END IF; - - -- Terminate a Write Immediately (if same bank or all banks) - IF (Data_in_enable = '1' AND (Bank = Ba OR Addr(10) = '1')) THEN - Data_in_enable := '0'; - END IF; - - -- Precharge Command Pipeline for READ - IF CAS_latency_3 = '1' THEN - Command(2) := PRECH; - Bank_precharge(2) := Ba; - A10_precharge(2) := Addr(10); - ELSIF CAS_latency_2 = '1' THEN - Command(1) := PRECH; - Bank_precharge(1) := Ba; - A10_precharge(1) := Addr(10); - END IF; - END IF; - - -- Burst Terminate - IF Burst_term = '1' THEN - -- Terminate a Write immediately - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - END IF; - - -- Terminate a Read depend on CAS Latency - IF CAS_latency_3 = '1' THEN - Command(2) := BST; - ELSIF CAS_latency_2 = '1' THEN - Command(1) := BST; - END IF; - END IF; - - -- Read Command - IF Read_enable = '1' THEN - -- Activate to Read - ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR - (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) - REPORT "Bank is not Activated for Read" - SEVERITY WARNING; - - -- Activate to Read - ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR - (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR - (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR - (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) - REPORT "tRCD violation during Read" - SEVERITY WARNING; - - -- CAS Latency Pipeline - IF Cas_latency_3 = '1' THEN - Command(2) := READ; - Col_addr (2) := Addr(col_bits - 1 DOWNTO 0); - Bank_addr (2) := Ba; - ELSIF Cas_latency_2 = '1' THEN - Command(1) := READ; - Col_addr (1) := Addr(col_bits - 1 DOWNTO 0); - Bank_addr (1) := Ba; - ELSIF Cas_latency_1 = '1' THEN - Command(0) := READ; - Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); - Bank_addr (0) := Ba; - END IF; - - -- Read Terminate Write Immediately - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - -- Interrupt a Write with Auto Precharge - IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN - RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; - RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; - ASSERT FALSE REPORT "Read interrupt a Write with Auto Precharge." SEVERITY NOTE; - END IF; - END IF; - - -- Read Terminate Read after CL - 1 - IF (Data_out_enable = '1' AND ((Cas_latency_2 = '1' AND ((Burst_length_2 = '1' AND Burst_counter < 1) OR - (Burst_length_4 = '1' AND Burst_counter < 3) OR - (Burst_length_8 = '1' AND Burst_counter < 7))) OR - (Cas_latency_3 = '1' AND ((Burst_length_4 = '1' AND Burst_counter < 2) OR - (Burst_length_8 = '1' AND Burst_counter < 6))))) THEN - -- Interrupt a Read with Auto Precharge - IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN - RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; - ASSERT FALSE REPORT "Read interrupt a Read with Auto Precharge." SEVERITY NOTE; - END IF; - END IF; - - -- Auto Precharge - IF Addr(10) = '1' THEN - Auto_precharge (CONV_INTEGER(Ba)) := '1'; - Count_precharge (CONV_INTEGER(Ba)) := 0; - RW_Interrupt_Bank := Ba; - Read_precharge (CONV_INTEGER(Ba)) := '1'; - END IF; - END IF; - - -- Write Command - IF Write_enable = '1' THEN - -- Activate to Write - ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR - (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) - REPORT "Bank is not Activated for Write" - SEVERITY WARNING; - - -- Activate to Write - ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR - (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR - (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR - (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) - REPORT "tRCD violation during Write" - SEVERITY WARNING; - - -- Latch write command, bank, column - Command(0) := WRITE; - Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); - Bank_addr (0) := Ba; - - -- Write Terminate Write Immediately - IF Data_in_enable = '1' THEN - Data_in_enable := '0'; - - -- Interrupt a Write with Auto Precharge - IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN - RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; - RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; - ASSERT FALSE REPORT "Write interrupt a Write with Auto Precharge." SEVERITY NOTE; - END IF; - END IF; - - -- Write Terminate Read Immediately - IF Data_out_enable = '1' THEN - Data_out_enable := '0'; - - -- Interrupt a Read with Auto Precharge - IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN - RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; - ASSERT FALSE REPORT "Write interrupt a Read with Auto Precharge." SEVERITY NOTE; - END IF; - END IF; - - -- Auto Precharge - IF Addr(10) = '1' THEN - Auto_precharge (CONV_INTEGER(Ba)) := '1'; - Count_precharge (CONV_INTEGER(Ba)) := 0; - RW_Interrupt_Bank := Ba; - Write_precharge (CONV_INTEGER(Ba)) := '1'; - END IF; - END IF; - - -- Write with AutoPrecharge Calculation - -- The device start internal precharge when: - -- 1. Meet tRAS requirement - -- and 2. tWR cycle(s) after last valid data - -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) - -- - -- Note: Model is starting the internal precharge 1 cycle after they meet all the - -- requirement but tRP will be compensate for the time after the 1 cycle. - IF ((Auto_precharge(0) = '1') AND (Write_precharge(0) = '1')) THEN - IF (((NOW - RAS_chk0 >= tRAS) AND - (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(0) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR - (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(0) >= 1)) THEN - Auto_precharge(0) := '0'; - Write_precharge(0) := '0'; - RW_interrupt_write(0) := '0'; - Pc_b0 := '1'; - Act_b0 := '0'; - RP_chk0 := NOW + tWRa; - END IF; - END IF; - IF ((Auto_precharge(1) = '1') AND (Write_precharge(1) = '1')) THEN - IF (((NOW - RAS_chk1 >= tRAS) AND - (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(1) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR - (RW_interrupt_write(1) = '1' AND RW_interrupt_counter(1) >= 1)) THEN - Auto_precharge(1) := '0'; - Write_precharge(1) := '0'; - RW_interrupt_write(1) := '0'; - Pc_b1 := '1'; - Act_b1 := '0'; - RP_chk1 := NOW + tWRa; - END IF; - END IF; - IF ((Auto_precharge(2) = '1') AND (Write_precharge(2) = '1')) THEN - IF (((NOW - RAS_chk2 >= tRAS) AND - (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(2) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR - (RW_interrupt_write(2) = '1' AND RW_interrupt_counter(2) >= 1)) THEN - Auto_precharge(2) := '0'; - Write_precharge(2) := '0'; - RW_interrupt_write(2) := '0'; - Pc_b2 := '1'; - Act_b2 := '0'; - RP_chk2 := NOW + tWRa; - END IF; - END IF; - IF ((Auto_precharge(3) = '1') AND (Write_precharge(3) = '1')) THEN - IF (((NOW - RAS_chk3 >= tRAS) AND - (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(3) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR - (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(3) >= 1)) THEN - Auto_precharge(3) := '0'; - Write_precharge(3) := '0'; - RW_interrupt_write(3) := '0'; - Pc_b3 := '1'; - Act_b3 := '0'; - RP_chk3 := NOW + tWRa; - END IF; - END IF; - - -- Read with AutoPrecharge Calculation - -- The device start internal precharge when: - -- 1. Meet minimum tRAS requirement - -- and 2. CL - 1 cycle(s) before last valid data - -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) - IF ((Auto_precharge(0) = '1') AND (Read_precharge(0) = '1')) THEN - IF (((NOW - RAS_chk0 >= tRAS) AND - ((Burst_length_1 = '1' AND Count_precharge(0) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR - (RW_interrupt_read(0) = '1')) THEN - Pc_b0 := '1'; - Act_b0 := '0'; - RP_chk0 := NOW; - Auto_precharge(0) := '0'; - Read_precharge(0) := '0'; - RW_interrupt_read(0) := '0'; - END IF; - END IF; - IF ((Auto_precharge(1) = '1') AND (Read_precharge(1) = '1')) THEN - IF (((NOW - RAS_chk1 >= tRAS) AND - ((Burst_length_1 = '1' AND Count_precharge(1) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR - (RW_interrupt_read(1) = '1')) THEN - Pc_b1 := '1'; - Act_b1 := '0'; - RP_chk1 := NOW; - Auto_precharge(1) := '0'; - Read_precharge(1) := '0'; - RW_interrupt_read(1) := '0'; - END IF; - END IF; - IF ((Auto_precharge(2) = '1') AND (Read_precharge(2) = '1')) THEN - IF (((NOW - RAS_chk2 >= tRAS) AND - ((Burst_length_1 = '1' AND Count_precharge(2) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR - (RW_interrupt_read(2) = '1')) THEN - Pc_b2 := '1'; - Act_b2 := '0'; - RP_chk2 := NOW; - Auto_precharge(2) := '0'; - Read_precharge(2) := '0'; - RW_interrupt_read(2) := '0'; - END IF; - END IF; - IF ((Auto_precharge(3) = '1') AND (Read_precharge(3) = '1')) THEN - IF (((NOW - RAS_chk3 >= tRAS) AND - ((Burst_length_1 = '1' AND Count_precharge(3) >= 1) OR - (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR - (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR - (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR - (RW_interrupt_read(3) = '1')) THEN - Pc_b3 := '1'; - Act_b3 := '0'; - RP_chk3 := NOW; - Auto_precharge(3) := '0'; - Read_precharge(3) := '0'; - RW_interrupt_read(3) := '0'; - END IF; - END IF; - - -- Internal Precharge or Bst - IF Command(0) = PRECH THEN -- PRECH terminate a read if same bank or all banks - IF Bank_precharge(0) = Bank OR A10_precharge(0) = '1' THEN - IF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - ELSIF Command(0) = BST THEN -- BST terminate a read regardless of bank - IF Data_out_enable = '1' THEN - Data_out_enable := '0'; - END IF; - END IF; - - IF Data_out_enable = '0' THEN - Dq <= TRANSPORT (OTHERS => 'Z') AFTER tOH; - END IF; - - -- Detect Read or Write Command - IF Command(0) = READ THEN - Bank := Bank_addr (0); - Col := Col_addr (0); - Col_brst := Col_addr (0); - IF Bank_addr (0) = "00" THEN - Row := B0_row_addr; - ELSIF Bank_addr (0) = "01" THEN - Row := B1_row_addr; - ELSIF Bank_addr (0) = "10" THEN - Row := B2_row_addr; - ELSE - Row := B3_row_addr; - END IF; - Burst_counter := 0; - Data_in_enable := '0'; - Data_out_enable := '1'; - ELSIF Command(0) = WRITE THEN - Bank := Bank_addr(0); - Col := Col_addr(0); - Col_brst := Col_addr(0); - IF Bank_addr (0) = "00" THEN - Row := B0_row_addr; - ELSIF Bank_addr (0) = "01" THEN - Row := B1_row_addr; - ELSIF Bank_addr (0) = "10" THEN - Row := B2_row_addr; - ELSE - Row := B3_row_addr; - END IF; - Burst_counter := 0; - Data_in_enable := '1'; - Data_out_enable := '0'; - END IF; - - -- DQ (Driver / Receiver) - Row_index := CONV_INTEGER (Row); - Col_index := CONV_INTEGER (Col); - - IF Data_in_enable = '1' THEN - IF Dqm /= "1111" THEN - -- Initialize Memory - Init_mem (Bank, Row_index); - - -- Array Buffer - CASE Bank IS - WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); - WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); - WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); - WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); - END CASE; - - -- Dqm Operation - IF Dqm (0) = '0' THEN - Dq_temp ( 7 DOWNTO 0) := Dq ( 7 DOWNTO 0); - END IF; - IF Dqm (1) = '0' THEN - Dq_temp (15 DOWNTO 8) := Dq (15 DOWNTO 8); - END IF; - IF Dqm (2) = '0' THEN - Dq_temp (23 DOWNTO 16) := Dq (23 DOWNTO 16); - END IF; - IF Dqm (3) = '0' THEN - Dq_temp (31 DOWNTO 24) := Dq (31 DOWNTO 24); - END IF; - - -- Write to Memory - CASE Bank IS - WHEN "00" => Bank0 (Row_index) (Col_index) := Dq_temp; - WHEN "01" => Bank1 (Row_index) (Col_index) := Dq_temp; - WHEN "10" => Bank2 (Row_index) (Col_index) := Dq_temp; - WHEN OTHERS => Bank3 (Row_index) (Col_index) := Dq_temp; - END CASE; - - -- Record tWR for manual precharge - WR_chkm(CONV_INTEGER(Bank)) := NOW; - END IF; - - -- Advance Burst Counter - Burst_decode; - - ELSIF Data_out_enable = '1' THEN - IF Dqm_reg0 /= "1111" THEN - -- Initialize Memory - Init_mem (Bank, Row_index); - - -- Array Buffer - CASE Bank IS - WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); - WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); - WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); - WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); - END CASE; - - -- Dqm Operation - IF Dqm_reg0 (0) = '1' THEN - Dq_temp ( 7 DOWNTO 0) := (OTHERS => 'Z'); - END IF; - IF Dqm_reg0 (1) = '1' THEN - Dq_temp (15 DOWNTO 8) := (OTHERS => 'Z'); - END IF; - IF Dqm_reg0 (2) = '1' THEN - Dq_temp (23 DOWNTO 16) := (OTHERS => 'Z'); - END IF; - IF Dqm_reg0 (3) = '1' THEN - Dq_temp (31 DOWNTO 24) := (OTHERS => 'Z'); - END IF; - - -- Output - Dq <= TRANSPORT Dq_temp AFTER tAC; - ELSE - Dq <= TRANSPORT (OTHERS => 'Z') AFTER tHZ; - END IF; - - -- Advance Burst Counter - Burst_decode; - END IF; - END IF; - - END PROCESS; - - -- Clock timing checks - Clock_check : PROCESS - VARIABLE Clk_low, Clk_high : TIME := 0 ns; - BEGIN - WAIT ON Clk; - IF (Clk = '1' AND NOW >= 10 ns) THEN - ASSERT (NOW - Clk_low >= tCL) - REPORT "tCL violation" - SEVERITY WARNING; - ASSERT (NOW - Clk_high >= tCK) - REPORT "tCK violation" - SEVERITY WARNING; - Clk_high := NOW; - ELSIF (Clk = '0' AND NOW /= 0 ns) THEN - ASSERT (NOW - Clk_high >= tCH) - REPORT "tCH violation" - SEVERITY WARNING; - Clk_low := NOW; - END IF; - END PROCESS; - - -- Setup timing checks - Setup_check : PROCESS - BEGIN - WAIT ON Clk; - IF Clk = '1' THEN - ASSERT(Cke'LAST_EVENT >= tCKS) - REPORT "CKE Setup time violation -- tCKS" - SEVERITY WARNING; - ASSERT(Cs_n'LAST_EVENT >= tCMS) - REPORT "CS# Setup time violation -- tCMS" - SEVERITY WARNING; - ASSERT(Cas_n'LAST_EVENT >= tCMS) - REPORT "CAS# Setup time violation -- tCMS" - SEVERITY WARNING; - ASSERT(Ras_n'LAST_EVENT >= tCMS) - REPORT "RAS# Setup time violation -- tCMS" - SEVERITY WARNING; - ASSERT(We_n'LAST_EVENT >= tCMS) - REPORT "WE# Setup time violation -- tCMS" - SEVERITY WARNING; - ASSERT(Dqm'LAST_EVENT >= tCMS) - REPORT "Dqm Setup time violation -- tCMS" - SEVERITY WARNING; - ASSERT(Addr'LAST_EVENT >= tAS) - REPORT "ADDR Setup time violation -- tAS" - SEVERITY WARNING; - ASSERT(Ba'LAST_EVENT >= tAS) - REPORT "BA Setup time violation -- tAS" - SEVERITY WARNING; - ASSERT(Dq'LAST_EVENT >= tDS) - REPORT "Dq Setup time violation -- tDS" - SEVERITY WARNING; - END IF; - END PROCESS; - - -- Hold timing checks - Hold_check : PROCESS - BEGIN - WAIT ON Clk'DELAYED (tCKH), Clk'DELAYED (tCMH), Clk'DELAYED (tAH), Clk'DELAYED (tDH); - IF Clk'DELAYED (tCKH) = '1' THEN - ASSERT(Cke'LAST_EVENT > tCKH) - REPORT "CKE Hold time violation -- tCKH" - SEVERITY WARNING; - END IF; - IF Clk'DELAYED (tCMH) = '1' THEN - ASSERT(Cs_n'LAST_EVENT > tCMH) - REPORT "CS# Hold time violation -- tCMH" - SEVERITY WARNING; - ASSERT(Cas_n'LAST_EVENT > tCMH) - REPORT "CAS# Hold time violation -- tCMH" - SEVERITY WARNING; - ASSERT(Ras_n'LAST_EVENT > tCMH) - REPORT "RAS# Hold time violation -- tCMH" - SEVERITY WARNING; - ASSERT(We_n'LAST_EVENT > tCMH) - REPORT "WE# Hold time violation -- tCMH" - SEVERITY WARNING; - ASSERT(Dqm'LAST_EVENT > tCMH) - REPORT "Dqm Hold time violation -- tCMH" - SEVERITY WARNING; - END IF; - IF Clk'DELAYED (tAH) = '1' THEN - ASSERT(Addr'LAST_EVENT > tAH) - REPORT "ADDR Hold time violation -- tAH" - SEVERITY WARNING; - ASSERT(Ba'LAST_EVENT > tAH) - REPORT "BA Hold time violation -- tAH" - SEVERITY WARNING; - END IF; - IF Clk'DELAYED (tDH) = '1' THEN - ASSERT(Dq'LAST_EVENT > tDH) - REPORT "Dq Hold time violation -- tDH" - SEVERITY WARNING; - END IF; - END PROCESS; - -END behave; Index: trunk/test_bench/cpu_simulator.vhd =================================================================== --- trunk/test_bench/cpu_simulator.vhd (revision 7) +++ trunk/test_bench/cpu_simulator.vhd (nonexistent) @@ -1,72 +0,0 @@ -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; - -ENTITY cpu_simulator IS - PORT(clk, reset: in std_logic; - - address : out std_logic_vector(21 downto 0); - writedata : out std_logic_vector(31 downto 0); - byteenable : out std_logic_vector(3 downto 0); - write : out std_logic; - read : out std_logic; - readdata : in std_logic_vector(31 downto 0); - waitrequest : in std_logic; - readdatavalid : in std_logic - ); -END cpu_simulator; - -ARCHITECTURE behaviour OF cpu_simulator IS - signal counter: unsigned(3 downto 0); - type vector is - record - address: integer; - writedata: integer; - byteenable: std_logic_vector(3 downto 0); - write: std_logic; - read: std_logic; - end record; - type script is array(0 to (2**counter'length)-1) of vector; - signal wave_form: script:=( - (0,0,"1111",'1','0'), - (1,1,"1111",'1','0'), - (2,2,"1111",'1','0'), - (3,3,"1111",'1','0'), - (1024,1024,"1111",'0','1'), - (1025,1025,"1111",'0','1'), - (1026,1026,"1111",'0','1'), - (1027,1027,"1111",'0','1'), - (1024,1024,"1111",'1','0'), - (1025,1025,"1111",'1','0'), - (1026,1026,"1111",'1','0'), - (1027,1027,"1111",'1','0'), - (0,0,"1111",'0','1'), - (1,1,"1111",'0','1'), - (2,2,"1111",'0','1'), - (3,3,"1111",'0','1') - ); -BEGIN - process(clk,reset) - begin - if reset='1' - then - counter<=(others=>'0'); - address<=(others=>'0'); - writedata<=(others=>'0'); - byteenable<=(others=>'0'); - write<='0'; - read<='0'; - elsif rising_edge(clk) - then - if waitrequest='0' - then - counter<=counter+1; - address<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).address,address'length)); - writedata<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).writedata,writedata'length)); - byteenable<=wave_form(to_integer(counter)).byteenable; - write<=wave_form(to_integer(counter)).write; - read<=wave_form(to_integer(counter)).read; - end if; - end if; - end process; -END behaviour; \ No newline at end of file Index: trunk/test_bench/pll.vhd =================================================================== --- trunk/test_bench/pll.vhd (revision 7) +++ trunk/test_bench/pll.vhd (nonexistent) @@ -1,256 +0,0 @@ --- megafunction wizard: %ALTPLL% --- GENERATION: STANDARD --- VERSION: WM1.0 --- MODULE: altpll - --- ============================================================ --- File Name: pll.vhd --- Megafunction Name(s): --- altpll --- ============================================================ --- ************************************************************ --- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! --- --- 5.1 Build 213 01/19/2006 SP 1 SJ Full Version --- ************************************************************ - - ---Copyright (C) 1991-2006 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 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.altera_mf_components.all; - -ENTITY pll IS - PORT - ( - inclk0 : IN STD_LOGIC := '0'; - c0 : OUT STD_LOGIC ; - e0 : OUT STD_LOGIC ; - locked : OUT STD_LOGIC - ); -END pll; - - -ARCHITECTURE SYN OF pll 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_VECTOR (3 DOWNTO 0); - SIGNAL sub_wire4 : STD_LOGIC ; - SIGNAL sub_wire5 : STD_LOGIC ; - SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); - SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); - SIGNAL sub_wire7 : 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; - extclk0_divide_by : NATURAL; - extclk0_duty_cycle : NATURAL; - extclk0_multiply_by : NATURAL; - extclk0_phase_shift : STRING; - inclk0_input_frequency : NATURAL; - intended_device_family : STRING; - invalid_lock_multiplier : NATURAL; - lpm_type : STRING; - operation_mode : STRING; - pll_type : STRING; - valid_lock_multiplier : NATURAL - ); - PORT ( - extclk : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); - inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); - locked : OUT STD_LOGIC ; - clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) - ); - END COMPONENT; - -BEGIN - sub_wire7_bv(0 DOWNTO 0) <= "0"; - sub_wire7 <= To_stdlogicvector(sub_wire7_bv); - sub_wire1 <= sub_wire0(0); - c0 <= sub_wire1; - locked <= sub_wire2; - sub_wire4 <= sub_wire3(0); - e0 <= sub_wire4; - sub_wire5 <= inclk0; - sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; - - altpll_component : altpll - GENERIC MAP ( - clk0_divide_by => 2, - clk0_duty_cycle => 50, - clk0_multiply_by => 11, - clk0_phase_shift => "0", - compensate_clock => "CLK0", - extclk0_divide_by => 2, - extclk0_duty_cycle => 50, - extclk0_multiply_by => 11, - extclk0_phase_shift => "5682", - inclk0_input_frequency => 41666, - intended_device_family => "Cyclone", - invalid_lock_multiplier => 5, - lpm_type => "altpll", - operation_mode => "NORMAL", - pll_type => "AUTO", - valid_lock_multiplier => 1 - ) - PORT MAP ( - inclk => sub_wire6, - clk => sub_wire0, - locked => sub_wire2, - extclk => sub_wire3 - ); - - - -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 "0" --- 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_FAMILY NUMERIC "11" --- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "Any" --- Retrieval info: PRIVATE: DEV_FAMILY STRING "Cyclone" --- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" --- Retrieval info: PRIVATE: DIV_FACTOR6 NUMERIC "1" --- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" --- Retrieval info: PRIVATE: DUTY_CYCLE6 STRING "50.00000000" --- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" --- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" --- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" --- 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: INT_FEEDBACK__MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" --- Retrieval info: PRIVATE: LOCK_LOSS_SWITCHOVER_CHECK STRING "0" --- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" --- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "504.000" --- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" --- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" --- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT6 STRING "deg" --- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" --- Retrieval info: PRIVATE: MIRROR_CLK6 STRING "0" --- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" --- Retrieval info: PRIVATE: MULT_FACTOR6 NUMERIC "1" --- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "132.000" --- Retrieval info: PRIVATE: OUTPUT_FREQ6 STRING "100.000" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" --- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE6 STRING "0" --- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" --- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT6 STRING "MHz" --- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" --- Retrieval info: PRIVATE: PHASE_SHIFT6 STRING "0.00000000" --- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" --- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT6 STRING "deg" --- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" --- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" --- 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_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: SACN_INPUTS_CHECK STRING "0" --- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED 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: STICKY_CLK6 STRING "0" --- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" --- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "0" --- Retrieval info: PRIVATE: USE_CLK0 STRING "1" --- Retrieval info: PRIVATE: USE_CLK6 STRING "0" --- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" --- Retrieval info: PRIVATE: USE_CLKENA6 STRING "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 "2" --- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "11" --- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" --- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" --- Retrieval info: CONSTANT: EXTCLK0_DIVIDE_BY NUMERIC "2" --- Retrieval info: CONSTANT: EXTCLK0_DUTY_CYCLE NUMERIC "50" --- Retrieval info: CONSTANT: EXTCLK0_MULTIPLY_BY NUMERIC "11" --- Retrieval info: CONSTANT: EXTCLK0_PHASE_SHIFT STRING "5682" --- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "41666" --- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone" --- 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: PLL_TYPE STRING "AUTO" --- Retrieval info: CONSTANT: VALID_LOCK_MULTIPLIER NUMERIC "1" --- Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT VCC "@clk[5..0]" --- Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT VCC "@extclk[3..0]" --- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT VCC "@inclk[1..0]" --- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT VCC "c0" --- Retrieval info: USED_PORT: e0 0 0 0 0 OUTPUT VCC "e0" --- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT 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: e0 0 0 0 0 @extclk 0 0 1 0 --- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll_waveforms.html FALSE FALSE --- Retrieval info: GEN_FILE: TYPE_NORMAL pll_wave*.jpg FALSE FALSE Index: trunk/test_bench/old/nios.dat =================================================================== --- trunk/test_bench/old/nios.dat (revision 7) +++ trunk/test_bench/old/nios.dat (nonexistent) @@ -1 +0,0 @@ -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file Index: trunk/test_bench/old/cpu_simulator_file_based.vhd =================================================================== --- trunk/test_bench/old/cpu_simulator_file_based.vhd (revision 7) +++ trunk/test_bench/old/cpu_simulator_file_based.vhd (nonexistent) @@ -1,79 +0,0 @@ -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; - -ENTITY cpu_simulator IS - PORT(clk, reset: in std_logic; - - address : out std_logic_vector(21 downto 0); - writedata : out std_logic_vector(31 downto 0); - byteenable : out std_logic_vector(3 downto 0); - write : out std_logic; - read : out std_logic; - readdata : in std_logic_vector(31 downto 0); - waitrequest : in std_logic; - readdatavalid : in std_logic - ); -END cpu_simulator; - -ARCHITECTURE behaviour OF cpu_simulator IS - signal address: std_logic_vector(21 downto 0); - signal writedata: std_logic_vector(31 downto 0); - signal byteenable: std_logic_vector(3 downto 0); - signal write: std_logic; - signal read: std_logic; - -BEGIN - process(clk,reset) - variable service: std_logic_vector(7 downto 0); - variable b0,b1,b2,b3,b4,b5,b6,b7: BYTE; - begin - if reset='1' - then - file_close(NIOS); - file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); - elsif rising_edge(clk) - then - if waitrequest='0' - then - if Endfile(NIOS) - then - file_close(NIOS); - file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); - else - Read(NIOS,b0); - Read(NIOS,b1); - Read(NIOS,b2); - Read(NIOS,b3); - Read(NIOS,b4); - Read(NIOS,b5); - Read(NIOS,b6); - Read(NIOS,b7); - service:=char2std_logic_vector(b0); - address<=service(5 downto 0)&char2std_logic_vector(b1)&char2std_logic_vector(b2); - writedata<=char2std_logic_vector(b3)&char2std_logic_vector(b4)&char2std_logic_vector(b5)&char2std_logic_vector(b6); - service:=char2std_logic_vector(b7); - byteenable<=not service(7 downto 4); - write<=service(3); - read<=service(2); - end if; - end if; - end if; - end process; - - process(clk,reset) - begin - if reset='1' - then - readed<=(others=>'0'); - new_data<='0'; - elsif rising_edge(clk) - then - new_data<=readdatavalid; - if readdatavalid='1' - then - readed<=readdata; - end if; - end if; - end process; -END behaviour; \ No newline at end of file Index: trunk/test_bench/old/Hello_LED_sdram_0.dat =================================================================== --- trunk/test_bench/old/Hello_LED_sdram_0.dat (revision 7) +++ trunk/test_bench/old/Hello_LED_sdram_0.dat (nonexistent) @@ -1,49 +0,0 @@ -@00000000 00400034 -@00000001 08400804 -@00000002 0800683A -@00000003 00000000 -@00000004 00000000 -@00000005 00000000 -@00000006 00000000 -@00000007 00000000 -@00000008 06C04034 -@00000009 DEC00004 -@0000000A 06800074 -@0000000B D6A03104 -@0000000C 00000340 -@0000000D DEFFFD04 -@0000000E DF000215 -@0000000F D839883A -@00000010 00800084 -@00000011 E0800005 -@00000012 E0000045 -@00000013 E0800003 -@00000014 1080204C -@00000015 1005003A -@00000016 1000031E -@00000017 E0800043 -@00000018 1080005C -@00000019 E0800045 -@0000001A E0800043 -@0000001B 1005003A -@0000001C 1000041E -@0000001D E0800003 -@0000001E 1004D07A -@0000001F E0800005 -@00000020 00000306 -@00000021 E0800003 -@00000022 1085883A -@00000023 E0800005 -@00000024 00C04034 -@00000025 18C21004 -@00000026 E0800003 -@00000027 18800035 -@00000028 E0000115 -@00000029 E0C00117 -@0000002A 008000F4 -@0000002B 10834FC4 -@0000002C 10FFE616 -@0000002D E0800117 -@0000002E 10800044 -@0000002F E0800115 -@00000030 003FF806 Index: trunk/test_bench/old/Count_Binary_sdram_0.dat =================================================================== --- trunk/test_bench/old/Count_Binary_sdram_0.dat (revision 7) +++ trunk/test_bench/old/Count_Binary_sdram_0.dat (nonexistent) @@ -1,5026 +0,0 @@ -;Count Binary -@00000000 00820014 -@00000001 1001483A -@00000002 10BFF804 -@00000003 00BFFD16 -@00000004 00400034 -@00000005 08407204 -@00000006 0800683A -@00000007 00000000 -@00000008 DEFFED04 -@00000009 DFC00015 -@0000000A D8400215 -@0000000B D8800315 -@0000000C D8C00415 -@0000000D D9000515 -@0000000E D9400615 -@0000000F D9800715 -@00000010 D9C00815 -@00000011 000B307A -@00000012 DA000915 -@00000013 DA400A15 -@00000014 DA800B15 -@00000015 DAC00C15 -@00000016 DB000D15 -@00000017 DB400E15 -@00000018 DB800F15 -@00000019 DBC01015 -@0000001A D9401115 -@0000001B EBFFFF04 -@0000001C DBC01215 -@0000001D 0009313A -@0000001E 2880004C -@0000001F 10000326 -@00000020 20000226 -@00000021 00000EC0 -@00000022 00000306 -@00000023 DF401215 -@00000024 E8BFFF17 -@00000025 003DA03A -@00000026 D9401117 -@00000027 DF401217 -@00000028 DFC00017 -@00000029 2801707A -@0000002A D8400217 -@0000002B D8800317 -@0000002C D8C00417 -@0000002D D9000517 -@0000002E D9400617 -@0000002F D9800717 -@00000030 D9C00817 -@00000031 DA000917 -@00000032 DA400A17 -@00000033 DA800B17 -@00000034 DAC00C17 -@00000035 DB000D17 -@00000036 DB400E17 -@00000037 DB800F17 -@00000038 DBC01017 -@00000039 DEC01304 -@0000003A E800083A -@0000003B DEFFF904 -@0000003C DFC00615 -@0000003D DF000515 -@0000003E D839883A -@0000003F 0005313A -@00000040 E0800415 -@00000041 E0800417 -@00000042 E0800315 -@00000043 E0800317 -@00000044 E0800015 -@00000045 E0000215 -@00000046 00800044 -@00000047 E0800115 -@00000048 E0C00017 -@00000049 E0800117 -@0000004A 1884703A -@0000004B 1005003A -@0000004C 1000101E -@0000004D 00C00034 -@0000004E 18D3A504 -@0000004F E0800217 -@00000050 100490FA -@00000051 10C9883A -@00000052 00C00034 -@00000053 18D3A504 -@00000054 E0800217 -@00000055 100490FA -@00000056 10C5883A -@00000057 10800104 -@00000058 20C00017 -@00000059 11000017 -@0000005A E1400217 -@0000005B 183EE83A -@0000005C 00000706 -@0000005D E0800117 -@0000005E 1085883A -@0000005F E0800115 -@00000060 E0800217 -@00000061 10800044 -@00000062 E0800215 -@00000063 003FE406 -@00000064 0005313A -@00000065 E0800315 -@00000066 E0800317 -@00000067 E0800415 -@00000068 E0800417 -@00000069 E0800015 -@0000006A E0800017 -@0000006B 1005003A -@0000006C 1000011E -@0000006D 003FD706 -@0000006E DFC00617 -@0000006F DF000517 -@00000070 DEC00704 -@00000071 F800283A -@00000072 06C04034 -@00000073 DEC00004 -@00000074 06800074 -@00000075 D6B38B04 -@00000076 00800034 -@00000077 1093A104 -@00000078 00C00034 -@00000079 18D42804 -@0000007A 10C00326 -@0000007B 10000015 -@0000007C 10800104 -@0000007D 10FFFD36 -@0000007E 0000DB40 -@0000007F DEFFFE04 -@00000080 DFC00115 -@00000081 DF000015 -@00000082 D839883A -@00000083 01000034 -@00000084 210D8704 -@00000085 00005100 -@00000086 01000034 -@00000087 210D8F04 -@00000088 00005100 -@00000089 01000034 -@0000008A 210D9604 -@0000008B 00005100 -@0000008C 01000034 -@0000008D 210D9D04 -@0000008E 00005100 -@0000008F DFC00117 -@00000090 DF000017 -@00000091 DEC00204 -@00000092 F800283A -@00000093 DEFFFF04 -@00000094 DF000015 -@00000095 D839883A -@00000096 00C04034 -@00000097 18C21004 -@00000098 D0A01603 -@00000099 18800035 -@0000009A DF000017 -@0000009B DEC00104 -@0000009C F800283A -@0000009D DEFFFF04 -@0000009E DF000015 -@0000009F D839883A -@000000A0 DF000017 -@000000A1 DEC00104 -@000000A2 F800283A -@000000A3 DEFFFE04 -@000000A4 DF000115 -@000000A5 D839883A -@000000A6 E1000015 -@000000A7 DF000117 -@000000A8 DEC00204 -@000000A9 F800283A -@000000AA DEFFFD04 -@000000AB DFC00215 -@000000AC DF000115 -@000000AD D839883A -@000000AE E1000015 -@000000AF 000024C0 -@000000B0 00002740 -@000000B1 E1000017 -@000000B2 000028C0 -@000000B3 D1601603 -@000000B4 01000034 -@000000B5 210DA404 -@000000B6 00005100 -@000000B7 DFC00217 -@000000B8 DF000117 -@000000B9 DEC00304 -@000000BA F800283A -@000000BB DEFFFA04 -@000000BC DFC00515 -@000000BD DF000415 -@000000BE D839883A -@000000BF E1400115 -@000000C0 E1000005 -@000000C1 E0800003 -@000000C2 108018D8 -@000000C3 1000201E -@000000C4 D0A01717 -@000000C5 E0800215 -@000000C6 E0C00217 -@000000C7 188000A0 -@000000C8 1000101E -@000000C9 E0C00217 -@000000CA 188000C8 -@000000CB 1000041E -@000000CC E0C00217 -@000000CD 18800060 -@000000CE 1000081E -@000000CF 00001106 -@000000D0 E0C00217 -@000000D1 18800120 -@000000D2 1000081E -@000000D3 E0C00217 -@000000D4 18800220 -@000000D5 1000081E -@000000D6 00000A06 -@000000D7 000024C0 -@000000D8 00003106 -@000000D9 00002740 -@000000DA 00002F06 -@000000DB E1000117 -@000000DC 000028C0 -@000000DD 00002C06 -@000000DE E1000117 -@000000DF 00002A80 -@000000E0 00002906 -@000000E1 E1000117 -@000000E2 00002A80 -@000000E3 00002606 -@000000E4 D0A01717 -@000000E5 E0800315 -@000000E6 E0C00317 -@000000E7 188000A0 -@000000E8 1000131E -@000000E9 E0C00317 -@000000EA 188000C8 -@000000EB 1000041E -@000000EC E0C00317 -@000000ED 18800060 -@000000EE 1000081E -@000000EF 00001A06 -@000000F0 E0C00317 -@000000F1 18800120 -@000000F2 10000E1E -@000000F3 E0C00317 -@000000F4 18800220 -@000000F5 1000101E -@000000F6 00001306 -@000000F7 01000034 -@000000F8 210DA604 -@000000F9 00005100 -@000000FA D0201715 -@000000FB 00000E06 -@000000FC 01000034 -@000000FD 210DA904 -@000000FE 00005100 -@000000FF D0201715 -@00000100 00000906 -@00000101 01000034 -@00000102 210DAC04 -@00000103 00005100 -@00000104 D0201715 -@00000105 00000406 -@00000106 01000034 -@00000107 210DAF04 -@00000108 00005100 -@00000109 D0201715 -@0000010A DFC00517 -@0000010B DF000417 -@0000010C DEC00604 -@0000010D F800283A -@0000010E DEFFFB04 -@0000010F DFC00415 -@00000110 DF000315 -@00000111 D839883A -@00000112 D0201605 -@00000113 00001FC0 -@00000114 010000B4 -@00000115 2121A804 -@00000116 0000E6C0 -@00000117 D0A01717 -@00000118 1005003A -@00000119 1000041E -@0000011A 010018C4 -@0000011B E1400217 -@0000011C 00002EC0 -@0000011D 00000206 -@0000011E E1000217 -@0000011F 00002A80 -@00000120 D0A01603 -@00000121 10803FD8 -@00000122 10001D1E -@00000123 01000034 -@00000124 210DB204 -@00000125 00005100 -@00000126 D0201715 -@00000127 E0000115 -@00000128 E0000015 -@00000129 E0800017 -@0000012A 10801188 -@0000012B 1000131E -@0000012C 01000034 -@0000012D 210DB504 -@0000012E 00005100 -@0000012F D0A01717 -@00000130 1005003A -@00000131 1000061E -@00000132 01000034 -@00000133 210DB604 -@00000134 00005100 -@00000135 01001DC4 -@00000136 E1400217 -@00000137 00002EC0 -@00000138 010000B4 -@00000139 2121A804 -@0000013A 0000E6C0 -@0000013B E0800017 -@0000013C 10800044 -@0000013D E0800015 -@0000013E 003FEA06 -@0000013F 00001FC0 -@00000140 D0A01603 -@00000141 10800044 -@00000142 D0A01605 -@00000143 003FD006 -@00000144 DEFFFC04 -@00000145 DFC00015 -@00000146 D9400115 -@00000147 D9800215 -@00000148 D9C00315 -@00000149 D0A00017 -@0000014A 200B883A -@0000014B D9800104 -@0000014C 11000117 -@0000014D 00800034 -@0000014E 1082C604 -@0000014F 20800115 -@00000150 0000AF40 -@00000151 DFC00017 -@00000152 DEC00404 -@00000153 F800283A -@00000154 DEFFFB04 -@00000155 DC000315 -@00000156 DC400215 -@00000157 DC800115 -@00000158 DFC00415 -@00000159 D9800005 -@0000015A 2025883A -@0000015B 2823883A -@0000015C 3C3FFFC4 -@0000015D 01C00A0E -@0000015E 88C00117 -@0000015F 9009883A -@00000160 880B883A -@00000161 D80D883A -@00000162 01C00044 -@00000163 183EE83A -@00000164 8007883A -@00000165 843FFFC4 -@00000166 1000081E -@00000167 00FFF616 -@00000168 0005883A -@00000169 DFC00417 -@0000016A DC000317 -@0000016B DC400217 -@0000016C DC800117 -@0000016D DEC00504 -@0000016E F800283A -@0000016F 00BFFFC4 -@00000170 DFC00417 -@00000171 DC000317 -@00000172 DC400217 -@00000173 DC800117 -@00000174 DEC00504 -@00000175 F800283A -@00000176 DEFFEC04 -@00000177 DF001215 -@00000178 DC001115 -@00000179 DC401015 -@0000017A DC800F15 -@0000017B DD000D15 -@0000017C DD800B15 -@0000017D DDC00A15 -@0000017E DFC01315 -@0000017F DCC00E15 -@00000180 DD400C15 -@00000181 30800003 -@00000182 202F883A -@00000183 2829883A -@00000184 1021883A -@00000185 D9C00215 -@00000186 34800044 -@00000187 D8000315 -@00000188 D8000415 -@00000189 D8000515 -@0000018A D8000615 -@0000018B 0039883A -@0000018C D8000715 -@0000018D D8000815 -@0000018E 002D883A -@0000018F 0023883A -@00000190 1000061E -@00000191 00002206 -@00000192 88002E26 -@00000193 90800003 -@00000194 94800044 -@00000195 1021883A -@00000196 10001D26 -@00000197 01C00044 -@00000198 89C03626 -@00000199 3C7FF80E -@0000019A 00800084 -@0000019B 88BFF71E -@0000019C 81003FCC -@0000019D 2100201C -@0000019E 213FE004 -@0000019F 00800B84 -@000001A0 20803826 -@000001A1 817FF404 -@000001A2 28C03FCC -@000001A3 00800244 -@000001A4 10C03636 -@000001A5 D8C00617 -@000001A6 2821883A -@000001A7 18005916 -@000001A8 D9000617 -@000001A9 01400284 -@000001AA 0000D8C0 -@000001AB 80C03FCC -@000001AC 18C0201C -@000001AD 18FFE004 -@000001AE 10C5883A -@000001AF D8800615 -@000001B0 90800003 -@000001B1 94800044 -@000001B2 1021883A -@000001B3 103FE31E -@000001B4 B005883A -@000001B5 DFC01317 -@000001B6 DF001217 -@000001B7 DC001117 -@000001B8 DC401017 -@000001B9 DC800F17 -@000001BA DCC00E17 -@000001BB DD000D17 -@000001BC DD400C17 -@000001BD DD800B17 -@000001BE DDC00A17 -@000001BF DEC01404 -@000001C0 F800283A -@000001C1 80C03FCC -@000001C2 18C0201C -@000001C3 18FFE004 -@000001C4 00800944 -@000001C5 18802026 -@000001C6 A0C00117 -@000001C7 B809883A -@000001C8 DC000005 -@000001C9 A00B883A -@000001CA D80D883A -@000001CB 183EE83A -@000001CC 1000E81E -@000001CD B5800044 -@000001CE 003FC406 -@000001CF 81003FCC -@000001D0 2100201C -@000001D1 213FE004 -@000001D2 00800C04 -@000001D3 20801C26 -@000001D4 00800944 -@000001D5 20801D26 -@000001D6 00800B84 -@000001D7 04400084 -@000001D8 20BFC81E -@000001D9 D8000615 -@000001DA 003FB806 -@000001DB 00801B04 -@000001DC 20802126 -@000001DD 20FFEA04 -@000001DE 00800804 -@000001DF 10C01C36 -@000001E0 180490BA -@000001E1 00C00034 -@000001E2 18CDBA04 -@000001E3 10C5883A -@000001E4 11000017 -@000001E5 2000683A -@000001E6 00BFFFC4 -@000001E7 07000284 -@000001E8 3823883A -@000001E9 D9C00715 -@000001EA D8800515 -@000001EB D8000315 -@000001EC D8000415 -@000001ED D8000815 -@000001EE D8800615 -@000001EF 003FA306 -@000001F0 DC400315 -@000001F1 04400084 -@000001F2 003FA006 -@000001F3 A0C00117 -@000001F4 B809883A -@000001F5 DC000045 -@000001F6 A00B883A -@000001F7 D9800044 -@000001F8 880F883A -@000001F9 183EE83A -@000001FA 1000BA1E -@000001FB B46D883A -@000001FC 0023883A -@000001FD 003F9506 -@000001FE 00800044 -@000001FF D8800415 -@00000200 003F9206 -@00000201 D8800517 -@00000202 1000B416 -@00000203 D9000517 -@00000204 01400284 -@00000205 0000D8C0 -@00000206 D8800515 -@00000207 D8C00517 -@00000208 80803FCC -@00000209 1080201C -@0000020A 10BFE004 -@0000020B 1887883A -@0000020C D8C00515 -@0000020D 003F8506 -@0000020E 00C00044 -@0000020F D8000715 -@00000210 07000404 -@00000211 D8C00815 -@00000212 D8800717 -@00000213 D8000915 -@00000214 1007003A -@00000215 D8800217 -@00000216 15400017 -@00000217 10800104 -@00000218 D8800215 -@00000219 1800011E -@0000021A A8009E16 -@0000021B 04C00044 -@0000021C A821883A -@0000021D 9823883A -@0000021E 00000506 -@0000021F 9809883A -@00000220 E00B883A -@00000221 0000D8C0 -@00000222 1027883A -@00000223 8C400044 -@00000224 8009883A -@00000225 E00B883A -@00000226 0000D6C0 -@00000227 1021883A -@00000228 103FF61E -@00000229 D8800517 -@0000022A D8C00317 -@0000022B 1445C83A -@0000022C D8800515 -@0000022D 18006F26 -@0000022E D8800917 -@0000022F 10000D26 -@00000230 A0C00117 -@00000231 00800B44 -@00000232 D8800085 -@00000233 B809883A -@00000234 A00B883A -@00000235 D9800084 -@00000236 01C00044 -@00000237 183EE83A -@00000238 10007C1E -@00000239 D8C00517 -@0000023A B5800044 -@0000023B 18FFFFC4 -@0000023C D8C00515 -@0000023D D9C00517 -@0000023E B809883A -@0000023F A00B883A -@00000240 01800C04 -@00000241 00005500 -@00000242 1000721E -@00000243 D8800517 -@00000244 B0AD883A -@00000245 983FB626 -@00000246 A809883A -@00000247 980B883A -@00000248 0000D6C0 -@00000249 11000C04 -@0000024A 20C03FCC -@0000024B 00800E44 -@0000024C 10C0042E -@0000024D D8800817 -@0000024E 190001C4 -@0000024F 1000011E -@00000250 190009C4 -@00000251 A0C00117 -@00000252 A00B883A -@00000253 D9000105 -@00000254 D9800104 -@00000255 B809883A -@00000256 01C00044 -@00000257 183EE83A -@00000258 10005C1E -@00000259 A809883A -@0000025A 980B883A -@0000025B 0000D7C0 -@0000025C 9809883A -@0000025D E00B883A -@0000025E 102B883A -@0000025F 0000D6C0 -@00000260 1027883A -@00000261 B5800044 -@00000262 003FE206 -@00000263 D8800517 -@00000264 B809883A -@00000265 A00B883A -@00000266 01800804 -@00000267 11FFFFC4 -@00000268 00005500 -@00000269 10004B1E -@0000026A D8800217 -@0000026B A2000117 -@0000026C B809883A -@0000026D 10C00017 -@0000026E 10800104 -@0000026F A00B883A -@00000270 D8C00145 -@00000271 D8C00517 -@00000272 D9800144 -@00000273 01C00044 -@00000274 D8800215 -@00000275 1DA1883A -@00000276 403EE83A -@00000277 10003D1E -@00000278 802D883A -@00000279 0023883A -@0000027A 003F1806 -@0000027B 07000404 -@0000027C D8000715 -@0000027D 003F9406 -@0000027E D8000715 -@0000027F 003F9206 -@00000280 D8800217 -@00000281 14400017 -@00000282 10C00104 -@00000283 D8C00215 -@00000284 8809883A -@00000285 0000BEC0 -@00000286 1021883A -@00000287 D8800517 -@00000288 B809883A -@00000289 A00B883A -@0000028A 1427C83A -@0000028B 01800804 -@0000028C 980F883A -@0000028D 00005500 -@0000028E 1000261E -@0000028F A0C00117 -@00000290 880D883A -@00000291 B809883A -@00000292 A00B883A -@00000293 800F883A -@00000294 B4ED883A -@00000295 183EE83A -@00000296 10001E1E -@00000297 B42D883A -@00000298 0023883A -@00000299 003EF906 -@0000029A 07000204 -@0000029B D8000715 -@0000029C 003F7506 -@0000029D D8C00917 -@0000029E 1821003A -@0000029F 8000031E -@000002A0 D8800517 -@000002A1 10BFFFC4 -@000002A2 D8800515 -@000002A3 D9C00517 -@000002A4 B809883A -@000002A5 A00B883A -@000002A6 01800804 -@000002A7 00005500 -@000002A8 10000C1E -@000002A9 D8C00517 -@000002AA B0ED883A -@000002AB 803F991E -@000002AC A0C00117 -@000002AD 00800B44 -@000002AE D88000C5 -@000002AF B809883A -@000002B0 A00B883A -@000002B1 D98000C4 -@000002B2 01C00044 -@000002B3 183EE83A -@000002B4 103FAC26 -@000002B5 00BFFFC4 -@000002B6 003EFE06 -@000002B7 D8000515 -@000002B8 003F4E06 -@000002B9 00C00044 -@000002BA 056BC83A -@000002BB D8C00915 -@000002BC 003F5E06 -@000002BD 2013883A -@000002BE D1200017 -@000002BF 2807883A -@000002C0 300F883A -@000002C1 480B883A -@000002C2 180D883A -@000002C3 02000034 -@000002C4 42017604 -@000002C5 4000683A -@000002C6 DEFFFA04 -@000002C7 DC400315 -@000002C8 DC800215 -@000002C9 DCC00115 -@000002CA DFC00515 -@000002CB DC000415 -@000002CC DD000015 -@000002CD 28C0000B -@000002CE 2027883A -@000002CF 2825883A -@000002D0 1804D0FA -@000002D1 3023883A -@000002D2 013FFFC4 -@000002D3 1080004C -@000002D4 10001B26 -@000002D5 2940008B -@000002D6 28BFFFCC -@000002D7 10A0001C -@000002D8 10A00004 -@000002D9 10001316 -@000002DA 3821883A -@000002DB 05010004 -@000002DC 01C00316 -@000002DD 00001B06 -@000002DE 04001A0E -@000002DF 9140008B -@000002E0 297FFFCC -@000002E1 2960001C -@000002E2 880D883A -@000002E3 9809883A -@000002E4 29600004 -@000002E5 800F883A -@000002E6 A400010E -@000002E7 01C10004 -@000002E8 0000C0C0 -@000002E9 80A1C83A -@000002EA 88A3883A -@000002EB 00BFF216 -@000002EC 90C0000B -@000002ED 18801014 -@000002EE 9080000D -@000002EF 013FFFC4 -@000002F0 2005883A -@000002F1 DFC00517 -@000002F2 DC000417 -@000002F3 DC400317 -@000002F4 DC800217 -@000002F5 DCC00117 -@000002F6 DD000017 -@000002F7 DEC00604 -@000002F8 F800283A -@000002F9 0009883A -@000002FA 003FF506 -@000002FB 20800007 -@000002FC 2007883A -@000002FD 10000326 -@000002FE 21000044 -@000002FF 20800007 -@00000300 103FFD1E -@00000301 20C5C83A -@00000302 F800283A -@00000303 DEFFFE04 -@00000304 DC000015 -@00000305 2021883A -@00000306 2809883A -@00000307 300B883A -@00000308 380D883A -@00000309 DFC00115 -@0000030A D0201815 -@0000030B 0000E980 -@0000030C 1007883A -@0000030D 00BFFFC4 -@0000030E 18800526 -@0000030F 1805883A -@00000310 DFC00117 -@00000311 DC000017 -@00000312 DEC00204 -@00000313 F800283A -@00000314 D0A01817 -@00000315 103FF926 -@00000316 80800315 -@00000317 1805883A -@00000318 DFC00117 -@00000319 DC000017 -@0000031A DEC00204 -@0000031B F800283A -@0000031C 00800044 -@0000031D 000F883A -@0000031E 2900082E -@0000031F 28000716 -@00000320 294B883A -@00000321 1085883A -@00000322 29000E2E -@00000323 1007003A -@00000324 1800081E -@00000325 283FFA0E -@00000326 1800061E -@00000327 21400236 -@00000328 2149C83A -@00000329 388EB03A -@0000032A 1004D07A -@0000032B 280AD07A -@0000032C 103FFA1E -@0000032D 3000011E -@0000032E 3809883A -@0000032F 2005883A -@00000330 F800283A -@00000331 1007003A -@00000332 183FF426 -@00000333 003FF906 -@00000334 DEFFFE04 -@00000335 DC000015 -@00000336 DFC00115 -@00000337 000D883A -@00000338 0021883A -@00000339 20000816 -@0000033A 28000A16 -@0000033B 0000C700 -@0000033C 80000126 -@0000033D 0085C83A -@0000033E DFC00117 -@0000033F DC000017 -@00000340 DEC00204 -@00000341 F800283A -@00000342 0109C83A -@00000343 0021003A -@00000344 283FF60E -@00000345 014BC83A -@00000346 8021003A -@00000347 003FF306 -@00000348 DEFFFE04 -@00000349 DC000015 -@0000034A DFC00115 -@0000034B 01800044 -@0000034C 0021883A -@0000034D 20000816 -@0000034E 28000A16 -@0000034F 0000C700 -@00000350 80000126 -@00000351 0085C83A -@00000352 DFC00117 -@00000353 DC000017 -@00000354 DEC00204 -@00000355 F800283A -@00000356 0109C83A -@00000357 3021883A -@00000358 283FF60E -@00000359 014BC83A -@0000035A 003FF406 -@0000035B 000D883A -@0000035C 02000034 -@0000035D 42031C04 -@0000035E 4000683A -@0000035F 01800044 -@00000360 02000034 -@00000361 42031C04 -@00000362 4000683A -@00000363 0007883A -@00000364 20000626 -@00000365 2080004C -@00000366 2008D07A -@00000367 10000126 -@00000368 1947883A -@00000369 294B883A -@0000036A 203FFA1E -@0000036B 1805883A -@0000036C F800283A -@0000036D DEFFFD04 -@0000036E DFC00215 -@0000036F DF000115 -@00000370 D839883A -@00000371 E0000015 -@00000372 000170FA -@00000373 00800044 -@00000374 1001703A -@00000375 E0000015 -@00000376 0000E200 -@00000377 01000034 -@00000378 210DDB04 -@00000379 01400034 -@0000037A 294DDB04 -@0000037B 01800034 -@0000037C 318DDB04 -@0000037D 0001F540 -@0000037E 0001DC80 -@0000037F 01000034 -@00000380 21078804 -@00000381 000283C0 -@00000382 D1200117 -@00000383 D1600217 -@00000384 D1A00317 -@00000385 00004380 -@00000386 1009883A -@00000387 00028D80 -@00000388 DEFFFE04 -@00000389 DFC00115 -@0000038A DF000015 -@0000038B D839883A -@0000038C 01004034 -@0000038D 21020004 -@0000038E 01400044 -@0000038F 0180FA04 -@00000390 00019880 -@00000391 01000034 -@00000392 210DFD04 -@00000393 01404034 -@00000394 29421404 -@00000395 01800404 -@00000396 00018600 -@00000397 DFC00117 -@00000398 DF000017 -@00000399 DEC00204 -@0000039A F800283A -@0000039B DEFFFD04 -@0000039C DFC00215 -@0000039D DF000115 -@0000039E D839883A -@0000039F E1000015 -@000003A0 E1000017 -@000003A1 0001B500 -@000003A2 DFC00217 -@000003A3 DF000117 -@000003A4 DEC00304 -@000003A5 F800283A -@000003A6 DEFFF704 -@000003A7 DFC00815 -@000003A8 DF000715 -@000003A9 D839883A -@000003AA E1000015 -@000003AB E1400115 -@000003AC E1800215 -@000003AD E0800017 -@000003AE 1004803A -@000003AF 1000091E -@000003B0 E1000017 -@000003B1 01400304 -@000003B2 0000D8C0 -@000003B3 1007883A -@000003B4 00800034 -@000003B5 10921F04 -@000003B6 1887883A -@000003B7 E0C00615 -@000003B8 00000106 -@000003B9 E0000615 -@000003BA E0800617 -@000003BB E0800315 -@000003BC E0800317 -@000003BD 1005003A -@000003BE 1000241E -@000003BF E0800317 -@000003C0 10800217 -@000003C1 108000CC -@000003C2 1005003A -@000003C3 10001A1E -@000003C4 E0800317 -@000003C5 10800017 -@000003C6 10800617 -@000003C7 1005003A -@000003C8 1000151E -@000003C9 E0800317 -@000003CA 10800017 -@000003CB 10800617 -@000003CC E1000317 -@000003CD E1400117 -@000003CE E1800217 -@000003CF 103EE83A -@000003D0 E0800415 -@000003D1 E0800417 -@000003D2 1004403A -@000003D3 1000071E -@000003D4 0000FB80 -@000003D5 E0C00417 -@000003D6 00C7C83A -@000003D7 10C00015 -@000003D8 00BFFFC4 -@000003D9 E0800515 -@000003DA 00000E06 -@000003DB E0800417 -@000003DC E0800515 -@000003DD 00000B06 -@000003DE 0000FB80 -@000003DF 1007883A -@000003E0 00800344 -@000003E1 18800015 -@000003E2 00000406 -@000003E3 0000FB80 -@000003E4 1007883A -@000003E5 00801444 -@000003E6 18800015 -@000003E7 00BFFFC4 -@000003E8 E0800515 -@000003E9 E0800517 -@000003EA DFC00817 -@000003EB DF000717 -@000003EC DEC00904 -@000003ED F800283A -@000003EE DEFFFD04 -@000003EF DFC00215 -@000003F0 DF000115 -@000003F1 D839883A -@000003F2 D0A00917 -@000003F3 1005003A -@000003F4 1000041E -@000003F5 D0A00917 -@000003F6 103EE83A -@000003F7 E0800015 -@000003F8 00000206 -@000003F9 D0A01804 -@000003FA E0800015 -@000003FB E0800017 -@000003FC DFC00217 -@000003FD DF000117 -@000003FE DEC00304 -@000003FF F800283A -@00000400 DEFFF204 -@00000401 DFC00D15 -@00000402 DF000C15 -@00000403 D839883A -@00000404 E1000015 -@00000405 E1400115 -@00000406 E1800215 -@00000407 E0800017 -@00000408 10800017 -@00000409 E0800315 -@0000040A E0800117 -@0000040B E0800415 -@0000040C E0000715 -@0000040D E0800217 -@0000040E 10800050 -@0000040F 10004D1E -@00000410 E0800317 -@00000411 10801417 -@00000412 E0800815 -@00000413 E0800317 -@00000414 10801517 -@00000415 E0800915 -@00000416 E0C00817 -@00000417 E0800917 -@00000418 18800536 -@00000419 E0800817 -@0000041A E0C00917 -@0000041B 10C5C83A -@0000041C E0800615 -@0000041D 00000406 -@0000041E 00820004 -@0000041F E0C00917 -@00000420 10C5C83A -@00000421 E0800615 -@00000422 E0800617 -@00000423 1004C03A -@00000424 1000011E -@00000425 00001E06 -@00000426 E0C00217 -@00000427 E0800617 -@00000428 1880022E -@00000429 E0800217 -@0000042A E0800615 -@0000042B E0C00317 -@0000042C E0800917 -@0000042D 1885883A -@0000042E 11401804 -@0000042F E1000417 -@00000430 E1800617 -@00000431 00030C00 -@00000432 E0C00417 -@00000433 E0800617 -@00000434 1885883A -@00000435 E0800415 -@00000436 E0C00217 -@00000437 E0800617 -@00000438 1885C83A -@00000439 E0800215 -@0000043A E1000317 -@0000043B E0C00917 -@0000043C E0800617 -@0000043D 1885883A -@0000043E 1081FFCC -@0000043F 20801515 -@00000440 E0800217 -@00000441 10800050 -@00000442 1000011E -@00000443 003FCC06 -@00000444 E0C00417 -@00000445 E0800117 -@00000446 18800126 -@00000447 00001506 -@00000448 E0800017 -@00000449 10800217 -@0000044A 1004D3BA -@0000044B 1080004C -@0000044C 1005003A -@0000044D 1000011E -@0000044E 00000E06 -@0000044F E0800317 -@00000450 10C01417 -@00000451 E0800817 -@00000452 1880061E -@00000453 E0800317 -@00000454 E0C00317 -@00000455 11001317 -@00000456 18800B17 -@00000457 2080012E -@00000458 003FF606 -@00000459 E0800317 -@0000045A 10C01417 -@0000045B E0800817 -@0000045C 18BFB01E -@0000045D E0000915 -@0000045E E0C00417 -@0000045F E0800117 -@00000460 18801726 -@00000461 0005303A -@00000462 E0800A15 -@00000463 0001703A -@00000464 E0800A17 -@00000465 E0800815 -@00000466 E0800817 -@00000467 E0800515 -@00000468 E0C00317 -@00000469 E0800317 -@0000046A 10801217 -@0000046B 10800054 -@0000046C 18801215 -@0000046D E0800317 -@0000046E 10800A17 -@0000046F 10800104 -@00000470 1007883A -@00000471 E0800317 -@00000472 10801217 -@00000473 18800035 -@00000474 E0800517 -@00000475 E0800A15 -@00000476 E0800A17 -@00000477 1001703A -@00000478 E0C00417 -@00000479 E0800117 -@0000047A 18800526 -@0000047B E0800417 -@0000047C E0C00117 -@0000047D 10C5C83A -@0000047E E0800B15 -@0000047F 00000B06 -@00000480 E0800017 -@00000481 10800217 -@00000482 1004D3BA -@00000483 1080004C -@00000484 1005003A -@00000485 1000031E -@00000486 00BFFD44 -@00000487 E0800B15 -@00000488 00000206 -@00000489 00BFFEC4 -@0000048A E0800B15 -@0000048B E0800B17 -@0000048C DFC00D17 -@0000048D DF000C17 -@0000048E DEC00E04 -@0000048F F800283A -@00000490 DEFFF104 -@00000491 DFC00E15 -@00000492 DF000D15 -@00000493 D839883A -@00000494 E1000015 -@00000495 E1400115 -@00000496 E1800215 -@00000497 E0000415 -@00000498 E0800017 -@00000499 10800017 -@0000049A E0800715 -@0000049B E0800117 -@0000049C E0800815 -@0000049D E0000915 -@0000049E E0800217 -@0000049F 10800050 -@000004A0 10003A1E -@000004A1 E0800717 -@000004A2 10801617 -@000004A3 E0800315 -@000004A4 E0800717 -@000004A5 10801717 -@000004A6 E0800415 -@000004A7 E0C00317 -@000004A8 E0800417 -@000004A9 1880062E -@000004AA E0C00417 -@000004AB E0800317 -@000004AC 1885C83A -@000004AD 10BFFFC4 -@000004AE E0800515 -@000004AF 00000C06 -@000004B0 E0800417 -@000004B1 1005003A -@000004B2 1000051E -@000004B3 00820004 -@000004B4 E0C00317 -@000004B5 10C5C83A -@000004B6 E0800515 -@000004B7 00000406 -@000004B8 0081FFC4 -@000004B9 E0C00317 -@000004BA 10C5C83A -@000004BB E0800515 -@000004BC E0800517 -@000004BD 1004C03A -@000004BE 1000011E -@000004BF 00001B06 -@000004C0 E0C00217 -@000004C1 E0800517 -@000004C2 1880022E -@000004C3 E0800217 -@000004C4 E0800515 -@000004C5 E0C00717 -@000004C6 E0800317 -@000004C7 1885883A -@000004C8 11021804 -@000004C9 E1400117 -@000004CA E1800517 -@000004CB 00030C00 -@000004CC E0C00117 -@000004CD E0800517 -@000004CE 1885883A -@000004CF E0800115 -@000004D0 E0C00217 -@000004D1 E0800517 -@000004D2 1885C83A -@000004D3 E0800215 -@000004D4 E1000717 -@000004D5 E0C00317 -@000004D6 E0800517 -@000004D7 1885883A -@000004D8 1081FFCC -@000004D9 20801615 -@000004DA 003FC306 -@000004DB 0005303A -@000004DC E0800B15 -@000004DD 0001703A -@000004DE E0800B17 -@000004DF E0800A15 -@000004E0 E0800A17 -@000004E1 E0800615 -@000004E2 E0C00717 -@000004E3 E0800717 -@000004E4 10801217 -@000004E5 10800094 -@000004E6 18801215 -@000004E7 E0800717 -@000004E8 10800A17 -@000004E9 10800104 -@000004EA 1007883A -@000004EB E0800717 -@000004EC 10801217 -@000004ED 18800035 -@000004EE E0800617 -@000004EF E0800B15 -@000004F0 E0800B17 -@000004F1 1001703A -@000004F2 E0800217 -@000004F3 10800050 -@000004F4 1000161E -@000004F5 E0800017 -@000004F6 10800217 -@000004F7 1004D3BA -@000004F8 1080004C -@000004F9 1005003A -@000004FA 1000011E -@000004FB 00001306 -@000004FC E0800717 -@000004FD 10C01717 -@000004FE E0800417 -@000004FF 1880061E -@00000500 E0800717 -@00000501 E0C00717 -@00000502 11001317 -@00000503 18800B17 -@00000504 2080012E -@00000505 003FF606 -@00000506 E0800717 -@00000507 10C01717 -@00000508 E0800417 -@00000509 1880011E -@0000050A 00000406 -@0000050B E0800217 -@0000050C 10800050 -@0000050D 1000011E -@0000050E 003F8F06 -@0000050F E0000B15 -@00000510 E0C00117 -@00000511 E0800817 -@00000512 18800526 -@00000513 E0800117 -@00000514 E0C00817 -@00000515 10C5C83A -@00000516 E0800C15 -@00000517 00000B06 -@00000518 E0800017 -@00000519 10800217 -@0000051A 1004D3BA -@0000051B 1080004C -@0000051C 1005003A -@0000051D 1000031E -@0000051E 00BFFD44 -@0000051F E0800C15 -@00000520 00000206 -@00000521 00BFFEC4 -@00000522 E0800C15 -@00000523 E0800C17 -@00000524 DFC00E17 -@00000525 DF000D17 -@00000526 DEC00F04 -@00000527 F800283A -@00000528 DEFFF804 -@00000529 DF000715 -@0000052A D839883A -@0000052B E1000015 -@0000052C E1400115 -@0000052D E0800017 -@0000052E E0800215 -@0000052F E0800217 -@00000530 10800A17 -@00000531 E0800315 -@00000532 E0800317 -@00000533 10800104 -@00000534 10800037 -@00000535 E0800415 -@00000536 E0800417 -@00000537 1080C00C -@00000538 1004C03A -@00000539 1000011E -@0000053A 00006E06 -@0000053B E0800417 -@0000053C 1004D23A -@0000053D 1080004C -@0000053E 1005003A -@0000053F 1000351E -@00000540 00800074 -@00000541 10800004 -@00000542 E0800515 -@00000543 E0800217 -@00000544 10801417 -@00000545 10800044 -@00000546 1081FFCC -@00000547 E0800615 -@00000548 E0800217 -@00000549 10C01517 -@0000054A E0800617 -@0000054B 1880011E -@0000054C 00001806 -@0000054D E0800317 -@0000054E 10800037 -@0000054F E0800515 -@00000550 E0800517 -@00000551 1004D3FA -@00000552 1080005C -@00000553 1080004C -@00000554 1005003A -@00000555 1000011E -@00000556 00000E06 -@00000557 E0C00217 -@00000558 E0800217 -@00000559 10801417 -@0000055A 1885883A -@0000055B 10C01804 -@0000055C E0800517 -@0000055D 18800005 -@0000055E E0C00217 -@0000055F E0800217 -@00000560 10801417 -@00000561 10800044 -@00000562 1081FFCC -@00000563 18801415 -@00000564 003FDE06 -@00000565 E0800517 -@00000566 10BFFFEC -@00000567 1005003A -@00000568 10000C1E -@00000569 E1000217 -@0000056A E0800217 -@0000056B 10C01217 -@0000056C 00BFFF84 -@0000056D 1884703A -@0000056E 20801215 -@0000056F E0800317 -@00000570 10800104 -@00000571 1007883A -@00000572 E0800217 -@00000573 10801217 -@00000574 18800035 -@00000575 E0800417 -@00000576 1004D27A -@00000577 1080004C -@00000578 1005003A -@00000579 103FB81E -@0000057A E0800417 -@0000057B 10BFFFEC -@0000057C 1004D43A -@0000057D E0800615 -@0000057E E0800617 -@0000057F 1005003A -@00000580 1000171E -@00000581 E0800217 -@00000582 E0C00217 -@00000583 11001717 -@00000584 18801617 -@00000585 20801226 -@00000586 E1000317 -@00000587 E0C00217 -@00000588 E0800217 -@00000589 10801717 -@0000058A 1885883A -@0000058B 10821804 -@0000058C 10800007 -@0000058D 20800035 -@0000058E E0C00217 -@0000058F E0800217 -@00000590 10801717 -@00000591 10800044 -@00000592 1081FFCC -@00000593 18801715 -@00000594 E0800617 -@00000595 10BFFFC4 -@00000596 E0800615 -@00000597 003FE606 -@00000598 E0800617 -@00000599 1005003A -@0000059A 103F971E -@0000059B E1000217 -@0000059C E0800217 -@0000059D 10C01217 -@0000059E 00BFFF44 -@0000059F 1884703A -@000005A0 20801215 -@000005A1 E0800217 -@000005A2 10800A17 -@000005A3 10800104 -@000005A4 1007883A -@000005A5 E0800217 -@000005A6 10801217 -@000005A7 18800035 -@000005A8 003F8906 -@000005A9 DF000717 -@000005AA DEC00804 -@000005AB F800283A -@000005AC DEFFF604 -@000005AD DF000915 -@000005AE D839883A -@000005AF E1000015 -@000005B0 E1400115 -@000005B1 E1800215 -@000005B2 E0800017 -@000005B3 10800017 -@000005B4 E0800315 -@000005B5 00BFF9C4 -@000005B6 E0800415 -@000005B7 E0800117 -@000005B8 E0800815 -@000005B9 E0C00817 -@000005BA 189A8060 -@000005BB 1000041E -@000005BC E0C00817 -@000005BD 189A80A0 -@000005BE 10001D1E -@000005BF 00002906 -@000005C0 E0800317 -@000005C1 10C00B17 -@000005C2 00A00034 -@000005C3 10BFFFC4 -@000005C4 18802426 -@000005C5 E0800217 -@000005C6 10800017 -@000005C7 E0800515 -@000005C8 E0800317 -@000005C9 E0800615 -@000005CA E0800517 -@000005CB 10800090 -@000005CC 1000071E -@000005CD E0C00517 -@000005CE 00A00034 -@000005CF 10BFFFC4 -@000005D0 18800326 -@000005D1 E0C00517 -@000005D2 E0C00715 -@000005D3 00000306 -@000005D4 00A00034 -@000005D5 10BFFF84 -@000005D6 E0800715 -@000005D7 E0C00717 -@000005D8 E0800617 -@000005D9 10C00B15 -@000005DA E0000415 -@000005DB 00000D06 -@000005DC E0800317 -@000005DD 10C00B17 -@000005DE 00A00034 -@000005DF 10BFFFC4 -@000005E0 18800826 -@000005E1 E1400217 -@000005E2 E0800317 -@000005E3 E0C00317 -@000005E4 11001317 -@000005E5 18800B17 -@000005E6 2085803A -@000005E7 28800015 -@000005E8 E0000415 -@000005E9 E0800417 -@000005EA DF000917 -@000005EB DEC00A04 -@000005EC F800283A -@000005ED DEFFFB04 -@000005EE DF000415 -@000005EF D839883A -@000005F0 E1000015 -@000005F1 E0800017 -@000005F2 E0800215 -@000005F3 E0800217 -@000005F4 10800A17 -@000005F5 10800104 -@000005F6 10800037 -@000005F7 E0800115 -@000005F8 E0800117 -@000005F9 1004D2BA -@000005FA 1080004C -@000005FB 1005003A -@000005FC 10000B1E -@000005FD E0800217 -@000005FE 10800A17 -@000005FF 10800104 -@00000600 1007883A -@00000601 E0800217 -@00000602 10801217 -@00000603 10810014 -@00000604 18800035 -@00000605 E0800217 -@00000606 10001315 -@00000607 00000A06 -@00000608 E0800217 -@00000609 10C01317 -@0000060A 00A00034 -@0000060B 10BFFF04 -@0000060C 10C00536 -@0000060D E0C00217 -@0000060E E0800217 -@0000060F 10801317 -@00000610 10800044 -@00000611 18801315 -@00000612 D0A00C17 -@00000613 E0800315 -@00000614 E0800317 -@00000615 DF000417 -@00000616 DEC00504 -@00000617 F800283A -@00000618 DEFFF704 -@00000619 DFC00815 -@0000061A DF000715 -@0000061B D839883A -@0000061C E1000015 -@0000061D E1400115 -@0000061E E1800215 -@0000061F E0000315 -@00000620 E0000415 -@00000621 E0000515 -@00000622 E0C00017 -@00000623 00800044 -@00000624 18801215 -@00000625 E0800117 -@00000626 10800104 -@00000627 1007883A -@00000628 E0800017 -@00000629 10801217 -@0000062A 18800035 -@0000062B E1000217 -@0000062C E1400017 -@0000062D 01800034 -@0000062E 31852804 -@0000062F 0001FC80 -@00000630 1004803A -@00000631 1000021E -@00000632 E1000017 -@00000633 00019240 -@00000634 E0800017 -@00000635 10001315 -@00000636 D0A00C17 -@00000637 E0800615 -@00000638 E1400617 -@00000639 E0800017 -@0000063A 11000C04 -@0000063B 01800034 -@0000063C 3185ED04 -@0000063D E1C00017 -@0000063E 0001A080 -@0000063F 1004403A -@00000640 1000041E -@00000641 E0C00017 -@00000642 00A00034 -@00000643 10BFFFC4 -@00000644 18800B15 -@00000645 DFC00817 -@00000646 DF000717 -@00000647 DEC00904 -@00000648 F800283A -@00000649 DEFFFD04 -@0000064A DFC00215 -@0000064B DF000115 -@0000064C D839883A -@0000064D E1000015 -@0000064E E1000017 -@0000064F D1600604 -@00000650 0001CD00 -@00000651 DFC00217 -@00000652 DF000117 -@00000653 DEC00304 -@00000654 F800283A -@00000655 DEFFFC04 -@00000656 DFC00315 -@00000657 DF000215 -@00000658 D839883A -@00000659 E1000015 -@0000065A E1400115 -@0000065B E0800017 -@0000065C 10000035 -@0000065D 00025040 -@0000065E DFC00317 -@0000065F DF000217 -@00000660 DEC00404 -@00000661 F800283A -@00000662 DEFFF904 -@00000663 DFC00615 -@00000664 DF000515 -@00000665 D839883A -@00000666 E1000015 -@00000667 E1400115 -@00000668 E1800215 -@00000669 E0800217 -@0000066A E0800315 -@0000066B D0A00C17 -@0000066C 1004C03A -@0000066D 1000041E -@0000066E E0800317 -@0000066F D0A00C15 -@00000670 E0000415 -@00000671 00000206 -@00000672 00BFFFC4 -@00000673 E0800415 -@00000674 E0800017 -@00000675 10800104 -@00000676 1007883A -@00000677 008001C4 -@00000678 18800035 -@00000679 E1000117 -@0000067A E1400017 -@0000067B 01800034 -@0000067C 31865504 -@0000067D 0001FC80 -@0000067E DFC00617 -@0000067F DF000517 -@00000680 DEC00704 -@00000681 F800283A -@00000682 DEFFF504 -@00000683 DF000A15 -@00000684 D839883A -@00000685 E1000015 -@00000686 E1400115 -@00000687 E1800215 -@00000688 E1C00315 -@00000689 E0000515 -@0000068A D0A00C17 -@0000068B E0800615 -@0000068C E0800617 -@0000068D 1005003A -@0000068E 10003F1E -@0000068F E0800017 -@00000690 1005003A -@00000691 1000391E -@00000692 E0C00017 -@00000693 E0800217 -@00000694 18800315 -@00000695 E0C00017 -@00000696 E0800317 -@00000697 18800515 -@00000698 0005303A -@00000699 E0800815 -@0000069A 0001703A -@0000069B E0800817 -@0000069C E0800715 -@0000069D E0800717 -@0000069E E0800415 -@0000069F D0A00D17 -@000006A0 E0800815 -@000006A1 E0800817 -@000006A2 E0800515 -@000006A3 E1000017 -@000006A4 E0C00117 -@000006A5 E0800517 -@000006A6 1885883A -@000006A7 10800044 -@000006A8 20800215 -@000006A9 E0800017 -@000006AA 10C00217 -@000006AB E0800517 -@000006AC 1880042E -@000006AD E0C00017 -@000006AE 00800044 -@000006AF 18800405 -@000006B0 00000206 -@000006B1 E0800017 -@000006B2 10000405 -@000006B3 D0A00E04 -@000006B4 E0800815 -@000006B5 E0800017 -@000006B6 E0800715 -@000006B7 E0C00717 -@000006B8 E0800817 -@000006B9 18800115 -@000006BA E0C00717 -@000006BB E0800817 -@000006BC 10800017 -@000006BD 18800015 -@000006BE E0800817 -@000006BF 10C00017 -@000006C0 E0800717 -@000006C1 18800115 -@000006C2 E0C00817 -@000006C3 E0800717 -@000006C4 18800015 -@000006C5 E0800417 -@000006C6 E0800815 -@000006C7 E0800817 -@000006C8 1001703A -@000006C9 E0000915 -@000006CA 00000506 -@000006CB 00BFFA84 -@000006CC E0800915 -@000006CD 00000206 -@000006CE 00BFDE84 -@000006CF E0800915 -@000006D0 E0800917 -@000006D1 DF000A17 -@000006D2 DEC00B04 -@000006D3 F800283A -@000006D4 DEFFFA04 -@000006D5 DFC00515 -@000006D6 DF000415 -@000006D7 D839883A -@000006D8 E1000015 -@000006D9 008000C4 -@000006DA E0800315 -@000006DB E1000317 -@000006DC 014003F4 -@000006DD 29509004 -@000006DE 0000D8C0 -@000006DF 100B883A -@000006E0 01005BB4 -@000006E1 210D8004 -@000006E2 0000D6C0 -@000006E3 100B883A -@000006E4 01200034 -@000006E5 213FFFC4 -@000006E6 0000D6C0 -@000006E7 100B883A -@000006E8 E1000017 -@000006E9 0000D6C0 -@000006EA E0800215 -@000006EB E0800217 -@000006EC 1005003A -@000006ED 10002A1E -@000006EE E0000115 -@000006EF E0C00117 -@000006F0 E0800217 -@000006F1 1880180E -@000006F2 00A00034 -@000006F3 10BFFFC4 -@000006F4 10BFFFC4 -@000006F5 103FFE1E -@000006F6 E1000317 -@000006F7 014003F4 -@000006F8 29509004 -@000006F9 0000D8C0 -@000006FA 100B883A -@000006FB 01005BB4 -@000006FC 210D8004 -@000006FD 0000D6C0 -@000006FE 100B883A -@000006FF 01200034 -@00000700 213FFFC4 -@00000701 0000D6C0 -@00000702 1007883A -@00000703 E0800017 -@00000704 10C5C83A -@00000705 E0800015 -@00000706 E0800117 -@00000707 10800044 -@00000708 E0800115 -@00000709 003FE506 -@0000070A E1000317 -@0000070B 014003F4 -@0000070C 29509004 -@0000070D 0000D8C0 -@0000070E 100B883A -@0000070F 01005BB4 -@00000710 210D8004 -@00000711 0000D6C0 -@00000712 1009883A -@00000713 E1400017 -@00000714 0000D8C0 -@00000715 10BFFFC4 -@00000716 103FFE1E -@00000717 00000D06 -@00000718 E1000317 -@00000719 014003F4 -@0000071A 29509004 -@0000071B 0000D8C0 -@0000071C 100B883A -@0000071D 01005BB4 -@0000071E 210D8004 -@0000071F 0000D6C0 -@00000720 1009883A -@00000721 E1400017 -@00000722 0000D8C0 -@00000723 10BFFFC4 -@00000724 00BFFE16 -@00000725 0005883A -@00000726 DFC00517 -@00000727 DF000417 -@00000728 DEC00604 -@00000729 F800283A -@0000072A DEFFFC04 -@0000072B DF000315 -@0000072C D839883A -@0000072D E1000015 -@0000072E E1400115 -@0000072F E1800215 -@00000730 E0800217 -@00000731 DF000317 -@00000732 DEC00404 -@00000733 F800283A -@00000734 DEFFF904 -@00000735 DFC00615 -@00000736 DF000515 -@00000737 D839883A -@00000738 E1000015 -@00000739 E1400115 -@0000073A E0800017 -@0000073B 1005003A -@0000073C 1000041E -@0000073D E0800017 -@0000073E 10800217 -@0000073F 1004C03A -@00000740 1000071E -@00000741 0001D800 -@00000742 1007883A -@00000743 00800584 -@00000744 18800015 -@00000745 00BFFA84 -@00000746 E0800415 -@00000747 00001306 -@00000748 E0800117 -@00000749 E0800215 -@0000074A E0800017 -@0000074B E0800315 -@0000074C E0C00317 -@0000074D E0800217 -@0000074E 18800115 -@0000074F E0C00317 -@00000750 E0800217 -@00000751 10800017 -@00000752 18800015 -@00000753 E0800217 -@00000754 10C00017 -@00000755 E0800317 -@00000756 18800115 -@00000757 E0C00217 -@00000758 E0800317 -@00000759 18800015 -@0000075A E0000415 -@0000075B E0800417 -@0000075C DFC00617 -@0000075D DF000517 -@0000075E DEC00704 -@0000075F F800283A -@00000760 DEFFFD04 -@00000761 DFC00215 -@00000762 DF000115 -@00000763 D839883A -@00000764 D0A00917 -@00000765 1005003A -@00000766 1000041E -@00000767 D0A00917 -@00000768 103EE83A -@00000769 E0800015 -@0000076A 00000206 -@0000076B D0A01804 -@0000076C E0800015 -@0000076D E0800017 -@0000076E DFC00217 -@0000076F DF000117 -@00000770 DEC00304 -@00000771 F800283A -@00000772 DEFFFD04 -@00000773 DFC00215 -@00000774 DF000115 -@00000775 D839883A -@00000776 00800034 -@00000777 108D8604 -@00000778 E0800015 -@00000779 E0C00017 -@0000077A 00800034 -@0000077B 108D8704 -@0000077C 18800736 -@0000077D E0800017 -@0000077E 10800017 -@0000077F 103EE83A -@00000780 E0800017 -@00000781 10BFFF04 -@00000782 E0800015 -@00000783 003FF506 -@00000784 DFC00217 -@00000785 DF000117 -@00000786 DEC00304 -@00000787 F800283A -@00000788 DEFFFD04 -@00000789 DFC00215 -@0000078A DF000115 -@0000078B D839883A -@0000078C 00800034 -@0000078D 108D8604 -@0000078E E0800015 -@0000078F E0C00017 -@00000790 00800034 -@00000791 108D8704 -@00000792 18800736 -@00000793 E0800017 -@00000794 10800017 -@00000795 103EE83A -@00000796 E0800017 -@00000797 10BFFF04 -@00000798 E0800015 -@00000799 003FF506 -@0000079A DFC00217 -@0000079B DF000117 -@0000079C DEC00304 -@0000079D F800283A -@0000079E DEFFF704 -@0000079F DFC00815 -@000007A0 DF000715 -@000007A1 DC000615 -@000007A2 DC400515 -@000007A3 D839883A -@000007A4 E1000015 -@000007A5 E1400115 -@000007A6 E1800215 -@000007A7 E1C00315 -@000007A8 E1000117 -@000007A9 E1400217 -@000007AA E1800317 -@000007AB 00022300 -@000007AC E0800415 -@000007AD E0800417 -@000007AE 1004803A -@000007AF 10001F1E -@000007B0 E4000017 -@000007B1 04400034 -@000007B2 8C521F04 -@000007B3 E1000417 -@000007B4 01400304 -@000007B5 0000D8C0 -@000007B6 1445883A -@000007B7 10800017 -@000007B8 80800015 -@000007B9 E4000017 -@000007BA 04400034 -@000007BB 8C521F04 -@000007BC E1000417 -@000007BD 01400304 -@000007BE 0000D8C0 -@000007BF 1445883A -@000007C0 10800104 -@000007C1 10800017 -@000007C2 80800115 -@000007C3 E4000017 -@000007C4 04400034 -@000007C5 8C521F04 -@000007C6 E1000417 -@000007C7 01400304 -@000007C8 0000D8C0 -@000007C9 1445883A -@000007CA 10800204 -@000007CB 10800017 -@000007CC 80800215 -@000007CD E1000417 -@000007CE 00024000 -@000007CF DFC00817 -@000007D0 DF000717 -@000007D1 DC000617 -@000007D2 DC400517 -@000007D3 DEC00904 -@000007D4 F800283A -@000007D5 DEFFFB04 -@000007D6 DFC00415 -@000007D7 DF000315 -@000007D8 D839883A -@000007D9 E1000015 -@000007DA E1400115 -@000007DB E1800215 -@000007DC 01000034 -@000007DD 21122204 -@000007DE E1400017 -@000007DF 01800044 -@000007E0 01C07FC4 -@000007E1 0001E780 -@000007E2 01000034 -@000007E3 21121F04 -@000007E4 E1400117 -@000007E5 000D883A -@000007E6 01C07FC4 -@000007E7 0001E780 -@000007E8 01000034 -@000007E9 21122504 -@000007EA E1400217 -@000007EB 01800044 -@000007EC 01C07FC4 -@000007ED 0001E780 -@000007EE DFC00417 -@000007EF DF000317 -@000007F0 DEC00504 -@000007F1 F800283A -@000007F2 DEFFF304 -@000007F3 DF000C15 -@000007F4 D839883A -@000007F5 E1000015 -@000007F6 E1400115 -@000007F7 E1800215 -@000007F8 00BFFA84 -@000007F9 E0800315 -@000007FA E0800017 -@000007FB 10800828 -@000007FC 1000511E -@000007FD 0005303A -@000007FE E0800615 -@000007FF 0001703A -@00000800 E0800617 -@00000801 E0800515 -@00000802 E0800517 -@00000803 E0800415 -@00000804 00C00034 -@00000805 18D3A504 -@00000806 E0800017 -@00000807 100490FA -@00000808 10C7883A -@00000809 E0800217 -@0000080A 18800015 -@0000080B 00C00034 -@0000080C 18D3A504 -@0000080D E0800017 -@0000080E 100490FA -@0000080F 10C5883A -@00000810 10C00104 -@00000811 E0800117 -@00000812 18800015 -@00000813 E0800217 -@00000814 1005003A -@00000815 1000191E -@00000816 E0800017 -@00000817 E0800615 -@00000818 0005303A -@00000819 E0800915 -@0000081A 0001703A -@0000081B E0800917 -@0000081C E0800815 -@0000081D E0800817 -@0000081E E0800715 -@0000081F 00C00044 -@00000820 E0800617 -@00000821 1886983A -@00000822 D0A00A17 -@00000823 10C4B03A -@00000824 D0A00A15 -@00000825 D0A00A17 -@00000826 100170FA -@00000827 E0800717 -@00000828 E0800915 -@00000829 E0800917 -@0000082A 1001703A -@0000082B E0000515 -@0000082C E0800517 -@0000082D E0800B15 -@0000082E 00001906 -@0000082F E0800017 -@00000830 E0800915 -@00000831 0005303A -@00000832 E0800A15 -@00000833 0001703A -@00000834 E0800A17 -@00000835 E0800615 -@00000836 E0800617 -@00000837 E0800715 -@00000838 00C00044 -@00000839 E0800917 -@0000083A 1884983A -@0000083B 0086303A -@0000083C D0A00A17 -@0000083D 10C4703A -@0000083E D0A00A15 -@0000083F D0A00A17 -@00000840 100170FA -@00000841 E0800717 -@00000842 E0800A15 -@00000843 E0800A17 -@00000844 1001703A -@00000845 E0000815 -@00000846 E0800817 -@00000847 E0800B15 -@00000848 E0800B17 -@00000849 E0800315 -@0000084A E0800417 -@0000084B E0800A15 -@0000084C E0800A17 -@0000084D 1001703A -@0000084E E0800317 -@0000084F DF000C17 -@00000850 DEC00D04 -@00000851 F800283A -@00000852 DEFFFA04 -@00000853 DFC00515 -@00000854 DF000415 -@00000855 DC000315 -@00000856 D839883A -@00000857 E1000015 -@00000858 E0C00017 -@00000859 E0800017 -@0000085A 10800217 -@0000085B 10900034 -@0000085C 18800215 -@0000085D E0000115 -@0000085E D0E00817 -@0000085F E0800117 -@00000860 18802436 -@00000861 04000034 -@00000862 84121F04 -@00000863 E1000117 -@00000864 01400304 -@00000865 0000D8C0 -@00000866 1405883A -@00000867 E0C00017 -@00000868 11000017 -@00000869 18800017 -@0000086A 2080161E -@0000086B 04000034 -@0000086C 84121F04 -@0000086D E1000117 -@0000086E 01400304 -@0000086F 0000D8C0 -@00000870 1405883A -@00000871 10800204 -@00000872 10800017 -@00000873 1004403A -@00000874 10000C1E -@00000875 E1000117 -@00000876 01400304 -@00000877 0000D8C0 -@00000878 1007883A -@00000879 00800034 -@0000087A 10921F04 -@0000087B 1887883A -@0000087C E0800017 -@0000087D 18800326 -@0000087E 00BFFCC4 -@0000087F E0800215 -@00000880 00000506 -@00000881 E0800117 -@00000882 10800044 -@00000883 E0800115 -@00000884 003FD906 -@00000885 E0000215 -@00000886 E0800217 -@00000887 DFC00517 -@00000888 DF000417 -@00000889 DC000317 -@0000088A DEC00604 -@0000088B F800283A -@0000088C DEFFF404 -@0000088D DFC00B15 -@0000088E DF000A15 -@0000088F D839883A -@00000890 E1000015 -@00000891 E1400115 -@00000892 E1800215 -@00000893 00BFFFC4 -@00000894 E0800515 -@00000895 00BFFB44 -@00000896 E0800615 -@00000897 E0000715 -@00000898 E1000017 -@00000899 D1600604 -@0000089A 00026040 -@0000089B E0800315 -@0000089C E0800317 -@0000089D 1004C03A -@0000089E 1000051E -@0000089F E1000017 -@000008A0 00026940 -@000008A1 E0800315 -@000008A2 00800044 -@000008A3 E0800715 -@000008A4 E0800317 -@000008A5 1005003A -@000008A6 1000321E -@000008A7 E1000317 -@000008A8 00027780 -@000008A9 E0800515 -@000008AA E0800517 -@000008AB 1004403A -@000008AC 1000031E -@000008AD E0800517 -@000008AE E0800615 -@000008AF 00002B06 -@000008B0 E1000517 -@000008B1 01400304 -@000008B2 0000D8C0 -@000008B3 1007883A -@000008B4 00800034 -@000008B5 10921F04 -@000008B6 1885883A -@000008B7 E0800415 -@000008B8 E1000417 -@000008B9 E0C00117 -@000008BA 00900034 -@000008BB 10BFFFC4 -@000008BC 1884703A -@000008BD 20800215 -@000008BE E0800717 -@000008BF 1004C03A -@000008C0 1000071E -@000008C1 E1000417 -@000008C2 00021480 -@000008C3 E0800615 -@000008C4 E0800617 -@000008C5 1004403A -@000008C6 1000011E -@000008C7 00001306 -@000008C8 E0800317 -@000008C9 10800317 -@000008CA 1005003A -@000008CB 1000091E -@000008CC E0800317 -@000008CD 10800317 -@000008CE E1000417 -@000008CF E1400017 -@000008D0 E1800117 -@000008D1 E1C00217 -@000008D2 103EE83A -@000008D3 E0800915 -@000008D4 00000106 -@000008D5 E0000915 -@000008D6 E0800917 -@000008D7 E0800615 -@000008D8 00000206 -@000008D9 00BFFB44 -@000008DA E0800615 -@000008DB E0800617 -@000008DC 1004403A -@000008DD 1000091E -@000008DE E1000517 -@000008DF 00024000 -@000008E0 00023B80 -@000008E1 E0C00617 -@000008E2 00C7C83A -@000008E3 10C00015 -@000008E4 00BFFFC4 -@000008E5 E0800815 -@000008E6 00000206 -@000008E7 E0800517 -@000008E8 E0800815 -@000008E9 E0800817 -@000008EA DFC00B17 -@000008EB DF000A17 -@000008EC DEC00C04 -@000008ED F800283A -@000008EE DEFFFD04 -@000008EF DFC00215 -@000008F0 DF000115 -@000008F1 D839883A -@000008F2 D0A00917 -@000008F3 1005003A -@000008F4 1000041E -@000008F5 D0A00917 -@000008F6 103EE83A -@000008F7 E0800015 -@000008F8 00000206 -@000008F9 D0A01804 -@000008FA E0800015 -@000008FB E0800017 -@000008FC DFC00217 -@000008FD DF000117 -@000008FE DEC00304 -@000008FF F800283A -@00000900 DEFFFC04 -@00000901 DFC00315 -@00000902 DF000215 -@00000903 DC000115 -@00000904 D839883A -@00000905 E1000015 -@00000906 E0800017 -@00000907 108000D0 -@00000908 10000F1E -@00000909 04000034 -@0000090A 84121F04 -@0000090B E1000017 -@0000090C 01400304 -@0000090D 0000D8C0 -@0000090E 1405883A -@0000090F 10800204 -@00000910 10000015 -@00000911 04000034 -@00000912 84121F04 -@00000913 E1000017 -@00000914 01400304 -@00000915 0000D8C0 -@00000916 1405883A -@00000917 10000015 -@00000918 DFC00317 -@00000919 DF000217 -@0000091A DC000117 -@0000091B DEC00404 -@0000091C F800283A -@0000091D DEFFFB04 -@0000091E DF000415 -@0000091F D839883A -@00000920 E1000015 -@00000921 0005303A -@00000922 E0800315 -@00000923 0001703A -@00000924 E0800317 -@00000925 E0800215 -@00000926 E0800217 -@00000927 E0800115 -@00000928 E0800017 -@00000929 E0800315 -@0000092A E0800317 -@0000092B 10C00017 -@0000092C E0800317 -@0000092D 10800117 -@0000092E 18800115 -@0000092F E0800317 -@00000930 10C00117 -@00000931 E0800317 -@00000932 10800017 -@00000933 18800015 -@00000934 E0C00317 -@00000935 E0800317 -@00000936 18800115 -@00000937 E0C00317 -@00000938 E0800317 -@00000939 18800015 -@0000093A E0800117 -@0000093B E0800315 -@0000093C E0800317 -@0000093D 1001703A -@0000093E DF000417 -@0000093F DEC00504 -@00000940 F800283A -@00000941 DEFFFB04 -@00000942 DFC00415 -@00000943 DF000315 -@00000944 D839883A -@00000945 D0A00E17 -@00000946 E0800115 -@00000947 D0A00D17 -@00000948 10800044 -@00000949 D0A00D15 -@0000094A E0C00117 -@0000094B D0A00E04 -@0000094C 18803026 -@0000094D E0800117 -@0000094E 10800017 -@0000094F E0800015 -@00000950 E0800117 -@00000951 10800403 -@00000952 1005003A -@00000953 1000051E -@00000954 D0A00D17 -@00000955 1004C03A -@00000956 1000021E -@00000957 E0800117 -@00000958 10000405 -@00000959 E0800117 -@0000095A 10C00217 -@0000095B D0A00D17 -@0000095C 10C01D36 -@0000095D E0800117 -@0000095E 10800403 -@0000095F 1004C03A -@00000960 1000191E -@00000961 E0800117 -@00000962 E0C00117 -@00000963 10800317 -@00000964 19000517 -@00000965 103EE83A -@00000966 E0800215 -@00000967 E0800217 -@00000968 1004C03A -@00000969 1000031E -@0000096A E1000117 -@0000096B 00024740 -@0000096C 00000D06 -@0000096D E1000117 -@0000096E E0800117 -@0000096F 10C00217 -@00000970 E0800217 -@00000971 1885883A -@00000972 20800215 -@00000973 E0800117 -@00000974 10C00217 -@00000975 D0A00D17 -@00000976 1880032E -@00000977 E0C00117 -@00000978 00800044 -@00000979 18800405 -@0000097A E0800017 -@0000097B E0800115 -@0000097C 003FCD06 -@0000097D DFC00417 -@0000097E DF000317 -@0000097F DEC00504 -@00000980 F800283A -@00000981 DEFFF904 -@00000982 DFC00615 -@00000983 DF000515 -@00000984 D839883A -@00000985 E1000015 -@00000986 E1400115 -@00000987 E0800117 -@00000988 10800017 -@00000989 E0800215 -@0000098A E1000017 -@0000098B 0000BEC0 -@0000098C 10800044 -@0000098D E0800315 -@0000098E E0C00217 -@0000098F E0800117 -@00000990 18800E26 -@00000991 E0800217 -@00000992 11000217 -@00000993 E1400017 -@00000994 E1800317 -@00000995 00030840 -@00000996 1004C03A -@00000997 1000031E -@00000998 E0800217 -@00000999 E0800415 -@0000099A 00000506 -@0000099B E0800217 -@0000099C 10800017 -@0000099D E0800215 -@0000099E 003FEF06 -@0000099F E0000415 -@000009A0 E0800417 -@000009A1 DFC00617 -@000009A2 DF000517 -@000009A3 DEC00704 -@000009A4 F800283A -@000009A5 DEFFFA04 -@000009A6 DFC00515 -@000009A7 DF000415 -@000009A8 D839883A -@000009A9 E1000015 -@000009AA D0A00417 -@000009AB E0800115 -@000009AC E0C00117 -@000009AD D0A00404 -@000009AE 18802926 -@000009AF E0800117 -@000009B0 11000217 -@000009B1 0000BEC0 -@000009B2 E0800215 -@000009B3 E0800117 -@000009B4 10C00217 -@000009B5 E0800217 -@000009B6 1885883A -@000009B7 10BFFFC4 -@000009B8 10800007 -@000009B9 10800BD8 -@000009BA 1000031E -@000009BB E0800217 -@000009BC 10BFFFC4 -@000009BD E0800215 -@000009BE E0C00017 -@000009BF E0800217 -@000009C0 1885883A -@000009C1 10800007 -@000009C2 10800BE0 -@000009C3 1000061E -@000009C4 E0C00017 -@000009C5 E0800217 -@000009C6 1885883A -@000009C7 10800007 -@000009C8 1004C03A -@000009C9 10000A1E -@000009CA E0800117 -@000009CB 11000217 -@000009CC E1400017 -@000009CD E1800217 -@000009CE 00030840 -@000009CF 1004C03A -@000009D0 1000031E -@000009D1 E0800117 -@000009D2 E0800315 -@000009D3 00000506 -@000009D4 E0800117 -@000009D5 10800017 -@000009D6 E0800115 -@000009D7 003FD406 -@000009D8 E0000315 -@000009D9 E0800317 -@000009DA DFC00517 -@000009DB DF000417 -@000009DC DEC00604 -@000009DD F800283A -@000009DE DEFFF804 -@000009DF DFC00715 -@000009E0 DF000615 -@000009E1 DC000515 -@000009E2 D839883A -@000009E3 E1000015 -@000009E4 00BFFA04 -@000009E5 E0800215 -@000009E6 E0000315 -@000009E7 E0000115 -@000009E8 E0800117 -@000009E9 10800808 -@000009EA 10001D1E -@000009EB 04000034 -@000009EC 84121F04 -@000009ED E1000117 -@000009EE 01400304 -@000009EF 0000D8C0 -@000009F0 1405883A -@000009F1 10800017 -@000009F2 1004C03A -@000009F3 1000101E -@000009F4 04000034 -@000009F5 84121F04 -@000009F6 E1000117 -@000009F7 01400304 -@000009F8 0000D8C0 -@000009F9 1407883A -@000009FA E0800017 -@000009FB 18800015 -@000009FC E0C00117 -@000009FD D0A00817 -@000009FE 10C0020E -@000009FF E0800117 -@00000A00 D0A00815 -@00000A01 E0800117 -@00000A02 E0800215 -@00000A03 00000406 -@00000A04 E0800117 -@00000A05 10800044 -@00000A06 E0800115 -@00000A07 003FE006 -@00000A08 E0000415 -@00000A09 E0800217 -@00000A0A DFC00717 -@00000A0B DF000617 -@00000A0C DC000517 -@00000A0D DEC00804 -@00000A0E F800283A -@00000A0F D0A00017 -@00000A10 DEFFFE04 -@00000A11 DC000015 -@00000A12 DFC00115 -@00000A13 11400C17 -@00000A14 2021883A -@00000A15 01004304 -@00000A16 28001B26 -@00000A17 28C00117 -@00000A18 008007C4 -@00000A19 10C00D16 -@00000A1A 28800104 -@00000A1B 10C00017 -@00000A1C 000D883A -@00000A1D 180890BA -@00000A1E 18C00044 -@00000A1F 10C00015 -@00000A20 2149883A -@00000A21 24000215 -@00000A22 3005883A -@00000A23 DFC00117 -@00000A24 DC000017 -@00000A25 DEC00204 -@00000A26 F800283A -@00000A27 00029A40 -@00000A28 100B883A -@00000A29 01BFFFC4 -@00000A2A 103FF726 -@00000A2B D0E00017 -@00000A2C 10004215 -@00000A2D 10000115 -@00000A2E 18800C17 -@00000A2F 28800015 -@00000A30 19400C15 -@00000A31 003FE806 -@00000A32 01400034 -@00000A33 2953E504 -@00000A34 11400C15 -@00000A35 003FE106 -@00000A36 D0A00017 -@00000A37 DEFFF804 -@00000A38 DD800015 -@00000A39 DFC00715 -@00000A3A DC000615 -@00000A3B DC400515 -@00000A3C DC800415 -@00000A3D DCC00315 -@00000A3E DD000215 -@00000A3F DD400115 -@00000A40 15000C17 -@00000A41 202D883A -@00000A42 A0002426 -@00000A43 A0800117 -@00000A44 A5402204 -@00000A45 0027883A -@00000A46 14BFFFC4 -@00000A47 9006803A -@00000A48 1800021E -@00000A49 00800044 -@00000A4A 14A6983A -@00000A4B 1800191E -@00000A4C 900690BA -@00000A4D 1D05883A -@00000A4E 14400204 -@00000A4F 1821883A -@00000A50 00000806 -@00000A51 88800017 -@00000A52 29400017 -@00000A53 94BFFFC4 -@00000A54 843FFF04 -@00000A55 103EE83A -@00000A56 8C7FFF04 -@00000A57 9827D07A -@00000A58 90000C16 -@00000A59 A8802017 -@00000A5A 854B883A -@00000A5B B009883A -@00000A5C 14C4703A -@00000A5D 103FF31E -@00000A5E 88800017 -@00000A5F 94BFFFC4 -@00000A60 843FFF04 -@00000A61 103EE83A -@00000A62 8C7FFF04 -@00000A63 9827D07A -@00000A64 903FF40E -@00000A65 A5000017 -@00000A66 A03FDC1E -@00000A67 B009883A -@00000A68 000354C0 -@00000A69 200B883A -@00000A6A D1200017 -@00000A6B 02000034 -@00000A6C 420A7304 -@00000A6D 4000683A -@00000A6E 200B883A -@00000A6F D1200017 -@00000A70 02000034 -@00000A71 420C9904 -@00000A72 4000683A -@00000A73 DEFFF504 -@00000A74 28C002C4 -@00000A75 00800584 -@00000A76 DC400715 -@00000A77 DC800615 -@00000A78 DFC00A15 -@00000A79 DF000915 -@00000A7A DC000815 -@00000A7B DCC00515 -@00000A7C DD000415 -@00000A7D DD400315 -@00000A7E DD800215 -@00000A7F DDC00115 -@00000A80 2025883A -@00000A81 04400404 -@00000A82 10C0032E -@00000A83 00BFFE04 -@00000A84 18A2703A -@00000A85 88000116 -@00000A86 89400D2E -@00000A87 0005883A -@00000A88 DFC00A17 -@00000A89 DF000917 -@00000A8A DC000817 -@00000A8B DC400717 -@00000A8C DC800617 -@00000A8D DCC00517 -@00000A8E DD000417 -@00000A8F DD400317 -@00000A90 DD800217 -@00000A91 DDC00117 -@00000A92 DEC00B04 -@00000A93 F800283A -@00000A94 9009883A -@00000A95 000356C0 -@00000A96 00807DC4 -@00000A97 14401536 -@00000A98 03400034 -@00000A99 6B528904 -@00000A9A 8B4D883A -@00000A9B 34000317 -@00000A9C 8812D0FA -@00000A9D 81803E26 -@00000A9E 80C00117 -@00000A9F 00BFFF04 -@00000AA0 82000317 -@00000AA1 1886703A -@00000AA2 80CB883A -@00000AA3 28800117 -@00000AA4 81C00217 -@00000AA5 9009883A -@00000AA6 10800054 -@00000AA7 41C00215 -@00000AA8 28800115 -@00000AA9 3A000315 -@00000AAA 00035880 -@00000AAB 80800204 -@00000AAC 003FDB06 -@00000AAD 8806D27A -@00000AAE 8812D0FA -@00000AAF 18000926 -@00000AB0 00800104 -@00000AB1 10C02F2E -@00000AB2 00800504 -@00000AB3 1A4016C4 -@00000AB4 10C0042E -@00000AB5 00801504 -@00000AB6 10C11536 -@00000AB7 8804D33A -@00000AB8 12401B84 -@00000AB9 480490FA -@00000ABA 03400034 -@00000ABB 6B528904 -@00000ABC 134B883A -@00000ABD 2C000317 -@00000ABE 81400926 -@00000ABF 01FFFF04 -@00000AC0 018003C4 -@00000AC1 80800117 -@00000AC2 11C6703A -@00000AC3 1C49C83A -@00000AC4 3100AA16 -@00000AC5 2000690E -@00000AC6 84000317 -@00000AC7 817FF91E -@00000AC8 4A400044 -@00000AC9 03000034 -@00000ACA 63128B04 -@00000ACB 64000217 -@00000ACC 83002826 -@00000ACD 80800117 -@00000ACE 00FFFF04 -@00000ACF 10C6703A -@00000AD0 1C49C83A -@00000AD1 008003C4 -@00000AD2 11006616 -@00000AD3 63000315 -@00000AD4 63000215 -@00000AD5 20000E16 -@00000AD6 80C7883A -@00000AD7 18800117 -@00000AD8 9009883A -@00000AD9 10800054 -@00000ADA 18800115 -@00000ADB 003FCE06 -@00000ADC 81800204 -@00000ADD 34000317 -@00000ADE 81BFBF1E -@00000ADF 4A400084 -@00000AE0 003FE806 -@00000AE1 8804D1BA -@00000AE2 12400E04 -@00000AE3 003FD506 -@00000AE4 00807FC4 -@00000AE5 10C09436 -@00000AE6 1808D0FA -@00000AE7 61BFFE04 -@00000AE8 00800044 -@00000AE9 200A90FA -@00000AEA 2007D0BA -@00000AEB 31000117 -@00000AEC 2991883A -@00000AED 41C00217 -@00000AEE 10C4983A -@00000AEF 82000315 -@00000AF0 81C00215 -@00000AF1 2088B03A -@00000AF2 3C000315 -@00000AF3 31000115 -@00000AF4 44000215 -@00000AF5 4807883A -@00000AF6 4800A616 -@00000AF7 1807D0BA -@00000AF8 03400034 -@00000AF9 6B528904 -@00000AFA 00800044 -@00000AFB 10CE983A -@00000AFC 69000117 -@00000AFD 21C04836 -@00000AFE 21C4703A -@00000AFF 10000A1E -@00000B00 39CF883A -@00000B01 00BFFF04 -@00000B02 4884703A -@00000B03 21C6703A -@00000B04 12400104 -@00000B05 1800041E -@00000B06 39CF883A -@00000B07 4A400104 -@00000B08 21C4703A -@00000B09 103FFC26 -@00000B0A 480490FA -@00000B0B 4817883A -@00000B0C 134D883A -@00000B0D 300B883A -@00000B0E 2C000317 -@00000B0F 81400926 -@00000B10 02BFFF04 -@00000B11 020003C4 -@00000B12 80800117 -@00000B13 1286703A -@00000B14 1C49C83A -@00000B15 41008016 -@00000B16 2000180E -@00000B17 84000317 -@00000B18 817FF91E -@00000B19 4A400044 -@00000B1A 488000CC -@00000B1B 29400204 -@00000B1C 103FF11E -@00000B1D 588000CC -@00000B1E 31BFFE04 -@00000B1F 5AFFFFC4 -@00000B20 1000E526 -@00000B21 30800217 -@00000B22 11BFFA26 -@00000B23 03400034 -@00000B24 6B528904 -@00000B25 39CF883A -@00000B26 68C00117 -@00000B27 19C01E36 -@00000B28 3800031E -@00000B29 00001C06 -@00000B2A 39CF883A -@00000B2B 4A400104 -@00000B2C 19C4703A -@00000B2D 103FFC26 -@00000B2E 003FDB06 -@00000B2F 80C7883A -@00000B30 18800117 -@00000B31 82000317 -@00000B32 81C00217 -@00000B33 10800054 -@00000B34 9009883A -@00000B35 18800115 -@00000B36 41C00215 -@00000B37 3A000315 -@00000B38 003F7106 -@00000B39 88800054 -@00000B3A 844B883A -@00000B3B 80800115 -@00000B3C 2905883A -@00000B3D 20C00054 -@00000B3E 61400315 -@00000B3F 61400215 -@00000B40 11000015 -@00000B41 9009883A -@00000B42 2B000215 -@00000B43 28C00115 -@00000B44 2B000315 -@00000B45 003F6406 -@00000B46 6D400217 -@00000B47 00BFFF04 -@00000B48 A8C00117 -@00000B49 18AC703A -@00000B4A B449C83A -@00000B4B B4400236 -@00000B4C 008003C4 -@00000B4D 11002316 -@00000B4E D0A01317 -@00000B4F 073FFFC4 -@00000B50 B02F883A -@00000B51 8887883A -@00000B52 D0A01217 -@00000B53 ADA7883A -@00000B54 1D000404 -@00000B55 17000326 -@00000B56 18C023C4 -@00000B57 00BFE004 -@00000B58 18A8703A -@00000B59 9009883A -@00000B5A A00B883A -@00000B5B DB400015 -@00000B5C 00030F40 -@00000B5D 1021883A -@00000B5E DB400017 -@00000B5F 17000426 -@00000B60 14C03E2E -@00000B61 00800034 -@00000B62 10928904 -@00000B63 A8803B26 -@00000B64 68800217 -@00000B65 013FFF04 -@00000B66 10C00117 -@00000B67 1906703A -@00000B68 1C49C83A -@00000B69 1C400236 -@00000B6A 008003C4 -@00000B6B 11000516 -@00000B6C 9009883A -@00000B6D 00035880 -@00000B6E 003F1806 -@00000B6F 4A7FFFC4 -@00000B70 003F5706 -@00000B71 6C000217 -@00000B72 88800054 -@00000B73 21000054 -@00000B74 8447883A -@00000B75 80800115 -@00000B76 19000115 -@00000B77 9009883A -@00000B78 68C00215 -@00000B79 003F3006 -@00000B7A 180AD27A -@00000B7B 1808D0FA -@00000B7C 28000426 -@00000B7D 00800104 -@00000B7E 11405836 -@00000B7F 1804D1BA -@00000B80 11000E04 -@00000B81 200490FA -@00000B82 01400034 -@00000B83 29528904 -@00000B84 1351883A -@00000B85 41C00217 -@00000B86 3A006D26 -@00000B87 38800117 -@00000B88 013FFF04 -@00000B89 1104703A -@00000B8A 1880052E -@00000B8B 39C00217 -@00000B8C 3A000326 -@00000B8D 38800117 -@00000B8E 1104703A -@00000B8F 18BFFB36 -@00000B90 3A000317 -@00000B91 82000315 -@00000B92 81C00215 -@00000B93 3C000315 -@00000B94 44000215 -@00000B95 003F5F06 -@00000B96 82000317 -@00000B97 81C00217 -@00000B98 88800054 -@00000B99 844B883A -@00000B9A 41C00215 -@00000B9B 3A000315 -@00000B9C 003F9E06 -@00000B9D 48C000C4 -@00000B9E 003F5806 -@00000B9F 07000034 -@00000BA0 E7127F04 -@00000BA1 E0800017 -@00000BA2 1505883A -@00000BA3 E0800015 -@00000BA4 84C05826 -@00000BA5 D0E01217 -@00000BA6 00BFFFC4 -@00000BA7 18805326 -@00000BA8 E0800017 -@00000BA9 84C7C83A -@00000BAA 10C5883A -@00000BAB E0800015 -@00000BAC 80C001CC -@00000BAD 0027883A -@00000BAE 18000326 -@00000BAF 00800204 -@00000BB0 10E7C83A -@00000BB1 84E1883A -@00000BB2 8505883A -@00000BB3 10801FCC -@00000BB4 00C02004 -@00000BB5 1887C83A -@00000BB6 98E7883A -@00000BB7 9009883A -@00000BB8 980B883A -@00000BB9 DB400015 -@00000BBA 00030F40 -@00000BBB 1007883A -@00000BBC 00BFFFC4 -@00000BBD DB400017 -@00000BBE 18804E26 -@00000BBF E0800017 -@00000BC0 1C07C83A -@00000BC1 1CC9883A -@00000BC2 14C5883A -@00000BC3 E0800015 -@00000BC4 6C000215 -@00000BC5 20800054 -@00000BC6 AB404426 -@00000BC7 014003C4 -@00000BC8 2D801636 -@00000BC9 00800044 -@00000BCA 80800115 -@00000BCB 003F9806 -@00000BCC 00805504 -@00000BCD 10C00336 -@00000BCE 8804D3FA -@00000BCF 12401DC4 -@00000BD0 003EE806 -@00000BD1 00815504 -@00000BD2 02401F84 -@00000BD3 10FEE536 -@00000BD4 8804D4BA -@00000BD5 12401F04 -@00000BD6 003EE206 -@00000BD7 00800504 -@00000BD8 290016C4 -@00000BD9 117FA72E -@00000BDA 00801504 -@00000BDB 11403A36 -@00000BDC 1804D33A -@00000BDD 11001B84 -@00000BDE 003FA206 -@00000BDF 80800115 -@00000BE0 A8800117 -@00000BE1 00FFFE04 -@00000BE2 B13FFD04 -@00000BE3 20EE703A -@00000BE4 1080004C -@00000BE5 15C4B03A -@00000BE6 A8800115 -@00000BE7 ADC7883A -@00000BE8 00800144 -@00000BE9 18800215 -@00000BEA 18800115 -@00000BEB 2DC02436 -@00000BEC E0C00017 -@00000BED D0A01117 -@00000BEE 10C0012E -@00000BEF D0E01115 -@00000BF0 D0A01017 -@00000BF1 10FF722E -@00000BF2 D0E01015 -@00000BF3 003F7006 -@00000BF4 2005D0BA -@00000BF5 00C00044 -@00000BF6 29000117 -@00000BF7 1886983A -@00000BF8 20C8B03A -@00000BF9 29000115 -@00000BFA 003F9606 -@00000BFB D4201215 -@00000BFC 003FAF06 -@00000BFD 80801FCC -@00000BFE 103FA61E -@00000BFF 00800034 -@00000C00 10928904 -@00000C01 10C00217 -@00000C02 A5C9883A -@00000C03 20800054 -@00000C04 18800115 -@00000C05 003FE606 -@00000C06 68800117 -@00000C07 01C6303A -@00000C08 10C4703A -@00000C09 68800115 -@00000C0A 003F1806 -@00000C0B 80800115 -@00000C0C 003FDF06 -@00000C0D 0027883A -@00000C0E 8007883A -@00000C0F 003FAF06 -@00000C10 A9400204 -@00000C11 9009883A -@00000C12 DB400015 -@00000C13 00032640 -@00000C14 DB400017 -@00000C15 003FD606 -@00000C16 00805504 -@00000C17 11400336 -@00000C18 1804D3FA -@00000C19 11001DC4 -@00000C1A 003F6606 -@00000C1B 00815504 -@00000C1C 01001F84 -@00000C1D 117F6336 -@00000C1E 1804D4BA -@00000C1F 11001F04 -@00000C20 003F6006 -@00000C21 31BFFFC4 -@00000C22 00BFFFC4 -@00000C23 30800826 -@00000C24 100F883A -@00000C25 20C00003 -@00000C26 28800003 -@00000C27 31BFFFC4 -@00000C28 21000044 -@00000C29 29400044 -@00000C2A 1880031E -@00000C2B 31FFF91E -@00000C2C 0005883A -@00000C2D F800283A -@00000C2E 1885C83A -@00000C2F F800283A -@00000C30 31BFFFC4 -@00000C31 00BFFFC4 -@00000C32 2007883A -@00000C33 30800726 -@00000C34 100F883A -@00000C35 28800003 -@00000C36 31BFFFC4 -@00000C37 29400044 -@00000C38 18800005 -@00000C39 18C00044 -@00000C3A 31FFFA1E -@00000C3B 2005883A -@00000C3C F800283A -@00000C3D DEFFFE04 -@00000C3E DC000015 -@00000C3F 2021883A -@00000C40 2809883A -@00000C41 DFC00115 -@00000C42 D0201815 -@00000C43 00035A40 -@00000C44 1007883A -@00000C45 00BFFFC4 -@00000C46 18800526 -@00000C47 1805883A -@00000C48 DFC00117 -@00000C49 DC000017 -@00000C4A DEC00204 -@00000C4B F800283A -@00000C4C D0A01817 -@00000C4D 103FF926 -@00000C4E 80800315 -@00000C4F 003FF706 -@00000C50 DEFFFB04 -@00000C51 DCC00015 -@00000C52 04C00034 -@00000C53 9CD28904 -@00000C54 DC000315 -@00000C55 DC400215 -@00000C56 DC800115 -@00000C57 2823883A -@00000C58 2021883A -@00000C59 DFC00415 -@00000C5A 000356C0 -@00000C5B 98800217 -@00000C5C 8009883A -@00000C5D 000B883A -@00000C5E 10C00117 -@00000C5F 00BFFF04 -@00000C60 18A4703A -@00000C61 9463C83A -@00000C62 8C401BC4 -@00000C63 8822D1FA -@00000C64 00802004 -@00000C65 8C7FFFC4 -@00000C66 882291FA -@00000C67 88800616 -@00000C68 00030F40 -@00000C69 98C00217 -@00000C6A 8009883A -@00000C6B 044BC83A -@00000C6C 1C87883A -@00000C6D 18800926 -@00000C6E 00035880 -@00000C6F 0005883A -@00000C70 DFC00417 -@00000C71 DC000317 -@00000C72 DC400217 -@00000C73 DC800117 -@00000C74 DCC00017 -@00000C75 DEC00504 -@00000C76 F800283A -@00000C77 8009883A -@00000C78 00030F40 -@00000C79 944DC83A -@00000C7A 00FFFFC4 -@00000C7B 8009883A -@00000C7C 000B883A -@00000C7D 01C00034 -@00000C7E 39D27F04 -@00000C7F 31800054 -@00000C80 10C00926 -@00000C81 38800017 -@00000C82 98C00217 -@00000C83 8009883A -@00000C84 1445C83A -@00000C85 38800015 -@00000C86 19800115 -@00000C87 00035880 -@00000C88 00800044 -@00000C89 003FE606 -@00000C8A 00030F40 -@00000C8B 99400217 -@00000C8C 100D883A -@00000C8D 8009883A -@00000C8E 1165C83A -@00000C8F 008003C4 -@00000C90 90C00054 -@00000C91 14BFDC0E -@00000C92 28C00115 -@00000C93 D0E01217 -@00000C94 00800034 -@00000C95 10927F04 -@00000C96 30C7C83A -@00000C97 10C00015 -@00000C98 003FD506 -@00000C99 DEFFFD04 -@00000C9A DC000115 -@00000C9B DC400015 -@00000C9C DFC00215 -@00000C9D 2821883A -@00000C9E 2023883A -@00000C9F 28003226 -@00000CA0 000356C0 -@00000CA1 82BFFE04 -@00000CA2 51400117 -@00000CA3 00BFFF84 -@00000CA4 03000034 -@00000CA5 63128904 -@00000CA6 2892703A -@00000CA7 524D883A -@00000CA8 30C00117 -@00000CA9 61000217 -@00000CAA 00BFFF04 -@00000CAB 1896703A -@00000CAC 21804E26 -@00000CAD 2880004C -@00000CAE 32C00115 -@00000CAF 000B883A -@00000CB0 1000091E -@00000CB1 50C00017 -@00000CB2 60800204 -@00000CB3 50D5C83A -@00000CB4 51000217 -@00000CB5 48D3883A -@00000CB6 20807426 -@00000CB7 52000317 -@00000CB8 41000215 -@00000CB9 22000315 -@00000CBA 32C7883A -@00000CBB 18800117 -@00000CBC 2808C03A -@00000CBD 1080004C -@00000CBE 1000061E -@00000CBF 4AD3883A -@00000CC0 20001626 -@00000CC1 30C00217 -@00000CC2 32000317 -@00000CC3 40C00215 -@00000CC4 1A000315 -@00000CC5 48800054 -@00000CC6 5247883A -@00000CC7 50800115 -@00000CC8 1A400015 -@00000CC9 20001726 -@00000CCA 8809883A -@00000CCB 02000034 -@00000CCC 420D6204 -@00000CCD DFC00217 -@00000CCE DC000117 -@00000CCF DC400017 -@00000CD0 DEC00304 -@00000CD1 4000683A -@00000CD2 DFC00217 -@00000CD3 DC000117 -@00000CD4 DC400017 -@00000CD5 DEC00304 -@00000CD6 F800283A -@00000CD7 30C00217 -@00000CD8 00800034 -@00000CD9 10928B04 -@00000CDA 18BFE71E -@00000CDB 1A800315 -@00000CDC 1A800215 -@00000CDD 01000044 -@00000CDE 50C00215 -@00000CDF 50C00315 -@00000CE0 003FE406 -@00000CE1 00807FC4 -@00000CE2 12402B36 -@00000CE3 4806D0FA -@00000CE4 01800034 -@00000CE5 31928904 -@00000CE6 00800044 -@00000CE7 180890FA -@00000CE8 1807D0BA -@00000CE9 31400117 -@00000CEA 2191883A -@00000CEB 41C00217 -@00000CEC 10C4983A -@00000CED 52000315 -@00000CEE 51C00215 -@00000CEF 288AB03A -@00000CF0 3A800315 -@00000CF1 31400115 -@00000CF2 42800215 -@00000CF3 8809883A -@00000CF4 02000034 -@00000CF5 420D6204 -@00000CF6 DFC00217 -@00000CF7 DC000117 -@00000CF8 DC400017 -@00000CF9 DEC00304 -@00000CFA 4000683A -@00000CFB 2880004C -@00000CFC 4AD3883A -@00000CFD 1000071E -@00000CFE 50C00017 -@00000CFF 50D5C83A -@00000D00 52000317 -@00000D01 51C00217 -@00000D02 48D3883A -@00000D03 41C00215 -@00000D04 3A000315 -@00000D05 D0A01417 -@00000D06 48C00054 -@00000D07 62800215 -@00000D08 50C00115 -@00000D09 48BFC036 -@00000D0A D1601317 -@00000D0B 8809883A -@00000D0C 00031400 -@00000D0D 003FBC06 -@00000D0E 4808D27A -@00000D0F 4806D0FA -@00000D10 2000151E -@00000D11 180490FA -@00000D12 01400034 -@00000D13 29528904 -@00000D14 1311883A -@00000D15 41C00217 -@00000D16 3A001E26 -@00000D17 38800117 -@00000D18 00FFFF04 -@00000D19 10C4703A -@00000D1A 4880052E -@00000D1B 39C00217 -@00000D1C 3A000326 -@00000D1D 38800117 -@00000D1E 10C4703A -@00000D1F 48BFFB36 -@00000D20 3A000317 -@00000D21 52000315 -@00000D22 51C00215 -@00000D23 3A800315 -@00000D24 42800215 -@00000D25 003FCD06 -@00000D26 00800104 -@00000D27 11000536 -@00000D28 4804D1BA -@00000D29 10C00E04 -@00000D2A 003FE606 -@00000D2B 01400044 -@00000D2C 003F8D06 -@00000D2D 00800504 -@00000D2E 20C016C4 -@00000D2F 113FE12E -@00000D30 00801504 -@00000D31 11000A36 -@00000D32 4804D33A -@00000D33 10C01B84 -@00000D34 003FDC06 -@00000D35 1805D0BA -@00000D36 00C00044 -@00000D37 29000117 -@00000D38 1886983A -@00000D39 20C8B03A -@00000D3A 29000115 -@00000D3B 003FE506 -@00000D3C 00805504 -@00000D3D 11000336 -@00000D3E 4804D3FA -@00000D3F 10C01DC4 -@00000D40 003FD006 -@00000D41 00815504 -@00000D42 00C01F84 -@00000D43 113FCD36 -@00000D44 4804D4BA -@00000D45 10C01F04 -@00000D46 003FCA06 -@00000D47 DEFFFD04 -@00000D48 DF000215 -@00000D49 D839883A -@00000D4A E1000015 -@00000D4B E0800017 -@00000D4C E0800115 -@00000D4D 00C00044 -@00000D4E E0800117 -@00000D4F 180171BA -@00000D50 DF000217 -@00000D51 DEC00304 -@00000D52 F800283A -@00000D53 DEFFFD04 -@00000D54 DFC00215 -@00000D55 DF000115 -@00000D56 D839883A -@00000D57 E1000015 -@00000D58 E1000017 -@00000D59 000351C0 -@00000D5A 003FFF06 -@00000D5B DEFFFE04 -@00000D5C DF000115 -@00000D5D D839883A -@00000D5E E1000015 -@00000D5F DF000117 -@00000D60 DEC00204 -@00000D61 F800283A -@00000D62 DEFFFE04 -@00000D63 DF000115 -@00000D64 D839883A -@00000D65 E1000015 -@00000D66 DF000117 -@00000D67 DEC00204 -@00000D68 F800283A -@00000D69 DEFFFA04 -@00000D6A DF000515 -@00000D6B D839883A -@00000D6C E1000015 -@00000D6D 0005303A -@00000D6E E0800415 -@00000D6F 0001703A -@00000D70 E0800417 -@00000D71 E0800315 -@00000D72 E0800317 -@00000D73 E0800115 -@00000D74 D0A01517 -@00000D75 10C000C4 -@00000D76 00BFFF04 -@00000D77 1884703A -@00000D78 D0A01515 -@00000D79 D0A01517 -@00000D7A E0800215 -@00000D7B D0E01517 -@00000D7C E0800017 -@00000D7D 1885883A -@00000D7E D0A01515 -@00000D7F E0800117 -@00000D80 E0800415 -@00000D81 E0800417 -@00000D82 1001703A -@00000D83 E0800217 -@00000D84 DF000517 -@00000D85 DEC00604 -@00000D86 F800283A -@00000D87 2A2A0A0A -@00000D88 2A2A2A2A -@00000D89 2A2A2A2A -@00000D8A 2A2A2A2A -@00000D8B 2A2A2A2A -@00000D8C 2A2A2A2A -@00000D8D 2A2A2A2A -@00000D8E 0000000A -@00000D8F 6548202A -@00000D90 206F6C6C -@00000D91 6D6F7266 -@00000D92 6F694E20 -@00000D93 49492073 -@00000D94 20202021 -@00000D95 000A2A20 -@00000D96 6F43202A -@00000D97 69746E75 -@00000D98 6620676E -@00000D99 206D6F72 -@00000D9A 74203030 -@00000D9B 6666206F -@00000D9C 000A2A20 -@00000D9D 2A2A2A2A -@00000D9E 2A2A2A2A -@00000D9F 2A2A2A2A -@00000DA0 2A2A2A2A -@00000DA1 2A2A2A2A -@00000DA2 2A2A2A2A -@00000DA3 000A2A2A -@00000DA4 78323025 -@00000DA5 0020202C -@00000DA6 74747542 -@00000DA7 31206E6F -@00000DA8 0000000A -@00000DA9 74747542 -@00000DAA 32206E6F -@00000DAB 0000000A -@00000DAC 74747542 -@00000DAD 33206E6F -@00000DAE 0000000A -@00000DAF 74747542 -@00000DB0 34206E6F -@00000DB1 0000000A -@00000DB2 6961570A -@00000DB3 676E6974 -@00000DB4 002E2E2E -@00000DB5 0000002E -@00000DB6 756F590A -@00000DB7 73757020 -@00000DB8 3A646568 -@00000DB9 00002020 -@00000DBA 00000838 -@00000DBB 000007F0 -@00000DBC 000007F0 -@00000DBD 000007F0 -@00000DBE 000007F0 -@00000DBF 000007F0 -@00000DC0 000007F0 -@00000DC1 000007F0 -@00000DC2 000007F0 -@00000DC3 000007F0 -@00000DC4 000007F0 -@00000DC5 0000098C -@00000DC6 00000848 -@00000DC7 000007F0 -@00000DC8 000007F0 -@00000DC9 000007F0 -@00000DCA 000007F0 -@00000DCB 00000848 -@00000DCC 000007F0 -@00000DCD 000007F0 -@00000DCE 000007F0 -@00000DCF 000007F0 -@00000DD0 000007F0 -@00000DD1 00000A68 -@00000DD2 000007F0 -@00000DD3 000007F0 -@00000DD4 000007F0 -@00000DD5 00000A00 -@00000DD6 000007F0 -@00000DD7 000009F8 -@00000DD8 000007F0 -@00000DD9 000007F0 -@00000DDA 000009EC -@00000DDB 7665642F -@00000DDC 61746A2F -@00000DDD 61755F67 -@00000DDE 305F7472 -@00000DDF 00000000 -@00000DE0 7665642F -@00000DE1 61746A2F -@00000DE2 61755F67 -@00000DE3 305F7472 -@00000DE4 00000000 -@00000DE5 7665642F -@00000DE6 6C756E2F -@00000DE7 0000006C -@00000DE8 000037D4 -@00000DE9 000037DC -@00000DEA 000037E4 -@00000DEB 00000000 -@00000DEC 00000000 -@00000DED 00000000 -@00000DEE 00000000 -@00000DEF 00000000 -@00000DF0 00000000 -@00000DF1 00000000 -@00000DF2 00000000 -@00000DF3 00000000 -@00000DF4 00000000 -@00000DF5 00000004 -@00000DF6 00000000 -@00000DF7 0001000A -@00000DF8 00000000 -@00000DF9 0002000A -@00000DFA 00000000 -@00000DFB 00000000 -@00000DFC 00000000 -@00000DFD 00000000 -@00000DFE 00000000 -@00000DFF 00003780 -@00000E00 00000000 -@00000E01 00000000 -@00000E02 00001000 -@00000E03 00001240 -@00000E04 00000000 -@00000E05 00000000 -@00000E06 000016B0 -@00000E07 01000850 -@00000E08 0000000A -@00000E09 00000000 -@00000E0A 00000000 -@00000E0B 00000000 -@00000E0C 00000000 -@00000E0D 00000000 -@00000E0E 00000000 -@00000E0F 00000000 -@00000E10 00000000 -@00000E11 00000000 -@00000E12 00000000 -@00000E13 00000000 -@00000E14 00000000 -@00000E15 00000000 -@00000E16 00000000 -@00000E17 00000000 -@00000E18 00000000 -@00000E19 00000000 -@00000E1A 00000000 -@00000E1B 00000000 -@00000E1C 00000000 -@00000E1D 00000000 -@00000E1E 00000000 -@00000E1F 00000000 -@00000E20 00000000 -@00000E21 00000000 -@00000E22 00000000 -@00000E23 00000000 -@00000E24 00000000 -@00000E25 00000000 -@00000E26 00000000 -@00000E27 00000000 -@00000E28 00000000 -@00000E29 00000000 -@00000E2A 00000000 -@00000E2B 00000000 -@00000E2C 00000000 -@00000E2D 00000000 -@00000E2E 00000000 -@00000E2F 00000000 -@00000E30 00000000 -@00000E31 00000000 -@00000E32 00000000 -@00000E33 00000000 -@00000E34 00000000 -@00000E35 00000000 -@00000E36 00000000 -@00000E37 00000000 -@00000E38 00000000 -@00000E39 00000000 -@00000E3A 00000000 -@00000E3B 00000000 -@00000E3C 00000000 -@00000E3D 00000000 -@00000E3E 00000000 -@00000E3F 00000000 -@00000E40 00000000 -@00000E41 00000000 -@00000E42 00000000 -@00000E43 00000000 -@00000E44 00000000 -@00000E45 00000000 -@00000E46 00000000 -@00000E47 00000000 -@00000E48 00000000 -@00000E49 00000000 -@00000E4A 00000000 -@00000E4B 00000000 -@00000E4C 00000000 -@00000E4D 00000000 -@00000E4E 00000000 -@00000E4F 00000000 -@00000E50 00000000 -@00000E51 00000000 -@00000E52 00000000 -@00000E53 00000000 -@00000E54 00000000 -@00000E55 00000000 -@00000E56 00000000 -@00000E57 00000000 -@00000E58 00000000 -@00000E59 00000000 -@00000E5A 00000000 -@00000E5B 00000000 -@00000E5C 00000000 -@00000E5D 00000000 -@00000E5E 00000000 -@00000E5F 00000000 -@00000E60 00000000 -@00000E61 00000000 -@00000E62 00000000 -@00000E63 00000000 -@00000E64 00000000 -@00000E65 00000000 -@00000E66 00000000 -@00000E67 00000000 -@00000E68 00000000 -@00000E69 00000000 -@00000E6A 00000000 -@00000E6B 00000000 -@00000E6C 00000000 -@00000E6D 00000000 -@00000E6E 00000000 -@00000E6F 00000000 -@00000E70 00000000 -@00000E71 00000000 -@00000E72 00000000 -@00000E73 00000000 -@00000E74 00000000 -@00000E75 00000000 -@00000E76 00000000 -@00000E77 00000000 -@00000E78 00000000 -@00000E79 00000000 -@00000E7A 00000000 -@00000E7B 00000000 -@00000E7C 00000000 -@00000E7D 00000000 -@00000E7E 00000000 -@00000E7F 00000000 -@00000E80 00000000 -@00000E81 00000000 -@00000E82 00000000 -@00000E83 00000000 -@00000E84 00000000 -@00000E85 00000000 -@00000E86 00000000 -@00000E87 00000000 -@00000E88 00000000 -@00000E89 00000000 -@00000E8A 00000000 -@00000E8B 00000000 -@00000E8C 00000000 -@00000E8D 00000000 -@00000E8E 00000000 -@00000E8F 00000000 -@00000E90 00000000 -@00000E91 00000000 -@00000E92 00000000 -@00000E93 00000000 -@00000E94 00000000 -@00000E95 00000000 -@00000E96 00000000 -@00000E97 00000000 -@00000E98 00000000 -@00000E99 00000000 -@00000E9A 00000000 -@00000E9B 00000000 -@00000E9C 00000000 -@00000E9D 00000000 -@00000E9E 00000000 -@00000E9F 00000000 -@00000EA0 00000000 -@00000EA1 00000000 -@00000EA2 00000000 -@00000EA3 00000000 -@00000EA4 00000000 -@00000EA5 00000000 -@00000EA6 00000000 -@00000EA7 00000000 -@00000EA8 00000000 -@00000EA9 00000000 -@00000EAA 00000000 -@00000EAB 00000000 -@00000EAC 00000000 -@00000EAD 00000000 -@00000EAE 00000000 -@00000EAF 00000000 -@00000EB0 00000000 -@00000EB1 00000000 -@00000EB2 00000000 -@00000EB3 00000000 -@00000EB4 00000000 -@00000EB5 00000000 -@00000EB6 00000000 -@00000EB7 00000000 -@00000EB8 00000000 -@00000EB9 00000000 -@00000EBA 00000000 -@00000EBB 00000000 -@00000EBC 00000000 -@00000EBD 00000000 -@00000EBE 00000000 -@00000EBF 00000000 -@00000EC0 00000000 -@00000EC1 00000000 -@00000EC2 00000000 -@00000EC3 00000000 -@00000EC4 00000000 -@00000EC5 00000000 -@00000EC6 00000000 -@00000EC7 00000000 -@00000EC8 00000000 -@00000EC9 00000000 -@00000ECA 00000000 -@00000ECB 00000000 -@00000ECC 00000000 -@00000ECD 00000000 -@00000ECE 00000000 -@00000ECF 00000000 -@00000ED0 00000000 -@00000ED1 00000000 -@00000ED2 00000000 -@00000ED3 00000000 -@00000ED4 00000000 -@00000ED5 00000000 -@00000ED6 00000000 -@00000ED7 00000000 -@00000ED8 00000000 -@00000ED9 00000000 -@00000EDA 00000000 -@00000EDB 00000000 -@00000EDC 00000000 -@00000EDD 00000000 -@00000EDE 00000000 -@00000EDF 00000000 -@00000EE0 00000000 -@00000EE1 00000000 -@00000EE2 00000000 -@00000EE3 00000000 -@00000EE4 00000000 -@00000EE5 00000000 -@00000EE6 00000000 -@00000EE7 00000000 -@00000EE8 00000000 -@00000EE9 00000000 -@00000EEA 00000000 -@00000EEB 00000000 -@00000EEC 00000000 -@00000EED 00000000 -@00000EEE 00000000 -@00000EEF 00000000 -@00000EF0 00000000 -@00000EF1 00000000 -@00000EF2 00000000 -@00000EF3 00000000 -@00000EF4 00000000 -@00000EF5 00000000 -@00000EF6 00000000 -@00000EF7 00000000 -@00000EF8 00000000 -@00000EF9 00000000 -@00000EFA 00000000 -@00000EFB 00000000 -@00000EFC 00000000 -@00000EFD 00000000 -@00000EFE 00000000 -@00000EFF 00000000 -@00000F00 00000000 -@00000F01 00000000 -@00000F02 00000000 -@00000F03 00000000 -@00000F04 00000000 -@00000F05 00000000 -@00000F06 00000000 -@00000F07 00000000 -@00000F08 00000000 -@00000F09 00000000 -@00000F0A 00000000 -@00000F0B 00000000 -@00000F0C 00000000 -@00000F0D 00000000 -@00000F0E 00000000 -@00000F0F 00000000 -@00000F10 00000000 -@00000F11 00000000 -@00000F12 00000000 -@00000F13 00000000 -@00000F14 00000000 -@00000F15 00000000 -@00000F16 00000000 -@00000F17 00000000 -@00000F18 00000000 -@00000F19 00000000 -@00000F1A 00000000 -@00000F1B 00000000 -@00000F1C 00000000 -@00000F1D 00000000 -@00000F1E 00000000 -@00000F1F 00000000 -@00000F20 00000000 -@00000F21 00000000 -@00000F22 00000000 -@00000F23 00000000 -@00000F24 00000000 -@00000F25 00000000 -@00000F26 00000000 -@00000F27 00000000 -@00000F28 00000000 -@00000F29 00000000 -@00000F2A 00000000 -@00000F2B 00000000 -@00000F2C 00000000 -@00000F2D 00000000 -@00000F2E 00000000 -@00000F2F 00000000 -@00000F30 00000000 -@00000F31 00000000 -@00000F32 00000000 -@00000F33 00000000 -@00000F34 00000000 -@00000F35 00000000 -@00000F36 00000000 -@00000F37 00000000 -@00000F38 00000000 -@00000F39 00000000 -@00000F3A 00000000 -@00000F3B 00000000 -@00000F3C 00000000 -@00000F3D 00000000 -@00000F3E 00000000 -@00000F3F 00000000 -@00000F40 00000000 -@00000F41 00000000 -@00000F42 00000000 -@00000F43 00000000 -@00000F44 00000000 -@00000F45 00000000 -@00000F46 00000000 -@00000F47 00000000 -@00000F48 00000000 -@00000F49 00000000 -@00000F4A 00000000 -@00000F4B 00000000 -@00000F4C 00000000 -@00000F4D 00000000 -@00000F4E 00000000 -@00000F4F 00000000 -@00000F50 00000000 -@00000F51 00000000 -@00000F52 00000000 -@00000F53 00000000 -@00000F54 00000000 -@00000F55 00000000 -@00000F56 00000000 -@00000F57 00000000 -@00000F58 00000000 -@00000F59 00000000 -@00000F5A 00000000 -@00000F5B 00000000 -@00000F5C 00000000 -@00000F5D 00000000 -@00000F5E 00000000 -@00000F5F 00000000 -@00000F60 00000000 -@00000F61 00000000 -@00000F62 00000000 -@00000F63 00000000 -@00000F64 00000000 -@00000F65 00000000 -@00000F66 00000000 -@00000F67 00000000 -@00000F68 00000000 -@00000F69 00000000 -@00000F6A 00000000 -@00000F6B 00000000 -@00000F6C 00000000 -@00000F6D 00000000 -@00000F6E 00000000 -@00000F6F 00000000 -@00000F70 00000000 -@00000F71 00000000 -@00000F72 00000000 -@00000F73 00000000 -@00000F74 00000000 -@00000F75 00000000 -@00000F76 00000000 -@00000F77 00000000 -@00000F78 00000000 -@00000F79 00000000 -@00000F7A 00000000 -@00000F7B 00000000 -@00000F7C 00000000 -@00000F7D 00000000 -@00000F7E 00000000 -@00000F7F 00000000 -@00000F80 00000000 -@00000F81 00000000 -@00000F82 00000000 -@00000F83 00000000 -@00000F84 00000000 -@00000F85 00000000 -@00000F86 00000000 -@00000F87 00000000 -@00000F88 00000000 -@00000F89 00000000 -@00000F8A 00000000 -@00000F8B 00000000 -@00000F8C 00000000 -@00000F8D 00000000 -@00000F8E 00000000 -@00000F8F 00000000 -@00000F90 00000000 -@00000F91 00000000 -@00000F92 00000000 -@00000F93 00000000 -@00000F94 00000000 -@00000F95 00000000 -@00000F96 00000000 -@00000F97 00000000 -@00000F98 00000000 -@00000F99 00000000 -@00000F9A 00000000 -@00000F9B 00000000 -@00000F9C 00000000 -@00000F9D 00000000 -@00000F9E 00000000 -@00000F9F 00000000 -@00000FA0 00000000 -@00000FA1 00000000 -@00000FA2 00000000 -@00000FA3 00000000 -@00000FA4 00000000 -@00000FA5 00000000 -@00000FA6 00000000 -@00000FA7 00000000 -@00000FA8 00000000 -@00000FA9 00000000 -@00000FAA 00000000 -@00000FAB 00000000 -@00000FAC 00000000 -@00000FAD 00000000 -@00000FAE 00000000 -@00000FAF 00000000 -@00000FB0 00000000 -@00000FB1 00000000 -@00000FB2 00000000 -@00000FB3 00000000 -@00000FB4 00000000 -@00000FB5 00000000 -@00000FB6 00000000 -@00000FB7 00000000 -@00000FB8 00000000 -@00000FB9 00000000 -@00000FBA 00000000 -@00000FBB 00000000 -@00000FBC 00000000 -@00000FBD 00000000 -@00000FBE 00000000 -@00000FBF 00000000 -@00000FC0 00000000 -@00000FC1 00000000 -@00000FC2 00000000 -@00000FC3 00000000 -@00000FC4 00000000 -@00000FC5 00000000 -@00000FC6 00000000 -@00000FC7 00000000 -@00000FC8 00000000 -@00000FC9 00000000 -@00000FCA 00000000 -@00000FCB 00000000 -@00000FCC 00000000 -@00000FCD 00000000 -@00000FCE 00000000 -@00000FCF 00000000 -@00000FD0 00000000 -@00000FD1 00000000 -@00000FD2 00000000 -@00000FD3 00000000 -@00000FD4 00000000 -@00000FD5 00000000 -@00000FD6 00000000 -@00000FD7 00000000 -@00000FD8 00000000 -@00000FD9 00000000 -@00000FDA 00000000 -@00000FDB 00000000 -@00000FDC 00000000 -@00000FDD 00000000 -@00000FDE 00000000 -@00000FDF 00000000 -@00000FE0 00000000 -@00000FE1 00000000 -@00000FE2 00000000 -@00000FE3 00000000 -@00000FE4 00000000 -@00000FE5 00000000 -@00000FE6 00000000 -@00000FE7 00000000 -@00000FE8 00000000 -@00000FE9 00000000 -@00000FEA 00000000 -@00000FEB 00000000 -@00000FEC 00000000 -@00000FED 00000000 -@00000FEE 00000000 -@00000FEF 00000000 -@00000FF0 00000000 -@00000FF1 00000000 -@00000FF2 00000000 -@00000FF3 00000000 -@00000FF4 00000000 -@00000FF5 00000000 -@00000FF6 00000000 -@00000FF7 00000000 -@00000FF8 00000000 -@00000FF9 00000000 -@00000FFA 00000000 -@00000FFB 00000000 -@00000FFC 00000000 -@00000FFD 00000000 -@00000FFE 00000000 -@00000FFF 00000000 -@00001000 00000000 -@00001001 00000000 -@00001002 00000000 -@00001003 00000000 -@00001004 00000000 -@00001005 00000000 -@00001006 00000000 -@00001007 00000000 -@00001008 00000000 -@00001009 00000000 -@0000100A 00000000 -@0000100B 00000000 -@0000100C 00000000 -@0000100D 00000000 -@0000100E 00000000 -@0000100F 00000000 -@00001010 00000000 -@00001011 00000000 -@00001012 00000000 -@00001013 00000000 -@00001014 00000000 -@00001015 00000000 -@00001016 00000000 -@00001017 00000000 -@00001018 00000000 -@00001019 00000000 -@0000101A 00000000 -@0000101B 00000000 -@0000101C 00000000 -@0000101D 00000000 -@0000101E 00000000 -@0000101F 00000000 -@00001020 00000000 -@00001021 00000000 -@00001022 00000000 -@00001023 00000000 -@00001024 00000000 -@00001025 00000000 -@00001026 00000000 -@00001027 00000000 -@00001028 00000000 -@00001029 00000000 -@0000102A 00000000 -@0000102B 00000000 -@0000102C 00000000 -@0000102D 00000000 -@0000102E 00000000 -@0000102F 00000000 -@00001030 00000000 -@00001031 00000000 -@00001032 00000000 -@00001033 00000000 -@00001034 00000000 -@00001035 00000000 -@00001036 00000000 -@00001037 00000000 -@00001038 00000000 -@00001039 00000000 -@0000103A 00000000 -@0000103B 00000000 -@0000103C 00000000 -@0000103D 00000000 -@0000103E 00000000 -@0000103F 00000000 -@00001040 00000000 -@00001041 00000000 -@00001042 00000000 -@00001043 00000000 -@00001044 00000000 -@00001045 00000000 -@00001046 00000000 -@00001047 00000000 -@00001048 00000000 -@00001049 00000000 -@0000104A 00000000 -@0000104B 00000000 -@0000104C 00000000 -@0000104D 00000000 -@0000104E 00000000 -@0000104F 00000000 -@00001050 00000000 -@00001051 00000000 -@00001052 00000000 -@00001053 00000000 -@00001054 00000000 -@00001055 00000000 -@00001056 00000000 -@00001057 00000000 -@00001058 00000000 -@00001059 00000000 -@0000105A 00000000 -@0000105B 00000000 -@0000105C 00000000 -@0000105D 00000000 -@0000105E 00000000 -@0000105F 00000000 -@00001060 00000000 -@00001061 00000000 -@00001062 00000000 -@00001063 00000000 -@00001064 00000000 -@00001065 00000000 -@00001066 00000000 -@00001067 00000000 -@00001068 00000000 -@00001069 00000000 -@0000106A 00000000 -@0000106B 00000000 -@0000106C 00000000 -@0000106D 00000000 -@0000106E 00000000 -@0000106F 00000000 -@00001070 00000000 -@00001071 00000000 -@00001072 00000000 -@00001073 00000000 -@00001074 00000000 -@00001075 00000000 -@00001076 00000000 -@00001077 00000000 -@00001078 00000000 -@00001079 00000000 -@0000107A 00000000 -@0000107B 00000000 -@0000107C 00000000 -@0000107D 00000000 -@0000107E 00000000 -@0000107F 00000000 -@00001080 00000000 -@00001081 00000000 -@00001082 00000000 -@00001083 00000000 -@00001084 00000000 -@00001085 00000000 -@00001086 00000000 -@00001087 00000000 -@00001088 00000000 -@00001089 00000000 -@0000108A 00000000 -@0000108B 00000000 -@0000108C 00000000 -@0000108D 00000000 -@0000108E 00000000 -@0000108F 00000000 -@00001090 00000000 -@00001091 00000000 -@00001092 00000000 -@00001093 00000000 -@00001094 00000000 -@00001095 00000000 -@00001096 00000000 -@00001097 00000000 -@00001098 00000000 -@00001099 00000000 -@0000109A 00000000 -@0000109B 00000000 -@0000109C 00000000 -@0000109D 00000000 -@0000109E 00000000 -@0000109F 00000000 -@000010A0 00000000 -@000010A1 00000000 -@000010A2 00000000 -@000010A3 00000000 -@000010A4 00000000 -@000010A5 00000000 -@000010A6 00000000 -@000010A7 00000000 -@000010A8 00000000 -@000010A9 00000000 -@000010AA 00000000 -@000010AB 00000000 -@000010AC 00000000 -@000010AD 00000000 -@000010AE 00000000 -@000010AF 00000000 -@000010B0 00000000 -@000010B1 00000000 -@000010B2 00000000 -@000010B3 00000000 -@000010B4 00000000 -@000010B5 00000000 -@000010B6 00000000 -@000010B7 00000000 -@000010B8 00000000 -@000010B9 00000000 -@000010BA 00000000 -@000010BB 00000000 -@000010BC 00000000 -@000010BD 00000000 -@000010BE 00000000 -@000010BF 00000000 -@000010C0 00000000 -@000010C1 00000000 -@000010C2 00000000 -@000010C3 00000000 -@000010C4 00000000 -@000010C5 00000000 -@000010C6 00000000 -@000010C7 00000000 -@000010C8 00000000 -@000010C9 00000000 -@000010CA 00000000 -@000010CB 00000000 -@000010CC 00000000 -@000010CD 00000000 -@000010CE 00000000 -@000010CF 00000000 -@000010D0 00000000 -@000010D1 00000000 -@000010D2 00000000 -@000010D3 00000000 -@000010D4 00000000 -@000010D5 00000000 -@000010D6 00000000 -@000010D7 00000000 -@000010D8 00000000 -@000010D9 00000000 -@000010DA 00000000 -@000010DB 00000000 -@000010DC 00000000 -@000010DD 00000000 -@000010DE 00000000 -@000010DF 00000000 -@000010E0 00000000 -@000010E1 00000000 -@000010E2 00000000 -@000010E3 00000000 -@000010E4 00000000 -@000010E5 00000000 -@000010E6 00000000 -@000010E7 00000000 -@000010E8 00000000 -@000010E9 00000000 -@000010EA 00000000 -@000010EB 00000000 -@000010EC 00000000 -@000010ED 00000000 -@000010EE 00000000 -@000010EF 00000000 -@000010F0 00000000 -@000010F1 00000000 -@000010F2 00000000 -@000010F3 00000000 -@000010F4 00000000 -@000010F5 00000000 -@000010F6 00000000 -@000010F7 00000000 -@000010F8 00000000 -@000010F9 00000000 -@000010FA 00000000 -@000010FB 00000000 -@000010FC 00000000 -@000010FD 00000000 -@000010FE 00000000 -@000010FF 00000000 -@00001100 00000000 -@00001101 00000000 -@00001102 00000000 -@00001103 00000000 -@00001104 00000000 -@00001105 00000000 -@00001106 00000000 -@00001107 00000000 -@00001108 00000000 -@00001109 00000000 -@0000110A 00000000 -@0000110B 00000000 -@0000110C 00000000 -@0000110D 00000000 -@0000110E 00000000 -@0000110F 00000000 -@00001110 00000000 -@00001111 00000000 -@00001112 00000000 -@00001113 00000000 -@00001114 00000000 -@00001115 00000000 -@00001116 00000000 -@00001117 00000000 -@00001118 00000000 -@00001119 00000000 -@0000111A 00000000 -@0000111B 00000000 -@0000111C 00000000 -@0000111D 00000000 -@0000111E 00000000 -@0000111F 00000000 -@00001120 00000000 -@00001121 00000000 -@00001122 00000000 -@00001123 00000000 -@00001124 00000000 -@00001125 00000000 -@00001126 00000000 -@00001127 00000000 -@00001128 00000000 -@00001129 00000000 -@0000112A 00000000 -@0000112B 00000000 -@0000112C 00000000 -@0000112D 00000000 -@0000112E 00000000 -@0000112F 00000000 -@00001130 00000000 -@00001131 00000000 -@00001132 00000000 -@00001133 00000000 -@00001134 00000000 -@00001135 00000000 -@00001136 00000000 -@00001137 00000000 -@00001138 00000000 -@00001139 00000000 -@0000113A 00000000 -@0000113B 00000000 -@0000113C 00000000 -@0000113D 00000000 -@0000113E 00000000 -@0000113F 00000000 -@00001140 00000000 -@00001141 00000000 -@00001142 00000000 -@00001143 00000000 -@00001144 00000000 -@00001145 00000000 -@00001146 00000000 -@00001147 00000000 -@00001148 00000000 -@00001149 00000000 -@0000114A 00000000 -@0000114B 00000000 -@0000114C 00000000 -@0000114D 00000000 -@0000114E 00000000 -@0000114F 00000000 -@00001150 00000000 -@00001151 00000000 -@00001152 00000000 -@00001153 00000000 -@00001154 00000000 -@00001155 00000000 -@00001156 00000000 -@00001157 00000000 -@00001158 00000000 -@00001159 00000000 -@0000115A 00000000 -@0000115B 00000000 -@0000115C 00000000 -@0000115D 00000000 -@0000115E 00000000 -@0000115F 00000000 -@00001160 00000000 -@00001161 00000000 -@00001162 00000000 -@00001163 00000000 -@00001164 00000000 -@00001165 00000000 -@00001166 00000000 -@00001167 00000000 -@00001168 00000000 -@00001169 00000000 -@0000116A 00000000 -@0000116B 00000000 -@0000116C 00000000 -@0000116D 00000000 -@0000116E 00000000 -@0000116F 00000000 -@00001170 00000000 -@00001171 00000000 -@00001172 00000000 -@00001173 00000000 -@00001174 00000000 -@00001175 00000000 -@00001176 00000000 -@00001177 00000000 -@00001178 00000000 -@00001179 00000000 -@0000117A 00000000 -@0000117B 00000000 -@0000117C 00000000 -@0000117D 00000000 -@0000117E 00000000 -@0000117F 00000000 -@00001180 00000000 -@00001181 00000000 -@00001182 00000000 -@00001183 00000000 -@00001184 00000000 -@00001185 00000000 -@00001186 00000000 -@00001187 00000000 -@00001188 00000000 -@00001189 00000000 -@0000118A 00000000 -@0000118B 00000000 -@0000118C 00000000 -@0000118D 00000000 -@0000118E 00000000 -@0000118F 00000000 -@00001190 00000000 -@00001191 00000000 -@00001192 00000000 -@00001193 00000000 -@00001194 00000000 -@00001195 00000000 -@00001196 00000000 -@00001197 00000000 -@00001198 00000000 -@00001199 00000000 -@0000119A 00000000 -@0000119B 00000000 -@0000119C 00000000 -@0000119D 00000000 -@0000119E 00000000 -@0000119F 00000000 -@000011A0 00000000 -@000011A1 00000000 -@000011A2 00000000 -@000011A3 00000000 -@000011A4 00000000 -@000011A5 00000000 -@000011A6 00000000 -@000011A7 00000000 -@000011A8 00000000 -@000011A9 00000000 -@000011AA 00000000 -@000011AB 00000000 -@000011AC 00000000 -@000011AD 00000000 -@000011AE 00000000 -@000011AF 00000000 -@000011B0 00000000 -@000011B1 00000000 -@000011B2 00000000 -@000011B3 00000000 -@000011B4 00000000 -@000011B5 00000000 -@000011B6 00000000 -@000011B7 00000000 -@000011B8 00000000 -@000011B9 00000000 -@000011BA 00000000 -@000011BB 00000000 -@000011BC 00000000 -@000011BD 00000000 -@000011BE 00000000 -@000011BF 00000000 -@000011C0 00000000 -@000011C1 00000000 -@000011C2 00000000 -@000011C3 00000000 -@000011C4 00000000 -@000011C5 00000000 -@000011C6 00000000 -@000011C7 00000000 -@000011C8 00000000 -@000011C9 00000000 -@000011CA 00000000 -@000011CB 00000000 -@000011CC 00000000 -@000011CD 00000000 -@000011CE 00000000 -@000011CF 00000000 -@000011D0 00000000 -@000011D1 00000000 -@000011D2 00000000 -@000011D3 00000000 -@000011D4 00000000 -@000011D5 00000000 -@000011D6 00000000 -@000011D7 00000000 -@000011D8 00000000 -@000011D9 00000000 -@000011DA 00000000 -@000011DB 00000000 -@000011DC 00000000 -@000011DD 00000000 -@000011DE 00000000 -@000011DF 00000000 -@000011E0 00000000 -@000011E1 00000000 -@000011E2 00000000 -@000011E3 00000000 -@000011E4 00000000 -@000011E5 00000000 -@000011E6 00000000 -@000011E7 00000000 -@000011E8 00000000 -@000011E9 00000000 -@000011EA 00000000 -@000011EB 00000000 -@000011EC 00000000 -@000011ED 00000000 -@000011EE 00000000 -@000011EF 00000000 -@000011F0 00000000 -@000011F1 00000000 -@000011F2 00000000 -@000011F3 00000000 -@000011F4 00000000 -@000011F5 00000000 -@000011F6 00000000 -@000011F7 00000000 -@000011F8 00000000 -@000011F9 00000000 -@000011FA 00000000 -@000011FB 00000000 -@000011FC 00000000 -@000011FD 00000000 -@000011FE 00000000 -@000011FF 00000000 -@00001200 00000000 -@00001201 00000000 -@00001202 00000000 -@00001203 00000000 -@00001204 00000000 -@00001205 00000000 -@00001206 00000000 -@00001207 00000000 -@00001208 00000000 -@00001209 00000000 -@0000120A 00000000 -@0000120B 00000000 -@0000120C 00000000 -@0000120D 00000000 -@0000120E 00000000 -@0000120F 00000000 -@00001210 00000000 -@00001211 00000000 -@00001212 00000000 -@00001213 00000000 -@00001214 00000000 -@00001215 00004E44 -@00001216 00004E44 -@00001217 00003794 -@00001218 00000000 -@00001219 00000000 -@0000121A 00000000 -@0000121B 00001CA8 -@0000121C 00000000 -@0000121D 00000000 -@0000121E 00000000 -@0000121F 00004854 -@00001220 00000000 -@00001221 00000000 -@00001222 00004854 -@00001223 00000000 -@00001224 00000000 -@00001225 00004854 -@00001226 00000000 -@00001227 00000000 -@00001228 00000000 -@00001229 00000000 -@0000122A 00000000 -@0000122B 00000000 -@0000122C 00000000 -@0000122D 00000000 -@0000122E 00000000 -@0000122F 00000000 -@00001230 00000000 -@00001231 00000000 -@00001232 00000000 -@00001233 00000000 -@00001234 00000000 -@00001235 00000000 -@00001236 00000000 -@00001237 00000000 -@00001238 00000000 -@00001239 00000000 -@0000123A 00000000 -@0000123B 00000000 -@0000123C 00000000 -@0000123D 00000000 -@0000123E 00000000 -@0000123F 00000000 -@00001240 00000000 -@00001241 00000000 -@00001242 00000000 -@00001243 00000000 -@00001244 00000000 -@00001245 00000000 -@00001246 00000000 -@00001247 00000000 -@00001248 00000000 -@00001249 00000000 -@0000124A 00000000 -@0000124B 00000000 -@0000124C 00000000 -@0000124D 00000000 -@0000124E 00000000 -@0000124F 00000000 -@00001250 00000000 -@00001251 00000000 -@00001252 00000000 -@00001253 00000000 -@00001254 00000000 -@00001255 00000000 -@00001256 00000000 -@00001257 00000000 -@00001258 00000000 -@00001259 00000000 -@0000125A 00000000 -@0000125B 00000000 -@0000125C 00000000 -@0000125D 00000000 -@0000125E 00000000 -@0000125F 00000000 -@00001260 00000000 -@00001261 00000000 -@00001262 00000000 -@00001263 00000000 -@00001264 00000000 -@00001265 00000000 -@00001266 00000000 -@00001267 00000000 -@00001268 00000000 -@00001269 00000000 -@0000126A 00000000 -@0000126B 00000000 -@0000126C 00000000 -@0000126D 00000000 -@0000126E 00000000 -@0000126F 00000000 -@00001270 00000000 -@00001271 00000000 -@00001272 00000000 -@00001273 00000000 -@00001274 00000000 -@00001275 00000000 -@00001276 00000000 -@00001277 00000000 -@00001278 00000000 -@00001279 00000000 -@0000127A 00000000 -@0000127B 00000000 -@0000127C 00000000 -@0000127D 00000000 -@0000127E 00000000 -@0000127F 00000000 -@00001280 00000000 -@00001281 00000000 -@00001282 00000000 -@00001283 00000000 -@00001284 00000000 -@00001285 00000000 -@00001286 00000000 -@00001287 00000000 -@00001288 00000000 -@00001289 00000000 -@0000128A 00000000 -@0000128B 00004A24 -@0000128C 00004A24 -@0000128D 00004A2C -@0000128E 00004A2C -@0000128F 00004A34 -@00001290 00004A34 -@00001291 00004A3C -@00001292 00004A3C -@00001293 00004A44 -@00001294 00004A44 -@00001295 00004A4C -@00001296 00004A4C -@00001297 00004A54 -@00001298 00004A54 -@00001299 00004A5C -@0000129A 00004A5C -@0000129B 00004A64 -@0000129C 00004A64 -@0000129D 00004A6C -@0000129E 00004A6C -@0000129F 00004A74 -@000012A0 00004A74 -@000012A1 00004A7C -@000012A2 00004A7C -@000012A3 00004A84 -@000012A4 00004A84 -@000012A5 00004A8C -@000012A6 00004A8C -@000012A7 00004A94 -@000012A8 00004A94 -@000012A9 00004A9C -@000012AA 00004A9C -@000012AB 00004AA4 -@000012AC 00004AA4 -@000012AD 00004AAC -@000012AE 00004AAC -@000012AF 00004AB4 -@000012B0 00004AB4 -@000012B1 00004ABC -@000012B2 00004ABC -@000012B3 00004AC4 -@000012B4 00004AC4 -@000012B5 00004ACC -@000012B6 00004ACC -@000012B7 00004AD4 -@000012B8 00004AD4 -@000012B9 00004ADC -@000012BA 00004ADC -@000012BB 00004AE4 -@000012BC 00004AE4 -@000012BD 00004AEC -@000012BE 00004AEC -@000012BF 00004AF4 -@000012C0 00004AF4 -@000012C1 00004AFC -@000012C2 00004AFC -@000012C3 00004B04 -@000012C4 00004B04 -@000012C5 00004B0C -@000012C6 00004B0C -@000012C7 00004B14 -@000012C8 00004B14 -@000012C9 00004B1C -@000012CA 00004B1C -@000012CB 00004B24 -@000012CC 00004B24 -@000012CD 00004B2C -@000012CE 00004B2C -@000012CF 00004B34 -@000012D0 00004B34 -@000012D1 00004B3C -@000012D2 00004B3C -@000012D3 00004B44 -@000012D4 00004B44 -@000012D5 00004B4C -@000012D6 00004B4C -@000012D7 00004B54 -@000012D8 00004B54 -@000012D9 00004B5C -@000012DA 00004B5C -@000012DB 00004B64 -@000012DC 00004B64 -@000012DD 00004B6C -@000012DE 00004B6C -@000012DF 00004B74 -@000012E0 00004B74 -@000012E1 00004B7C -@000012E2 00004B7C -@000012E3 00004B84 -@000012E4 00004B84 -@000012E5 00004B8C -@000012E6 00004B8C -@000012E7 00004B94 -@000012E8 00004B94 -@000012E9 00004B9C -@000012EA 00004B9C -@000012EB 00004BA4 -@000012EC 00004BA4 -@000012ED 00004BAC -@000012EE 00004BAC -@000012EF 00004BB4 -@000012F0 00004BB4 -@000012F1 00004BBC -@000012F2 00004BBC -@000012F3 00004BC4 -@000012F4 00004BC4 -@000012F5 00004BCC -@000012F6 00004BCC -@000012F7 00004BD4 -@000012F8 00004BD4 -@000012F9 00004BDC -@000012FA 00004BDC -@000012FB 00004BE4 -@000012FC 00004BE4 -@000012FD 00004BEC -@000012FE 00004BEC -@000012FF 00004BF4 -@00001300 00004BF4 -@00001301 00004BFC -@00001302 00004BFC -@00001303 00004C04 -@00001304 00004C04 -@00001305 00004C0C -@00001306 00004C0C -@00001307 00004C14 -@00001308 00004C14 -@00001309 00004C1C -@0000130A 00004C1C -@0000130B 00004C24 -@0000130C 00004C24 -@0000130D 00004C2C -@0000130E 00004C2C -@0000130F 00004C34 -@00001310 00004C34 -@00001311 00004C3C -@00001312 00004C3C -@00001313 00004C44 -@00001314 00004C44 -@00001315 00004C4C -@00001316 00004C4C -@00001317 00004C54 -@00001318 00004C54 -@00001319 00004C5C -@0000131A 00004C5C -@0000131B 00004C64 -@0000131C 00004C64 -@0000131D 00004C6C -@0000131E 00004C6C -@0000131F 00004C74 -@00001320 00004C74 -@00001321 00004C7C -@00001322 00004C7C -@00001323 00004C84 -@00001324 00004C84 -@00001325 00004C8C -@00001326 00004C8C -@00001327 00004C94 -@00001328 00004C94 -@00001329 00004C9C -@0000132A 00004C9C -@0000132B 00004CA4 -@0000132C 00004CA4 -@0000132D 00004CAC -@0000132E 00004CAC -@0000132F 00004CB4 -@00001330 00004CB4 -@00001331 00004CBC -@00001332 00004CBC -@00001333 00004CC4 -@00001334 00004CC4 -@00001335 00004CCC -@00001336 00004CCC -@00001337 00004CD4 -@00001338 00004CD4 -@00001339 00004CDC -@0000133A 00004CDC -@0000133B 00004CE4 -@0000133C 00004CE4 -@0000133D 00004CEC -@0000133E 00004CEC -@0000133F 00004CF4 -@00001340 00004CF4 -@00001341 00004CFC -@00001342 00004CFC -@00001343 00004D04 -@00001344 00004D04 -@00001345 00004D0C -@00001346 00004D0C -@00001347 00004D14 -@00001348 00004D14 -@00001349 00004D1C -@0000134A 00004D1C -@0000134B 00004D24 -@0000134C 00004D24 -@0000134D 00004D2C -@0000134E 00004D2C -@0000134F 00004D34 -@00001350 00004D34 -@00001351 00004D3C -@00001352 00004D3C -@00001353 00004D44 -@00001354 00004D44 -@00001355 00004D4C -@00001356 00004D4C -@00001357 00004D54 -@00001358 00004D54 -@00001359 00004D5C -@0000135A 00004D5C -@0000135B 00004D64 -@0000135C 00004D64 -@0000135D 00004D6C -@0000135E 00004D6C -@0000135F 00004D74 -@00001360 00004D74 -@00001361 00004D7C -@00001362 00004D7C -@00001363 00004D84 -@00001364 00004D84 -@00001365 00004D8C -@00001366 00004D8C -@00001367 00004D94 -@00001368 00004D94 -@00001369 00004D9C -@0000136A 00004D9C -@0000136B 00004DA4 -@0000136C 00004DA4 -@0000136D 00004DAC -@0000136E 00004DAC -@0000136F 00004DB4 -@00001370 00004DB4 -@00001371 00004DBC -@00001372 00004DBC -@00001373 00004DC4 -@00001374 00004DC4 -@00001375 00004DCC -@00001376 00004DCC -@00001377 00004DD4 -@00001378 00004DD4 -@00001379 00004DDC -@0000137A 00004DDC -@0000137B 00004DE4 -@0000137C 00004DE4 -@0000137D 00004DEC -@0000137E 00004DEC -@0000137F 00004DF4 -@00001380 00004DF4 -@00001381 00004DFC -@00001382 00004DFC -@00001383 00004E04 -@00001384 00004E04 -@00001385 00004E0C -@00001386 00004E0C -@00001387 00004E14 -@00001388 00004E14 -@00001389 00004E1C -@0000138A 00004E1C -@0000138B 000037A0 -@0000138C 00000000 -@0000138D 00000000 -@0000138E 00000000 -@0000138F 00004E3C -@00001390 00004E3C -@00001391 00004854 -@00001392 00004854 -@00001393 FFFFFFFF -@00001394 00000000 -@00001395 00000000 -@00001396 FFFFFFFF -@00001397 00000000 -@00001398 00000000 -@00001399 00004E64 -@0000139A 00004E64 -@0000139B 00000000 -@0000139C 00000000 -@0000139D FFFFFFFF -@0000139E 00000000 -@0000139F 00020000 -@000013A0 000050A0 Index: trunk/test_bench/sdram_ctrl_tb.vhd =================================================================== --- trunk/test_bench/sdram_ctrl_tb.vhd (revision 7) +++ trunk/test_bench/sdram_ctrl_tb.vhd (nonexistent) @@ -1,169 +0,0 @@ -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; - -entity sdram_ctrl_tb is -end sdram_ctrl_tb; - -architecture structure of sdram_ctrl_tb is - component pll - port ( - inclk0 : IN STD_LOGIC := '0'; - c0 : OUT STD_LOGIC ; - e0 : OUT STD_LOGIC ; - locked : OUT STD_LOGIC - ) ; - end component ; - component sdram_ctrl is - port( - signal clk : IN STD_LOGIC; - signal reset : IN STD_LOGIC; - - signal avs_nios_chipselect : IN STD_LOGIC; - signal avs_nios_address : IN STD_LOGIC_VECTOR (21 DOWNTO 0); - signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (3 DOWNTO 0); - signal avs_nios_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); - signal avs_nios_write : IN STD_LOGIC; - signal avs_nios_read : IN STD_LOGIC; - signal avs_nios_readdata : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); - signal avs_nios_readdatavalid : OUT STD_LOGIC; - signal avs_nios_waitrequest : OUT STD_LOGIC; - - signal sdram_addr : OUT STD_LOGIC_VECTOR (11 DOWNTO 0); - signal sdram_ba : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); - signal sdram_cas_n : OUT STD_LOGIC; - signal sdram_cke : OUT STD_LOGIC; - signal sdram_cs_n : OUT STD_LOGIC_VECTOR(0 downto 0); - signal sdram_dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0); - signal sdram_dqm : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); - signal sdram_ras_n : OUT STD_LOGIC; - signal sdram_we_n : OUT STD_LOGIC - ); - end component; - - component mt48lc4m32b2 IS - PORT ( - Dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0) := (OTHERS => 'Z'); - Addr : IN STD_LOGIC_VECTOR (11 DOWNTO 0) := (OTHERS => '0'); - Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; - Clk : IN STD_LOGIC := '0'; - Cke : IN STD_LOGIC := '1'; - Cs_n : IN STD_LOGIC := '1'; - Ras_n : IN STD_LOGIC := '1'; - Cas_n : IN STD_LOGIC := '1'; - We_n : IN STD_LOGIC := '1'; - Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" - ); - END component; - - component cpu_simulator IS - PORT(clk, reset: IN std_logic; - address : OUT std_logic_vector(21 downto 0):=(others=>'0'); - writedata : out std_logic_vector(31 downto 0):=(others=>'0'); - byteenable : out std_logic_vector(3 downto 0):=(others=>'0'); - write : out std_logic:='0'; - read : out std_logic:='0'; - readdata : in std_logic_vector(31 downto 0); - waitrequest : in std_logic; - readdatavalid : in std_logic - ); - END component; - - signal reset, clk_ok: std_logic; - signal run_nios_n : std_logic:='1'; - signal clk,i_clk: std_logic:='0'; - - signal SDRAM_CLK : std_logic; - signal SDRAM_CKE : std_logic; - signal SDRAM_NCS : std_logic_vector(0 downto 0); - signal SDRAM_NRAS : std_logic; - signal SDRAM_NCAS : std_logic; - signal SDRAM_NWE : std_logic; - signal SDRAM_ADDRESS : std_logic_vector(11 downto 0); - signal SDRAM_BANK : std_logic_vector(1 downto 0); - signal SDRAM_DQM : std_logic_vector(3 downto 0); - signal SDRAM_DATA : std_logic_vector(31 downto 0); - - signal address : std_logic_vector(21 downto 0); - signal writedata : std_logic_vector(31 downto 0):=(others=>'0'); - signal byteenable : std_logic_vector(3 downto 0):=(others=>'0'); - signal write : std_logic; - signal read : std_logic; - signal chipselect : std_logic:='1'; - signal readdata : std_logic_vector(31 downto 0); - signal waitrequest : std_logic; - signal readdatavalid : std_logic; - -begin - - reset<= not clk_ok; - run_nios_n<= reset after 140 us; - - UUT: sdram_ctrl - port map( - clk => i_clk, - reset => reset, - - avs_nios_chipselect => chipselect, - avs_nios_address => address, - avs_nios_byteenable => byteenable, - avs_nios_writedata => writedata, - avs_nios_write => write, - avs_nios_read => read, - avs_nios_readdata => readdata, - avs_nios_readdatavalid => readdatavalid, - avs_nios_waitrequest => waitrequest, - - sdram_addr => SDRAM_ADDRESS, - sdram_ba => SDRAM_BANK, - sdram_cas_n => SDRAM_NCAS, - sdram_cke => SDRAM_CKE, - sdram_cs_n => SDRAM_NCS, - sdram_dq => SDRAM_DATA, - sdram_dqm => SDRAM_DQM, - sdram_ras_n => SDRAM_NRAS, - sdram_we_n => SDRAM_NWE - ); - - sdram:mt48lc4m32b2 - PORT MAP( - Dq => SDRAM_DATA, - Addr => SDRAM_ADDRESS, - Ba => SDRAM_BANK, - Clk => SDRAM_CLK, - Cke => SDRAM_CKE, - Cs_n => SDRAM_NCS(0), - Ras_n => SDRAM_NRAS, - Cas_n => SDRAM_NCAS, - We_n => SDRAM_NWE, - Dqm => SDRAM_DQM - ); - - cpu: cpu_simulator - PORT MAP( - clk => i_clk, - reset => run_nios_n, - address => address, - writedata => writedata, - byteenable => byteenable, - write => write, - read => read, - readdata => readdata, - waitrequest => waitrequest, - readdatavalid => readdatavalid - ); - - U1 : pll - port map( - inclk0 => clk, - c0 => i_clk, - e0 => SDRAM_CLK, - locked =>clk_ok - ); - - clock_generator:process - begin - wait for 21 ns; - clk<= clk xor '1'; - end process; -end structure; Index: trunk/doc/sdram_ctrl.sxw =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/doc/sdram_ctrl.sxw =================================================================== --- trunk/doc/sdram_ctrl.sxw (revision 7) +++ trunk/doc/sdram_ctrl.sxw (nonexistent)
trunk/doc/sdram_ctrl.sxw Property changes : Deleted: svn:mime-type ## -1 +0,0 ## -application/octet-stream \ No newline at end of property Index: trunk/doc/readme.txt =================================================================== --- trunk/doc/readme.txt (revision 7) +++ trunk/doc/readme.txt (nonexistent) @@ -1 +0,0 @@ -Please look up inside the source. \ No newline at end of file Index: trunk/src/sdram_ctrl.vhd =================================================================== --- trunk/src/sdram_ctrl.vhd (revision 7) +++ trunk/src/sdram_ctrl.vhd (nonexistent) @@ -1,484 +0,0 @@ ------------------------------------------------------------------- --- --- sdram_ctrl.vhd --- --- Module Description: --- SDRAM small&fast controller --- --- --- To Do: --- multichipselect support done --- configurable times 50% --- nios simulation support --- --- Author(s): --- Aleksey Kuzmenok, ntpqa@opencores.org --- ------------------------------------------------------------------- --- --- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG --- --- This module is free software; you can redistribute it and/or --- modify it under the terms of the GNU Lesser General Public --- License as published by the Free Software Foundation; either --- version 2.1 of the License, or (at your option) any later version. --- --- This module 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 --- Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public --- License along with this software; if not, write to the Free Software --- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --- ------------------------------------------------------------------- --- Hardware test results --- FPGA SDRAM CLK (not less than) --- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz --- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz --- ------------------------------------------------------------------- --- History --- 22.10.2006 multichipselect functionaly tested --- 10.11.2006 first successful hardware test --- 07.12.2006 proved to be fully reliable - -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; - -LIBRARY altera_mf; -USE altera_mf.altera_mf_components.all; - -entity sdram_ctrl is - generic( - DATA_WIDTH: integer:=32; - CHIPSELECTS: integer:=1; - LOG2_OF_CS: integer:=0; - BANK_WIDTH: integer:=2; - ROW_WIDTH: integer:=12; - COLUMN_WIDTH: integer:=8; - - MODE_REGISTER: integer:=48; -- 1 word burst, CAS latency=3 - - -- Only two times are configurable - -- tINIT delay between powerup and load mode register = 100 us - -- tREF refresh period = 15.625 us (64ms/4096rows) - clk_MHz: integer:=120; - t_INIT_uS: integer:=110; -- 109.9 us just to be on the save side - t_REF_nS: integer:=15384 -- 15.384 us the same purpose - - ); - port( - signal clk : IN STD_LOGIC; - signal reset : IN STD_LOGIC; - - -- IMPORTANT: for this Avalon(tm) interface - -- 'Minimum Arbitration Shares'=1 - -- 'Max Pending Read Transactions'=9 - signal avs_nios_chipselect : IN STD_LOGIC; - signal avs_nios_address : IN STD_LOGIC_VECTOR ((LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); - signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); - signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_write : IN STD_LOGIC; - signal avs_nios_read : IN STD_LOGIC; - signal avs_nios_waitrequest : OUT STD_LOGIC; - signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_readdatavalid : OUT STD_LOGIC; - - -- global export signals - signal sdram_cke : OUT STD_LOGIC; -- This pin has the fixed state '1' - signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); - signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); - signal sdram_cs_n : OUT STD_LOGIC_VECTOR ((CHIPSELECTS-1) DOWNTO 0); - signal sdram_ras_n : OUT STD_LOGIC; - signal sdram_cas_n : OUT STD_LOGIC; - signal sdram_we_n : OUT STD_LOGIC; - signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) - ); -end sdram_ctrl; - -architecture behaviour of sdram_ctrl is - - CONSTANT FIFO_WIDTH: integer:=LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - CONSTANT BE_LOW_BIT: integer:=2; - CONSTANT DATA_LOW_BIT: integer:=(DATA_WIDTH/8)+2; - CONSTANT COL_LOW_BIT: integer:=DATA_WIDTH+(DATA_WIDTH/8)+2; - CONSTANT ROW_LOW_BIT: integer:=COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - CONSTANT BANK_LOW_BIT: integer:=ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - CONSTANT CS_LOW_BIT: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - - --CONSTANT MODE: std_logic_vector((sdram_addr'length-1) downto 0):=std_logic_vector(MODE_REGISTER((sdram_addr'length-1) downto 0)); - CONSTANT INIT_PAUSE_CLOCKS: integer:=clk_MHz*t_INIT_uS; - CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*t_REF_nS)/1000; - CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! - - COMPONENT scfifo - GENERIC ( - add_ram_output_register : STRING; - intended_device_family : STRING; - lpm_numwords : NATURAL; - lpm_showahead : STRING; - lpm_type : STRING; - lpm_width : NATURAL; - lpm_widthu : NATURAL; - overflow_checking : STRING; - underflow_checking : STRING; - use_eab : STRING - ); - PORT ( - rdreq : IN STD_LOGIC ; - empty : OUT STD_LOGIC ; - aclr : IN STD_LOGIC ; - clock : IN STD_LOGIC ; - q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - wrreq : IN STD_LOGIC ; - data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - full : OUT STD_LOGIC - ); - END COMPONENT; - - -- If you ask me why there are so many states, I'll answer that all times are fixed. - -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. - -- tRP PRECHARGE command period = 3 clocks - -- tRFC AUTO REFRESH period = 10 clocks - -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks - -- tRCD ACTIVE to READ or WRITE delay = 3 clocks - -- tRAS ACTIVE to PRECHARGE command = 7 clocks - -- tRC ACTIVE to ACTIVE command period = 10 clocks - -- tWR2 Write recovery time = 2 clocks - type states is ( - INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, - INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, - INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, - REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, - REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, - ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, - IDLE,READ0,WRITE0); - signal operation: states; - - signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); - - signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); - signal refresh_counter: unsigned(15 downto 0); - signal active_counter: unsigned(2 downto 0); - signal active_address: unsigned((LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH-1) downto 0); - - signal chipselect: std_logic_vector(LOG2_OF_CS downto 0); - signal bank: std_logic_vector((sdram_ba'length-1) downto 0); - signal row: std_logic_vector((sdram_addr'length-1) downto 0); - signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); - signal data: std_logic_vector((sdram_dq'length-1) downto 0); - signal be: std_logic_vector((sdram_dqm'length-1) downto 0); - - signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; - - signal fifo_rdreq,fifo_empty: std_logic; - - signal read_latency: std_logic_vector(CAS_LATENCY downto 0); - - signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); - signal fifo_wrreq,fifo_wrfull: std_logic; - - signal i_command : STD_LOGIC_VECTOR(2 downto 0); - CONSTANT NOP: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="111"; - CONSTANT ACTIVE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="011"; - CONSTANT READ: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="101"; - CONSTANT WRITE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="100"; - CONSTANT PRECHARGE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="010"; - CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="001"; - CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="000"; - - signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); - signal i_chipselect: STD_LOGIC_VECTOR((sdram_cs_n'length-1) downto 0); - signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); - signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); - signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); - attribute ALTERA_ATTRIBUTE : string; - attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_chipselect : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; - - function DECODE(hex: std_logic_vector; size: integer) return std_logic_vector is - variable result : std_logic_vector((size-1) downto 0); - begin - result:=(others=>'1'); - result(to_integer(unsigned(hex))):='0'; - return result; - end; -begin - sdram_cke<='1'; - (sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; - sdram_cs_n <= i_chipselect; - sdram_addr <= i_address; - sdram_ba <= i_bank; - sdram_dqm <= i_dqm; - sdram_dq <= i_data; - - fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; - fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; - - avs_nios_waitrequest<=fifo_wrfull; - - fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; - - do_active<='0' when active_address=unsigned(fifo_q((fifo_q'length-1) downto (column'length+data'length+be'length+2))) else '1'; - read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; - ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; - - operation_machine:process(reset,clk) - begin - if reset='1' - then - operation<=INIT0; - active_address<=(others=>'1'); - elsif rising_edge(clk) - then - if CHIPSELECTS>1 - then - chipselect<='0'&fifo_q((FIFO_WIDTH-1) downto CS_LOW_BIT); - bank<=fifo_q((CS_LOW_BIT-1) downto BANK_LOW_BIT); - else - chipselect<=(others=>'0'); - bank<=fifo_q((FIFO_WIDTH-1) downto BANK_LOW_BIT); - end if; - - row<= fifo_q((BANK_LOW_BIT-1) downto ROW_LOW_BIT); - column<=fifo_q((ROW_LOW_BIT-1) downto COL_LOW_BIT); - data<= fifo_q((COL_LOW_BIT-1) downto DATA_LOW_BIT); - be<= fifo_q((DATA_LOW_BIT-1) downto BE_LOW_BIT); - - case operation is - when INIT0=> - if do_init='1' - then operation<=INIT1;row(10)<='1'; - end if; - when INIT1=>operation<=INIT2; - when INIT2=>operation<=INIT3; - when INIT3=>operation<=INIT4; - when INIT4=>operation<=INIT5; - when INIT5=>operation<=INIT6; - when INIT6=>operation<=INIT7; - when INIT7=>operation<=INIT8; - when INIT8=>operation<=INIT9; - when INIT9=>operation<=INIT10; - when INIT10=>operation<=INIT11; - when INIT11=>operation<=INIT12; - when INIT12=>operation<=INIT13; - when INIT13=>operation<=INIT14; - when INIT14=>operation<=INIT15; - when INIT15=>operation<=INIT16; - when INIT16=>operation<=INIT17; - when INIT17=>operation<=INIT18; - when INIT18=>operation<=INIT19; - when INIT19=>operation<=INIT20; - when INIT20=>operation<=INIT21; - when INIT21=>operation<=INIT22; - when INIT22=>operation<=INIT23; - when INIT23=>operation<=INIT24;row<=std_logic_vector(to_unsigned(MODE_REGISTER,row'length)); - when INIT24=>operation<=IDLE; - - when REFRESH0=>operation<=REFRESH1; - when REFRESH1=>operation<=REFRESH2; - when REFRESH2=>operation<=REFRESH3; - when REFRESH3=>operation<=REFRESH4; - when REFRESH4=>operation<=REFRESH5; - when REFRESH5=>operation<=REFRESH6; - when REFRESH6=>operation<=REFRESH7; - when REFRESH7=>operation<=REFRESH8; - when REFRESH8=>operation<=REFRESH9; - when REFRESH9=>operation<=REFRESH10; - when REFRESH10=>operation<=REFRESH11; - when REFRESH11=>operation<=REFRESH12; - when REFRESH12=>operation<=REFRESH13; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto ROW_LOW_BIT)); - when REFRESH13=>operation<=REFRESH14; - when REFRESH14=>operation<=IDLE; - - when ACTIVE0=>operation<=ACTIVE1; - when ACTIVE1=>operation<=ACTIVE2; - when ACTIVE2=>operation<=ACTIVE3; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto ROW_LOW_BIT)); - when ACTIVE3=>operation<=ACTIVE4; - when ACTIVE4=>operation<=IDLE; - - when others=> - if do_refresh='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=REFRESH0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif do_active='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=ACTIVE0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif fifo_empty='1' - then - operation<=IDLE; - elsif fifo_q(1)='1' --write - then - if read_latency(CAS_LATENCY-1 downto 0)>"000" - then operation<=IDLE; - else operation<=WRITE0; - end if; - elsif fifo_q(0)='1' --read - then - operation<=READ0; - end if; - end case; - end if; - end process; - - control_latency:process(reset,clk) - begin - if reset='1' - then - read_latency<=(others=>'0'); - elsif rising_edge(clk) - then - read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); - if operation=READ0 - then read_latency(0)<='1'; - else read_latency(0)<='0'; - end if; - end if; - end process; - latch_readdata:process(reset,clk) - begin - if reset='1' - then - avs_nios_readdata<=(others=>'0'); - avs_nios_readdatavalid<='0'; - elsif rising_edge(clk) - then - avs_nios_readdata<=sdram_dq; - avs_nios_readdatavalid<=read_latency(CAS_LATENCY); - end if; - end process; - initialization:process(reset,clk) - begin - if rising_edge(clk) - then - if init_counter>0 - then - init_counter<=init_counter-1; - else do_init<='1'; - end if; - end if; - end process; - refreshing:process(clk,reset) - begin - if reset='1' - then - refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='0'; - elsif rising_edge(clk) - then - if refresh_counter=to_unsigned(0,refresh_counter'length) - then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='1'; - else refresh_counter<=refresh_counter-1; - end if; - if operation=REFRESH0 or operation=REFRESH5 - then do_refresh<='0'; - end if; - end if; - end process; - active_period:process(reset,clk) - begin - if reset='1' - then - active_counter<=(others=>'0'); - tRCD_not_expired<='0'; - elsif rising_edge(clk) - then - if operation=ACTIVE3 or operation=REFRESH13 - then active_counter<=to_unsigned(5,active_counter'length); - elsif active_counter>0 - then active_counter<=active_counter-1; - end if; - end if; - if active_counter>0 - then tRCD_not_expired<='1'; - else tRCD_not_expired<='0'; - end if; - end process; - latch_controls:process(clk,reset) - begin - if reset='1' - then - i_command<=NOP; - i_address<=(others=>'0'); - i_bank<=(others=>'0'); - i_dqm<=(others=>'0'); - i_data<=(others=>'Z'); - i_chipselect<=(others=>'1'); - elsif rising_edge(clk) - then - i_command<=NOP; - i_chipselect<=DECODE(chipselect,i_chipselect'length); - i_bank<=bank; - i_address<=(others=>'0'); - i_address((column'length-1) downto 0)<=column; - i_data<=(others=>'Z'); - i_dqm<=(others=>'0'); - - case operation is - when INIT1|REFRESH0|ACTIVE0 => - i_command<=PRECHARGE; - i_address<=row; - i_chipselect<=(others=>'0'); - when INIT4|INIT14|REFRESH3 => - i_command<=AUTO_REFRESH; - i_chipselect<=(others=>'0'); - when INIT24=> - i_command<=LOAD_MODE_REGISTER; - i_address<=row; - i_chipselect<=(others=>'0'); - when ACTIVE3|REFRESH13 => - i_command<=ACTIVE; - i_address<=row; - when READ0 => - i_command<=READ; - when WRITE0 => - i_command<=WRITE; - i_dqm<=not be; - i_data<=data; - when OTHERS => - end case; - end if; - end process; - - fifo: scfifo - GENERIC MAP ( - add_ram_output_register => "ON", - intended_device_family => "Auto", - lpm_numwords => 4, - lpm_showahead => "ON", - lpm_type => "scfifo", - lpm_width => FIFO_WIDTH, - lpm_widthu => 2, - overflow_checking => "ON", - underflow_checking => "ON", - use_eab => "ON" - ) - PORT MAP ( - rdreq => fifo_rdreq, - aclr => reset, - clock => clk, - wrreq => fifo_wrreq, - data => fifo_data, - empty => fifo_empty, - q => fifo_q, - full => fifo_wrfull - ); -end behaviour; Index: trunk/syn/sdram_ctrl/class.ptf =================================================================== --- trunk/syn/sdram_ctrl/class.ptf (revision 7) +++ trunk/syn/sdram_ctrl/class.ptf (nonexistent) @@ -1,972 +0,0 @@ -# -# This class.ptf file built by Component Editor -# 2006.09.25.10:24:12 -# -# DO NOT MODIFY THIS FILE -# If you hand-modify this file you will likely -# interfere with Component Editor's ability to -# read and edit it. And then Component Editor -# will overwrite your changes anyway. So, for -# the very best results, just relax and -# DO NOT MODIFY THIS FILE -# -CLASS sdram_ctrl -{ - CB_GENERATOR - { - HDL_FILES - { - FILE - { - use_in_simulation = "1"; - use_in_synthesis = "1"; - filepath = "hdl/sdram_ctrl.vhd"; - } - } - top_module_name = "sdram_ctrl.vhd:sdram_ctrl"; - emit_system_h = "0"; - LIBRARIES - { - library = "ieee.std_logic_1164.all"; - library = "ieee.numeric_std.all"; - library = "altera_mf.altera_mf_components.all"; - library = "std.standard.all"; - } - } - MODULE_DEFAULTS global_signals - { - class = "sdram_ctrl"; - class_version = "1.1"; - SYSTEM_BUILDER_INFO - { - Instantiate_In_System_Module = "1"; - Has_Clock = "1"; - Top_Level_Ports_Are_Enumerated = "1"; - } - COMPONENT_BUILDER - { - GLS_SETTINGS - { - } - } - PORT_WIRING - { - PORT clk - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "clk"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT reset - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "reset"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_cke - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_ba - { - width = "-1"; - width_expression = "((bank_width - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_addr - { - width = "-1"; - width_expression = "((row_width - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_cs_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_ras_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_cas_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_we_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_dq - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "inout"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_dqm - { - width = "-1"; - width_expression = "(((data_width / 8) - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - } - WIZARD_SCRIPT_ARGUMENTS - { - hdl_parameters - { - data_width = "32"; - bank_width = "4"; - row_width = "12"; - column_width = "8"; - clk_mhz = "120"; - } - } - SIMULATION - { - DISPLAY - { - } - } - SLAVE nios - { - SYSTEM_BUILDER_INFO - { - Bus_Type = "avalon"; - Address_Group = "1"; - Has_Clock = "0"; - Address_Width = "-1"; - Address_Alignment = "dynamic"; - Data_Width = "8"; - Has_Base_Address = "1"; - Has_IRQ = "0"; - Setup_Time = "0"; - Hold_Time = "0"; - Read_Wait_States = "peripheral_controlled"; - Write_Wait_States = "peripheral_controlled"; - Read_Latency = "0"; - Maximum_Pending_Read_Transactions = "9"; - Active_CS_Through_Read_Latency = "0"; - Is_Printable_Device = "1"; - Is_Memory_Device = "1"; - Is_Readable = "1"; - Is_Writable = "1"; - Minimum_Uninterrupted_Run_Length = "1"; - } - COMPONENT_BUILDER - { - AVS_SETTINGS - { - Setup_Value = "0"; - Read_Wait_Value = "1"; - Write_Wait_Value = "1"; - Hold_Value = "0"; - Timing_Units = "cycles"; - Read_Latency_Value = "0"; - Minimum_Arbitration_Shares = "1"; - Active_CS_Through_Read_Latency = "0"; - Max_Pending_Read_Transactions_Value = "9"; - Address_Alignment = "dynamic"; - Is_Printable_Device = "1"; - interface_name = "Avalon Slave"; - external_wait = "1"; - Is_Memory_Device = "1"; - } - } - PORT_WIRING - { - PORT avs_nios_chipselect - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "chipselect"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_address - { - width = "-1"; - width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; - direction = "input"; - type = "address"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_byteenable - { - width = "-1"; - width_expression = "(((data_width / 8) - 1)) - (0) + 1"; - direction = "input"; - type = "byteenable"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_writedata - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "input"; - type = "writedata"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_write - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "write"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_read - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "read"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_waitrequest - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "waitrequest"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_readdata - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "output"; - type = "readdata"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_readdatavalid - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "readdatavalid"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - } - } - } - USER_INTERFACE - { - USER_LABELS - { - name = "sdram_ctrl"; - technology = "Opencores"; - } - WIZARD_UI the_wizard_ui - { - title = "sdram_ctrl - {{ $MOD }}"; - CONTEXT - { - H = "WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"; - M = ""; - SBI_global_signals = "SYSTEM_BUILDER_INFO"; - SBI_nios = "SLAVE nios/SYSTEM_BUILDER_INFO"; - # The following signals have parameterized widths: - PORT_sdram_ba = "PORT_WIRING/PORT sdram_ba"; - PORT_sdram_addr = "PORT_WIRING/PORT sdram_addr"; - PORT_sdram_dq = "PORT_WIRING/PORT sdram_dq"; - PORT_sdram_dqm = "PORT_WIRING/PORT sdram_dqm"; - PORT_avs_nios_address = "SLAVE nios/PORT_WIRING/PORT avs_nios_address"; - PORT_avs_nios_byteenable = "SLAVE nios/PORT_WIRING/PORT avs_nios_byteenable"; - PORT_avs_nios_writedata = "SLAVE nios/PORT_WIRING/PORT avs_nios_writedata"; - PORT_avs_nios_readdata = "SLAVE nios/PORT_WIRING/PORT avs_nios_readdata"; - } - PAGES main - { - PAGE 1 - { - align = "left"; - title = "sdram_ctrl 1.1 Settings"; - layout = "vertical"; - TEXT - { - title = "Built on: 2006.09.25.10:24:12"; - } - TEXT - { - title = "Class name: sdram_ctrl"; - } - TEXT - { - title = "Class version: 1.1"; - } - TEXT - { - title = "Component name: sdram_ctrl"; - } - TEXT - { - title = "Component Group: Opencores"; - } - GROUP parameters - { - title = "Parameters"; - layout = "form"; - align = "left"; - EDIT e1 - { - id = "data_width"; - editable = "1"; - title = "data_width:"; - columns = "40"; - tooltip = "default value: 32"; - DATA - { - $H/data_width = "$"; - } - q = "'"; - warning = "{{ if(!(regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/data_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/data_width,'ugly_-?[0-9]+')))'data_width must be numeric constant, not '+$H/data_width; }}"; - } - EDIT e2 - { - id = "bank_width"; - editable = "1"; - title = "bank_width:"; - columns = "40"; - tooltip = "default value: 4"; - DATA - { - $H/bank_width = "$"; - } - q = "'"; - warning = "{{ if(!(regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/bank_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/bank_width,'ugly_-?[0-9]+')))'bank_width must be numeric constant, not '+$H/bank_width; }}"; - } - EDIT e3 - { - id = "row_width"; - editable = "1"; - title = "row_width:"; - columns = "40"; - tooltip = "default value: 12"; - DATA - { - $H/row_width = "$"; - } - q = "'"; - warning = "{{ if(!(regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/row_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/row_width,'ugly_-?[0-9]+')))'row_width must be numeric constant, not '+$H/row_width; }}"; - } - EDIT e4 - { - id = "column_width"; - editable = "1"; - title = "column_width:"; - columns = "40"; - tooltip = "default value: 8"; - DATA - { - $H/column_width = "$"; - } - q = "'"; - warning = "{{ if(!(regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/column_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/column_width,'ugly_-?[0-9]+')))'column_width must be numeric constant, not '+$H/column_width; }}"; - } - EDIT e5 - { - id = "clk_mhz"; - editable = "1"; - title = "clk_mhz:"; - columns = "40"; - tooltip = "default value: 120"; - DATA - { - $H/clk_mhz = "$"; - } - q = "'"; - warning = "{{ if(!(regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/clk_mhz,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/clk_mhz,'ugly_-?[0-9]+')))'clk_mhz must be numeric constant, not '+$H/clk_mhz; }}"; - } - } - GROUP variable_port_widths - { - # This group is for display only, to preview parameterized port widths - title = "Parameterized Signal Widths"; - layout = "form"; - align = "left"; - EDIT sdram_ba_width - { - id = "sdram_ba_width"; - editable = "0"; - title = "sdram_ba[((bank_width - 1)) - (0) + 1]:"; - tooltip = "sdram_ba[((bank_width - 1)) - (0) + 1]
direction: output
signal type: export"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_sdram_ba/width = (int((( ( $H/bank_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_sdram_ba/width = "$"; - } - warning = "{{ if($PORT_sdram_ba/width <= 0)('width of sdram_ba must be greater than zero' ) }}"; - } - EDIT sdram_addr_width - { - id = "sdram_addr_width"; - editable = "0"; - title = "sdram_addr[((row_width - 1)) - (0) + 1]:"; - tooltip = "sdram_addr[((row_width - 1)) - (0) + 1]
direction: output
signal type: export"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_sdram_addr/width = (int((( ( $H/row_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_sdram_addr/width = "$"; - } - warning = "{{ if($PORT_sdram_addr/width <= 0)('width of sdram_addr must be greater than zero' ) }}"; - } - EDIT sdram_dq_width - { - id = "sdram_dq_width"; - editable = "0"; - title = "sdram_dq[((data_width - 1)) - (0) + 1]:"; - tooltip = "sdram_dq[((data_width - 1)) - (0) + 1]
direction: inout
signal type: export"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_sdram_dq/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_sdram_dq/width = "$"; - } - warning = "{{ if($PORT_sdram_dq/width <= 0)('width of sdram_dq must be greater than zero' ) }}"; - } - EDIT sdram_dqm_width - { - id = "sdram_dqm_width"; - editable = "0"; - title = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]:"; - tooltip = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]
direction: output
signal type: export"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_sdram_dqm/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_sdram_dqm/width = "$"; - } - warning = "{{ if($PORT_sdram_dqm/width <= 0)('width of sdram_dqm must be greater than zero' ) }}"; - } - EDIT avs_nios_address_width - { - id = "avs_nios_address_width"; - editable = "0"; - title = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]:"; - tooltip = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]
direction: input
signal type: address"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_avs_nios_address/width = (int((((( ( $H/bank_width ) + ( $H/row_width ) ) + ( $H/column_width ) ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - dummy_dummy = "{{ $SBI_nios/Address_Width = $PORT_avs_nios_address/width; }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_avs_nios_address/width = "$"; - } - warning = "{{ if($PORT_avs_nios_address/width <= 0)('width of avs_nios_address must be greater than zero' ) }}"; - } - EDIT avs_nios_byteenable_width - { - id = "avs_nios_byteenable_width"; - editable = "0"; - title = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]:"; - tooltip = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]
direction: input
signal type: byteenable"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_avs_nios_byteenable/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_avs_nios_byteenable/width = "$"; - } - warning = "{{ if($PORT_avs_nios_byteenable/width <= 0)('width of avs_nios_byteenable must be greater than zero' ) }}"; - } - EDIT avs_nios_writedata_width - { - id = "avs_nios_writedata_width"; - editable = "0"; - title = "avs_nios_writedata[((data_width - 1)) - (0) + 1]:"; - tooltip = "avs_nios_writedata[((data_width - 1)) - (0) + 1]
direction: input
signal type: writedata"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_avs_nios_writedata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_writedata/width - 1) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_avs_nios_writedata/width = "$"; - } - warning = "{{ if($PORT_avs_nios_writedata/width <= 0)('width of avs_nios_writedata must be greater than zero' ) }}"; - } - EDIT avs_nios_readdata_width - { - id = "avs_nios_readdata_width"; - editable = "0"; - title = "avs_nios_readdata[((data_width - 1)) - (0) + 1]:"; - tooltip = "avs_nios_readdata[((data_width - 1)) - (0) + 1]
direction: output
signal type: readdata"; - # This expression should emulate the HDL, and assign the port width - dummy = "{{ $PORT_avs_nios_readdata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; - dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_readdata/width - 1) + 1); }}"; - DATA - { - # The EDIT field is noneditable, so this just reads the current width. - $PORT_avs_nios_readdata/width = "$"; - } - warning = "{{ if($PORT_avs_nios_readdata/width <= 0)('width of avs_nios_readdata must be greater than zero' ) }}"; - } - } - } - } - } - } - SOPC_Builder_Version = "5.10"; - COMPONENT_BUILDER - { - HDL_PARAMETERS - { - # generated by CBDocument.getParameterContainer - # used only by Component Editor - HDL_PARAMETER data_width - { - parameter_name = "data_width"; - type = "integer"; - default_value = "32"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER bank_width - { - parameter_name = "bank_width"; - type = "integer"; - default_value = "4"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER row_width - { - parameter_name = "row_width"; - type = "integer"; - default_value = "12"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER column_width - { - parameter_name = "column_width"; - type = "integer"; - default_value = "8"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER clk_mhz - { - parameter_name = "clk_mhz"; - type = "integer"; - default_value = "120"; - editable = "1"; - tooltip = ""; - } - } - SW_FILES - { - } - built_on = "2006.09.25.10:24:12"; - CACHED_HDL_INFO - { - # cached hdl info, emitted by CBFrameRealtime.getDocumentCachedHDLInfoSection - # used only by Component Builder - FILE sdram_ctrl.vhd - { - file_mod = "Mon Sep 18 18:08:50 EEST 2006"; - quartus_map_start = "Mon Sep 25 10:22:36 EEST 2006"; - quartus_map_finished = "Mon Sep 25 10:22:58 EEST 2006"; - #found 1 valid modules - WRAPPER sdram_ctrl - { - CLASS sdram_ctrl - { - CB_GENERATOR - { - HDL_FILES - { - FILE - { - use_in_simulation = "1"; - use_in_synthesis = "1"; - filepath = "H:/Work/Home_stuff/opencores/sdram_ctrl/src/sdram_ctrl.vhd"; - } - } - top_module_name = "sdram_ctrl"; - emit_system_h = "0"; - LIBRARIES - { - library = "ieee.std_logic_1164.all"; - library = "ieee.numeric_std.all"; - library = "altera_mf.altera_mf_components.all"; - library = "std.standard.all"; - } - } - MODULE_DEFAULTS global_signals - { - class = "sdram_ctrl"; - class_version = "1.0"; - SYSTEM_BUILDER_INFO - { - Instantiate_In_System_Module = "1"; - } - SLAVE nios - { - SYSTEM_BUILDER_INFO - { - Bus_Type = "avalon"; - } - PORT_WIRING - { - PORT avs_nios_chipselect - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "chipselect"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_address - { - width = "-1"; - width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; - direction = "input"; - type = "address"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_byteenable - { - width = "-1"; - width_expression = "(((data_width / 8) - 1)) - (0) + 1"; - direction = "input"; - type = "byteenable"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_writedata - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "input"; - type = "writedata"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_write - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "write"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_read - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "read"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_waitrequest - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "waitrequest"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_readdata - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "output"; - type = "readdata"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT avs_nios_readdatavalid - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "readdatavalid"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - } - } - SLAVE avalon_slave_0 - { - SYSTEM_BUILDER_INFO - { - Bus_Type = "avalon"; - } - PORT_WIRING - { - PORT sdram_cke - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_ba - { - width = "-1"; - width_expression = "((bank_width - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_addr - { - width = "-1"; - width_expression = "((row_width - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_cs_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_ras_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_cas_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_we_n - { - width = "1"; - width_expression = ""; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_dq - { - width = "-1"; - width_expression = "((data_width - 1)) - (0) + 1"; - direction = "inout"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT sdram_dqm - { - width = "-1"; - width_expression = "(((data_width / 8) - 1)) - (0) + 1"; - direction = "output"; - type = "export"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - } - } - PORT_WIRING - { - PORT clk - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "clk"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - PORT reset - { - width = "1"; - width_expression = ""; - direction = "input"; - type = "reset"; - is_shared = "0"; - vhdl_record_name = ""; - vhdl_record_type = ""; - } - } - } - USER_INTERFACE - { - USER_LABELS - { - name = "sdram_ctrl"; - technology = "imported components"; - } - } - SOPC_Builder_Version = "0.0"; - COMPONENT_BUILDER - { - HDL_PARAMETERS - { - # generated by CBDocument.getParameterContainer - # used only by Component Editor - HDL_PARAMETER data_width - { - parameter_name = "data_width"; - type = "integer"; - default_value = "32"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER bank_width - { - parameter_name = "bank_width"; - type = "integer"; - default_value = "4"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER row_width - { - parameter_name = "row_width"; - type = "integer"; - default_value = "12"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER column_width - { - parameter_name = "column_width"; - type = "integer"; - default_value = "8"; - editable = "1"; - tooltip = ""; - } - HDL_PARAMETER clk_mhz - { - parameter_name = "clk_mhz"; - type = "integer"; - default_value = "120"; - editable = "1"; - tooltip = ""; - } - } - } - } - } - } - } - } - ASSOCIATED_FILES - { - Add_Program = "the_wizard_ui"; - Edit_Program = "the_wizard_ui"; - Generator_Program = "cb_generator.pl"; - } -} Index: trunk/syn/sdram_ctrl/cb_generator.pl =================================================================== --- trunk/syn/sdram_ctrl/cb_generator.pl (revision 7) +++ trunk/syn/sdram_ctrl/cb_generator.pl (nonexistent) @@ -1,1159 +0,0 @@ -# | file: cb_generator.pl -# | -# | This SOPC Builder Generator program is provided by -# | the Component Builder application. It is copied -# | straight across and is data-driven from its command -# | line arguments and the PTF files referenced. -# | -# | Its purpose is to construct an HDL "wrapper" for -# | a particular instance of a particular SOPC Builder -# | peripheral. This wrapper resolves the instance -# | name and any HDL parameterization. -# | -# +------------------------------------------- - - - -# +------------------------------------------- -# | - -use strict; -use format_conversion_utils; -use ptf_parse; -use wiz_utils; -use europa_all; -use run_system_command_utils; - -# | -# +------------------------------------------- - - - -# +------------------------------------------- -# | -# | first pass: include all of generator_libarary.pm RIGHT HERE. -# | dvb04.08.02 -# | then prune down to actual functionality. -# | -# | TODO: Rewrite this whole file into something readable -# | this is much more confusing than I'm comfortable with. dvb04. -# | (though it does seem to work.) -# | - -my $DEBUG_DEFAULT_GEN = 1; - -#This is the global hash of arguments passed in by the generator program - -my $generator_hr = { - wrapper_args => { - make_wrapper => 0, - top_module_name => "", - simulate_hdl => 1, - ports => "", - }, - class_ptf_hr => "", - module_ptf_hr => "", - system_ptf_hr => "", - language => "", - external_args => "", - external_args_hr => "", - project_path_widget => "__PROJECT_DIRECTORY__", - generator_mode => "silent", - }; - - -sub generator_print_verbose -{ - my ($info) = (@_); - - if($generator_hr->{generator_mode} eq "verbose"){ - print("cb_generator.pl: ".$info); - } -} - -sub generator_enable_mode -{ - my ($mode) = (@_); - $generator_hr->{generator_mode} = $mode; -} - -sub generator_get_system_ptf_handle -{ - return $generator_hr->{system_ptf_hr}; -} - -sub generator_get_language -{ - return $generator_hr->{language}; -} - -sub generator_get_class_ptf_handle -{ - return $generator_hr->{class_ptf_hr}; -} - -sub default_ribbit -{ - my ($arg) = (@_); - &ribbit("\n\n--Error: default_gen_lib: $arg\n"); -} - - -sub _copy_files -{ - my ($dest_dir, $source_dir, @files) = (@_); - my $function_name; - - #validate args - &default_ribbit("No target dir for function copy_files!") - unless ($dest_dir ne ""); - - &default_ribbit("No source dir for function copy_files!") - unless ($source_dir ne ""); - - &default_ribbit("No files for function copy_files!") - unless (@files != 0); - - - #check for valid directories - opendir (SDIR, $source_dir) or - &default_ribbit("can't open $source_dir !"); - - opendir (DDIR, $dest_dir) or - &default_ribbit("can't open $dest_dir !"); - - - foreach my $source_file(@files){ - # | - # | Separate out the source subdir and the source filename - # | - my $source_subdir = ""; - my $source_filename = $source_file; - - if($source_filename =~ /^(.*)\/(.*)$/) # break on last slash - { - $source_subdir = "/$1"; # embed its leading slash, for concatty - $source_filename = $2; - } - - my $source_fullpath = "$source_dir$source_subdir/$source_filename"; - my $dest_fullpath = "$dest_dir/$source_filename"; - - &Perlcopy($source_fullpath, $dest_fullpath); - &generator_print_verbose("Copying file: \"$source_fullpath\"" - . " to \"$dest_fullpath\".\n"); - } - - closedir (SDIR); - closedir (DDIR); -} - - -sub get_module_wrapper_arg_hash_from_system_ptf_file -{ - my $module_ptf_hr = $generator_hr->{module_ptf_hr}; - - my @list_of_sections = ("MASTER","SLAVE","PORT_WIRING"); - my @port_list; - foreach my $section(@list_of_sections){ - my $number = get_child_count($module_ptf_hr, $section); - - for(my $initial=0; $initial < $number; $initial++){ - - my $interface_section = get_child($module_ptf_hr, $initial, $section); - my $interface_section_name = get_data($interface_section); - - my $port_wiring_section; - if($section ne "PORT_WIRING"){ - $port_wiring_section = - get_child_by_path($module_ptf_hr, $section." ".$interface_section_name."/PORT_WIRING"); - }else{ - $port_wiring_section = - get_child_by_path($module_ptf_hr, $section); - } - my $num_ports = get_child_count($port_wiring_section, "PORT"); - foreach(my $port_count = 0; $port_count < $num_ports; $port_count++){ - my $port = get_child($port_wiring_section, $port_count, "PORT"); - - my %port_info_struct; - $port_info_struct{name} = get_data($port); - $port_info_struct{direction} = get_data_by_path($port, "direction"); - $port_info_struct{width} = get_data_by_path($port, "width"); - $port_info_struct{vhdl_record_name} = get_data_by_path($port, "vhdl_record_name"); - $port_info_struct{vhdl_record_type} = get_data_by_path($port, "vhdl_record_type"); - - push(@port_list, \%port_info_struct); - - } - } - } - $generator_hr->{wrapper_args}{ports} = \@port_list; -} - - -sub generator_make_module_wrapper -{ - my ($simulate_hdl, $top_module_name, $module_language) = (@_); - - &default_ribbit("generator_make_module_wrapper: no arg0 passed in for simulate_hdl\n") - if($simulate_hdl eq ''); - - &default_ribbit("generator_make_module_wrapper: no arg1 passed in for top_module_name\n") - unless($top_module_name); - - $generator_hr->{wrapper_args}{simulate_hdl} = $simulate_hdl; - $generator_hr->{wrapper_args}{top_module_name} = $top_module_name; - $generator_hr->{wrapper_args}{make_wrapper} = 1; - $generator_hr->{wrapper_args}{module_language} = $module_language; - -} - - - - -# | -# | recognize varous number forms, -# | return 'h0123abcd-ish. -# | -sub turn_anything_into_appropriate_string($$$$) - { - my ($value,$type,$editable,$module_language) = (@_); - - return $value if($value =~ /^\"/); # quoted string: unscathed - return $value if($type eq "string"); # string: anything is ok - - return $value if(!$editable); # and you know, if you can't change it, keep it! - - - # | - # | first, convert to a number - # | - my $base = 10; - my $n = $value; - my $width = 32; - my $number = 0; - - $value = lc($value); # lower case - - if($value =~ /^([0-9]*)\'([hbo])(.*)$/) - { - # | tick notation: AOK for verilog - if($module_language eq "verilog") - { - $number = $value; - } - # | - # | note: at this point, we could notice if the - # | result should be vhdl binary, and convert - # | to that, avoiding the precision-losing - # | integer intermediary - # | - # | (alternatively, we could use a binary string - # | always as the intermediate form, rather than - # | a precision-losing int.) - # | - else - { - $width = $1; - my $baseletter = $2; - my $digits = $3; - - if($baseletter eq "h") - { - $base = 16; - } - elsif($baseletter eq "b") - { - $base = 2; - } - elsif($baseletter eq "o") # must be - { - $base = 8; - } - - $digits =~ s/[ _-]//g; # crush out dividing value - - while(length($digits) > 0) - { - my $digit = substr($digits,0,1); - $digits = substr($digits,1); - my $digitvalue = hex($digit); # how handy - $number = $number * $base + $digitvalue; - } - } - } - elsif($value =~ /^0x(.*)$/) - { - $number = hex($1); - } - else # try for decimal - { - $number = int(1 * $value); - } - - # | - # | ok, we have a number. If our target type - # | is "std_logic_vector(this downto that)" - # | for tricky VHDL, we - # | must quote a binary string out of it. - # | - - if(($module_language eq "vhdl") and ($type =~ /^.*\((\d+) downto (\d+)\).*$/)) - { - my ($high_bit,$low_bit) = ($1,$2); - my $binary = ""; - for(my $bit = $low_bit; $bit <= $high_bit; $bit++) - { - $binary = ($number % 2) . $binary; - $number = int($number >> 1); - } - - $number = '"' . $binary . '"'; - } - - return $number; - } - -# -# return @array of vhdl libraries, if any, from the class.ptf -sub get_libraries() -{ - my $class_ptf = generator_get_class_ptf_handle(); - my @libraries; - my $libraries_ptf = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/LIBRARIES"); - - if($libraries_ptf) - { - my $library_count = get_child_count($libraries_ptf,"library"); - for(my $i = 0; $i < $library_count; $i++) - { - my $library_ptf = get_child($libraries_ptf,$i,"library"); - my $library_name = get_data($library_ptf); - push(@libraries,$library_name); - } - } - - return @libraries; -} - - - -sub _generator_make_module_wrapper -{ - - my $wrapper_args = $generator_hr->{wrapper_args}; - my $no_black_box = $wrapper_args->{simulate_hdl}; - my $top_module_name = $wrapper_args->{top_module_name}; - my $language = $generator_hr->{language}; - my @external_args = @{$generator_hr->{external_args}}; - my $module_ptf_hr = $generator_hr->{module_ptf_hr}; - - ### Build Module - my $project = e_project->new(@external_args); - my $top = $project->top(); - - # add the ports to the system module - my @ports; - - foreach my $port_hash(@{$wrapper_args->{ports}}){ - my $porto = e_port->new({ - name => $port_hash->{name}, - width => $port_hash->{width}, - direction => $port_hash->{direction}, - vhdl_record_name => $port_hash->{vhdl_record_name}, - vhdl_record_type => $port_hash->{vhdl_record_type} - }); - push(@ports, $porto); - } - $top->add_contents(@ports); - - - - - - # +---------------------------------------- - # | Get parameters from class.ptf - # | create @array of parameters, eacho - # | one like name=>, default=>, type=>, - # | - # | These are the definitions of parameters for - # | ANY instance of this module; we need to - # | have them in the "wrapee" module so that - # | when the system bus is knitted together - # | the parameter types can be properly used. - # | - # | (as it turns out, verilog doesnt need - # | them, but vhld does) - # | - # | dvb2004 - - - my @e_hdl_parameters; # list of e_parameters - - my $class_ptf = generator_get_class_ptf_handle(); - my $hdl_parameter_definitions_ptf = get_child_by_path($class_ptf,"CLASS/COMPONENT_BUILDER/HDL_PARAMETERS"); - - my @libraries = get_libraries(); - - my $hdl_parameter_count = get_child_count($hdl_parameter_definitions_ptf,"HDL_PARAMETER"); - - my $module_language = $generator_hr->{wrapper_args}{module_language}; - - for(my $i = 0; $i < $hdl_parameter_count; $i++) - { - my $a_parameter = get_child($hdl_parameter_definitions_ptf,$i,"HDL_PARAMETER"); - my $parameter_editable = get_data_by_path($a_parameter,"editable"); - if($parameter_editable) - { - my $boring_name = get_data($a_parameter); # legal guinevere-ized - my $name = get_data_by_path($a_parameter,"parameter_name"); # original HDL name - my $default = get_data_by_path($a_parameter,"default_value"); - my $type = get_data_by_path($a_parameter,"type"); - - $default = turn_anything_into_appropriate_string($default,$type,1,$module_language); - - my $a_parameter = e_parameter->new - ({ - name => $name, - default => $default, - type => $type - }); - - push (@e_hdl_parameters,$a_parameter); - } - } - - - - # | and @e_hdl_parameters is used below in the wrapee module - # +-------------------------------------------- - - # +-------------------------------------------- - # | Now, we build a "hdl_parameter_map", which is just - # | your basic hash table with keys (parameters) - # | and values (parameter values). - # | - # | these are the particular values for this instance. - # | - - my %hdl_parameter_map; - my $module_ptf = $generator_hr->{module_ptf_hr}; - my $hdl_parameters_ptf = - get_child_by_path($module_ptf,"WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"); - - my $child_count = get_child_count($hdl_parameters_ptf); - - for(my $i = 0; $i < $child_count; $i++) - { - my $a_parameter = get_child($hdl_parameters_ptf,$i); - - my $boring_name = get_name($a_parameter); - my $value = get_data($a_parameter); - - # refer back to the original HDL name... - my $parameter_definition_ptf = get_child_by_path($hdl_parameter_definitions_ptf,"HDL_PARAMETER $boring_name"); - my $parameter_name = get_data_by_path($parameter_definition_ptf,"parameter_name"); - my $parameter_type = get_data_by_path($parameter_definition_ptf,"type"); - my $parameter_editable = get_data_by_path($parameter_definition_ptf,"editable"); - - $value = turn_anything_into_appropriate_string($value,$parameter_type,$parameter_editable,$module_language); - - # | - # | our internal _dummy assignment shows up here - # | without a corresponding hdl entry. we - # | ignore it. - # | - - if(($parameter_name ne "") and $parameter_editable) - { - $hdl_parameter_map{$parameter_name} = $value; - } - } - - my $wrapee_module; - $wrapee_module = e_module->new({ - name => $top_module_name, - contents => [@ports,@e_hdl_parameters], - do_black_box => 0, - do_ptf => 0, - _hdl_generated => 1, - _explicitly_empty_module => 1, - }); - - # VHDL Libraries, from PTF file... - $wrapee_module->add_vhdl_libraries(@libraries); - $top->add_vhdl_libraries(@libraries); - - - $top->add_contents ( - e_instance->new({ - module => $wrapee_module, - parameter_map => \%hdl_parameter_map - }), - ); - - $project->top()->do_ptf(0); - $project->do_write_ptf(0); - - - my $module_file = $project->_target_module_name().".v"; - $module_file = $project->_target_module_name().".vhd" - if($language eq "vhdl"); - - $module_file = $generator_hr->{project_path_widget}."/".$module_file; - &generator_set_files_in_system_ptf("Synthesis_HDL_Files", ($module_file)); - $project->output(); - - - # if you don't want a simulation model, you don't get a simulation model - if($no_black_box eq "0") - { - my $black_project = e_project->new(@external_args); - $black_project->_target_module_name($top_module_name); - my $black_top = $black_project->top(); - - - - $black_top->add_contents(@ports); - my $black_top_instance; - $black_top_instance = e_module->new({ - name => $wrapper_args->{top_module_name}."_bb", - contents => [@ports], - do_black_box => 1, - do_ptf => 0, - _hdl_generated => 0, - _explicitly_empty_module => 1, - }); - - $black_top->add_contents ( - e_instance->new({ - module => $black_top_instance, - }), - ); - - - - - $black_project->top()->do_ptf(0); - $black_project->do_write_ptf(0); - - my $black_module_file = $black_project->_target_module_name().".v"; - $black_module_file = $black_project->_target_module_name().".vhd" - if($language eq "vhdl"); - - - $black_module_file = $generator_hr->{project_path_widget}."/".$black_module_file; - &generator_set_files_in_system_ptf("Simulation_HDL_Files", ($black_module_file)); - -# &set_data_by_path($module_ptf_hr, "HDL_INFO/Simulation_HDL_Files", $black_module_file); - - - $black_project->output(); - } - -} - -#### -# Args: $file_type : "synthesis", "synthesis_only", "simulation" -# @file_list : an array of files. This list of files is assumed to be relative to the -# component's directory - - -my $decoder_ring_hr = { - quartus_only => { - copy => 1, - copy_to => "project", - ptf_set => 0, - }, - simulation_only => { - copy => 1, - copy_to => "simulation", - ptf_set => 1, - ptf_section => "Simulation_HDL_Files", - }, - simulation_and_quartus => { - copy => 1, - copy_to => "project", - ptf_set => 1, - ptf_section => "Synthesis_HDL_Files", - }, - precompiled_simulation_files => { - copy => 0, - ptf_set => 1, - ptf_section => "Precompiled_Simulation_Library_Files", - }, - }; - - - - -sub generator_copy_files_and_set_system_ptf -{ - my ($hdl_section, @file_list) = (@_); - - my $ptf_path_prefix = ""; - my $external_args_hr = $generator_hr->{external_args_hr}; - my @new_file_array; - - #validate first - my $decoder_hash = $decoder_ring_hr->{$hdl_section}; - &default_ribbit("generator_copy_files_and_set_system_ptf: No understood HDL section passed in for first arg\n") - unless($decoder_ring_hr->{$hdl_section} ne ""); - - &generator_print_verbose("generator_copy_files_and_set_system_ptf: copying files for section ".$hdl_section."\n"); - - #copy second - my @new_file_array; - - # If we need to copy over some files, then we need to make sure we are - # keeping track of what files we copy over. - # Otherwise, we just need to keep track of the files that the user has asked to copy over - # and use these instead. - if($decoder_hash->{copy}){ - my $copy_to_location; - my $copy_from_location; - - if($decoder_hash->{copy_to} eq "project"){ - $copy_to_location = $external_args_hr->{system_directory}; - }elsif($decoder_hash->{copy_to} eq "simulation"){ - $copy_to_location = $external_args_hr->{system_sim_dir}; - }else{ - &default_ribbit("generator_copy_files_and_set_system_ptf: No understood copy files to location\n"); - } - - $copy_from_location = $external_args_hr->{class_directory}; - @new_file_array = &generator_copy_files($copy_to_location, $copy_from_location, @file_list); - }else{ - @new_file_array = @file_list; - } - - #scribble on PTF hash last - if($decoder_hash->{ptf_set}){ - - if($decoder_hash->{copy_to} eq "project"){ - foreach my $file(@new_file_array){ - $file =~ s/^.*\/(.*?)$/$1/; - $file = $generator_hr->{project_path_widget}."/".$file; - } - } - &generator_print_verbose("generator_copy_files_and_set_system_ptf: setting system PTF file in section ".$hdl_section."\n"); - if($decoder_hash->{ptf_section} eq "Precompiled_Simulation_Library_Files"){ - @new_file_array = map{$external_args_hr->{class_directory}."/".$_} @new_file_array; - } - &generator_set_files_in_system_ptf($decoder_hash->{ptf_section}, @new_file_array); - } -} - - - -#### -# Name: generator_set_files_in_system_ptf -# Args: $hdl_section -# @list_of_files -# Returns: 1 or 0 -# Purpose: This is an internal function used to set files in the module's section in the system PTF file -# -sub generator_set_files_in_system_ptf -{ - my ($hdl_section, @list_of_files) = (@_); - - my $file_list = join(",", @list_of_files); - my $previous_data; - - &generator_print_verbose("setting HDL_INFO/".$hdl_section." in system PTF file with ".$file_list."\n"); - my $previous_data = &get_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section); - if($previous_data){ - $file_list = $previous_data . ", $file_list"; # spr 132177 - # swapping order, dvb 2003 - } - &set_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section, $file_list); -} - -#### -# Name: generator_copy_files -# Args: $target_directory -# $source_directory -# @list_of_files -# Returns: The list of files which has been copied (suitable for framing!) -# Purpose: This is an internal function used to copy files around in the generator program. -# -sub generator_copy_files -{ - my ($target_directory, $source_directory, @list_of_files) = (@_); - - my @new_file_array; - - foreach my $file_name(@list_of_files){ - $file_name =~ s|\\|\/|g; - if($file_name =~ /\*\.*/){ - $file_name =~ s/\*/$1/; - my @found_list = &_find_all_dir_files_with_ext($source_directory, $file_name); - push(@new_file_array, @found_list); - }else{ - &generator_print_verbose("Copying: ".$file_name."\n"); - push(@new_file_array, $file_name); - } - } - - &_copy_files($target_directory, $source_directory, @new_file_array); - return @new_file_array; -} - - - -sub _find_all_dir_files_with_ext -{ - my ($dir, - $ext) = (@_); - - opendir (DIR, $dir) or - &default_ribbit("can't open $dir !"); - - my @all_files = readdir(DIR); - my @new_file_list; - - - foreach my $file (@all_files){ - if($file =~ /^.*($ext)$/){ - push(@new_file_list, $file); - } - } - - return @new_file_list; -} - -#### -# Name: generator_begin -# Args: Array of generator program launcher args -# Returns: A hash reference to the module's section in the system PTF file -# Purpose: This is the first subroutine a user should call before running the rest of their -# generator program. -# - -sub generator_begin -{ - my @external_args = (@_); - - my ($external_args_hr, - $temp_user_defined, - $temp_db_Module, - $temp_db_PTF_File) = Process_Wizard_Script_Arguments("", @external_args); - - &generator_print_verbose("generator_begin: initializing\n"); - - $generator_hr->{external_args_hr} = $external_args_hr; - $generator_hr->{external_args} = \@external_args; - - # open up class.ptf and - $generator_hr->{class_ptf_hr} = new_ptf_from_file($external_args_hr->{class_directory}."/class.ptf"); - - # get the system.ptf - $generator_hr->{system_ptf_hr} = new_ptf_from_file($external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"); - $generator_hr->{module_ptf_hr} = &get_child_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/MODULE $external_args_hr->{target_module_name}"); - my $class_name = get_data_by_path($generator_hr->{module_ptf_hr}, "class"); - - # find the default generator section - $generator_hr->{language} = get_data_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/WIZARD_SCRIPT_ARGUMENTS/hdl_language"); - - # get some wrapper settings - &get_module_wrapper_arg_hash_from_system_ptf_file(); - - # clear system ptf's HDL section - &delete_child($generator_hr->{module_ptf_hr}, "HDL_INFO"); - - return $generator_hr->{module_ptf_hr}; -} - -#### -# Name: generator_end -# Args: none -# Returns: nothing -# Purpose: This is the last subroutine a user should call from their generator program. -# Not calling this subroutine will make you very sad... =< -# - -sub generator_end -{ - # o.k., time to make the wrapper and output it. - if($generator_hr->{wrapper_args}{make_wrapper}){ - &_generator_make_module_wrapper(); - } - - - my $external_args_hr = $generator_hr->{external_args_hr}; - my $ptf_file_name = $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"; - &generator_print_verbose("generator_end: writing PTF file ".$external_args_hr->{system_name}.".ptf to ".$external_args_hr->{system_directory}."\n"); - - default_ribbit("Cannot write PTF file ".$ptf_file_name."!\n") - unless(&write_ptf_file($generator_hr->{system_ptf_hr}, $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf")); -} - -sub generator_end_read_module_wrapper_string -{ - my $language = &generator_get_language(); - my $ls; - - if($language =~ /vhdl/){ - $ls = ".vhd"; - }elsif($language =~ /verilog/){ - $ls = ".v"; - }else{ - &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); - } - my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; - my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; - - my $file = $system_dir."/".$module_name.$ls; - &generator_print_verbose("generator library reading file into string: $file\n"); - - open (FILE,"<$file") or ribbit "cannot open file ($file) ($!)\n"; - my $return_string; - while () - { - $return_string .= $_; - } - close (FILE); - return($return_string); -} - -sub generator_end_write_module_wrapper_string -{ - my $string = shift or ribbit "no string specified\n"; - - my $language = &generator_get_language(); - my $ls; - - print $language; - - if($language =~ /vhdl/){ - $ls = ".vhd"; - }elsif($language =~ /verilog/){ - $ls = ".v"; - }else{ - &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); - } - my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; - my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; - - my $file = $system_dir."/".$module_name.$ls; - &generator_print_verbose("generator library writing string into file: $file\n"); - - open (FILE,">$file") or ribbit "cannot open file ($file) ($!)\n"; - print FILE $string; - close (FILE); -} -# end of generator_library.pm - - - - - -# -# -# -# -# --------------------------------------------------------------------- - -# +---------------------------------------------------- -# | emit_system_h -# | -# | if "is_cpu", attempt to emit a system.h -# | memory map. -# | - -sub emit_system_h($$$) - { - my ($sopc_directory,$master,$system_ptf) = (@_); - - # | - # | Build a system.h file for masters. - # | - - -# as of quartus 5.0, we prefer gtf-generate in sopc_builder directly - - my $gtf_generate = "$sopc_directory/bin/gtf-generate"; - my $gtf_filename = "$sopc_directory/bin/gtf/system.h.gtf"; - - if(! -f $gtf_generate) - { - # but if sopc_builder is missing it for whatever reason, - # try the one in sopc_kit_nios2 - - my $sopc_kit_nios2 = $ENV{SOPC_KIT_NIOS2}; - if($sopc_kit_nios2 ne "") - { - $gtf_generate = "$sopc_kit_nios2/bin/gtf-generate"; - $gtf_filename = "$sopc_kit_nios2/bin/gtf/system.h.gtf"; - } - } - - # | - # | xml template - # | - - my $stf_template = < - - - - - - -EOP - - # | - # | THINK - # | - - my $output_directory = "./${master}_map"; - my $project_name = "ignored"; - my $stf_filename = "./${master}_project.stf"; - - # | - # | build up template variables - # | - - my %template_vars; - $template_vars{date} = fcu_date_time(); - $template_vars{whoami} = $0; - $template_vars{project_name} = $project_name; - $template_vars{system_ptf} = $system_ptf; - $template_vars{output_directory} = $output_directory; - $template_vars{master} = $master; - - # | - # | poke in the values to the template - # | - - foreach my $key (sort(keys(%template_vars))) - { - $stf_template =~ s/--$key--/$template_vars{$key}/gs; - } - - ## debug print $stf_template; - - # | - # | write out the stf file, so we can soon use it - # | - - fcu_write_file($stf_filename,$stf_template); - - # | - # | and use it - # | - - if(-e $gtf_generate && -e $gtf_filename) - { - - my $generate_cmd = $gtf_generate; - - $generate_cmd .= " --output-directory=$output_directory"; - $generate_cmd .= " --gtf=$gtf_filename"; - $generate_cmd .= " --stf=$stf_filename"; - - r_system($sopc_directory,$generate_cmd); - - # | - # | done with it - # | - - r_system($sopc_directory,"rm $stf_filename"); - - fcu_print_command("Generated memory map \"$output_directory/system.h\""); - } - else - { - fcu_print_command("Warning: did NOT emit system.h for $master"); - } - - - - - } - - -sub r_system($$) - { - my ($sopc_directory,$cmd) = (@_); - fcu_print_command($cmd); - return Run_Command_In_Unix_Like_Shell($sopc_directory,$cmd); - } - - - - - - - -# +------------------------------------------ -# | synthesis and simulation files are are -# | listed in CLASS/CB_GENERATOR/HDL_FILES. -# | - -sub get_synthesis_files($) - { - my ($class_ptf) = (@_); - my $synthesis_files = ""; - my $simulation_files = ""; - - my $hdl_files = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/HDL_FILES"); - my $child_count = get_child_count($hdl_files); - for(my $i = 0; $i < $child_count; $i++) - { - my $hdl_file = get_child($hdl_files,$i); - if(get_name($hdl_file) eq "FILE") - { - my $filename = get_data_by_path($hdl_file,"filepath"); - my $use_in_synthesis = get_data_by_path($hdl_file,"use_in_synthesis"); - my $use_in_simulation = get_data_by_path($hdl_file,"use_in_simulation"); - - if($use_in_synthesis) - { - $synthesis_files .= ", " if $synthesis_files; - $synthesis_files .= $filename; - } - - if($use_in_simulation) - { - $simulation_files .= ", " if $simulation_files; - $simulation_files .= $filename; - } - } - } - - return $synthesis_files; - } - - - - - - - - -sub main - { - - push(@ARGV,"--verbose=1") if 0; - my %args = fcu_parse_args(@ARGV); - - if(0) - { - foreach my $key (sort(keys(%args))) - { - print("--$key = $args{$key} \n"); - } - } - - # | - # | get the arguments we care about - # | - - my $class_dir = fcu_get_switch(\%args,"module_lib_dir"); - - - my $target_module_name = fcu_get_switch(\%args,"target_module_name"); - my $system_name = fcu_get_switch(\%args,"system_name"); - my $sopc_directory = fcu_get_switch(\%args,"sopc_directory"); - - # | - # | preflight the arguments a little - # | - - my $error_count = 0; - - my $class_ptf_path = "$class_dir/class.ptf"; - if(!-f $class_ptf_path) - { - print "error: no class.ptf at \"$class_dir\"\n"; - $error_count++; - } - - die "$error_count errors" if($error_count > 0); - - # +------------------------------------------- - # | ok, let us get to work - # | - - - my $class_ptf = new_ptf_from_file($class_ptf_path); - - # | - # | emit system.h for this module - # | TODO iff Is_CPU i guess. - # | - - my $do_emit_system_h = get_data_by_path($class_ptf, - "CLASS/CB_GENERATOR/emit_system_h"); - if($do_emit_system_h) - { - emit_system_h($sopc_directory, - $target_module_name, - "./$system_name.ptf"); - } - - my $top_module_name = get_data_by_path($class_ptf, - "CLASS/CB_GENERATOR/top_module_name"); - my $file_name = ""; - - # | stored as file_name.v:module_name, so we break it open - if($top_module_name =~ /^(.*):(.*)$/) - { - $file_name = $1; - my $module_name = $2; - $top_module_name = $module_name; - } - - # | language of this particular module... - - my $module_language = "verilog"; - if($file_name =~ /^.*\.vhd$/) - { - $module_language = "vhdl"; - } - - # | - # | consult the CB_GENERATOR/HDL_FILES section regarding - # | where our HDL files for synthesis are. - # | - - - my $synthesis_files = get_synthesis_files($class_ptf); - - - my $instantiate_in_system_module = get_data_by_path($class_ptf, - "CLASS/MODULE_DEFAULTS/SYSTEM_BUILDER_INFO/Instantiate_In_System_Module"); - - - - if($instantiate_in_system_module) - { - generator_enable_mode ("terse"); - - - generator_begin (@ARGV); - - - generator_make_module_wrapper(1,$top_module_name,$module_language); - - generator_copy_files_and_set_system_ptf - ( - "simulation_and_quartus", - split(/ *, */,$synthesis_files) -# "$synthesis_files" - ); - - generator_end (); - } - - exit (0); - } - -$| = 1; # always polite to flush. -main() - -# end of file Index: trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd =================================================================== --- trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (revision 7) +++ trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (nonexistent) @@ -1,440 +0,0 @@ ------------------------------------------------------------------- --- --- sdram_ctrl.vhd --- --- Module Description: --- SDRAM small&fast controller --- --- --- To Do: --- configurable times --- nios simulation support --- --- Author(s): --- Aleksey Kuzmenok, ntpqa@opencores.org --- ------------------------------------------------------------------- --- --- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG --- --- This module is free software; you can redistribute it and/or --- modify it under the terms of the GNU Lesser General Public --- License as published by the Free Software Foundation; either --- version 2.1 of the License, or (at your option) any later version. --- --- This module 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 --- Lesser General Public License for more details. --- --- You should have received a copy of the GNU Lesser General Public --- License along with this software; if not, write to the Free Software --- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --- ------------------------------------------------------------------- --- Test results --- FPGA SDRAM CLK (not less than) --- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz --- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz --- ------------------------------------------------------------------- - -LIBRARY ieee; -USE ieee.std_logic_1164.ALL; -USE ieee.numeric_std.ALL; -LIBRARY altera_mf; -USE altera_mf.altera_mf_components.all; - -entity sdram_ctrl is - generic( - DATA_WIDTH: integer:=32; - BANK_WIDTH: integer:=4; - ROW_WIDTH: integer:=12; - COLUMN_WIDTH: integer:=8; - - clk_MHz: integer:=120 - ); - port( - signal clk : IN STD_LOGIC; - signal reset : IN STD_LOGIC; - - -- IMPORTANT: for this Avalon(tm) interface - -- 'Minimum Arbitration Shares'=1 - -- 'Max Pending Read Transactions'=9 - signal avs_nios_chipselect : IN STD_LOGIC; - signal avs_nios_address : IN STD_LOGIC_VECTOR ((BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); - signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); - signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_write : IN STD_LOGIC; - signal avs_nios_read : IN STD_LOGIC; - signal avs_nios_waitrequest : OUT STD_LOGIC; - signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal avs_nios_readdatavalid : OUT STD_LOGIC; - - -- global export signals - signal sdram_cke : OUT STD_LOGIC; -- This pin has fixed state '1' - signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); - signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); - signal sdram_cs_n : OUT STD_LOGIC; -- This pin has fixed state '0' - signal sdram_ras_n : OUT STD_LOGIC; - signal sdram_cas_n : OUT STD_LOGIC; - signal sdram_we_n : OUT STD_LOGIC; - signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); - signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) - ); -end sdram_ctrl; - -architecture behaviour of sdram_ctrl is - - CONSTANT FIFO_WIDTH: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; - - CONSTANT MODE: std_logic_vector(11 downto 0):="000000110000"; -- 1 word burst, CAS latency=3 - -- Only two times are configurable - -- tINIT delay between powerup and load mode register = 100 us - -- tREF refresh period = 15.625 us (64ms/4096rows) - CONSTANT INIT_PAUSE_CLOCKS: integer:=(clk_MHz*10000)/91; -- 109.9 us just to be on the save side - CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*1000)/65; -- 15.384 us the same purpose - CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! - - COMPONENT scfifo - GENERIC ( - add_ram_output_register : STRING; - intended_device_family : STRING; - lpm_numwords : NATURAL; - lpm_showahead : STRING; - lpm_type : STRING; - lpm_width : NATURAL; - lpm_widthu : NATURAL; - overflow_checking : STRING; - underflow_checking : STRING; - use_eab : STRING - ); - PORT ( - rdreq : IN STD_LOGIC ; - empty : OUT STD_LOGIC ; - aclr : IN STD_LOGIC ; - clock : IN STD_LOGIC ; - q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - wrreq : IN STD_LOGIC ; - data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); - full : OUT STD_LOGIC - ); - END COMPONENT; - - -- If you ask me why there are so many states, I'll answer that all times are fixed. - -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. - -- tRP PRECHARGE command period = 3 clocks - -- tRFC AUTO REFRESH period = 10 clocks - -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks - -- tRCD ACTIVE to READ or WRITE delay = 3 clocks - -- tRAS ACTIVE to PRECHARGE command = 7 clocks - -- tRC ACTIVE to ACTIVE command period = 10 clocks - -- tWR2 Write recovery time = 2 clocks - type states is ( - INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, - INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, - INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, - REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, - REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, - ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, - IDLE,READ0,WRITE0); - signal operation: states; - - signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); - - signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); - signal refresh_counter: unsigned(15 downto 0); - signal active_counter: unsigned(2 downto 0); - signal active_address: unsigned((BANK_WIDTH+ROW_WIDTH-1) downto 0); - - signal bank: std_logic_vector((sdram_ba'length-1) downto 0); - signal row: std_logic_vector((sdram_addr'length-1) downto 0); - signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); - signal be: std_logic_vector((sdram_dqm'length-1) downto 0); - signal data: std_logic_vector((sdram_dq'length-1) downto 0); - - signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; - - signal fifo_rdreq,fifo_empty: std_logic; - - signal read_latency: std_logic_vector(CAS_LATENCY downto 0); - - signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); - signal fifo_wrreq,fifo_wrfull: std_logic; - - signal i_command : STD_LOGIC_VECTOR(4 downto 0); - CONSTANT NOP: STD_LOGIC_VECTOR(4 downto 0):="10111"; - CONSTANT ACTIVE: STD_LOGIC_VECTOR(4 downto 0):="10011"; - CONSTANT READ: STD_LOGIC_VECTOR(4 downto 0):="10101"; - CONSTANT WRITE: STD_LOGIC_VECTOR(4 downto 0):="10100"; - CONSTANT PRECHARGE: STD_LOGIC_VECTOR(4 downto 0):="10010"; - CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR(4 downto 0):="10001"; - CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR(4 downto 0):="10000"; - - signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); - signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); - signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); - signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); - attribute ALTERA_ATTRIBUTE : string; - attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; - attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; -begin - (sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; - sdram_addr <= i_address; - sdram_ba <= i_bank; - sdram_dqm <= i_dqm; - sdram_dq <= i_data; - - fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; - fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; - - avs_nios_waitrequest<=fifo_wrfull; - - fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; - - do_active<='0' when active_address=unsigned((fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length)))) else '1'; - read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; - ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; - - operation_machine:process(reset,clk) - begin - if reset='1' - then - operation<=INIT0; - active_address<=(others=>'1'); - elsif rising_edge(clk) - then - - bank<=fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length)); - row<=fifo_q((fifo_q'length-bank'length-1) downto (fifo_q'length-bank'length-row'length)); - column<=fifo_q((column'length+data'length+be'length+2-1) downto (data'length+be'length+2)); - data<=fifo_q((data'length+be'length+2-1) downto (be'length+2)); - be<=fifo_q((be'length+2-1) downto 2); - - case operation is - when INIT0=> - if do_init='1' - then operation<=INIT1;row(10)<='1'; - end if; - when INIT1=>operation<=INIT2; - when INIT2=>operation<=INIT3; - when INIT3=>operation<=INIT4; - when INIT4=>operation<=INIT5; - when INIT5=>operation<=INIT6; - when INIT6=>operation<=INIT7; - when INIT7=>operation<=INIT8; - when INIT8=>operation<=INIT9; - when INIT9=>operation<=INIT10; - when INIT10=>operation<=INIT11; - when INIT11=>operation<=INIT12; - when INIT12=>operation<=INIT13; - when INIT13=>operation<=INIT14; - when INIT14=>operation<=INIT15; - when INIT15=>operation<=INIT16; - when INIT16=>operation<=INIT17; - when INIT17=>operation<=INIT18; - when INIT18=>operation<=INIT19; - when INIT19=>operation<=INIT20; - when INIT20=>operation<=INIT21; - when INIT21=>operation<=INIT22; - when INIT22=>operation<=INIT23; - when INIT23=>operation<=INIT24;row<=MODE((row'length-1) downto 0); - when INIT24=>operation<=IDLE; - - when REFRESH0=>operation<=REFRESH1; - when REFRESH1=>operation<=REFRESH2; - when REFRESH2=>operation<=REFRESH3; - when REFRESH3=>operation<=REFRESH4; - when REFRESH4=>operation<=REFRESH5; - when REFRESH5=>operation<=REFRESH6; - when REFRESH6=>operation<=REFRESH7; - when REFRESH7=>operation<=REFRESH8; - when REFRESH8=>operation<=REFRESH9; - when REFRESH9=>operation<=REFRESH10; - when REFRESH10=>operation<=REFRESH11; - when REFRESH11=>operation<=REFRESH12; - when REFRESH12=>operation<=REFRESH13; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); - when REFRESH13=>operation<=REFRESH14; - when REFRESH14=>operation<=IDLE; - - when ACTIVE0=>operation<=ACTIVE1; - when ACTIVE1=>operation<=ACTIVE2; - when ACTIVE2=>operation<=ACTIVE3; - active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); - when ACTIVE3=>operation<=ACTIVE4; - when ACTIVE4=>operation<=IDLE; - - when others=> - if do_refresh='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=REFRESH0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif do_active='1' - then - if tRCD_not_expired='0' and operation=IDLE - then operation<=ACTIVE0;row(10)<='1'; - else operation<=IDLE; - end if; - elsif fifo_empty='1' - then - operation<=IDLE; - elsif fifo_q(1)='1' --write - then - if read_latency(CAS_LATENCY-1 downto 0)>"000" - then operation<=IDLE; - else operation<=WRITE0; - end if; - elsif fifo_q(0)='1' --read - then - operation<=READ0; - end if; - end case; - end if; - end process; - - control_latency:process(reset,clk) - begin - if reset='1' - then - read_latency<=(others=>'0'); - elsif rising_edge(clk) - then - read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); - if operation=READ0 - then read_latency(0)<='1'; - else read_latency(0)<='0'; - end if; - end if; - end process; - latch_readdata:process(reset,clk) - begin - if reset='1' - then - avs_nios_readdata<=(others=>'0'); - avs_nios_readdatavalid<='0'; - elsif rising_edge(clk) - then - avs_nios_readdata<=sdram_dq; - avs_nios_readdatavalid<=read_latency(CAS_LATENCY); - end if; - end process; - initialization:process(reset,clk) - begin - if rising_edge(clk) - then - if init_counter>0 - then - init_counter<=init_counter-1; - else do_init<='1'; - end if; - end if; - end process; - refreshing:process(clk,reset) - begin - if reset='1' - then - refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='0'; - elsif rising_edge(clk) - then - if refresh_counter=to_unsigned(0,refresh_counter'length) - then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); - do_refresh<='1'; - else refresh_counter<=refresh_counter-1; - end if; - if operation=REFRESH0 or operation=REFRESH5 - then do_refresh<='0'; - end if; - end if; - end process; - active_period:process(reset,clk) - begin - if reset='1' - then - active_counter<=(others=>'0'); - tRCD_not_expired<='0'; - elsif rising_edge(clk) - then - if operation=ACTIVE3 or operation=REFRESH13 - then active_counter<=to_unsigned(5,active_counter'length); - elsif active_counter>0 - then active_counter<=active_counter-1; - end if; - end if; - if active_counter>0 - then tRCD_not_expired<='1'; - else tRCD_not_expired<='0'; - end if; - end process; - latch_controls:process(clk,reset) - begin - if reset='1' - then - i_command<=NOP; - i_address<=(others=>'0'); - i_bank<=(others=>'0'); - i_dqm<=(others=>'0'); - i_data<=(others=>'Z'); - elsif rising_edge(clk) - then - i_command<=NOP; - i_bank<=bank; - i_address<=(others=>'0'); - i_address((column'length-1) downto 0)<=column; - i_data<=(others=>'Z'); - i_dqm<=(others=>'0'); - - case operation is - when INIT1|REFRESH0|ACTIVE0 => - i_command<=PRECHARGE; - i_address<=row; - when INIT4|INIT14|REFRESH3 => - i_command<=AUTO_REFRESH; - when INIT24=> - i_command<=LOAD_MODE_REGISTER; - i_address<=row; - when ACTIVE3|REFRESH13 => - i_command<=ACTIVE; - i_address<=row; - when READ0 => - i_command<=READ; - when WRITE0 => - i_command<=WRITE; - i_dqm<=not be; - i_data<=data; - when OTHERS => - end case; - end if; - end process; - - fifo: scfifo - GENERIC MAP ( - add_ram_output_register => "ON", - intended_device_family => "Cyclone", - lpm_numwords => 4, - lpm_showahead => "ON", - lpm_type => "scfifo", - lpm_width => FIFO_WIDTH, - lpm_widthu => 2, - overflow_checking => "ON", - underflow_checking => "ON", - use_eab => "ON" - ) - PORT MAP ( - rdreq => fifo_rdreq, - aclr => reset, - clock => clk, - wrreq => fifo_wrreq, - data => fifo_data, - empty => fifo_empty, - q => fifo_q, - full => fifo_wrfull - ); -end behaviour; Index: sdram_ctrl/trunk/src/sdram_ctrl.vhd =================================================================== --- sdram_ctrl/trunk/src/sdram_ctrl.vhd (nonexistent) +++ sdram_ctrl/trunk/src/sdram_ctrl.vhd (revision 8) @@ -0,0 +1,484 @@ +------------------------------------------------------------------ +-- +-- sdram_ctrl.vhd +-- +-- Module Description: +-- SDRAM small&fast controller +-- +-- +-- To Do: +-- multichipselect support done +-- configurable times 50% +-- nios simulation support +-- +-- Author(s): +-- Aleksey Kuzmenok, ntpqa@opencores.org +-- +------------------------------------------------------------------ +-- +-- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG +-- +-- This module is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License, or (at your option) any later version. +-- +-- This module 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 +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this software; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +-- +------------------------------------------------------------------ +-- Hardware test results +-- FPGA SDRAM CLK (not less than) +-- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz +-- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz +-- +------------------------------------------------------------------ +-- History +-- 22.10.2006 multichipselect functionaly tested +-- 10.11.2006 first successful hardware test +-- 07.12.2006 proved to be fully reliable + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity sdram_ctrl is + generic( + DATA_WIDTH: integer:=32; + CHIPSELECTS: integer:=1; + LOG2_OF_CS: integer:=0; + BANK_WIDTH: integer:=2; + ROW_WIDTH: integer:=12; + COLUMN_WIDTH: integer:=8; + + MODE_REGISTER: integer:=48; -- 1 word burst, CAS latency=3 + + -- Only two times are configurable + -- tINIT delay between powerup and load mode register = 100 us + -- tREF refresh period = 15.625 us (64ms/4096rows) + clk_MHz: integer:=120; + t_INIT_uS: integer:=110; -- 109.9 us just to be on the save side + t_REF_nS: integer:=15384 -- 15.384 us the same purpose + + ); + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + -- IMPORTANT: for this Avalon(tm) interface + -- 'Minimum Arbitration Shares'=1 + -- 'Max Pending Read Transactions'=9 + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR ((LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + + -- global export signals + signal sdram_cke : OUT STD_LOGIC; -- This pin has the fixed state '1' + signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); + signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); + signal sdram_cs_n : OUT STD_LOGIC_VECTOR ((CHIPSELECTS-1) DOWNTO 0); + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC; + signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) + ); +end sdram_ctrl; + +architecture behaviour of sdram_ctrl is + + CONSTANT FIFO_WIDTH: integer:=LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + CONSTANT BE_LOW_BIT: integer:=2; + CONSTANT DATA_LOW_BIT: integer:=(DATA_WIDTH/8)+2; + CONSTANT COL_LOW_BIT: integer:=DATA_WIDTH+(DATA_WIDTH/8)+2; + CONSTANT ROW_LOW_BIT: integer:=COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + CONSTANT BANK_LOW_BIT: integer:=ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + CONSTANT CS_LOW_BIT: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + + --CONSTANT MODE: std_logic_vector((sdram_addr'length-1) downto 0):=std_logic_vector(MODE_REGISTER((sdram_addr'length-1) downto 0)); + CONSTANT INIT_PAUSE_CLOCKS: integer:=clk_MHz*t_INIT_uS; + CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*t_REF_nS)/1000; + CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! + + COMPONENT scfifo + GENERIC ( + add_ram_output_register : STRING; + intended_device_family : STRING; + lpm_numwords : NATURAL; + lpm_showahead : STRING; + lpm_type : STRING; + lpm_width : NATURAL; + lpm_widthu : NATURAL; + overflow_checking : STRING; + underflow_checking : STRING; + use_eab : STRING + ); + PORT ( + rdreq : IN STD_LOGIC ; + empty : OUT STD_LOGIC ; + aclr : IN STD_LOGIC ; + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + wrreq : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + full : OUT STD_LOGIC + ); + END COMPONENT; + + -- If you ask me why there are so many states, I'll answer that all times are fixed. + -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. + -- tRP PRECHARGE command period = 3 clocks + -- tRFC AUTO REFRESH period = 10 clocks + -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks + -- tRCD ACTIVE to READ or WRITE delay = 3 clocks + -- tRAS ACTIVE to PRECHARGE command = 7 clocks + -- tRC ACTIVE to ACTIVE command period = 10 clocks + -- tWR2 Write recovery time = 2 clocks + type states is ( + INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, + INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, + INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, + REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, + REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, + ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, + IDLE,READ0,WRITE0); + signal operation: states; + + signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); + + signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); + signal refresh_counter: unsigned(15 downto 0); + signal active_counter: unsigned(2 downto 0); + signal active_address: unsigned((LOG2_OF_CS+BANK_WIDTH+ROW_WIDTH-1) downto 0); + + signal chipselect: std_logic_vector(LOG2_OF_CS downto 0); + signal bank: std_logic_vector((sdram_ba'length-1) downto 0); + signal row: std_logic_vector((sdram_addr'length-1) downto 0); + signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); + signal data: std_logic_vector((sdram_dq'length-1) downto 0); + signal be: std_logic_vector((sdram_dqm'length-1) downto 0); + + signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; + + signal fifo_rdreq,fifo_empty: std_logic; + + signal read_latency: std_logic_vector(CAS_LATENCY downto 0); + + signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); + signal fifo_wrreq,fifo_wrfull: std_logic; + + signal i_command : STD_LOGIC_VECTOR(2 downto 0); + CONSTANT NOP: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="111"; + CONSTANT ACTIVE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="011"; + CONSTANT READ: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="101"; + CONSTANT WRITE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="100"; + CONSTANT PRECHARGE: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="010"; + CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="001"; + CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR((i_command'length-1) downto 0):="000"; + + signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); + signal i_chipselect: STD_LOGIC_VECTOR((sdram_cs_n'length-1) downto 0); + signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); + signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); + signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); + attribute ALTERA_ATTRIBUTE : string; + attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_chipselect : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; + + function DECODE(hex: std_logic_vector; size: integer) return std_logic_vector is + variable result : std_logic_vector((size-1) downto 0); + begin + result:=(others=>'1'); + result(to_integer(unsigned(hex))):='0'; + return result; + end; +begin + sdram_cke<='1'; + (sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; + sdram_cs_n <= i_chipselect; + sdram_addr <= i_address; + sdram_ba <= i_bank; + sdram_dqm <= i_dqm; + sdram_dq <= i_data; + + fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; + fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; + + avs_nios_waitrequest<=fifo_wrfull; + + fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; + + do_active<='0' when active_address=unsigned(fifo_q((fifo_q'length-1) downto (column'length+data'length+be'length+2))) else '1'; + read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; + ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; + + operation_machine:process(reset,clk) + begin + if reset='1' + then + operation<=INIT0; + active_address<=(others=>'1'); + elsif rising_edge(clk) + then + if CHIPSELECTS>1 + then + chipselect<='0'&fifo_q((FIFO_WIDTH-1) downto CS_LOW_BIT); + bank<=fifo_q((CS_LOW_BIT-1) downto BANK_LOW_BIT); + else + chipselect<=(others=>'0'); + bank<=fifo_q((FIFO_WIDTH-1) downto BANK_LOW_BIT); + end if; + + row<= fifo_q((BANK_LOW_BIT-1) downto ROW_LOW_BIT); + column<=fifo_q((ROW_LOW_BIT-1) downto COL_LOW_BIT); + data<= fifo_q((COL_LOW_BIT-1) downto DATA_LOW_BIT); + be<= fifo_q((DATA_LOW_BIT-1) downto BE_LOW_BIT); + + case operation is + when INIT0=> + if do_init='1' + then operation<=INIT1;row(10)<='1'; + end if; + when INIT1=>operation<=INIT2; + when INIT2=>operation<=INIT3; + when INIT3=>operation<=INIT4; + when INIT4=>operation<=INIT5; + when INIT5=>operation<=INIT6; + when INIT6=>operation<=INIT7; + when INIT7=>operation<=INIT8; + when INIT8=>operation<=INIT9; + when INIT9=>operation<=INIT10; + when INIT10=>operation<=INIT11; + when INIT11=>operation<=INIT12; + when INIT12=>operation<=INIT13; + when INIT13=>operation<=INIT14; + when INIT14=>operation<=INIT15; + when INIT15=>operation<=INIT16; + when INIT16=>operation<=INIT17; + when INIT17=>operation<=INIT18; + when INIT18=>operation<=INIT19; + when INIT19=>operation<=INIT20; + when INIT20=>operation<=INIT21; + when INIT21=>operation<=INIT22; + when INIT22=>operation<=INIT23; + when INIT23=>operation<=INIT24;row<=std_logic_vector(to_unsigned(MODE_REGISTER,row'length)); + when INIT24=>operation<=IDLE; + + when REFRESH0=>operation<=REFRESH1; + when REFRESH1=>operation<=REFRESH2; + when REFRESH2=>operation<=REFRESH3; + when REFRESH3=>operation<=REFRESH4; + when REFRESH4=>operation<=REFRESH5; + when REFRESH5=>operation<=REFRESH6; + when REFRESH6=>operation<=REFRESH7; + when REFRESH7=>operation<=REFRESH8; + when REFRESH8=>operation<=REFRESH9; + when REFRESH9=>operation<=REFRESH10; + when REFRESH10=>operation<=REFRESH11; + when REFRESH11=>operation<=REFRESH12; + when REFRESH12=>operation<=REFRESH13; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto ROW_LOW_BIT)); + when REFRESH13=>operation<=REFRESH14; + when REFRESH14=>operation<=IDLE; + + when ACTIVE0=>operation<=ACTIVE1; + when ACTIVE1=>operation<=ACTIVE2; + when ACTIVE2=>operation<=ACTIVE3; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto ROW_LOW_BIT)); + when ACTIVE3=>operation<=ACTIVE4; + when ACTIVE4=>operation<=IDLE; + + when others=> + if do_refresh='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=REFRESH0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif do_active='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=ACTIVE0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif fifo_empty='1' + then + operation<=IDLE; + elsif fifo_q(1)='1' --write + then + if read_latency(CAS_LATENCY-1 downto 0)>"000" + then operation<=IDLE; + else operation<=WRITE0; + end if; + elsif fifo_q(0)='1' --read + then + operation<=READ0; + end if; + end case; + end if; + end process; + + control_latency:process(reset,clk) + begin + if reset='1' + then + read_latency<=(others=>'0'); + elsif rising_edge(clk) + then + read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); + if operation=READ0 + then read_latency(0)<='1'; + else read_latency(0)<='0'; + end if; + end if; + end process; + latch_readdata:process(reset,clk) + begin + if reset='1' + then + avs_nios_readdata<=(others=>'0'); + avs_nios_readdatavalid<='0'; + elsif rising_edge(clk) + then + avs_nios_readdata<=sdram_dq; + avs_nios_readdatavalid<=read_latency(CAS_LATENCY); + end if; + end process; + initialization:process(reset,clk) + begin + if rising_edge(clk) + then + if init_counter>0 + then + init_counter<=init_counter-1; + else do_init<='1'; + end if; + end if; + end process; + refreshing:process(clk,reset) + begin + if reset='1' + then + refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='0'; + elsif rising_edge(clk) + then + if refresh_counter=to_unsigned(0,refresh_counter'length) + then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='1'; + else refresh_counter<=refresh_counter-1; + end if; + if operation=REFRESH0 or operation=REFRESH5 + then do_refresh<='0'; + end if; + end if; + end process; + active_period:process(reset,clk) + begin + if reset='1' + then + active_counter<=(others=>'0'); + tRCD_not_expired<='0'; + elsif rising_edge(clk) + then + if operation=ACTIVE3 or operation=REFRESH13 + then active_counter<=to_unsigned(5,active_counter'length); + elsif active_counter>0 + then active_counter<=active_counter-1; + end if; + end if; + if active_counter>0 + then tRCD_not_expired<='1'; + else tRCD_not_expired<='0'; + end if; + end process; + latch_controls:process(clk,reset) + begin + if reset='1' + then + i_command<=NOP; + i_address<=(others=>'0'); + i_bank<=(others=>'0'); + i_dqm<=(others=>'0'); + i_data<=(others=>'Z'); + i_chipselect<=(others=>'1'); + elsif rising_edge(clk) + then + i_command<=NOP; + i_chipselect<=DECODE(chipselect,i_chipselect'length); + i_bank<=bank; + i_address<=(others=>'0'); + i_address((column'length-1) downto 0)<=column; + i_data<=(others=>'Z'); + i_dqm<=(others=>'0'); + + case operation is + when INIT1|REFRESH0|ACTIVE0 => + i_command<=PRECHARGE; + i_address<=row; + i_chipselect<=(others=>'0'); + when INIT4|INIT14|REFRESH3 => + i_command<=AUTO_REFRESH; + i_chipselect<=(others=>'0'); + when INIT24=> + i_command<=LOAD_MODE_REGISTER; + i_address<=row; + i_chipselect<=(others=>'0'); + when ACTIVE3|REFRESH13 => + i_command<=ACTIVE; + i_address<=row; + when READ0 => + i_command<=READ; + when WRITE0 => + i_command<=WRITE; + i_dqm<=not be; + i_data<=data; + when OTHERS => + end case; + end if; + end process; + + fifo: scfifo + GENERIC MAP ( + add_ram_output_register => "ON", + intended_device_family => "Auto", + lpm_numwords => 4, + lpm_showahead => "ON", + lpm_type => "scfifo", + lpm_width => FIFO_WIDTH, + lpm_widthu => 2, + overflow_checking => "ON", + underflow_checking => "ON", + use_eab => "ON" + ) + PORT MAP ( + rdreq => fifo_rdreq, + aclr => reset, + clock => clk, + wrreq => fifo_wrreq, + data => fifo_data, + empty => fifo_empty, + q => fifo_q, + full => fifo_wrfull + ); +end behaviour; Index: sdram_ctrl/trunk/test_bench/sdram_ctrl_tb.vhd =================================================================== --- sdram_ctrl/trunk/test_bench/sdram_ctrl_tb.vhd (nonexistent) +++ sdram_ctrl/trunk/test_bench/sdram_ctrl_tb.vhd (revision 8) @@ -0,0 +1,169 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +entity sdram_ctrl_tb is +end sdram_ctrl_tb; + +architecture structure of sdram_ctrl_tb is + component pll + port ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + e0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ) ; + end component ; + component sdram_ctrl is + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR (21 DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (3 DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + + signal sdram_addr : OUT STD_LOGIC_VECTOR (11 DOWNTO 0); + signal sdram_ba : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_cke : OUT STD_LOGIC; + signal sdram_cs_n : OUT STD_LOGIC_VECTOR(0 downto 0); + signal sdram_dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC + ); + end component; + + component mt48lc4m32b2 IS + PORT ( + Dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0) := (OTHERS => 'Z'); + Addr : IN STD_LOGIC_VECTOR (11 DOWNTO 0) := (OTHERS => '0'); + Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + Clk : IN STD_LOGIC := '0'; + Cke : IN STD_LOGIC := '1'; + Cs_n : IN STD_LOGIC := '1'; + Ras_n : IN STD_LOGIC := '1'; + Cas_n : IN STD_LOGIC := '1'; + We_n : IN STD_LOGIC := '1'; + Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" + ); + END component; + + component cpu_simulator IS + PORT(clk, reset: IN std_logic; + address : OUT std_logic_vector(21 downto 0):=(others=>'0'); + writedata : out std_logic_vector(31 downto 0):=(others=>'0'); + byteenable : out std_logic_vector(3 downto 0):=(others=>'0'); + write : out std_logic:='0'; + read : out std_logic:='0'; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); + END component; + + signal reset, clk_ok: std_logic; + signal run_nios_n : std_logic:='1'; + signal clk,i_clk: std_logic:='0'; + + signal SDRAM_CLK : std_logic; + signal SDRAM_CKE : std_logic; + signal SDRAM_NCS : std_logic_vector(0 downto 0); + signal SDRAM_NRAS : std_logic; + signal SDRAM_NCAS : std_logic; + signal SDRAM_NWE : std_logic; + signal SDRAM_ADDRESS : std_logic_vector(11 downto 0); + signal SDRAM_BANK : std_logic_vector(1 downto 0); + signal SDRAM_DQM : std_logic_vector(3 downto 0); + signal SDRAM_DATA : std_logic_vector(31 downto 0); + + signal address : std_logic_vector(21 downto 0); + signal writedata : std_logic_vector(31 downto 0):=(others=>'0'); + signal byteenable : std_logic_vector(3 downto 0):=(others=>'0'); + signal write : std_logic; + signal read : std_logic; + signal chipselect : std_logic:='1'; + signal readdata : std_logic_vector(31 downto 0); + signal waitrequest : std_logic; + signal readdatavalid : std_logic; + +begin + + reset<= not clk_ok; + run_nios_n<= reset after 140 us; + + UUT: sdram_ctrl + port map( + clk => i_clk, + reset => reset, + + avs_nios_chipselect => chipselect, + avs_nios_address => address, + avs_nios_byteenable => byteenable, + avs_nios_writedata => writedata, + avs_nios_write => write, + avs_nios_read => read, + avs_nios_readdata => readdata, + avs_nios_readdatavalid => readdatavalid, + avs_nios_waitrequest => waitrequest, + + sdram_addr => SDRAM_ADDRESS, + sdram_ba => SDRAM_BANK, + sdram_cas_n => SDRAM_NCAS, + sdram_cke => SDRAM_CKE, + sdram_cs_n => SDRAM_NCS, + sdram_dq => SDRAM_DATA, + sdram_dqm => SDRAM_DQM, + sdram_ras_n => SDRAM_NRAS, + sdram_we_n => SDRAM_NWE + ); + + sdram:mt48lc4m32b2 + PORT MAP( + Dq => SDRAM_DATA, + Addr => SDRAM_ADDRESS, + Ba => SDRAM_BANK, + Clk => SDRAM_CLK, + Cke => SDRAM_CKE, + Cs_n => SDRAM_NCS(0), + Ras_n => SDRAM_NRAS, + Cas_n => SDRAM_NCAS, + We_n => SDRAM_NWE, + Dqm => SDRAM_DQM + ); + + cpu: cpu_simulator + PORT MAP( + clk => i_clk, + reset => run_nios_n, + address => address, + writedata => writedata, + byteenable => byteenable, + write => write, + read => read, + readdata => readdata, + waitrequest => waitrequest, + readdatavalid => readdatavalid + ); + + U1 : pll + port map( + inclk0 => clk, + c0 => i_clk, + e0 => SDRAM_CLK, + locked =>clk_ok + ); + + clock_generator:process + begin + wait for 21 ns; + clk<= clk xor '1'; + end process; +end structure; Index: sdram_ctrl/trunk/test_bench/mt48lc4m32b2.vhd =================================================================== --- sdram_ctrl/trunk/test_bench/mt48lc4m32b2.vhd (nonexistent) +++ sdram_ctrl/trunk/test_bench/mt48lc4m32b2.vhd (revision 8) @@ -0,0 +1,1134 @@ +----------------------------------------------------------------------------------------- +-- +-- File Name: MT48LC4M32B2.VHD +-- Version: 2.0 +-- Date: January 24th, 2002 +-- Model: Behavioral +-- Simulator: Model Technology +-- +-- Dependencies: None +-- +-- Email: modelsupport@micron.com +-- Company: Micron Technology, Inc. +-- Part Number: MT48LC4M32A2 (1Mb x 32 x 4 Banks) +-- +-- Description: Micron 128Mb SDRAM +-- +-- Limitation: - Doesn't check for 4096-cycle refresh +-- +-- Note: - Set simulator resolution to "ps" accuracy +-- +-- Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY +-- WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY +-- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR +-- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. +-- +-- Copyright (c) 1998 Micron Semiconductor Products, Inc. +-- All rights researved +-- +-- Rev Author Date Changes +-- --- -------------------------- ------------------------------------- +-- 2.0 SH 01/24/2002 - Second Release +-- Micron Technology Inc. +-- +-------------------------------------------------------------------------- + +LIBRARY IEEE; + USE IEEE.STD_LOGIC_1164.ALL; + USE IEEE.STD_LOGIC_UNSIGNED.ALL; + USE IEEE.STD_LOGIC_ARITH.ALL; + +ENTITY mt48lc4m32b2 IS + GENERIC ( + -- Timing Parameters for -75 (PC133) and CL = 3 + tAC : TIME := 5.4 ns; + tHZ : TIME := 5.4 ns; + tOH : TIME := 2.7 ns; + tMRD : INTEGER := 2; -- 2 Clk Cycles + tRAS : TIME := 44.0 ns; + tRC : TIME := 66.0 ns; + tRCD : TIME := 20.0 ns; + tRFC : TIME := 66.0 ns; + tRP : TIME := 20.0 ns; + tRRD : TIME := 15.0 ns; + tWRa : TIME := 7.5 ns; -- Auto precharge + tWRm : TIME := 15.0 ns; -- Manual Precharge + + tAH : TIME := 0.8 ns; + tAS : TIME := 1.5 ns; + tCH : TIME := 2.5 ns; + tCL : TIME := 2.5 ns; + tCK : TIME := 7.5 ns; + tDH : TIME := 0.8 ns; + tDS : TIME := 1.5 ns; + tCKH : TIME := 0.8 ns; + tCKS : TIME := 1.5 ns; + tCMH : TIME := 0.8 ns; + tCMS : TIME := 1.5 ns; + + addr_bits : INTEGER := 12; + data_bits : INTEGER := 32; + col_bits : INTEGER := 8 + ); + PORT ( + Dq : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z'); + Addr : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + Clk : IN STD_LOGIC := '0'; + Cke : IN STD_LOGIC := '1'; + Cs_n : IN STD_LOGIC := '1'; + Ras_n : IN STD_LOGIC := '1'; + Cas_n : IN STD_LOGIC := '1'; + We_n : IN STD_LOGIC := '1'; + Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" + ); +END mt48lc4m32b2; + +ARCHITECTURE behave OF mt48lc4m32b2 IS + TYPE State IS (BST, NOP, PRECH, READ, WRITE); + TYPE Array4xI IS ARRAY (3 DOWNTO 0) OF INTEGER; + TYPE Array4xT IS ARRAY (3 DOWNTO 0) OF TIME; + TYPE Array4xB IS ARRAY (3 DOWNTO 0) OF STD_LOGIC; + TYPE Array4x2BV IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0); + TYPE Array4xCBV IS ARRAY (4 DOWNTO 0) OF STD_LOGIC_VECTOR (Col_bits - 1 DOWNTO 0); + TYPE Array_state IS ARRAY (4 DOWNTO 0) OF State; + SIGNAL Mode_reg : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + SIGNAL Active_enable, Aref_enable, Burst_term : STD_LOGIC := '0'; + SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : STD_LOGIC := '0'; + SIGNAL Burst_length_1, Burst_length_2, Burst_length_4, Burst_length_8 : STD_LOGIC := '0'; + SIGNAL Cas_latency_1, Cas_latency_2, Cas_latency_3 : STD_LOGIC := '0'; + SIGNAL Cs_in, Ras_in, Cas_in, We_in : STD_LOGIC := '0'; + SIGNAL Write_burst_mode : STD_LOGIC := '0'; + SIGNAL Sys_clk, CkeZ : STD_LOGIC := '0'; + +BEGIN + -- Strip the strength + Cs_in <= To_X01 (Cs_n); + Ras_in <= To_X01 (Ras_n); + Cas_in <= To_X01 (Cas_n); + We_in <= To_X01 (We_n); + + -- Commands Decode + Active_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND We_in; + Aref_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND We_in; + Burst_term <= NOT(Cs_in) AND Ras_in AND Cas_in AND NOT(We_in); + Mode_reg_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in); + Prech_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND NOT(We_in); + Read_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND We_in; + Write_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND NOT(We_in); + + -- Burst Length Decode + Burst_length_1 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND NOT(Mode_reg(0)); + Burst_length_2 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND Mode_reg(0); + Burst_length_4 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND NOT(Mode_reg(0)); + Burst_length_8 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND Mode_reg(0); + + -- CAS Latency Decode + Cas_latency_1 <= NOT(Mode_reg(6)) AND NOT(Mode_reg(5)) AND Mode_reg(4); + Cas_latency_2 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND NOT(Mode_reg(4)); + Cas_latency_3 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND Mode_reg(4); + + -- Write Burst Mode + Write_burst_mode <= Mode_reg(9); + + -- System Clock + int_clk : PROCESS (Clk) + BEGIN + IF Clk'LAST_VALUE = '0' AND Clk = '1' THEN + CkeZ <= Cke; + END IF; + Sys_clk <= CkeZ AND Clk; + END PROCESS; + + state_register : PROCESS + TYPE ram_type IS ARRAY (2**col_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0); + TYPE ram_pntr IS ACCESS ram_type; + TYPE ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF ram_pntr; + VARIABLE Bank0 : ram_stor; + VARIABLE Bank1 : ram_stor; + VARIABLE Bank2 : ram_stor; + VARIABLE Bank3 : ram_stor; + VARIABLE Row_index, Col_index : INTEGER := 0; + VARIABLE Dq_temp : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => '0'); + + VARIABLE Col_addr : Array4xCBV; + VARIABLE Bank_addr : Array4x2BV; + VARIABLE Dqm_reg0, Dqm_reg1 : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000"; + + VARIABLE Bank, Prev_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + VARIABLE B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Col_brst : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Row : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Col : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Burst_counter : INTEGER := 0; + + VARIABLE Command : Array_state; + VARIABLE Bank_precharge : Array4x2BV; + VARIABLE A10_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Auto_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Read_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Write_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_read : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_write : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + VARIABLE RW_interrupt_counter : Array4xI := (0 & 0 & 0 & 0); + VARIABLE Count_precharge : Array4xI := (0 & 0 & 0 & 0); + + VARIABLE Data_in_enable, Data_out_enable : STD_LOGIC := '0'; + VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : STD_LOGIC := '0'; + VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : STD_LOGIC := '1'; + + -- Timing Check + VARIABLE MRD_chk : INTEGER := 0; + VARIABLE RFC_chk : TIME := 0 ns; + VARIABLE RRD_chk : TIME := 0 ns; + VARIABLE WR_chkm : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns); + VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3 : TIME := 0 ns; + VARIABLE RC_chk0, RC_chk1, RC_chk2, RC_chk3 : TIME := 0 ns; + VARIABLE RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3 : TIME := 0 ns; + VARIABLE RP_chk0, RP_chk1, RP_chk2, RP_chk3 : TIME := 0 ns; + + -- Initialize empty rows + PROCEDURE Init_mem (Bank : STD_LOGIC_VECTOR (1 DOWNTO 0); Row_index : INTEGER) IS + VARIABLE i, j : INTEGER := 0; + BEGIN + IF Bank = "00" THEN + IF Bank0 (Row_index) = NULL THEN -- Check to see if row empty + Bank0 (Row_index) := NEW ram_type; -- Open new row for access + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP -- Filled row with zeros + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank0 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "01" THEN + IF Bank1 (Row_index) = NULL THEN + Bank1 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank1 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "10" THEN + IF Bank2 (Row_index) = NULL THEN + Bank2 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank2 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "11" THEN + IF Bank3 (Row_index) = NULL THEN + Bank3 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank3 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + END IF; + END; + + -- Burst Counter + PROCEDURE Burst_decode IS + VARIABLE Col_int : INTEGER := 0; + VARIABLE Col_vec, Col_temp : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + BEGIN + -- Advance Burst Counter + Burst_counter := Burst_counter + 1; + + -- Burst Type + IF Mode_reg (3) = '0' THEN + Col_int := conv_integer(Col) + 1; + Col_temp := CONV_STD_LOGIC_VECTOR(Col_int, col_bits); + ELSIF Mode_reg (3) = '1' THEN + Col_vec := CONV_STD_LOGIC_VECTOR(Burst_counter, col_bits); + Col_temp (2) := Col_vec (2) XOR Col_brst (2); + Col_temp (1) := Col_vec (1) XOR Col_brst (1); + Col_temp (0) := Col_vec (0) XOR Col_brst (0); + END IF; + + -- Burst Length + IF Burst_length_2 = '1' THEN + Col (0) := Col_temp (0); + ELSIF Burst_length_4 = '1' THEN + Col (1 DOWNTO 0) := Col_temp (1 DOWNTO 0); + ELSIF Burst_length_8 = '1' THEN + Col (2 DOWNTO 0) := Col_temp (2 DOWNTO 0); + ELSE + Col := Col_temp; + END IF; + + -- Burst Read Single Write + IF Write_burst_mode = '1' AND Data_in_enable = '1' THEN + Data_in_enable := '0'; + END IF; + + -- Data counter + IF Burst_length_1 = '1' THEN + IF Burst_counter >= 1 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_2 = '1' THEN + IF Burst_counter >= 2 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_4 = '1' THEN + IF Burst_counter >= 4 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_8 = '1' THEN + IF Burst_counter >= 8 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + END IF; + END; + + BEGIN + WAIT ON Sys_clk; + IF Sys_clk'event AND Sys_clk = '1' THEN + -- Internal Pipeline + Command(0) := Command(1); + Command(1) := Command(2); + Command(2) := Command(3); + Command(3) := NOP; + + Col_addr(0) := Col_addr(1); + Col_addr(1) := Col_addr(2); + Col_addr(2) := Col_addr(3); + Col_addr(3) := (OTHERS => '0'); + + Bank_addr(0) := Bank_addr(1); + Bank_addr(1) := Bank_addr(2); + Bank_addr(2) := Bank_addr(3); + Bank_addr(3) := "00"; + + Bank_precharge(0) := Bank_precharge(1); + Bank_precharge(1) := Bank_precharge(2); + Bank_precharge(2) := Bank_precharge(3); + Bank_precharge(3) := "00"; + + A10_precharge(0) := A10_precharge(1); + A10_precharge(1) := A10_precharge(2); + A10_precharge(2) := A10_precharge(3); + A10_precharge(3) := '0'; + + -- Dqm pipeline for Read + Dqm_reg0 := Dqm_reg1; + Dqm_reg1 := Dqm; + + -- Read or Write with Auto Precharge Counter + IF Auto_precharge (0) = '1' THEN + Count_precharge (0) := Count_precharge (0) + 1; + END IF; + IF Auto_precharge (1) = '1' THEN + Count_precharge (1) := Count_precharge (1) + 1; + END IF; + IF Auto_precharge (2) = '1' THEN + Count_precharge (2) := Count_precharge (2) + 1; + END IF; + IF Auto_precharge (3) = '1' THEN + Count_precharge (3) := Count_precharge (3) + 1; + END IF; + + -- Read or Write Interrupt Counter + IF RW_interrupt_write (0) = '1' THEN + RW_interrupt_counter (0) := RW_interrupt_counter (0) + 1; + END IF; + IF RW_interrupt_write (1) = '1' THEN + RW_interrupt_counter (1) := RW_interrupt_counter (1) + 1; + END IF; + IF RW_interrupt_write (2) = '1' THEN + RW_interrupt_counter (2) := RW_interrupt_counter (2) + 1; + END IF; + IF RW_interrupt_write (3) = '1' THEN + RW_interrupt_counter (3) := RW_interrupt_counter (3) + 1; + END IF; + + -- tMRD Counter + MRD_chk := MRD_chk + 1; + + -- Auto Refresh + IF Aref_enable = '1' THEN + -- Auto Refresh to Auto Refresh + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Auto Refresh" + SEVERITY WARNING; + + -- Precharge to Auto Refresh + ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR + (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) + REPORT "tRP violation during Auto Refresh" + SEVERITY WARNING; + + -- Precharge to Auto Refresh + ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') + REPORT "All banks must be Precharge before Auto Refresh" + SEVERITY WARNING; + + -- Load Mode Register to Auto Refresh + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Auto Refresh" + SEVERITY WARNING; + + -- Record current tRFC time + RFC_chk := NOW; + END IF; + + -- Load Mode Register + IF Mode_reg_enable = '1' THEN + -- Register Mode + Mode_reg <= Addr; + + -- Precharge to Load Mode Register + ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') + REPORT "All banks must be Precharge before Load Mode Register" + SEVERITY WARNING; + + -- Precharge to Load Mode Register + ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR + (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) + REPORT "tRP violation during Load Mode Register" + SEVERITY WARNING; + + -- Auto Refresh to Load Mode Register + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Load Mode Register" + SEVERITY WARNING; + + -- Load Mode Register to Load Mode Register + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Load Mode Register" + SEVERITY WARNING; + + -- Record current tMRD time + MRD_chk := 0; + END IF; + + -- Active Block (Latch Bank and Row Address) + IF Active_enable = '1' THEN + -- Activate an OPEN bank can corrupt data + ASSERT ((Ba = "00" AND Act_b0 = '0') OR (Ba = "01" AND Act_b1 = '0') OR + (Ba = "10" AND Act_b2 = '0') OR (Ba = "11" AND Act_b3 = '0')) + REPORT "Bank is already activated - data can be corrupted" + SEVERITY WARNING; + + -- Activate Bank 0 + IF Ba = "00" AND Pc_b0 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk0 >= tRC) + REPORT "tRC violation during Activate Bank 0" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk0 >= tRP) + REPORT "tRP violation during Activate Bank 0" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b0 := '1'; + Pc_b0 := '0'; + B0_row_addr := Addr; + RAS_chk0 := NOW; + RC_chk0 := NOW; + RCD_chk0 := NOW; + END IF; + + -- Activate Bank 1 + IF Ba = "01" AND Pc_b1 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk1 >= tRC) + REPORT "tRC violation during Activate Bank 1" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk1 >= tRP) + REPORT "tRP violation during Activate Bank 1" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b1 := '1'; + Pc_b1 := '0'; + B1_row_addr := Addr; + RAS_chk1 := NOW; + RC_chk1 := NOW; + RCD_chk1 := NOW; + END IF; + + -- Activate Bank 2 + IF Ba = "10" AND Pc_b2 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk2 >= tRC) + REPORT "tRC violation during Activate Bank 2" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk2 >= tRP) + REPORT "tRP violation during Activate Bank 2" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b2 := '1'; + Pc_b2 := '0'; + B2_row_addr := Addr; + RAS_chk2 := NOW; + RC_chk2 := NOW; + RCD_chk2 := NOW; + END IF; + + -- Activate Bank 3 + IF Ba = "11" AND Pc_b3 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk3 >= tRC) + REPORT "tRC violation during Activate Bank 3" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk3 >= tRP) + REPORT "tRP violation during Activate Bank 3" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b3 := '1'; + Pc_b3 := '0'; + B3_row_addr := Addr; + RAS_chk3 := NOW; + RC_chk3 := NOW; + RCD_chk3 := NOW; + END IF; + + -- Activate to Activate (different bank) + IF (Prev_bank /= Ba) THEN + ASSERT (NOW - RRD_chk >= tRRD) + REPORT "tRRD violation during Activate" + SEVERITY WARNING; + END IF; + + -- Auto Refresh to Activate + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Activate" + SEVERITY WARNING; + + -- Load Mode Register to Activate + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Activate" + SEVERITY WARNING; + + -- Record variable for checking violation + RRD_chk := NOW; + Prev_Bank := Ba; + END IF; + + -- Precharge Block + IF Prech_enable = '1' THEN + -- Load Mode Register to Precharge + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Precharge" + SEVERITY WARNING; + + -- Precharge Bank 0 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "00")) AND Act_b0 = '1') THEN + Act_b0 := '0'; + Pc_b0 := '1'; + RP_chk0 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk0 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(0) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 1 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "01")) AND Act_b1 = '1') THEN + Act_b1 := '0'; + Pc_b1 := '1'; + RP_chk1 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk1 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(1) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 2 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "10")) AND Act_b2 = '1') THEN + Act_b2 := '0'; + Pc_b2 := '1'; + RP_chk2 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk2 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(2) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 3 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "11")) AND Act_b3 = '1') THEN + Act_b3 := '0'; + Pc_b3 := '1'; + RP_chk3 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk3 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(3) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Terminate a Write Immediately (if same bank or all banks) + IF (Data_in_enable = '1' AND (Bank = Ba OR Addr(10) = '1')) THEN + Data_in_enable := '0'; + END IF; + + -- Precharge Command Pipeline for READ + IF CAS_latency_3 = '1' THEN + Command(2) := PRECH; + Bank_precharge(2) := Ba; + A10_precharge(2) := Addr(10); + ELSIF CAS_latency_2 = '1' THEN + Command(1) := PRECH; + Bank_precharge(1) := Ba; + A10_precharge(1) := Addr(10); + END IF; + END IF; + + -- Burst Terminate + IF Burst_term = '1' THEN + -- Terminate a Write immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + END IF; + + -- Terminate a Read depend on CAS Latency + IF CAS_latency_3 = '1' THEN + Command(2) := BST; + ELSIF CAS_latency_2 = '1' THEN + Command(1) := BST; + END IF; + END IF; + + -- Read Command + IF Read_enable = '1' THEN + -- Activate to Read + ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR + (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) + REPORT "Bank is not Activated for Read" + SEVERITY WARNING; + + -- Activate to Read + ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR + (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR + (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR + (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) + REPORT "tRCD violation during Read" + SEVERITY WARNING; + + -- CAS Latency Pipeline + IF Cas_latency_3 = '1' THEN + Command(2) := READ; + Col_addr (2) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (2) := Ba; + ELSIF Cas_latency_2 = '1' THEN + Command(1) := READ; + Col_addr (1) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (1) := Ba; + ELSIF Cas_latency_1 = '1' THEN + Command(0) := READ; + Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (0) := Ba; + END IF; + + -- Read Terminate Write Immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + -- Interrupt a Write with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; + ASSERT FALSE REPORT "Read interrupt a Write with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Read Terminate Read after CL - 1 + IF (Data_out_enable = '1' AND ((Cas_latency_2 = '1' AND ((Burst_length_2 = '1' AND Burst_counter < 1) OR + (Burst_length_4 = '1' AND Burst_counter < 3) OR + (Burst_length_8 = '1' AND Burst_counter < 7))) OR + (Cas_latency_3 = '1' AND ((Burst_length_4 = '1' AND Burst_counter < 2) OR + (Burst_length_8 = '1' AND Burst_counter < 6))))) THEN + -- Interrupt a Read with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + ASSERT FALSE REPORT "Read interrupt a Read with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Auto Precharge + IF Addr(10) = '1' THEN + Auto_precharge (CONV_INTEGER(Ba)) := '1'; + Count_precharge (CONV_INTEGER(Ba)) := 0; + RW_Interrupt_Bank := Ba; + Read_precharge (CONV_INTEGER(Ba)) := '1'; + END IF; + END IF; + + -- Write Command + IF Write_enable = '1' THEN + -- Activate to Write + ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR + (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) + REPORT "Bank is not Activated for Write" + SEVERITY WARNING; + + -- Activate to Write + ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR + (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR + (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR + (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) + REPORT "tRCD violation during Write" + SEVERITY WARNING; + + -- Latch write command, bank, column + Command(0) := WRITE; + Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (0) := Ba; + + -- Write Terminate Write Immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + + -- Interrupt a Write with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; + ASSERT FALSE REPORT "Write interrupt a Write with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Write Terminate Read Immediately + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + + -- Interrupt a Read with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + ASSERT FALSE REPORT "Write interrupt a Read with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Auto Precharge + IF Addr(10) = '1' THEN + Auto_precharge (CONV_INTEGER(Ba)) := '1'; + Count_precharge (CONV_INTEGER(Ba)) := 0; + RW_Interrupt_Bank := Ba; + Write_precharge (CONV_INTEGER(Ba)) := '1'; + END IF; + END IF; + + -- Write with AutoPrecharge Calculation + -- The device start internal precharge when: + -- 1. Meet tRAS requirement + -- and 2. tWR cycle(s) after last valid data + -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) + -- + -- Note: Model is starting the internal precharge 1 cycle after they meet all the + -- requirement but tRP will be compensate for the time after the 1 cycle. + IF ((Auto_precharge(0) = '1') AND (Write_precharge(0) = '1')) THEN + IF (((NOW - RAS_chk0 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(0) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR + (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(0) >= 1)) THEN + Auto_precharge(0) := '0'; + Write_precharge(0) := '0'; + RW_interrupt_write(0) := '0'; + Pc_b0 := '1'; + Act_b0 := '0'; + RP_chk0 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(1) = '1') AND (Write_precharge(1) = '1')) THEN + IF (((NOW - RAS_chk1 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(1) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR + (RW_interrupt_write(1) = '1' AND RW_interrupt_counter(1) >= 1)) THEN + Auto_precharge(1) := '0'; + Write_precharge(1) := '0'; + RW_interrupt_write(1) := '0'; + Pc_b1 := '1'; + Act_b1 := '0'; + RP_chk1 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(2) = '1') AND (Write_precharge(2) = '1')) THEN + IF (((NOW - RAS_chk2 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(2) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR + (RW_interrupt_write(2) = '1' AND RW_interrupt_counter(2) >= 1)) THEN + Auto_precharge(2) := '0'; + Write_precharge(2) := '0'; + RW_interrupt_write(2) := '0'; + Pc_b2 := '1'; + Act_b2 := '0'; + RP_chk2 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(3) = '1') AND (Write_precharge(3) = '1')) THEN + IF (((NOW - RAS_chk3 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(3) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR + (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(3) >= 1)) THEN + Auto_precharge(3) := '0'; + Write_precharge(3) := '0'; + RW_interrupt_write(3) := '0'; + Pc_b3 := '1'; + Act_b3 := '0'; + RP_chk3 := NOW + tWRa; + END IF; + END IF; + + -- Read with AutoPrecharge Calculation + -- The device start internal precharge when: + -- 1. Meet minimum tRAS requirement + -- and 2. CL - 1 cycle(s) before last valid data + -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) + IF ((Auto_precharge(0) = '1') AND (Read_precharge(0) = '1')) THEN + IF (((NOW - RAS_chk0 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(0) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR + (RW_interrupt_read(0) = '1')) THEN + Pc_b0 := '1'; + Act_b0 := '0'; + RP_chk0 := NOW; + Auto_precharge(0) := '0'; + Read_precharge(0) := '0'; + RW_interrupt_read(0) := '0'; + END IF; + END IF; + IF ((Auto_precharge(1) = '1') AND (Read_precharge(1) = '1')) THEN + IF (((NOW - RAS_chk1 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(1) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR + (RW_interrupt_read(1) = '1')) THEN + Pc_b1 := '1'; + Act_b1 := '0'; + RP_chk1 := NOW; + Auto_precharge(1) := '0'; + Read_precharge(1) := '0'; + RW_interrupt_read(1) := '0'; + END IF; + END IF; + IF ((Auto_precharge(2) = '1') AND (Read_precharge(2) = '1')) THEN + IF (((NOW - RAS_chk2 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(2) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR + (RW_interrupt_read(2) = '1')) THEN + Pc_b2 := '1'; + Act_b2 := '0'; + RP_chk2 := NOW; + Auto_precharge(2) := '0'; + Read_precharge(2) := '0'; + RW_interrupt_read(2) := '0'; + END IF; + END IF; + IF ((Auto_precharge(3) = '1') AND (Read_precharge(3) = '1')) THEN + IF (((NOW - RAS_chk3 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(3) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR + (RW_interrupt_read(3) = '1')) THEN + Pc_b3 := '1'; + Act_b3 := '0'; + RP_chk3 := NOW; + Auto_precharge(3) := '0'; + Read_precharge(3) := '0'; + RW_interrupt_read(3) := '0'; + END IF; + END IF; + + -- Internal Precharge or Bst + IF Command(0) = PRECH THEN -- PRECH terminate a read if same bank or all banks + IF Bank_precharge(0) = Bank OR A10_precharge(0) = '1' THEN + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Command(0) = BST THEN -- BST terminate a read regardless of bank + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + + IF Data_out_enable = '0' THEN + Dq <= TRANSPORT (OTHERS => 'Z') AFTER tOH; + END IF; + + -- Detect Read or Write Command + IF Command(0) = READ THEN + Bank := Bank_addr (0); + Col := Col_addr (0); + Col_brst := Col_addr (0); + IF Bank_addr (0) = "00" THEN + Row := B0_row_addr; + ELSIF Bank_addr (0) = "01" THEN + Row := B1_row_addr; + ELSIF Bank_addr (0) = "10" THEN + Row := B2_row_addr; + ELSE + Row := B3_row_addr; + END IF; + Burst_counter := 0; + Data_in_enable := '0'; + Data_out_enable := '1'; + ELSIF Command(0) = WRITE THEN + Bank := Bank_addr(0); + Col := Col_addr(0); + Col_brst := Col_addr(0); + IF Bank_addr (0) = "00" THEN + Row := B0_row_addr; + ELSIF Bank_addr (0) = "01" THEN + Row := B1_row_addr; + ELSIF Bank_addr (0) = "10" THEN + Row := B2_row_addr; + ELSE + Row := B3_row_addr; + END IF; + Burst_counter := 0; + Data_in_enable := '1'; + Data_out_enable := '0'; + END IF; + + -- DQ (Driver / Receiver) + Row_index := CONV_INTEGER (Row); + Col_index := CONV_INTEGER (Col); + + IF Data_in_enable = '1' THEN + IF Dqm /= "1111" THEN + -- Initialize Memory + Init_mem (Bank, Row_index); + + -- Array Buffer + CASE Bank IS + WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); + WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); + WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); + WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); + END CASE; + + -- Dqm Operation + IF Dqm (0) = '0' THEN + Dq_temp ( 7 DOWNTO 0) := Dq ( 7 DOWNTO 0); + END IF; + IF Dqm (1) = '0' THEN + Dq_temp (15 DOWNTO 8) := Dq (15 DOWNTO 8); + END IF; + IF Dqm (2) = '0' THEN + Dq_temp (23 DOWNTO 16) := Dq (23 DOWNTO 16); + END IF; + IF Dqm (3) = '0' THEN + Dq_temp (31 DOWNTO 24) := Dq (31 DOWNTO 24); + END IF; + + -- Write to Memory + CASE Bank IS + WHEN "00" => Bank0 (Row_index) (Col_index) := Dq_temp; + WHEN "01" => Bank1 (Row_index) (Col_index) := Dq_temp; + WHEN "10" => Bank2 (Row_index) (Col_index) := Dq_temp; + WHEN OTHERS => Bank3 (Row_index) (Col_index) := Dq_temp; + END CASE; + + -- Record tWR for manual precharge + WR_chkm(CONV_INTEGER(Bank)) := NOW; + END IF; + + -- Advance Burst Counter + Burst_decode; + + ELSIF Data_out_enable = '1' THEN + IF Dqm_reg0 /= "1111" THEN + -- Initialize Memory + Init_mem (Bank, Row_index); + + -- Array Buffer + CASE Bank IS + WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); + WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); + WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); + WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); + END CASE; + + -- Dqm Operation + IF Dqm_reg0 (0) = '1' THEN + Dq_temp ( 7 DOWNTO 0) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (1) = '1' THEN + Dq_temp (15 DOWNTO 8) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (2) = '1' THEN + Dq_temp (23 DOWNTO 16) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (3) = '1' THEN + Dq_temp (31 DOWNTO 24) := (OTHERS => 'Z'); + END IF; + + -- Output + Dq <= TRANSPORT Dq_temp AFTER tAC; + ELSE + Dq <= TRANSPORT (OTHERS => 'Z') AFTER tHZ; + END IF; + + -- Advance Burst Counter + Burst_decode; + END IF; + END IF; + + END PROCESS; + + -- Clock timing checks + Clock_check : PROCESS + VARIABLE Clk_low, Clk_high : TIME := 0 ns; + BEGIN + WAIT ON Clk; + IF (Clk = '1' AND NOW >= 10 ns) THEN + ASSERT (NOW - Clk_low >= tCL) + REPORT "tCL violation" + SEVERITY WARNING; + ASSERT (NOW - Clk_high >= tCK) + REPORT "tCK violation" + SEVERITY WARNING; + Clk_high := NOW; + ELSIF (Clk = '0' AND NOW /= 0 ns) THEN + ASSERT (NOW - Clk_high >= tCH) + REPORT "tCH violation" + SEVERITY WARNING; + Clk_low := NOW; + END IF; + END PROCESS; + + -- Setup timing checks + Setup_check : PROCESS + BEGIN + WAIT ON Clk; + IF Clk = '1' THEN + ASSERT(Cke'LAST_EVENT >= tCKS) + REPORT "CKE Setup time violation -- tCKS" + SEVERITY WARNING; + ASSERT(Cs_n'LAST_EVENT >= tCMS) + REPORT "CS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Cas_n'LAST_EVENT >= tCMS) + REPORT "CAS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Ras_n'LAST_EVENT >= tCMS) + REPORT "RAS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(We_n'LAST_EVENT >= tCMS) + REPORT "WE# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Dqm'LAST_EVENT >= tCMS) + REPORT "Dqm Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Addr'LAST_EVENT >= tAS) + REPORT "ADDR Setup time violation -- tAS" + SEVERITY WARNING; + ASSERT(Ba'LAST_EVENT >= tAS) + REPORT "BA Setup time violation -- tAS" + SEVERITY WARNING; + ASSERT(Dq'LAST_EVENT >= tDS) + REPORT "Dq Setup time violation -- tDS" + SEVERITY WARNING; + END IF; + END PROCESS; + + -- Hold timing checks + Hold_check : PROCESS + BEGIN + WAIT ON Clk'DELAYED (tCKH), Clk'DELAYED (tCMH), Clk'DELAYED (tAH), Clk'DELAYED (tDH); + IF Clk'DELAYED (tCKH) = '1' THEN + ASSERT(Cke'LAST_EVENT > tCKH) + REPORT "CKE Hold time violation -- tCKH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tCMH) = '1' THEN + ASSERT(Cs_n'LAST_EVENT > tCMH) + REPORT "CS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Cas_n'LAST_EVENT > tCMH) + REPORT "CAS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Ras_n'LAST_EVENT > tCMH) + REPORT "RAS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(We_n'LAST_EVENT > tCMH) + REPORT "WE# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Dqm'LAST_EVENT > tCMH) + REPORT "Dqm Hold time violation -- tCMH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tAH) = '1' THEN + ASSERT(Addr'LAST_EVENT > tAH) + REPORT "ADDR Hold time violation -- tAH" + SEVERITY WARNING; + ASSERT(Ba'LAST_EVENT > tAH) + REPORT "BA Hold time violation -- tAH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tDH) = '1' THEN + ASSERT(Dq'LAST_EVENT > tDH) + REPORT "Dq Hold time violation -- tDH" + SEVERITY WARNING; + END IF; + END PROCESS; + +END behave; Index: sdram_ctrl/trunk/test_bench/cpu_simulator.vhd =================================================================== --- sdram_ctrl/trunk/test_bench/cpu_simulator.vhd (nonexistent) +++ sdram_ctrl/trunk/test_bench/cpu_simulator.vhd (revision 8) @@ -0,0 +1,72 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +ENTITY cpu_simulator IS + PORT(clk, reset: in std_logic; + + address : out std_logic_vector(21 downto 0); + writedata : out std_logic_vector(31 downto 0); + byteenable : out std_logic_vector(3 downto 0); + write : out std_logic; + read : out std_logic; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); +END cpu_simulator; + +ARCHITECTURE behaviour OF cpu_simulator IS + signal counter: unsigned(3 downto 0); + type vector is + record + address: integer; + writedata: integer; + byteenable: std_logic_vector(3 downto 0); + write: std_logic; + read: std_logic; + end record; + type script is array(0 to (2**counter'length)-1) of vector; + signal wave_form: script:=( + (0,0,"1111",'1','0'), + (1,1,"1111",'1','0'), + (2,2,"1111",'1','0'), + (3,3,"1111",'1','0'), + (1024,1024,"1111",'0','1'), + (1025,1025,"1111",'0','1'), + (1026,1026,"1111",'0','1'), + (1027,1027,"1111",'0','1'), + (1024,1024,"1111",'1','0'), + (1025,1025,"1111",'1','0'), + (1026,1026,"1111",'1','0'), + (1027,1027,"1111",'1','0'), + (0,0,"1111",'0','1'), + (1,1,"1111",'0','1'), + (2,2,"1111",'0','1'), + (3,3,"1111",'0','1') + ); +BEGIN + process(clk,reset) + begin + if reset='1' + then + counter<=(others=>'0'); + address<=(others=>'0'); + writedata<=(others=>'0'); + byteenable<=(others=>'0'); + write<='0'; + read<='0'; + elsif rising_edge(clk) + then + if waitrequest='0' + then + counter<=counter+1; + address<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).address,address'length)); + writedata<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).writedata,writedata'length)); + byteenable<=wave_form(to_integer(counter)).byteenable; + write<=wave_form(to_integer(counter)).write; + read<=wave_form(to_integer(counter)).read; + end if; + end if; + end process; +END behaviour; \ No newline at end of file Index: sdram_ctrl/trunk/test_bench/pll.vhd =================================================================== --- sdram_ctrl/trunk/test_bench/pll.vhd (nonexistent) +++ sdram_ctrl/trunk/test_bench/pll.vhd (revision 8) @@ -0,0 +1,256 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 5.1 Build 213 01/19/2006 SP 1 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2006 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 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.altera_mf_components.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + e0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll 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_VECTOR (3 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : 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; + extclk0_divide_by : NATURAL; + extclk0_duty_cycle : NATURAL; + extclk0_multiply_by : NATURAL; + extclk0_phase_shift : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + invalid_lock_multiplier : NATURAL; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + valid_lock_multiplier : NATURAL + ); + PORT ( + extclk : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + locked <= sub_wire2; + sub_wire4 <= sub_wire3(0); + e0 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + clk0_divide_by => 2, + clk0_duty_cycle => 50, + clk0_multiply_by => 11, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + extclk0_divide_by => 2, + extclk0_duty_cycle => 50, + extclk0_multiply_by => 11, + extclk0_phase_shift => "5682", + inclk0_input_frequency => 41666, + intended_device_family => "Cyclone", + invalid_lock_multiplier => 5, + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + valid_lock_multiplier => 1 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2, + extclk => sub_wire3 + ); + + + +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 "0" +-- 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_FAMILY NUMERIC "11" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: DEV_FAMILY STRING "Cyclone" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: DIV_FACTOR6 NUMERIC "1" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE6 STRING "50.00000000" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- 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: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" +-- Retrieval info: PRIVATE: LOCK_LOSS_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "504.000" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT6 STRING "deg" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK6 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: MULT_FACTOR6 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "132.000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ6 STRING "100.000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE6 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT6 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT6 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT6 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- 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_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: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED 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: STICKY_CLK6 STRING "0" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK6 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA6 STRING "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 "2" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: EXTCLK0_DIVIDE_BY NUMERIC "2" +-- Retrieval info: CONSTANT: EXTCLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: EXTCLK0_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: EXTCLK0_PHASE_SHIFT STRING "5682" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "41666" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone" +-- 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: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: VALID_LOCK_MULTIPLIER NUMERIC "1" +-- Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT VCC "@clk[5..0]" +-- Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT VCC "@extclk[3..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT VCC "c0" +-- Retrieval info: USED_PORT: e0 0 0 0 0 OUTPUT VCC "e0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT 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: e0 0 0 0 0 @extclk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_waveforms.html FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_wave*.jpg FALSE FALSE Index: sdram_ctrl/trunk/test_bench/old/nios.dat =================================================================== --- sdram_ctrl/trunk/test_bench/old/nios.dat (nonexistent) +++ sdram_ctrl/trunk/test_bench/old/nios.dat (revision 8) @@ -0,0 +1 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file Index: sdram_ctrl/trunk/test_bench/old/Hello_LED_sdram_0.dat =================================================================== --- sdram_ctrl/trunk/test_bench/old/Hello_LED_sdram_0.dat (nonexistent) +++ sdram_ctrl/trunk/test_bench/old/Hello_LED_sdram_0.dat (revision 8) @@ -0,0 +1,49 @@ +@00000000 00400034 +@00000001 08400804 +@00000002 0800683A +@00000003 00000000 +@00000004 00000000 +@00000005 00000000 +@00000006 00000000 +@00000007 00000000 +@00000008 06C04034 +@00000009 DEC00004 +@0000000A 06800074 +@0000000B D6A03104 +@0000000C 00000340 +@0000000D DEFFFD04 +@0000000E DF000215 +@0000000F D839883A +@00000010 00800084 +@00000011 E0800005 +@00000012 E0000045 +@00000013 E0800003 +@00000014 1080204C +@00000015 1005003A +@00000016 1000031E +@00000017 E0800043 +@00000018 1080005C +@00000019 E0800045 +@0000001A E0800043 +@0000001B 1005003A +@0000001C 1000041E +@0000001D E0800003 +@0000001E 1004D07A +@0000001F E0800005 +@00000020 00000306 +@00000021 E0800003 +@00000022 1085883A +@00000023 E0800005 +@00000024 00C04034 +@00000025 18C21004 +@00000026 E0800003 +@00000027 18800035 +@00000028 E0000115 +@00000029 E0C00117 +@0000002A 008000F4 +@0000002B 10834FC4 +@0000002C 10FFE616 +@0000002D E0800117 +@0000002E 10800044 +@0000002F E0800115 +@00000030 003FF806 Index: sdram_ctrl/trunk/test_bench/old/cpu_simulator_file_based.vhd =================================================================== --- sdram_ctrl/trunk/test_bench/old/cpu_simulator_file_based.vhd (nonexistent) +++ sdram_ctrl/trunk/test_bench/old/cpu_simulator_file_based.vhd (revision 8) @@ -0,0 +1,79 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +ENTITY cpu_simulator IS + PORT(clk, reset: in std_logic; + + address : out std_logic_vector(21 downto 0); + writedata : out std_logic_vector(31 downto 0); + byteenable : out std_logic_vector(3 downto 0); + write : out std_logic; + read : out std_logic; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); +END cpu_simulator; + +ARCHITECTURE behaviour OF cpu_simulator IS + signal address: std_logic_vector(21 downto 0); + signal writedata: std_logic_vector(31 downto 0); + signal byteenable: std_logic_vector(3 downto 0); + signal write: std_logic; + signal read: std_logic; + +BEGIN + process(clk,reset) + variable service: std_logic_vector(7 downto 0); + variable b0,b1,b2,b3,b4,b5,b6,b7: BYTE; + begin + if reset='1' + then + file_close(NIOS); + file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); + elsif rising_edge(clk) + then + if waitrequest='0' + then + if Endfile(NIOS) + then + file_close(NIOS); + file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); + else + Read(NIOS,b0); + Read(NIOS,b1); + Read(NIOS,b2); + Read(NIOS,b3); + Read(NIOS,b4); + Read(NIOS,b5); + Read(NIOS,b6); + Read(NIOS,b7); + service:=char2std_logic_vector(b0); + address<=service(5 downto 0)&char2std_logic_vector(b1)&char2std_logic_vector(b2); + writedata<=char2std_logic_vector(b3)&char2std_logic_vector(b4)&char2std_logic_vector(b5)&char2std_logic_vector(b6); + service:=char2std_logic_vector(b7); + byteenable<=not service(7 downto 4); + write<=service(3); + read<=service(2); + end if; + end if; + end if; + end process; + + process(clk,reset) + begin + if reset='1' + then + readed<=(others=>'0'); + new_data<='0'; + elsif rising_edge(clk) + then + new_data<=readdatavalid; + if readdatavalid='1' + then + readed<=readdata; + end if; + end if; + end process; +END behaviour; \ No newline at end of file Index: sdram_ctrl/trunk/test_bench/old/Count_Binary_sdram_0.dat =================================================================== --- sdram_ctrl/trunk/test_bench/old/Count_Binary_sdram_0.dat (nonexistent) +++ sdram_ctrl/trunk/test_bench/old/Count_Binary_sdram_0.dat (revision 8) @@ -0,0 +1,5026 @@ +;Count Binary +@00000000 00820014 +@00000001 1001483A +@00000002 10BFF804 +@00000003 00BFFD16 +@00000004 00400034 +@00000005 08407204 +@00000006 0800683A +@00000007 00000000 +@00000008 DEFFED04 +@00000009 DFC00015 +@0000000A D8400215 +@0000000B D8800315 +@0000000C D8C00415 +@0000000D D9000515 +@0000000E D9400615 +@0000000F D9800715 +@00000010 D9C00815 +@00000011 000B307A +@00000012 DA000915 +@00000013 DA400A15 +@00000014 DA800B15 +@00000015 DAC00C15 +@00000016 DB000D15 +@00000017 DB400E15 +@00000018 DB800F15 +@00000019 DBC01015 +@0000001A D9401115 +@0000001B EBFFFF04 +@0000001C DBC01215 +@0000001D 0009313A +@0000001E 2880004C +@0000001F 10000326 +@00000020 20000226 +@00000021 00000EC0 +@00000022 00000306 +@00000023 DF401215 +@00000024 E8BFFF17 +@00000025 003DA03A +@00000026 D9401117 +@00000027 DF401217 +@00000028 DFC00017 +@00000029 2801707A +@0000002A D8400217 +@0000002B D8800317 +@0000002C D8C00417 +@0000002D D9000517 +@0000002E D9400617 +@0000002F D9800717 +@00000030 D9C00817 +@00000031 DA000917 +@00000032 DA400A17 +@00000033 DA800B17 +@00000034 DAC00C17 +@00000035 DB000D17 +@00000036 DB400E17 +@00000037 DB800F17 +@00000038 DBC01017 +@00000039 DEC01304 +@0000003A E800083A +@0000003B DEFFF904 +@0000003C DFC00615 +@0000003D DF000515 +@0000003E D839883A +@0000003F 0005313A +@00000040 E0800415 +@00000041 E0800417 +@00000042 E0800315 +@00000043 E0800317 +@00000044 E0800015 +@00000045 E0000215 +@00000046 00800044 +@00000047 E0800115 +@00000048 E0C00017 +@00000049 E0800117 +@0000004A 1884703A +@0000004B 1005003A +@0000004C 1000101E +@0000004D 00C00034 +@0000004E 18D3A504 +@0000004F E0800217 +@00000050 100490FA +@00000051 10C9883A +@00000052 00C00034 +@00000053 18D3A504 +@00000054 E0800217 +@00000055 100490FA +@00000056 10C5883A +@00000057 10800104 +@00000058 20C00017 +@00000059 11000017 +@0000005A E1400217 +@0000005B 183EE83A +@0000005C 00000706 +@0000005D E0800117 +@0000005E 1085883A +@0000005F E0800115 +@00000060 E0800217 +@00000061 10800044 +@00000062 E0800215 +@00000063 003FE406 +@00000064 0005313A +@00000065 E0800315 +@00000066 E0800317 +@00000067 E0800415 +@00000068 E0800417 +@00000069 E0800015 +@0000006A E0800017 +@0000006B 1005003A +@0000006C 1000011E +@0000006D 003FD706 +@0000006E DFC00617 +@0000006F DF000517 +@00000070 DEC00704 +@00000071 F800283A +@00000072 06C04034 +@00000073 DEC00004 +@00000074 06800074 +@00000075 D6B38B04 +@00000076 00800034 +@00000077 1093A104 +@00000078 00C00034 +@00000079 18D42804 +@0000007A 10C00326 +@0000007B 10000015 +@0000007C 10800104 +@0000007D 10FFFD36 +@0000007E 0000DB40 +@0000007F DEFFFE04 +@00000080 DFC00115 +@00000081 DF000015 +@00000082 D839883A +@00000083 01000034 +@00000084 210D8704 +@00000085 00005100 +@00000086 01000034 +@00000087 210D8F04 +@00000088 00005100 +@00000089 01000034 +@0000008A 210D9604 +@0000008B 00005100 +@0000008C 01000034 +@0000008D 210D9D04 +@0000008E 00005100 +@0000008F DFC00117 +@00000090 DF000017 +@00000091 DEC00204 +@00000092 F800283A +@00000093 DEFFFF04 +@00000094 DF000015 +@00000095 D839883A +@00000096 00C04034 +@00000097 18C21004 +@00000098 D0A01603 +@00000099 18800035 +@0000009A DF000017 +@0000009B DEC00104 +@0000009C F800283A +@0000009D DEFFFF04 +@0000009E DF000015 +@0000009F D839883A +@000000A0 DF000017 +@000000A1 DEC00104 +@000000A2 F800283A +@000000A3 DEFFFE04 +@000000A4 DF000115 +@000000A5 D839883A +@000000A6 E1000015 +@000000A7 DF000117 +@000000A8 DEC00204 +@000000A9 F800283A +@000000AA DEFFFD04 +@000000AB DFC00215 +@000000AC DF000115 +@000000AD D839883A +@000000AE E1000015 +@000000AF 000024C0 +@000000B0 00002740 +@000000B1 E1000017 +@000000B2 000028C0 +@000000B3 D1601603 +@000000B4 01000034 +@000000B5 210DA404 +@000000B6 00005100 +@000000B7 DFC00217 +@000000B8 DF000117 +@000000B9 DEC00304 +@000000BA F800283A +@000000BB DEFFFA04 +@000000BC DFC00515 +@000000BD DF000415 +@000000BE D839883A +@000000BF E1400115 +@000000C0 E1000005 +@000000C1 E0800003 +@000000C2 108018D8 +@000000C3 1000201E +@000000C4 D0A01717 +@000000C5 E0800215 +@000000C6 E0C00217 +@000000C7 188000A0 +@000000C8 1000101E +@000000C9 E0C00217 +@000000CA 188000C8 +@000000CB 1000041E +@000000CC E0C00217 +@000000CD 18800060 +@000000CE 1000081E +@000000CF 00001106 +@000000D0 E0C00217 +@000000D1 18800120 +@000000D2 1000081E +@000000D3 E0C00217 +@000000D4 18800220 +@000000D5 1000081E +@000000D6 00000A06 +@000000D7 000024C0 +@000000D8 00003106 +@000000D9 00002740 +@000000DA 00002F06 +@000000DB E1000117 +@000000DC 000028C0 +@000000DD 00002C06 +@000000DE E1000117 +@000000DF 00002A80 +@000000E0 00002906 +@000000E1 E1000117 +@000000E2 00002A80 +@000000E3 00002606 +@000000E4 D0A01717 +@000000E5 E0800315 +@000000E6 E0C00317 +@000000E7 188000A0 +@000000E8 1000131E +@000000E9 E0C00317 +@000000EA 188000C8 +@000000EB 1000041E +@000000EC E0C00317 +@000000ED 18800060 +@000000EE 1000081E +@000000EF 00001A06 +@000000F0 E0C00317 +@000000F1 18800120 +@000000F2 10000E1E +@000000F3 E0C00317 +@000000F4 18800220 +@000000F5 1000101E +@000000F6 00001306 +@000000F7 01000034 +@000000F8 210DA604 +@000000F9 00005100 +@000000FA D0201715 +@000000FB 00000E06 +@000000FC 01000034 +@000000FD 210DA904 +@000000FE 00005100 +@000000FF D0201715 +@00000100 00000906 +@00000101 01000034 +@00000102 210DAC04 +@00000103 00005100 +@00000104 D0201715 +@00000105 00000406 +@00000106 01000034 +@00000107 210DAF04 +@00000108 00005100 +@00000109 D0201715 +@0000010A DFC00517 +@0000010B DF000417 +@0000010C DEC00604 +@0000010D F800283A +@0000010E DEFFFB04 +@0000010F DFC00415 +@00000110 DF000315 +@00000111 D839883A +@00000112 D0201605 +@00000113 00001FC0 +@00000114 010000B4 +@00000115 2121A804 +@00000116 0000E6C0 +@00000117 D0A01717 +@00000118 1005003A +@00000119 1000041E +@0000011A 010018C4 +@0000011B E1400217 +@0000011C 00002EC0 +@0000011D 00000206 +@0000011E E1000217 +@0000011F 00002A80 +@00000120 D0A01603 +@00000121 10803FD8 +@00000122 10001D1E +@00000123 01000034 +@00000124 210DB204 +@00000125 00005100 +@00000126 D0201715 +@00000127 E0000115 +@00000128 E0000015 +@00000129 E0800017 +@0000012A 10801188 +@0000012B 1000131E +@0000012C 01000034 +@0000012D 210DB504 +@0000012E 00005100 +@0000012F D0A01717 +@00000130 1005003A +@00000131 1000061E +@00000132 01000034 +@00000133 210DB604 +@00000134 00005100 +@00000135 01001DC4 +@00000136 E1400217 +@00000137 00002EC0 +@00000138 010000B4 +@00000139 2121A804 +@0000013A 0000E6C0 +@0000013B E0800017 +@0000013C 10800044 +@0000013D E0800015 +@0000013E 003FEA06 +@0000013F 00001FC0 +@00000140 D0A01603 +@00000141 10800044 +@00000142 D0A01605 +@00000143 003FD006 +@00000144 DEFFFC04 +@00000145 DFC00015 +@00000146 D9400115 +@00000147 D9800215 +@00000148 D9C00315 +@00000149 D0A00017 +@0000014A 200B883A +@0000014B D9800104 +@0000014C 11000117 +@0000014D 00800034 +@0000014E 1082C604 +@0000014F 20800115 +@00000150 0000AF40 +@00000151 DFC00017 +@00000152 DEC00404 +@00000153 F800283A +@00000154 DEFFFB04 +@00000155 DC000315 +@00000156 DC400215 +@00000157 DC800115 +@00000158 DFC00415 +@00000159 D9800005 +@0000015A 2025883A +@0000015B 2823883A +@0000015C 3C3FFFC4 +@0000015D 01C00A0E +@0000015E 88C00117 +@0000015F 9009883A +@00000160 880B883A +@00000161 D80D883A +@00000162 01C00044 +@00000163 183EE83A +@00000164 8007883A +@00000165 843FFFC4 +@00000166 1000081E +@00000167 00FFF616 +@00000168 0005883A +@00000169 DFC00417 +@0000016A DC000317 +@0000016B DC400217 +@0000016C DC800117 +@0000016D DEC00504 +@0000016E F800283A +@0000016F 00BFFFC4 +@00000170 DFC00417 +@00000171 DC000317 +@00000172 DC400217 +@00000173 DC800117 +@00000174 DEC00504 +@00000175 F800283A +@00000176 DEFFEC04 +@00000177 DF001215 +@00000178 DC001115 +@00000179 DC401015 +@0000017A DC800F15 +@0000017B DD000D15 +@0000017C DD800B15 +@0000017D DDC00A15 +@0000017E DFC01315 +@0000017F DCC00E15 +@00000180 DD400C15 +@00000181 30800003 +@00000182 202F883A +@00000183 2829883A +@00000184 1021883A +@00000185 D9C00215 +@00000186 34800044 +@00000187 D8000315 +@00000188 D8000415 +@00000189 D8000515 +@0000018A D8000615 +@0000018B 0039883A +@0000018C D8000715 +@0000018D D8000815 +@0000018E 002D883A +@0000018F 0023883A +@00000190 1000061E +@00000191 00002206 +@00000192 88002E26 +@00000193 90800003 +@00000194 94800044 +@00000195 1021883A +@00000196 10001D26 +@00000197 01C00044 +@00000198 89C03626 +@00000199 3C7FF80E +@0000019A 00800084 +@0000019B 88BFF71E +@0000019C 81003FCC +@0000019D 2100201C +@0000019E 213FE004 +@0000019F 00800B84 +@000001A0 20803826 +@000001A1 817FF404 +@000001A2 28C03FCC +@000001A3 00800244 +@000001A4 10C03636 +@000001A5 D8C00617 +@000001A6 2821883A +@000001A7 18005916 +@000001A8 D9000617 +@000001A9 01400284 +@000001AA 0000D8C0 +@000001AB 80C03FCC +@000001AC 18C0201C +@000001AD 18FFE004 +@000001AE 10C5883A +@000001AF D8800615 +@000001B0 90800003 +@000001B1 94800044 +@000001B2 1021883A +@000001B3 103FE31E +@000001B4 B005883A +@000001B5 DFC01317 +@000001B6 DF001217 +@000001B7 DC001117 +@000001B8 DC401017 +@000001B9 DC800F17 +@000001BA DCC00E17 +@000001BB DD000D17 +@000001BC DD400C17 +@000001BD DD800B17 +@000001BE DDC00A17 +@000001BF DEC01404 +@000001C0 F800283A +@000001C1 80C03FCC +@000001C2 18C0201C +@000001C3 18FFE004 +@000001C4 00800944 +@000001C5 18802026 +@000001C6 A0C00117 +@000001C7 B809883A +@000001C8 DC000005 +@000001C9 A00B883A +@000001CA D80D883A +@000001CB 183EE83A +@000001CC 1000E81E +@000001CD B5800044 +@000001CE 003FC406 +@000001CF 81003FCC +@000001D0 2100201C +@000001D1 213FE004 +@000001D2 00800C04 +@000001D3 20801C26 +@000001D4 00800944 +@000001D5 20801D26 +@000001D6 00800B84 +@000001D7 04400084 +@000001D8 20BFC81E +@000001D9 D8000615 +@000001DA 003FB806 +@000001DB 00801B04 +@000001DC 20802126 +@000001DD 20FFEA04 +@000001DE 00800804 +@000001DF 10C01C36 +@000001E0 180490BA +@000001E1 00C00034 +@000001E2 18CDBA04 +@000001E3 10C5883A +@000001E4 11000017 +@000001E5 2000683A +@000001E6 00BFFFC4 +@000001E7 07000284 +@000001E8 3823883A +@000001E9 D9C00715 +@000001EA D8800515 +@000001EB D8000315 +@000001EC D8000415 +@000001ED D8000815 +@000001EE D8800615 +@000001EF 003FA306 +@000001F0 DC400315 +@000001F1 04400084 +@000001F2 003FA006 +@000001F3 A0C00117 +@000001F4 B809883A +@000001F5 DC000045 +@000001F6 A00B883A +@000001F7 D9800044 +@000001F8 880F883A +@000001F9 183EE83A +@000001FA 1000BA1E +@000001FB B46D883A +@000001FC 0023883A +@000001FD 003F9506 +@000001FE 00800044 +@000001FF D8800415 +@00000200 003F9206 +@00000201 D8800517 +@00000202 1000B416 +@00000203 D9000517 +@00000204 01400284 +@00000205 0000D8C0 +@00000206 D8800515 +@00000207 D8C00517 +@00000208 80803FCC +@00000209 1080201C +@0000020A 10BFE004 +@0000020B 1887883A +@0000020C D8C00515 +@0000020D 003F8506 +@0000020E 00C00044 +@0000020F D8000715 +@00000210 07000404 +@00000211 D8C00815 +@00000212 D8800717 +@00000213 D8000915 +@00000214 1007003A +@00000215 D8800217 +@00000216 15400017 +@00000217 10800104 +@00000218 D8800215 +@00000219 1800011E +@0000021A A8009E16 +@0000021B 04C00044 +@0000021C A821883A +@0000021D 9823883A +@0000021E 00000506 +@0000021F 9809883A +@00000220 E00B883A +@00000221 0000D8C0 +@00000222 1027883A +@00000223 8C400044 +@00000224 8009883A +@00000225 E00B883A +@00000226 0000D6C0 +@00000227 1021883A +@00000228 103FF61E +@00000229 D8800517 +@0000022A D8C00317 +@0000022B 1445C83A +@0000022C D8800515 +@0000022D 18006F26 +@0000022E D8800917 +@0000022F 10000D26 +@00000230 A0C00117 +@00000231 00800B44 +@00000232 D8800085 +@00000233 B809883A +@00000234 A00B883A +@00000235 D9800084 +@00000236 01C00044 +@00000237 183EE83A +@00000238 10007C1E +@00000239 D8C00517 +@0000023A B5800044 +@0000023B 18FFFFC4 +@0000023C D8C00515 +@0000023D D9C00517 +@0000023E B809883A +@0000023F A00B883A +@00000240 01800C04 +@00000241 00005500 +@00000242 1000721E +@00000243 D8800517 +@00000244 B0AD883A +@00000245 983FB626 +@00000246 A809883A +@00000247 980B883A +@00000248 0000D6C0 +@00000249 11000C04 +@0000024A 20C03FCC +@0000024B 00800E44 +@0000024C 10C0042E +@0000024D D8800817 +@0000024E 190001C4 +@0000024F 1000011E +@00000250 190009C4 +@00000251 A0C00117 +@00000252 A00B883A +@00000253 D9000105 +@00000254 D9800104 +@00000255 B809883A +@00000256 01C00044 +@00000257 183EE83A +@00000258 10005C1E +@00000259 A809883A +@0000025A 980B883A +@0000025B 0000D7C0 +@0000025C 9809883A +@0000025D E00B883A +@0000025E 102B883A +@0000025F 0000D6C0 +@00000260 1027883A +@00000261 B5800044 +@00000262 003FE206 +@00000263 D8800517 +@00000264 B809883A +@00000265 A00B883A +@00000266 01800804 +@00000267 11FFFFC4 +@00000268 00005500 +@00000269 10004B1E +@0000026A D8800217 +@0000026B A2000117 +@0000026C B809883A +@0000026D 10C00017 +@0000026E 10800104 +@0000026F A00B883A +@00000270 D8C00145 +@00000271 D8C00517 +@00000272 D9800144 +@00000273 01C00044 +@00000274 D8800215 +@00000275 1DA1883A +@00000276 403EE83A +@00000277 10003D1E +@00000278 802D883A +@00000279 0023883A +@0000027A 003F1806 +@0000027B 07000404 +@0000027C D8000715 +@0000027D 003F9406 +@0000027E D8000715 +@0000027F 003F9206 +@00000280 D8800217 +@00000281 14400017 +@00000282 10C00104 +@00000283 D8C00215 +@00000284 8809883A +@00000285 0000BEC0 +@00000286 1021883A +@00000287 D8800517 +@00000288 B809883A +@00000289 A00B883A +@0000028A 1427C83A +@0000028B 01800804 +@0000028C 980F883A +@0000028D 00005500 +@0000028E 1000261E +@0000028F A0C00117 +@00000290 880D883A +@00000291 B809883A +@00000292 A00B883A +@00000293 800F883A +@00000294 B4ED883A +@00000295 183EE83A +@00000296 10001E1E +@00000297 B42D883A +@00000298 0023883A +@00000299 003EF906 +@0000029A 07000204 +@0000029B D8000715 +@0000029C 003F7506 +@0000029D D8C00917 +@0000029E 1821003A +@0000029F 8000031E +@000002A0 D8800517 +@000002A1 10BFFFC4 +@000002A2 D8800515 +@000002A3 D9C00517 +@000002A4 B809883A +@000002A5 A00B883A +@000002A6 01800804 +@000002A7 00005500 +@000002A8 10000C1E +@000002A9 D8C00517 +@000002AA B0ED883A +@000002AB 803F991E +@000002AC A0C00117 +@000002AD 00800B44 +@000002AE D88000C5 +@000002AF B809883A +@000002B0 A00B883A +@000002B1 D98000C4 +@000002B2 01C00044 +@000002B3 183EE83A +@000002B4 103FAC26 +@000002B5 00BFFFC4 +@000002B6 003EFE06 +@000002B7 D8000515 +@000002B8 003F4E06 +@000002B9 00C00044 +@000002BA 056BC83A +@000002BB D8C00915 +@000002BC 003F5E06 +@000002BD 2013883A +@000002BE D1200017 +@000002BF 2807883A +@000002C0 300F883A +@000002C1 480B883A +@000002C2 180D883A +@000002C3 02000034 +@000002C4 42017604 +@000002C5 4000683A +@000002C6 DEFFFA04 +@000002C7 DC400315 +@000002C8 DC800215 +@000002C9 DCC00115 +@000002CA DFC00515 +@000002CB DC000415 +@000002CC DD000015 +@000002CD 28C0000B +@000002CE 2027883A +@000002CF 2825883A +@000002D0 1804D0FA +@000002D1 3023883A +@000002D2 013FFFC4 +@000002D3 1080004C +@000002D4 10001B26 +@000002D5 2940008B +@000002D6 28BFFFCC +@000002D7 10A0001C +@000002D8 10A00004 +@000002D9 10001316 +@000002DA 3821883A +@000002DB 05010004 +@000002DC 01C00316 +@000002DD 00001B06 +@000002DE 04001A0E +@000002DF 9140008B +@000002E0 297FFFCC +@000002E1 2960001C +@000002E2 880D883A +@000002E3 9809883A +@000002E4 29600004 +@000002E5 800F883A +@000002E6 A400010E +@000002E7 01C10004 +@000002E8 0000C0C0 +@000002E9 80A1C83A +@000002EA 88A3883A +@000002EB 00BFF216 +@000002EC 90C0000B +@000002ED 18801014 +@000002EE 9080000D +@000002EF 013FFFC4 +@000002F0 2005883A +@000002F1 DFC00517 +@000002F2 DC000417 +@000002F3 DC400317 +@000002F4 DC800217 +@000002F5 DCC00117 +@000002F6 DD000017 +@000002F7 DEC00604 +@000002F8 F800283A +@000002F9 0009883A +@000002FA 003FF506 +@000002FB 20800007 +@000002FC 2007883A +@000002FD 10000326 +@000002FE 21000044 +@000002FF 20800007 +@00000300 103FFD1E +@00000301 20C5C83A +@00000302 F800283A +@00000303 DEFFFE04 +@00000304 DC000015 +@00000305 2021883A +@00000306 2809883A +@00000307 300B883A +@00000308 380D883A +@00000309 DFC00115 +@0000030A D0201815 +@0000030B 0000E980 +@0000030C 1007883A +@0000030D 00BFFFC4 +@0000030E 18800526 +@0000030F 1805883A +@00000310 DFC00117 +@00000311 DC000017 +@00000312 DEC00204 +@00000313 F800283A +@00000314 D0A01817 +@00000315 103FF926 +@00000316 80800315 +@00000317 1805883A +@00000318 DFC00117 +@00000319 DC000017 +@0000031A DEC00204 +@0000031B F800283A +@0000031C 00800044 +@0000031D 000F883A +@0000031E 2900082E +@0000031F 28000716 +@00000320 294B883A +@00000321 1085883A +@00000322 29000E2E +@00000323 1007003A +@00000324 1800081E +@00000325 283FFA0E +@00000326 1800061E +@00000327 21400236 +@00000328 2149C83A +@00000329 388EB03A +@0000032A 1004D07A +@0000032B 280AD07A +@0000032C 103FFA1E +@0000032D 3000011E +@0000032E 3809883A +@0000032F 2005883A +@00000330 F800283A +@00000331 1007003A +@00000332 183FF426 +@00000333 003FF906 +@00000334 DEFFFE04 +@00000335 DC000015 +@00000336 DFC00115 +@00000337 000D883A +@00000338 0021883A +@00000339 20000816 +@0000033A 28000A16 +@0000033B 0000C700 +@0000033C 80000126 +@0000033D 0085C83A +@0000033E DFC00117 +@0000033F DC000017 +@00000340 DEC00204 +@00000341 F800283A +@00000342 0109C83A +@00000343 0021003A +@00000344 283FF60E +@00000345 014BC83A +@00000346 8021003A +@00000347 003FF306 +@00000348 DEFFFE04 +@00000349 DC000015 +@0000034A DFC00115 +@0000034B 01800044 +@0000034C 0021883A +@0000034D 20000816 +@0000034E 28000A16 +@0000034F 0000C700 +@00000350 80000126 +@00000351 0085C83A +@00000352 DFC00117 +@00000353 DC000017 +@00000354 DEC00204 +@00000355 F800283A +@00000356 0109C83A +@00000357 3021883A +@00000358 283FF60E +@00000359 014BC83A +@0000035A 003FF406 +@0000035B 000D883A +@0000035C 02000034 +@0000035D 42031C04 +@0000035E 4000683A +@0000035F 01800044 +@00000360 02000034 +@00000361 42031C04 +@00000362 4000683A +@00000363 0007883A +@00000364 20000626 +@00000365 2080004C +@00000366 2008D07A +@00000367 10000126 +@00000368 1947883A +@00000369 294B883A +@0000036A 203FFA1E +@0000036B 1805883A +@0000036C F800283A +@0000036D DEFFFD04 +@0000036E DFC00215 +@0000036F DF000115 +@00000370 D839883A +@00000371 E0000015 +@00000372 000170FA +@00000373 00800044 +@00000374 1001703A +@00000375 E0000015 +@00000376 0000E200 +@00000377 01000034 +@00000378 210DDB04 +@00000379 01400034 +@0000037A 294DDB04 +@0000037B 01800034 +@0000037C 318DDB04 +@0000037D 0001F540 +@0000037E 0001DC80 +@0000037F 01000034 +@00000380 21078804 +@00000381 000283C0 +@00000382 D1200117 +@00000383 D1600217 +@00000384 D1A00317 +@00000385 00004380 +@00000386 1009883A +@00000387 00028D80 +@00000388 DEFFFE04 +@00000389 DFC00115 +@0000038A DF000015 +@0000038B D839883A +@0000038C 01004034 +@0000038D 21020004 +@0000038E 01400044 +@0000038F 0180FA04 +@00000390 00019880 +@00000391 01000034 +@00000392 210DFD04 +@00000393 01404034 +@00000394 29421404 +@00000395 01800404 +@00000396 00018600 +@00000397 DFC00117 +@00000398 DF000017 +@00000399 DEC00204 +@0000039A F800283A +@0000039B DEFFFD04 +@0000039C DFC00215 +@0000039D DF000115 +@0000039E D839883A +@0000039F E1000015 +@000003A0 E1000017 +@000003A1 0001B500 +@000003A2 DFC00217 +@000003A3 DF000117 +@000003A4 DEC00304 +@000003A5 F800283A +@000003A6 DEFFF704 +@000003A7 DFC00815 +@000003A8 DF000715 +@000003A9 D839883A +@000003AA E1000015 +@000003AB E1400115 +@000003AC E1800215 +@000003AD E0800017 +@000003AE 1004803A +@000003AF 1000091E +@000003B0 E1000017 +@000003B1 01400304 +@000003B2 0000D8C0 +@000003B3 1007883A +@000003B4 00800034 +@000003B5 10921F04 +@000003B6 1887883A +@000003B7 E0C00615 +@000003B8 00000106 +@000003B9 E0000615 +@000003BA E0800617 +@000003BB E0800315 +@000003BC E0800317 +@000003BD 1005003A +@000003BE 1000241E +@000003BF E0800317 +@000003C0 10800217 +@000003C1 108000CC +@000003C2 1005003A +@000003C3 10001A1E +@000003C4 E0800317 +@000003C5 10800017 +@000003C6 10800617 +@000003C7 1005003A +@000003C8 1000151E +@000003C9 E0800317 +@000003CA 10800017 +@000003CB 10800617 +@000003CC E1000317 +@000003CD E1400117 +@000003CE E1800217 +@000003CF 103EE83A +@000003D0 E0800415 +@000003D1 E0800417 +@000003D2 1004403A +@000003D3 1000071E +@000003D4 0000FB80 +@000003D5 E0C00417 +@000003D6 00C7C83A +@000003D7 10C00015 +@000003D8 00BFFFC4 +@000003D9 E0800515 +@000003DA 00000E06 +@000003DB E0800417 +@000003DC E0800515 +@000003DD 00000B06 +@000003DE 0000FB80 +@000003DF 1007883A +@000003E0 00800344 +@000003E1 18800015 +@000003E2 00000406 +@000003E3 0000FB80 +@000003E4 1007883A +@000003E5 00801444 +@000003E6 18800015 +@000003E7 00BFFFC4 +@000003E8 E0800515 +@000003E9 E0800517 +@000003EA DFC00817 +@000003EB DF000717 +@000003EC DEC00904 +@000003ED F800283A +@000003EE DEFFFD04 +@000003EF DFC00215 +@000003F0 DF000115 +@000003F1 D839883A +@000003F2 D0A00917 +@000003F3 1005003A +@000003F4 1000041E +@000003F5 D0A00917 +@000003F6 103EE83A +@000003F7 E0800015 +@000003F8 00000206 +@000003F9 D0A01804 +@000003FA E0800015 +@000003FB E0800017 +@000003FC DFC00217 +@000003FD DF000117 +@000003FE DEC00304 +@000003FF F800283A +@00000400 DEFFF204 +@00000401 DFC00D15 +@00000402 DF000C15 +@00000403 D839883A +@00000404 E1000015 +@00000405 E1400115 +@00000406 E1800215 +@00000407 E0800017 +@00000408 10800017 +@00000409 E0800315 +@0000040A E0800117 +@0000040B E0800415 +@0000040C E0000715 +@0000040D E0800217 +@0000040E 10800050 +@0000040F 10004D1E +@00000410 E0800317 +@00000411 10801417 +@00000412 E0800815 +@00000413 E0800317 +@00000414 10801517 +@00000415 E0800915 +@00000416 E0C00817 +@00000417 E0800917 +@00000418 18800536 +@00000419 E0800817 +@0000041A E0C00917 +@0000041B 10C5C83A +@0000041C E0800615 +@0000041D 00000406 +@0000041E 00820004 +@0000041F E0C00917 +@00000420 10C5C83A +@00000421 E0800615 +@00000422 E0800617 +@00000423 1004C03A +@00000424 1000011E +@00000425 00001E06 +@00000426 E0C00217 +@00000427 E0800617 +@00000428 1880022E +@00000429 E0800217 +@0000042A E0800615 +@0000042B E0C00317 +@0000042C E0800917 +@0000042D 1885883A +@0000042E 11401804 +@0000042F E1000417 +@00000430 E1800617 +@00000431 00030C00 +@00000432 E0C00417 +@00000433 E0800617 +@00000434 1885883A +@00000435 E0800415 +@00000436 E0C00217 +@00000437 E0800617 +@00000438 1885C83A +@00000439 E0800215 +@0000043A E1000317 +@0000043B E0C00917 +@0000043C E0800617 +@0000043D 1885883A +@0000043E 1081FFCC +@0000043F 20801515 +@00000440 E0800217 +@00000441 10800050 +@00000442 1000011E +@00000443 003FCC06 +@00000444 E0C00417 +@00000445 E0800117 +@00000446 18800126 +@00000447 00001506 +@00000448 E0800017 +@00000449 10800217 +@0000044A 1004D3BA +@0000044B 1080004C +@0000044C 1005003A +@0000044D 1000011E +@0000044E 00000E06 +@0000044F E0800317 +@00000450 10C01417 +@00000451 E0800817 +@00000452 1880061E +@00000453 E0800317 +@00000454 E0C00317 +@00000455 11001317 +@00000456 18800B17 +@00000457 2080012E +@00000458 003FF606 +@00000459 E0800317 +@0000045A 10C01417 +@0000045B E0800817 +@0000045C 18BFB01E +@0000045D E0000915 +@0000045E E0C00417 +@0000045F E0800117 +@00000460 18801726 +@00000461 0005303A +@00000462 E0800A15 +@00000463 0001703A +@00000464 E0800A17 +@00000465 E0800815 +@00000466 E0800817 +@00000467 E0800515 +@00000468 E0C00317 +@00000469 E0800317 +@0000046A 10801217 +@0000046B 10800054 +@0000046C 18801215 +@0000046D E0800317 +@0000046E 10800A17 +@0000046F 10800104 +@00000470 1007883A +@00000471 E0800317 +@00000472 10801217 +@00000473 18800035 +@00000474 E0800517 +@00000475 E0800A15 +@00000476 E0800A17 +@00000477 1001703A +@00000478 E0C00417 +@00000479 E0800117 +@0000047A 18800526 +@0000047B E0800417 +@0000047C E0C00117 +@0000047D 10C5C83A +@0000047E E0800B15 +@0000047F 00000B06 +@00000480 E0800017 +@00000481 10800217 +@00000482 1004D3BA +@00000483 1080004C +@00000484 1005003A +@00000485 1000031E +@00000486 00BFFD44 +@00000487 E0800B15 +@00000488 00000206 +@00000489 00BFFEC4 +@0000048A E0800B15 +@0000048B E0800B17 +@0000048C DFC00D17 +@0000048D DF000C17 +@0000048E DEC00E04 +@0000048F F800283A +@00000490 DEFFF104 +@00000491 DFC00E15 +@00000492 DF000D15 +@00000493 D839883A +@00000494 E1000015 +@00000495 E1400115 +@00000496 E1800215 +@00000497 E0000415 +@00000498 E0800017 +@00000499 10800017 +@0000049A E0800715 +@0000049B E0800117 +@0000049C E0800815 +@0000049D E0000915 +@0000049E E0800217 +@0000049F 10800050 +@000004A0 10003A1E +@000004A1 E0800717 +@000004A2 10801617 +@000004A3 E0800315 +@000004A4 E0800717 +@000004A5 10801717 +@000004A6 E0800415 +@000004A7 E0C00317 +@000004A8 E0800417 +@000004A9 1880062E +@000004AA E0C00417 +@000004AB E0800317 +@000004AC 1885C83A +@000004AD 10BFFFC4 +@000004AE E0800515 +@000004AF 00000C06 +@000004B0 E0800417 +@000004B1 1005003A +@000004B2 1000051E +@000004B3 00820004 +@000004B4 E0C00317 +@000004B5 10C5C83A +@000004B6 E0800515 +@000004B7 00000406 +@000004B8 0081FFC4 +@000004B9 E0C00317 +@000004BA 10C5C83A +@000004BB E0800515 +@000004BC E0800517 +@000004BD 1004C03A +@000004BE 1000011E +@000004BF 00001B06 +@000004C0 E0C00217 +@000004C1 E0800517 +@000004C2 1880022E +@000004C3 E0800217 +@000004C4 E0800515 +@000004C5 E0C00717 +@000004C6 E0800317 +@000004C7 1885883A +@000004C8 11021804 +@000004C9 E1400117 +@000004CA E1800517 +@000004CB 00030C00 +@000004CC E0C00117 +@000004CD E0800517 +@000004CE 1885883A +@000004CF E0800115 +@000004D0 E0C00217 +@000004D1 E0800517 +@000004D2 1885C83A +@000004D3 E0800215 +@000004D4 E1000717 +@000004D5 E0C00317 +@000004D6 E0800517 +@000004D7 1885883A +@000004D8 1081FFCC +@000004D9 20801615 +@000004DA 003FC306 +@000004DB 0005303A +@000004DC E0800B15 +@000004DD 0001703A +@000004DE E0800B17 +@000004DF E0800A15 +@000004E0 E0800A17 +@000004E1 E0800615 +@000004E2 E0C00717 +@000004E3 E0800717 +@000004E4 10801217 +@000004E5 10800094 +@000004E6 18801215 +@000004E7 E0800717 +@000004E8 10800A17 +@000004E9 10800104 +@000004EA 1007883A +@000004EB E0800717 +@000004EC 10801217 +@000004ED 18800035 +@000004EE E0800617 +@000004EF E0800B15 +@000004F0 E0800B17 +@000004F1 1001703A +@000004F2 E0800217 +@000004F3 10800050 +@000004F4 1000161E +@000004F5 E0800017 +@000004F6 10800217 +@000004F7 1004D3BA +@000004F8 1080004C +@000004F9 1005003A +@000004FA 1000011E +@000004FB 00001306 +@000004FC E0800717 +@000004FD 10C01717 +@000004FE E0800417 +@000004FF 1880061E +@00000500 E0800717 +@00000501 E0C00717 +@00000502 11001317 +@00000503 18800B17 +@00000504 2080012E +@00000505 003FF606 +@00000506 E0800717 +@00000507 10C01717 +@00000508 E0800417 +@00000509 1880011E +@0000050A 00000406 +@0000050B E0800217 +@0000050C 10800050 +@0000050D 1000011E +@0000050E 003F8F06 +@0000050F E0000B15 +@00000510 E0C00117 +@00000511 E0800817 +@00000512 18800526 +@00000513 E0800117 +@00000514 E0C00817 +@00000515 10C5C83A +@00000516 E0800C15 +@00000517 00000B06 +@00000518 E0800017 +@00000519 10800217 +@0000051A 1004D3BA +@0000051B 1080004C +@0000051C 1005003A +@0000051D 1000031E +@0000051E 00BFFD44 +@0000051F E0800C15 +@00000520 00000206 +@00000521 00BFFEC4 +@00000522 E0800C15 +@00000523 E0800C17 +@00000524 DFC00E17 +@00000525 DF000D17 +@00000526 DEC00F04 +@00000527 F800283A +@00000528 DEFFF804 +@00000529 DF000715 +@0000052A D839883A +@0000052B E1000015 +@0000052C E1400115 +@0000052D E0800017 +@0000052E E0800215 +@0000052F E0800217 +@00000530 10800A17 +@00000531 E0800315 +@00000532 E0800317 +@00000533 10800104 +@00000534 10800037 +@00000535 E0800415 +@00000536 E0800417 +@00000537 1080C00C +@00000538 1004C03A +@00000539 1000011E +@0000053A 00006E06 +@0000053B E0800417 +@0000053C 1004D23A +@0000053D 1080004C +@0000053E 1005003A +@0000053F 1000351E +@00000540 00800074 +@00000541 10800004 +@00000542 E0800515 +@00000543 E0800217 +@00000544 10801417 +@00000545 10800044 +@00000546 1081FFCC +@00000547 E0800615 +@00000548 E0800217 +@00000549 10C01517 +@0000054A E0800617 +@0000054B 1880011E +@0000054C 00001806 +@0000054D E0800317 +@0000054E 10800037 +@0000054F E0800515 +@00000550 E0800517 +@00000551 1004D3FA +@00000552 1080005C +@00000553 1080004C +@00000554 1005003A +@00000555 1000011E +@00000556 00000E06 +@00000557 E0C00217 +@00000558 E0800217 +@00000559 10801417 +@0000055A 1885883A +@0000055B 10C01804 +@0000055C E0800517 +@0000055D 18800005 +@0000055E E0C00217 +@0000055F E0800217 +@00000560 10801417 +@00000561 10800044 +@00000562 1081FFCC +@00000563 18801415 +@00000564 003FDE06 +@00000565 E0800517 +@00000566 10BFFFEC +@00000567 1005003A +@00000568 10000C1E +@00000569 E1000217 +@0000056A E0800217 +@0000056B 10C01217 +@0000056C 00BFFF84 +@0000056D 1884703A +@0000056E 20801215 +@0000056F E0800317 +@00000570 10800104 +@00000571 1007883A +@00000572 E0800217 +@00000573 10801217 +@00000574 18800035 +@00000575 E0800417 +@00000576 1004D27A +@00000577 1080004C +@00000578 1005003A +@00000579 103FB81E +@0000057A E0800417 +@0000057B 10BFFFEC +@0000057C 1004D43A +@0000057D E0800615 +@0000057E E0800617 +@0000057F 1005003A +@00000580 1000171E +@00000581 E0800217 +@00000582 E0C00217 +@00000583 11001717 +@00000584 18801617 +@00000585 20801226 +@00000586 E1000317 +@00000587 E0C00217 +@00000588 E0800217 +@00000589 10801717 +@0000058A 1885883A +@0000058B 10821804 +@0000058C 10800007 +@0000058D 20800035 +@0000058E E0C00217 +@0000058F E0800217 +@00000590 10801717 +@00000591 10800044 +@00000592 1081FFCC +@00000593 18801715 +@00000594 E0800617 +@00000595 10BFFFC4 +@00000596 E0800615 +@00000597 003FE606 +@00000598 E0800617 +@00000599 1005003A +@0000059A 103F971E +@0000059B E1000217 +@0000059C E0800217 +@0000059D 10C01217 +@0000059E 00BFFF44 +@0000059F 1884703A +@000005A0 20801215 +@000005A1 E0800217 +@000005A2 10800A17 +@000005A3 10800104 +@000005A4 1007883A +@000005A5 E0800217 +@000005A6 10801217 +@000005A7 18800035 +@000005A8 003F8906 +@000005A9 DF000717 +@000005AA DEC00804 +@000005AB F800283A +@000005AC DEFFF604 +@000005AD DF000915 +@000005AE D839883A +@000005AF E1000015 +@000005B0 E1400115 +@000005B1 E1800215 +@000005B2 E0800017 +@000005B3 10800017 +@000005B4 E0800315 +@000005B5 00BFF9C4 +@000005B6 E0800415 +@000005B7 E0800117 +@000005B8 E0800815 +@000005B9 E0C00817 +@000005BA 189A8060 +@000005BB 1000041E +@000005BC E0C00817 +@000005BD 189A80A0 +@000005BE 10001D1E +@000005BF 00002906 +@000005C0 E0800317 +@000005C1 10C00B17 +@000005C2 00A00034 +@000005C3 10BFFFC4 +@000005C4 18802426 +@000005C5 E0800217 +@000005C6 10800017 +@000005C7 E0800515 +@000005C8 E0800317 +@000005C9 E0800615 +@000005CA E0800517 +@000005CB 10800090 +@000005CC 1000071E +@000005CD E0C00517 +@000005CE 00A00034 +@000005CF 10BFFFC4 +@000005D0 18800326 +@000005D1 E0C00517 +@000005D2 E0C00715 +@000005D3 00000306 +@000005D4 00A00034 +@000005D5 10BFFF84 +@000005D6 E0800715 +@000005D7 E0C00717 +@000005D8 E0800617 +@000005D9 10C00B15 +@000005DA E0000415 +@000005DB 00000D06 +@000005DC E0800317 +@000005DD 10C00B17 +@000005DE 00A00034 +@000005DF 10BFFFC4 +@000005E0 18800826 +@000005E1 E1400217 +@000005E2 E0800317 +@000005E3 E0C00317 +@000005E4 11001317 +@000005E5 18800B17 +@000005E6 2085803A +@000005E7 28800015 +@000005E8 E0000415 +@000005E9 E0800417 +@000005EA DF000917 +@000005EB DEC00A04 +@000005EC F800283A +@000005ED DEFFFB04 +@000005EE DF000415 +@000005EF D839883A +@000005F0 E1000015 +@000005F1 E0800017 +@000005F2 E0800215 +@000005F3 E0800217 +@000005F4 10800A17 +@000005F5 10800104 +@000005F6 10800037 +@000005F7 E0800115 +@000005F8 E0800117 +@000005F9 1004D2BA +@000005FA 1080004C +@000005FB 1005003A +@000005FC 10000B1E +@000005FD E0800217 +@000005FE 10800A17 +@000005FF 10800104 +@00000600 1007883A +@00000601 E0800217 +@00000602 10801217 +@00000603 10810014 +@00000604 18800035 +@00000605 E0800217 +@00000606 10001315 +@00000607 00000A06 +@00000608 E0800217 +@00000609 10C01317 +@0000060A 00A00034 +@0000060B 10BFFF04 +@0000060C 10C00536 +@0000060D E0C00217 +@0000060E E0800217 +@0000060F 10801317 +@00000610 10800044 +@00000611 18801315 +@00000612 D0A00C17 +@00000613 E0800315 +@00000614 E0800317 +@00000615 DF000417 +@00000616 DEC00504 +@00000617 F800283A +@00000618 DEFFF704 +@00000619 DFC00815 +@0000061A DF000715 +@0000061B D839883A +@0000061C E1000015 +@0000061D E1400115 +@0000061E E1800215 +@0000061F E0000315 +@00000620 E0000415 +@00000621 E0000515 +@00000622 E0C00017 +@00000623 00800044 +@00000624 18801215 +@00000625 E0800117 +@00000626 10800104 +@00000627 1007883A +@00000628 E0800017 +@00000629 10801217 +@0000062A 18800035 +@0000062B E1000217 +@0000062C E1400017 +@0000062D 01800034 +@0000062E 31852804 +@0000062F 0001FC80 +@00000630 1004803A +@00000631 1000021E +@00000632 E1000017 +@00000633 00019240 +@00000634 E0800017 +@00000635 10001315 +@00000636 D0A00C17 +@00000637 E0800615 +@00000638 E1400617 +@00000639 E0800017 +@0000063A 11000C04 +@0000063B 01800034 +@0000063C 3185ED04 +@0000063D E1C00017 +@0000063E 0001A080 +@0000063F 1004403A +@00000640 1000041E +@00000641 E0C00017 +@00000642 00A00034 +@00000643 10BFFFC4 +@00000644 18800B15 +@00000645 DFC00817 +@00000646 DF000717 +@00000647 DEC00904 +@00000648 F800283A +@00000649 DEFFFD04 +@0000064A DFC00215 +@0000064B DF000115 +@0000064C D839883A +@0000064D E1000015 +@0000064E E1000017 +@0000064F D1600604 +@00000650 0001CD00 +@00000651 DFC00217 +@00000652 DF000117 +@00000653 DEC00304 +@00000654 F800283A +@00000655 DEFFFC04 +@00000656 DFC00315 +@00000657 DF000215 +@00000658 D839883A +@00000659 E1000015 +@0000065A E1400115 +@0000065B E0800017 +@0000065C 10000035 +@0000065D 00025040 +@0000065E DFC00317 +@0000065F DF000217 +@00000660 DEC00404 +@00000661 F800283A +@00000662 DEFFF904 +@00000663 DFC00615 +@00000664 DF000515 +@00000665 D839883A +@00000666 E1000015 +@00000667 E1400115 +@00000668 E1800215 +@00000669 E0800217 +@0000066A E0800315 +@0000066B D0A00C17 +@0000066C 1004C03A +@0000066D 1000041E +@0000066E E0800317 +@0000066F D0A00C15 +@00000670 E0000415 +@00000671 00000206 +@00000672 00BFFFC4 +@00000673 E0800415 +@00000674 E0800017 +@00000675 10800104 +@00000676 1007883A +@00000677 008001C4 +@00000678 18800035 +@00000679 E1000117 +@0000067A E1400017 +@0000067B 01800034 +@0000067C 31865504 +@0000067D 0001FC80 +@0000067E DFC00617 +@0000067F DF000517 +@00000680 DEC00704 +@00000681 F800283A +@00000682 DEFFF504 +@00000683 DF000A15 +@00000684 D839883A +@00000685 E1000015 +@00000686 E1400115 +@00000687 E1800215 +@00000688 E1C00315 +@00000689 E0000515 +@0000068A D0A00C17 +@0000068B E0800615 +@0000068C E0800617 +@0000068D 1005003A +@0000068E 10003F1E +@0000068F E0800017 +@00000690 1005003A +@00000691 1000391E +@00000692 E0C00017 +@00000693 E0800217 +@00000694 18800315 +@00000695 E0C00017 +@00000696 E0800317 +@00000697 18800515 +@00000698 0005303A +@00000699 E0800815 +@0000069A 0001703A +@0000069B E0800817 +@0000069C E0800715 +@0000069D E0800717 +@0000069E E0800415 +@0000069F D0A00D17 +@000006A0 E0800815 +@000006A1 E0800817 +@000006A2 E0800515 +@000006A3 E1000017 +@000006A4 E0C00117 +@000006A5 E0800517 +@000006A6 1885883A +@000006A7 10800044 +@000006A8 20800215 +@000006A9 E0800017 +@000006AA 10C00217 +@000006AB E0800517 +@000006AC 1880042E +@000006AD E0C00017 +@000006AE 00800044 +@000006AF 18800405 +@000006B0 00000206 +@000006B1 E0800017 +@000006B2 10000405 +@000006B3 D0A00E04 +@000006B4 E0800815 +@000006B5 E0800017 +@000006B6 E0800715 +@000006B7 E0C00717 +@000006B8 E0800817 +@000006B9 18800115 +@000006BA E0C00717 +@000006BB E0800817 +@000006BC 10800017 +@000006BD 18800015 +@000006BE E0800817 +@000006BF 10C00017 +@000006C0 E0800717 +@000006C1 18800115 +@000006C2 E0C00817 +@000006C3 E0800717 +@000006C4 18800015 +@000006C5 E0800417 +@000006C6 E0800815 +@000006C7 E0800817 +@000006C8 1001703A +@000006C9 E0000915 +@000006CA 00000506 +@000006CB 00BFFA84 +@000006CC E0800915 +@000006CD 00000206 +@000006CE 00BFDE84 +@000006CF E0800915 +@000006D0 E0800917 +@000006D1 DF000A17 +@000006D2 DEC00B04 +@000006D3 F800283A +@000006D4 DEFFFA04 +@000006D5 DFC00515 +@000006D6 DF000415 +@000006D7 D839883A +@000006D8 E1000015 +@000006D9 008000C4 +@000006DA E0800315 +@000006DB E1000317 +@000006DC 014003F4 +@000006DD 29509004 +@000006DE 0000D8C0 +@000006DF 100B883A +@000006E0 01005BB4 +@000006E1 210D8004 +@000006E2 0000D6C0 +@000006E3 100B883A +@000006E4 01200034 +@000006E5 213FFFC4 +@000006E6 0000D6C0 +@000006E7 100B883A +@000006E8 E1000017 +@000006E9 0000D6C0 +@000006EA E0800215 +@000006EB E0800217 +@000006EC 1005003A +@000006ED 10002A1E +@000006EE E0000115 +@000006EF E0C00117 +@000006F0 E0800217 +@000006F1 1880180E +@000006F2 00A00034 +@000006F3 10BFFFC4 +@000006F4 10BFFFC4 +@000006F5 103FFE1E +@000006F6 E1000317 +@000006F7 014003F4 +@000006F8 29509004 +@000006F9 0000D8C0 +@000006FA 100B883A +@000006FB 01005BB4 +@000006FC 210D8004 +@000006FD 0000D6C0 +@000006FE 100B883A +@000006FF 01200034 +@00000700 213FFFC4 +@00000701 0000D6C0 +@00000702 1007883A +@00000703 E0800017 +@00000704 10C5C83A +@00000705 E0800015 +@00000706 E0800117 +@00000707 10800044 +@00000708 E0800115 +@00000709 003FE506 +@0000070A E1000317 +@0000070B 014003F4 +@0000070C 29509004 +@0000070D 0000D8C0 +@0000070E 100B883A +@0000070F 01005BB4 +@00000710 210D8004 +@00000711 0000D6C0 +@00000712 1009883A +@00000713 E1400017 +@00000714 0000D8C0 +@00000715 10BFFFC4 +@00000716 103FFE1E +@00000717 00000D06 +@00000718 E1000317 +@00000719 014003F4 +@0000071A 29509004 +@0000071B 0000D8C0 +@0000071C 100B883A +@0000071D 01005BB4 +@0000071E 210D8004 +@0000071F 0000D6C0 +@00000720 1009883A +@00000721 E1400017 +@00000722 0000D8C0 +@00000723 10BFFFC4 +@00000724 00BFFE16 +@00000725 0005883A +@00000726 DFC00517 +@00000727 DF000417 +@00000728 DEC00604 +@00000729 F800283A +@0000072A DEFFFC04 +@0000072B DF000315 +@0000072C D839883A +@0000072D E1000015 +@0000072E E1400115 +@0000072F E1800215 +@00000730 E0800217 +@00000731 DF000317 +@00000732 DEC00404 +@00000733 F800283A +@00000734 DEFFF904 +@00000735 DFC00615 +@00000736 DF000515 +@00000737 D839883A +@00000738 E1000015 +@00000739 E1400115 +@0000073A E0800017 +@0000073B 1005003A +@0000073C 1000041E +@0000073D E0800017 +@0000073E 10800217 +@0000073F 1004C03A +@00000740 1000071E +@00000741 0001D800 +@00000742 1007883A +@00000743 00800584 +@00000744 18800015 +@00000745 00BFFA84 +@00000746 E0800415 +@00000747 00001306 +@00000748 E0800117 +@00000749 E0800215 +@0000074A E0800017 +@0000074B E0800315 +@0000074C E0C00317 +@0000074D E0800217 +@0000074E 18800115 +@0000074F E0C00317 +@00000750 E0800217 +@00000751 10800017 +@00000752 18800015 +@00000753 E0800217 +@00000754 10C00017 +@00000755 E0800317 +@00000756 18800115 +@00000757 E0C00217 +@00000758 E0800317 +@00000759 18800015 +@0000075A E0000415 +@0000075B E0800417 +@0000075C DFC00617 +@0000075D DF000517 +@0000075E DEC00704 +@0000075F F800283A +@00000760 DEFFFD04 +@00000761 DFC00215 +@00000762 DF000115 +@00000763 D839883A +@00000764 D0A00917 +@00000765 1005003A +@00000766 1000041E +@00000767 D0A00917 +@00000768 103EE83A +@00000769 E0800015 +@0000076A 00000206 +@0000076B D0A01804 +@0000076C E0800015 +@0000076D E0800017 +@0000076E DFC00217 +@0000076F DF000117 +@00000770 DEC00304 +@00000771 F800283A +@00000772 DEFFFD04 +@00000773 DFC00215 +@00000774 DF000115 +@00000775 D839883A +@00000776 00800034 +@00000777 108D8604 +@00000778 E0800015 +@00000779 E0C00017 +@0000077A 00800034 +@0000077B 108D8704 +@0000077C 18800736 +@0000077D E0800017 +@0000077E 10800017 +@0000077F 103EE83A +@00000780 E0800017 +@00000781 10BFFF04 +@00000782 E0800015 +@00000783 003FF506 +@00000784 DFC00217 +@00000785 DF000117 +@00000786 DEC00304 +@00000787 F800283A +@00000788 DEFFFD04 +@00000789 DFC00215 +@0000078A DF000115 +@0000078B D839883A +@0000078C 00800034 +@0000078D 108D8604 +@0000078E E0800015 +@0000078F E0C00017 +@00000790 00800034 +@00000791 108D8704 +@00000792 18800736 +@00000793 E0800017 +@00000794 10800017 +@00000795 103EE83A +@00000796 E0800017 +@00000797 10BFFF04 +@00000798 E0800015 +@00000799 003FF506 +@0000079A DFC00217 +@0000079B DF000117 +@0000079C DEC00304 +@0000079D F800283A +@0000079E DEFFF704 +@0000079F DFC00815 +@000007A0 DF000715 +@000007A1 DC000615 +@000007A2 DC400515 +@000007A3 D839883A +@000007A4 E1000015 +@000007A5 E1400115 +@000007A6 E1800215 +@000007A7 E1C00315 +@000007A8 E1000117 +@000007A9 E1400217 +@000007AA E1800317 +@000007AB 00022300 +@000007AC E0800415 +@000007AD E0800417 +@000007AE 1004803A +@000007AF 10001F1E +@000007B0 E4000017 +@000007B1 04400034 +@000007B2 8C521F04 +@000007B3 E1000417 +@000007B4 01400304 +@000007B5 0000D8C0 +@000007B6 1445883A +@000007B7 10800017 +@000007B8 80800015 +@000007B9 E4000017 +@000007BA 04400034 +@000007BB 8C521F04 +@000007BC E1000417 +@000007BD 01400304 +@000007BE 0000D8C0 +@000007BF 1445883A +@000007C0 10800104 +@000007C1 10800017 +@000007C2 80800115 +@000007C3 E4000017 +@000007C4 04400034 +@000007C5 8C521F04 +@000007C6 E1000417 +@000007C7 01400304 +@000007C8 0000D8C0 +@000007C9 1445883A +@000007CA 10800204 +@000007CB 10800017 +@000007CC 80800215 +@000007CD E1000417 +@000007CE 00024000 +@000007CF DFC00817 +@000007D0 DF000717 +@000007D1 DC000617 +@000007D2 DC400517 +@000007D3 DEC00904 +@000007D4 F800283A +@000007D5 DEFFFB04 +@000007D6 DFC00415 +@000007D7 DF000315 +@000007D8 D839883A +@000007D9 E1000015 +@000007DA E1400115 +@000007DB E1800215 +@000007DC 01000034 +@000007DD 21122204 +@000007DE E1400017 +@000007DF 01800044 +@000007E0 01C07FC4 +@000007E1 0001E780 +@000007E2 01000034 +@000007E3 21121F04 +@000007E4 E1400117 +@000007E5 000D883A +@000007E6 01C07FC4 +@000007E7 0001E780 +@000007E8 01000034 +@000007E9 21122504 +@000007EA E1400217 +@000007EB 01800044 +@000007EC 01C07FC4 +@000007ED 0001E780 +@000007EE DFC00417 +@000007EF DF000317 +@000007F0 DEC00504 +@000007F1 F800283A +@000007F2 DEFFF304 +@000007F3 DF000C15 +@000007F4 D839883A +@000007F5 E1000015 +@000007F6 E1400115 +@000007F7 E1800215 +@000007F8 00BFFA84 +@000007F9 E0800315 +@000007FA E0800017 +@000007FB 10800828 +@000007FC 1000511E +@000007FD 0005303A +@000007FE E0800615 +@000007FF 0001703A +@00000800 E0800617 +@00000801 E0800515 +@00000802 E0800517 +@00000803 E0800415 +@00000804 00C00034 +@00000805 18D3A504 +@00000806 E0800017 +@00000807 100490FA +@00000808 10C7883A +@00000809 E0800217 +@0000080A 18800015 +@0000080B 00C00034 +@0000080C 18D3A504 +@0000080D E0800017 +@0000080E 100490FA +@0000080F 10C5883A +@00000810 10C00104 +@00000811 E0800117 +@00000812 18800015 +@00000813 E0800217 +@00000814 1005003A +@00000815 1000191E +@00000816 E0800017 +@00000817 E0800615 +@00000818 0005303A +@00000819 E0800915 +@0000081A 0001703A +@0000081B E0800917 +@0000081C E0800815 +@0000081D E0800817 +@0000081E E0800715 +@0000081F 00C00044 +@00000820 E0800617 +@00000821 1886983A +@00000822 D0A00A17 +@00000823 10C4B03A +@00000824 D0A00A15 +@00000825 D0A00A17 +@00000826 100170FA +@00000827 E0800717 +@00000828 E0800915 +@00000829 E0800917 +@0000082A 1001703A +@0000082B E0000515 +@0000082C E0800517 +@0000082D E0800B15 +@0000082E 00001906 +@0000082F E0800017 +@00000830 E0800915 +@00000831 0005303A +@00000832 E0800A15 +@00000833 0001703A +@00000834 E0800A17 +@00000835 E0800615 +@00000836 E0800617 +@00000837 E0800715 +@00000838 00C00044 +@00000839 E0800917 +@0000083A 1884983A +@0000083B 0086303A +@0000083C D0A00A17 +@0000083D 10C4703A +@0000083E D0A00A15 +@0000083F D0A00A17 +@00000840 100170FA +@00000841 E0800717 +@00000842 E0800A15 +@00000843 E0800A17 +@00000844 1001703A +@00000845 E0000815 +@00000846 E0800817 +@00000847 E0800B15 +@00000848 E0800B17 +@00000849 E0800315 +@0000084A E0800417 +@0000084B E0800A15 +@0000084C E0800A17 +@0000084D 1001703A +@0000084E E0800317 +@0000084F DF000C17 +@00000850 DEC00D04 +@00000851 F800283A +@00000852 DEFFFA04 +@00000853 DFC00515 +@00000854 DF000415 +@00000855 DC000315 +@00000856 D839883A +@00000857 E1000015 +@00000858 E0C00017 +@00000859 E0800017 +@0000085A 10800217 +@0000085B 10900034 +@0000085C 18800215 +@0000085D E0000115 +@0000085E D0E00817 +@0000085F E0800117 +@00000860 18802436 +@00000861 04000034 +@00000862 84121F04 +@00000863 E1000117 +@00000864 01400304 +@00000865 0000D8C0 +@00000866 1405883A +@00000867 E0C00017 +@00000868 11000017 +@00000869 18800017 +@0000086A 2080161E +@0000086B 04000034 +@0000086C 84121F04 +@0000086D E1000117 +@0000086E 01400304 +@0000086F 0000D8C0 +@00000870 1405883A +@00000871 10800204 +@00000872 10800017 +@00000873 1004403A +@00000874 10000C1E +@00000875 E1000117 +@00000876 01400304 +@00000877 0000D8C0 +@00000878 1007883A +@00000879 00800034 +@0000087A 10921F04 +@0000087B 1887883A +@0000087C E0800017 +@0000087D 18800326 +@0000087E 00BFFCC4 +@0000087F E0800215 +@00000880 00000506 +@00000881 E0800117 +@00000882 10800044 +@00000883 E0800115 +@00000884 003FD906 +@00000885 E0000215 +@00000886 E0800217 +@00000887 DFC00517 +@00000888 DF000417 +@00000889 DC000317 +@0000088A DEC00604 +@0000088B F800283A +@0000088C DEFFF404 +@0000088D DFC00B15 +@0000088E DF000A15 +@0000088F D839883A +@00000890 E1000015 +@00000891 E1400115 +@00000892 E1800215 +@00000893 00BFFFC4 +@00000894 E0800515 +@00000895 00BFFB44 +@00000896 E0800615 +@00000897 E0000715 +@00000898 E1000017 +@00000899 D1600604 +@0000089A 00026040 +@0000089B E0800315 +@0000089C E0800317 +@0000089D 1004C03A +@0000089E 1000051E +@0000089F E1000017 +@000008A0 00026940 +@000008A1 E0800315 +@000008A2 00800044 +@000008A3 E0800715 +@000008A4 E0800317 +@000008A5 1005003A +@000008A6 1000321E +@000008A7 E1000317 +@000008A8 00027780 +@000008A9 E0800515 +@000008AA E0800517 +@000008AB 1004403A +@000008AC 1000031E +@000008AD E0800517 +@000008AE E0800615 +@000008AF 00002B06 +@000008B0 E1000517 +@000008B1 01400304 +@000008B2 0000D8C0 +@000008B3 1007883A +@000008B4 00800034 +@000008B5 10921F04 +@000008B6 1885883A +@000008B7 E0800415 +@000008B8 E1000417 +@000008B9 E0C00117 +@000008BA 00900034 +@000008BB 10BFFFC4 +@000008BC 1884703A +@000008BD 20800215 +@000008BE E0800717 +@000008BF 1004C03A +@000008C0 1000071E +@000008C1 E1000417 +@000008C2 00021480 +@000008C3 E0800615 +@000008C4 E0800617 +@000008C5 1004403A +@000008C6 1000011E +@000008C7 00001306 +@000008C8 E0800317 +@000008C9 10800317 +@000008CA 1005003A +@000008CB 1000091E +@000008CC E0800317 +@000008CD 10800317 +@000008CE E1000417 +@000008CF E1400017 +@000008D0 E1800117 +@000008D1 E1C00217 +@000008D2 103EE83A +@000008D3 E0800915 +@000008D4 00000106 +@000008D5 E0000915 +@000008D6 E0800917 +@000008D7 E0800615 +@000008D8 00000206 +@000008D9 00BFFB44 +@000008DA E0800615 +@000008DB E0800617 +@000008DC 1004403A +@000008DD 1000091E +@000008DE E1000517 +@000008DF 00024000 +@000008E0 00023B80 +@000008E1 E0C00617 +@000008E2 00C7C83A +@000008E3 10C00015 +@000008E4 00BFFFC4 +@000008E5 E0800815 +@000008E6 00000206 +@000008E7 E0800517 +@000008E8 E0800815 +@000008E9 E0800817 +@000008EA DFC00B17 +@000008EB DF000A17 +@000008EC DEC00C04 +@000008ED F800283A +@000008EE DEFFFD04 +@000008EF DFC00215 +@000008F0 DF000115 +@000008F1 D839883A +@000008F2 D0A00917 +@000008F3 1005003A +@000008F4 1000041E +@000008F5 D0A00917 +@000008F6 103EE83A +@000008F7 E0800015 +@000008F8 00000206 +@000008F9 D0A01804 +@000008FA E0800015 +@000008FB E0800017 +@000008FC DFC00217 +@000008FD DF000117 +@000008FE DEC00304 +@000008FF F800283A +@00000900 DEFFFC04 +@00000901 DFC00315 +@00000902 DF000215 +@00000903 DC000115 +@00000904 D839883A +@00000905 E1000015 +@00000906 E0800017 +@00000907 108000D0 +@00000908 10000F1E +@00000909 04000034 +@0000090A 84121F04 +@0000090B E1000017 +@0000090C 01400304 +@0000090D 0000D8C0 +@0000090E 1405883A +@0000090F 10800204 +@00000910 10000015 +@00000911 04000034 +@00000912 84121F04 +@00000913 E1000017 +@00000914 01400304 +@00000915 0000D8C0 +@00000916 1405883A +@00000917 10000015 +@00000918 DFC00317 +@00000919 DF000217 +@0000091A DC000117 +@0000091B DEC00404 +@0000091C F800283A +@0000091D DEFFFB04 +@0000091E DF000415 +@0000091F D839883A +@00000920 E1000015 +@00000921 0005303A +@00000922 E0800315 +@00000923 0001703A +@00000924 E0800317 +@00000925 E0800215 +@00000926 E0800217 +@00000927 E0800115 +@00000928 E0800017 +@00000929 E0800315 +@0000092A E0800317 +@0000092B 10C00017 +@0000092C E0800317 +@0000092D 10800117 +@0000092E 18800115 +@0000092F E0800317 +@00000930 10C00117 +@00000931 E0800317 +@00000932 10800017 +@00000933 18800015 +@00000934 E0C00317 +@00000935 E0800317 +@00000936 18800115 +@00000937 E0C00317 +@00000938 E0800317 +@00000939 18800015 +@0000093A E0800117 +@0000093B E0800315 +@0000093C E0800317 +@0000093D 1001703A +@0000093E DF000417 +@0000093F DEC00504 +@00000940 F800283A +@00000941 DEFFFB04 +@00000942 DFC00415 +@00000943 DF000315 +@00000944 D839883A +@00000945 D0A00E17 +@00000946 E0800115 +@00000947 D0A00D17 +@00000948 10800044 +@00000949 D0A00D15 +@0000094A E0C00117 +@0000094B D0A00E04 +@0000094C 18803026 +@0000094D E0800117 +@0000094E 10800017 +@0000094F E0800015 +@00000950 E0800117 +@00000951 10800403 +@00000952 1005003A +@00000953 1000051E +@00000954 D0A00D17 +@00000955 1004C03A +@00000956 1000021E +@00000957 E0800117 +@00000958 10000405 +@00000959 E0800117 +@0000095A 10C00217 +@0000095B D0A00D17 +@0000095C 10C01D36 +@0000095D E0800117 +@0000095E 10800403 +@0000095F 1004C03A +@00000960 1000191E +@00000961 E0800117 +@00000962 E0C00117 +@00000963 10800317 +@00000964 19000517 +@00000965 103EE83A +@00000966 E0800215 +@00000967 E0800217 +@00000968 1004C03A +@00000969 1000031E +@0000096A E1000117 +@0000096B 00024740 +@0000096C 00000D06 +@0000096D E1000117 +@0000096E E0800117 +@0000096F 10C00217 +@00000970 E0800217 +@00000971 1885883A +@00000972 20800215 +@00000973 E0800117 +@00000974 10C00217 +@00000975 D0A00D17 +@00000976 1880032E +@00000977 E0C00117 +@00000978 00800044 +@00000979 18800405 +@0000097A E0800017 +@0000097B E0800115 +@0000097C 003FCD06 +@0000097D DFC00417 +@0000097E DF000317 +@0000097F DEC00504 +@00000980 F800283A +@00000981 DEFFF904 +@00000982 DFC00615 +@00000983 DF000515 +@00000984 D839883A +@00000985 E1000015 +@00000986 E1400115 +@00000987 E0800117 +@00000988 10800017 +@00000989 E0800215 +@0000098A E1000017 +@0000098B 0000BEC0 +@0000098C 10800044 +@0000098D E0800315 +@0000098E E0C00217 +@0000098F E0800117 +@00000990 18800E26 +@00000991 E0800217 +@00000992 11000217 +@00000993 E1400017 +@00000994 E1800317 +@00000995 00030840 +@00000996 1004C03A +@00000997 1000031E +@00000998 E0800217 +@00000999 E0800415 +@0000099A 00000506 +@0000099B E0800217 +@0000099C 10800017 +@0000099D E0800215 +@0000099E 003FEF06 +@0000099F E0000415 +@000009A0 E0800417 +@000009A1 DFC00617 +@000009A2 DF000517 +@000009A3 DEC00704 +@000009A4 F800283A +@000009A5 DEFFFA04 +@000009A6 DFC00515 +@000009A7 DF000415 +@000009A8 D839883A +@000009A9 E1000015 +@000009AA D0A00417 +@000009AB E0800115 +@000009AC E0C00117 +@000009AD D0A00404 +@000009AE 18802926 +@000009AF E0800117 +@000009B0 11000217 +@000009B1 0000BEC0 +@000009B2 E0800215 +@000009B3 E0800117 +@000009B4 10C00217 +@000009B5 E0800217 +@000009B6 1885883A +@000009B7 10BFFFC4 +@000009B8 10800007 +@000009B9 10800BD8 +@000009BA 1000031E +@000009BB E0800217 +@000009BC 10BFFFC4 +@000009BD E0800215 +@000009BE E0C00017 +@000009BF E0800217 +@000009C0 1885883A +@000009C1 10800007 +@000009C2 10800BE0 +@000009C3 1000061E +@000009C4 E0C00017 +@000009C5 E0800217 +@000009C6 1885883A +@000009C7 10800007 +@000009C8 1004C03A +@000009C9 10000A1E +@000009CA E0800117 +@000009CB 11000217 +@000009CC E1400017 +@000009CD E1800217 +@000009CE 00030840 +@000009CF 1004C03A +@000009D0 1000031E +@000009D1 E0800117 +@000009D2 E0800315 +@000009D3 00000506 +@000009D4 E0800117 +@000009D5 10800017 +@000009D6 E0800115 +@000009D7 003FD406 +@000009D8 E0000315 +@000009D9 E0800317 +@000009DA DFC00517 +@000009DB DF000417 +@000009DC DEC00604 +@000009DD F800283A +@000009DE DEFFF804 +@000009DF DFC00715 +@000009E0 DF000615 +@000009E1 DC000515 +@000009E2 D839883A +@000009E3 E1000015 +@000009E4 00BFFA04 +@000009E5 E0800215 +@000009E6 E0000315 +@000009E7 E0000115 +@000009E8 E0800117 +@000009E9 10800808 +@000009EA 10001D1E +@000009EB 04000034 +@000009EC 84121F04 +@000009ED E1000117 +@000009EE 01400304 +@000009EF 0000D8C0 +@000009F0 1405883A +@000009F1 10800017 +@000009F2 1004C03A +@000009F3 1000101E +@000009F4 04000034 +@000009F5 84121F04 +@000009F6 E1000117 +@000009F7 01400304 +@000009F8 0000D8C0 +@000009F9 1407883A +@000009FA E0800017 +@000009FB 18800015 +@000009FC E0C00117 +@000009FD D0A00817 +@000009FE 10C0020E +@000009FF E0800117 +@00000A00 D0A00815 +@00000A01 E0800117 +@00000A02 E0800215 +@00000A03 00000406 +@00000A04 E0800117 +@00000A05 10800044 +@00000A06 E0800115 +@00000A07 003FE006 +@00000A08 E0000415 +@00000A09 E0800217 +@00000A0A DFC00717 +@00000A0B DF000617 +@00000A0C DC000517 +@00000A0D DEC00804 +@00000A0E F800283A +@00000A0F D0A00017 +@00000A10 DEFFFE04 +@00000A11 DC000015 +@00000A12 DFC00115 +@00000A13 11400C17 +@00000A14 2021883A +@00000A15 01004304 +@00000A16 28001B26 +@00000A17 28C00117 +@00000A18 008007C4 +@00000A19 10C00D16 +@00000A1A 28800104 +@00000A1B 10C00017 +@00000A1C 000D883A +@00000A1D 180890BA +@00000A1E 18C00044 +@00000A1F 10C00015 +@00000A20 2149883A +@00000A21 24000215 +@00000A22 3005883A +@00000A23 DFC00117 +@00000A24 DC000017 +@00000A25 DEC00204 +@00000A26 F800283A +@00000A27 00029A40 +@00000A28 100B883A +@00000A29 01BFFFC4 +@00000A2A 103FF726 +@00000A2B D0E00017 +@00000A2C 10004215 +@00000A2D 10000115 +@00000A2E 18800C17 +@00000A2F 28800015 +@00000A30 19400C15 +@00000A31 003FE806 +@00000A32 01400034 +@00000A33 2953E504 +@00000A34 11400C15 +@00000A35 003FE106 +@00000A36 D0A00017 +@00000A37 DEFFF804 +@00000A38 DD800015 +@00000A39 DFC00715 +@00000A3A DC000615 +@00000A3B DC400515 +@00000A3C DC800415 +@00000A3D DCC00315 +@00000A3E DD000215 +@00000A3F DD400115 +@00000A40 15000C17 +@00000A41 202D883A +@00000A42 A0002426 +@00000A43 A0800117 +@00000A44 A5402204 +@00000A45 0027883A +@00000A46 14BFFFC4 +@00000A47 9006803A +@00000A48 1800021E +@00000A49 00800044 +@00000A4A 14A6983A +@00000A4B 1800191E +@00000A4C 900690BA +@00000A4D 1D05883A +@00000A4E 14400204 +@00000A4F 1821883A +@00000A50 00000806 +@00000A51 88800017 +@00000A52 29400017 +@00000A53 94BFFFC4 +@00000A54 843FFF04 +@00000A55 103EE83A +@00000A56 8C7FFF04 +@00000A57 9827D07A +@00000A58 90000C16 +@00000A59 A8802017 +@00000A5A 854B883A +@00000A5B B009883A +@00000A5C 14C4703A +@00000A5D 103FF31E +@00000A5E 88800017 +@00000A5F 94BFFFC4 +@00000A60 843FFF04 +@00000A61 103EE83A +@00000A62 8C7FFF04 +@00000A63 9827D07A +@00000A64 903FF40E +@00000A65 A5000017 +@00000A66 A03FDC1E +@00000A67 B009883A +@00000A68 000354C0 +@00000A69 200B883A +@00000A6A D1200017 +@00000A6B 02000034 +@00000A6C 420A7304 +@00000A6D 4000683A +@00000A6E 200B883A +@00000A6F D1200017 +@00000A70 02000034 +@00000A71 420C9904 +@00000A72 4000683A +@00000A73 DEFFF504 +@00000A74 28C002C4 +@00000A75 00800584 +@00000A76 DC400715 +@00000A77 DC800615 +@00000A78 DFC00A15 +@00000A79 DF000915 +@00000A7A DC000815 +@00000A7B DCC00515 +@00000A7C DD000415 +@00000A7D DD400315 +@00000A7E DD800215 +@00000A7F DDC00115 +@00000A80 2025883A +@00000A81 04400404 +@00000A82 10C0032E +@00000A83 00BFFE04 +@00000A84 18A2703A +@00000A85 88000116 +@00000A86 89400D2E +@00000A87 0005883A +@00000A88 DFC00A17 +@00000A89 DF000917 +@00000A8A DC000817 +@00000A8B DC400717 +@00000A8C DC800617 +@00000A8D DCC00517 +@00000A8E DD000417 +@00000A8F DD400317 +@00000A90 DD800217 +@00000A91 DDC00117 +@00000A92 DEC00B04 +@00000A93 F800283A +@00000A94 9009883A +@00000A95 000356C0 +@00000A96 00807DC4 +@00000A97 14401536 +@00000A98 03400034 +@00000A99 6B528904 +@00000A9A 8B4D883A +@00000A9B 34000317 +@00000A9C 8812D0FA +@00000A9D 81803E26 +@00000A9E 80C00117 +@00000A9F 00BFFF04 +@00000AA0 82000317 +@00000AA1 1886703A +@00000AA2 80CB883A +@00000AA3 28800117 +@00000AA4 81C00217 +@00000AA5 9009883A +@00000AA6 10800054 +@00000AA7 41C00215 +@00000AA8 28800115 +@00000AA9 3A000315 +@00000AAA 00035880 +@00000AAB 80800204 +@00000AAC 003FDB06 +@00000AAD 8806D27A +@00000AAE 8812D0FA +@00000AAF 18000926 +@00000AB0 00800104 +@00000AB1 10C02F2E +@00000AB2 00800504 +@00000AB3 1A4016C4 +@00000AB4 10C0042E +@00000AB5 00801504 +@00000AB6 10C11536 +@00000AB7 8804D33A +@00000AB8 12401B84 +@00000AB9 480490FA +@00000ABA 03400034 +@00000ABB 6B528904 +@00000ABC 134B883A +@00000ABD 2C000317 +@00000ABE 81400926 +@00000ABF 01FFFF04 +@00000AC0 018003C4 +@00000AC1 80800117 +@00000AC2 11C6703A +@00000AC3 1C49C83A +@00000AC4 3100AA16 +@00000AC5 2000690E +@00000AC6 84000317 +@00000AC7 817FF91E +@00000AC8 4A400044 +@00000AC9 03000034 +@00000ACA 63128B04 +@00000ACB 64000217 +@00000ACC 83002826 +@00000ACD 80800117 +@00000ACE 00FFFF04 +@00000ACF 10C6703A +@00000AD0 1C49C83A +@00000AD1 008003C4 +@00000AD2 11006616 +@00000AD3 63000315 +@00000AD4 63000215 +@00000AD5 20000E16 +@00000AD6 80C7883A +@00000AD7 18800117 +@00000AD8 9009883A +@00000AD9 10800054 +@00000ADA 18800115 +@00000ADB 003FCE06 +@00000ADC 81800204 +@00000ADD 34000317 +@00000ADE 81BFBF1E +@00000ADF 4A400084 +@00000AE0 003FE806 +@00000AE1 8804D1BA +@00000AE2 12400E04 +@00000AE3 003FD506 +@00000AE4 00807FC4 +@00000AE5 10C09436 +@00000AE6 1808D0FA +@00000AE7 61BFFE04 +@00000AE8 00800044 +@00000AE9 200A90FA +@00000AEA 2007D0BA +@00000AEB 31000117 +@00000AEC 2991883A +@00000AED 41C00217 +@00000AEE 10C4983A +@00000AEF 82000315 +@00000AF0 81C00215 +@00000AF1 2088B03A +@00000AF2 3C000315 +@00000AF3 31000115 +@00000AF4 44000215 +@00000AF5 4807883A +@00000AF6 4800A616 +@00000AF7 1807D0BA +@00000AF8 03400034 +@00000AF9 6B528904 +@00000AFA 00800044 +@00000AFB 10CE983A +@00000AFC 69000117 +@00000AFD 21C04836 +@00000AFE 21C4703A +@00000AFF 10000A1E +@00000B00 39CF883A +@00000B01 00BFFF04 +@00000B02 4884703A +@00000B03 21C6703A +@00000B04 12400104 +@00000B05 1800041E +@00000B06 39CF883A +@00000B07 4A400104 +@00000B08 21C4703A +@00000B09 103FFC26 +@00000B0A 480490FA +@00000B0B 4817883A +@00000B0C 134D883A +@00000B0D 300B883A +@00000B0E 2C000317 +@00000B0F 81400926 +@00000B10 02BFFF04 +@00000B11 020003C4 +@00000B12 80800117 +@00000B13 1286703A +@00000B14 1C49C83A +@00000B15 41008016 +@00000B16 2000180E +@00000B17 84000317 +@00000B18 817FF91E +@00000B19 4A400044 +@00000B1A 488000CC +@00000B1B 29400204 +@00000B1C 103FF11E +@00000B1D 588000CC +@00000B1E 31BFFE04 +@00000B1F 5AFFFFC4 +@00000B20 1000E526 +@00000B21 30800217 +@00000B22 11BFFA26 +@00000B23 03400034 +@00000B24 6B528904 +@00000B25 39CF883A +@00000B26 68C00117 +@00000B27 19C01E36 +@00000B28 3800031E +@00000B29 00001C06 +@00000B2A 39CF883A +@00000B2B 4A400104 +@00000B2C 19C4703A +@00000B2D 103FFC26 +@00000B2E 003FDB06 +@00000B2F 80C7883A +@00000B30 18800117 +@00000B31 82000317 +@00000B32 81C00217 +@00000B33 10800054 +@00000B34 9009883A +@00000B35 18800115 +@00000B36 41C00215 +@00000B37 3A000315 +@00000B38 003F7106 +@00000B39 88800054 +@00000B3A 844B883A +@00000B3B 80800115 +@00000B3C 2905883A +@00000B3D 20C00054 +@00000B3E 61400315 +@00000B3F 61400215 +@00000B40 11000015 +@00000B41 9009883A +@00000B42 2B000215 +@00000B43 28C00115 +@00000B44 2B000315 +@00000B45 003F6406 +@00000B46 6D400217 +@00000B47 00BFFF04 +@00000B48 A8C00117 +@00000B49 18AC703A +@00000B4A B449C83A +@00000B4B B4400236 +@00000B4C 008003C4 +@00000B4D 11002316 +@00000B4E D0A01317 +@00000B4F 073FFFC4 +@00000B50 B02F883A +@00000B51 8887883A +@00000B52 D0A01217 +@00000B53 ADA7883A +@00000B54 1D000404 +@00000B55 17000326 +@00000B56 18C023C4 +@00000B57 00BFE004 +@00000B58 18A8703A +@00000B59 9009883A +@00000B5A A00B883A +@00000B5B DB400015 +@00000B5C 00030F40 +@00000B5D 1021883A +@00000B5E DB400017 +@00000B5F 17000426 +@00000B60 14C03E2E +@00000B61 00800034 +@00000B62 10928904 +@00000B63 A8803B26 +@00000B64 68800217 +@00000B65 013FFF04 +@00000B66 10C00117 +@00000B67 1906703A +@00000B68 1C49C83A +@00000B69 1C400236 +@00000B6A 008003C4 +@00000B6B 11000516 +@00000B6C 9009883A +@00000B6D 00035880 +@00000B6E 003F1806 +@00000B6F 4A7FFFC4 +@00000B70 003F5706 +@00000B71 6C000217 +@00000B72 88800054 +@00000B73 21000054 +@00000B74 8447883A +@00000B75 80800115 +@00000B76 19000115 +@00000B77 9009883A +@00000B78 68C00215 +@00000B79 003F3006 +@00000B7A 180AD27A +@00000B7B 1808D0FA +@00000B7C 28000426 +@00000B7D 00800104 +@00000B7E 11405836 +@00000B7F 1804D1BA +@00000B80 11000E04 +@00000B81 200490FA +@00000B82 01400034 +@00000B83 29528904 +@00000B84 1351883A +@00000B85 41C00217 +@00000B86 3A006D26 +@00000B87 38800117 +@00000B88 013FFF04 +@00000B89 1104703A +@00000B8A 1880052E +@00000B8B 39C00217 +@00000B8C 3A000326 +@00000B8D 38800117 +@00000B8E 1104703A +@00000B8F 18BFFB36 +@00000B90 3A000317 +@00000B91 82000315 +@00000B92 81C00215 +@00000B93 3C000315 +@00000B94 44000215 +@00000B95 003F5F06 +@00000B96 82000317 +@00000B97 81C00217 +@00000B98 88800054 +@00000B99 844B883A +@00000B9A 41C00215 +@00000B9B 3A000315 +@00000B9C 003F9E06 +@00000B9D 48C000C4 +@00000B9E 003F5806 +@00000B9F 07000034 +@00000BA0 E7127F04 +@00000BA1 E0800017 +@00000BA2 1505883A +@00000BA3 E0800015 +@00000BA4 84C05826 +@00000BA5 D0E01217 +@00000BA6 00BFFFC4 +@00000BA7 18805326 +@00000BA8 E0800017 +@00000BA9 84C7C83A +@00000BAA 10C5883A +@00000BAB E0800015 +@00000BAC 80C001CC +@00000BAD 0027883A +@00000BAE 18000326 +@00000BAF 00800204 +@00000BB0 10E7C83A +@00000BB1 84E1883A +@00000BB2 8505883A +@00000BB3 10801FCC +@00000BB4 00C02004 +@00000BB5 1887C83A +@00000BB6 98E7883A +@00000BB7 9009883A +@00000BB8 980B883A +@00000BB9 DB400015 +@00000BBA 00030F40 +@00000BBB 1007883A +@00000BBC 00BFFFC4 +@00000BBD DB400017 +@00000BBE 18804E26 +@00000BBF E0800017 +@00000BC0 1C07C83A +@00000BC1 1CC9883A +@00000BC2 14C5883A +@00000BC3 E0800015 +@00000BC4 6C000215 +@00000BC5 20800054 +@00000BC6 AB404426 +@00000BC7 014003C4 +@00000BC8 2D801636 +@00000BC9 00800044 +@00000BCA 80800115 +@00000BCB 003F9806 +@00000BCC 00805504 +@00000BCD 10C00336 +@00000BCE 8804D3FA +@00000BCF 12401DC4 +@00000BD0 003EE806 +@00000BD1 00815504 +@00000BD2 02401F84 +@00000BD3 10FEE536 +@00000BD4 8804D4BA +@00000BD5 12401F04 +@00000BD6 003EE206 +@00000BD7 00800504 +@00000BD8 290016C4 +@00000BD9 117FA72E +@00000BDA 00801504 +@00000BDB 11403A36 +@00000BDC 1804D33A +@00000BDD 11001B84 +@00000BDE 003FA206 +@00000BDF 80800115 +@00000BE0 A8800117 +@00000BE1 00FFFE04 +@00000BE2 B13FFD04 +@00000BE3 20EE703A +@00000BE4 1080004C +@00000BE5 15C4B03A +@00000BE6 A8800115 +@00000BE7 ADC7883A +@00000BE8 00800144 +@00000BE9 18800215 +@00000BEA 18800115 +@00000BEB 2DC02436 +@00000BEC E0C00017 +@00000BED D0A01117 +@00000BEE 10C0012E +@00000BEF D0E01115 +@00000BF0 D0A01017 +@00000BF1 10FF722E +@00000BF2 D0E01015 +@00000BF3 003F7006 +@00000BF4 2005D0BA +@00000BF5 00C00044 +@00000BF6 29000117 +@00000BF7 1886983A +@00000BF8 20C8B03A +@00000BF9 29000115 +@00000BFA 003F9606 +@00000BFB D4201215 +@00000BFC 003FAF06 +@00000BFD 80801FCC +@00000BFE 103FA61E +@00000BFF 00800034 +@00000C00 10928904 +@00000C01 10C00217 +@00000C02 A5C9883A +@00000C03 20800054 +@00000C04 18800115 +@00000C05 003FE606 +@00000C06 68800117 +@00000C07 01C6303A +@00000C08 10C4703A +@00000C09 68800115 +@00000C0A 003F1806 +@00000C0B 80800115 +@00000C0C 003FDF06 +@00000C0D 0027883A +@00000C0E 8007883A +@00000C0F 003FAF06 +@00000C10 A9400204 +@00000C11 9009883A +@00000C12 DB400015 +@00000C13 00032640 +@00000C14 DB400017 +@00000C15 003FD606 +@00000C16 00805504 +@00000C17 11400336 +@00000C18 1804D3FA +@00000C19 11001DC4 +@00000C1A 003F6606 +@00000C1B 00815504 +@00000C1C 01001F84 +@00000C1D 117F6336 +@00000C1E 1804D4BA +@00000C1F 11001F04 +@00000C20 003F6006 +@00000C21 31BFFFC4 +@00000C22 00BFFFC4 +@00000C23 30800826 +@00000C24 100F883A +@00000C25 20C00003 +@00000C26 28800003 +@00000C27 31BFFFC4 +@00000C28 21000044 +@00000C29 29400044 +@00000C2A 1880031E +@00000C2B 31FFF91E +@00000C2C 0005883A +@00000C2D F800283A +@00000C2E 1885C83A +@00000C2F F800283A +@00000C30 31BFFFC4 +@00000C31 00BFFFC4 +@00000C32 2007883A +@00000C33 30800726 +@00000C34 100F883A +@00000C35 28800003 +@00000C36 31BFFFC4 +@00000C37 29400044 +@00000C38 18800005 +@00000C39 18C00044 +@00000C3A 31FFFA1E +@00000C3B 2005883A +@00000C3C F800283A +@00000C3D DEFFFE04 +@00000C3E DC000015 +@00000C3F 2021883A +@00000C40 2809883A +@00000C41 DFC00115 +@00000C42 D0201815 +@00000C43 00035A40 +@00000C44 1007883A +@00000C45 00BFFFC4 +@00000C46 18800526 +@00000C47 1805883A +@00000C48 DFC00117 +@00000C49 DC000017 +@00000C4A DEC00204 +@00000C4B F800283A +@00000C4C D0A01817 +@00000C4D 103FF926 +@00000C4E 80800315 +@00000C4F 003FF706 +@00000C50 DEFFFB04 +@00000C51 DCC00015 +@00000C52 04C00034 +@00000C53 9CD28904 +@00000C54 DC000315 +@00000C55 DC400215 +@00000C56 DC800115 +@00000C57 2823883A +@00000C58 2021883A +@00000C59 DFC00415 +@00000C5A 000356C0 +@00000C5B 98800217 +@00000C5C 8009883A +@00000C5D 000B883A +@00000C5E 10C00117 +@00000C5F 00BFFF04 +@00000C60 18A4703A +@00000C61 9463C83A +@00000C62 8C401BC4 +@00000C63 8822D1FA +@00000C64 00802004 +@00000C65 8C7FFFC4 +@00000C66 882291FA +@00000C67 88800616 +@00000C68 00030F40 +@00000C69 98C00217 +@00000C6A 8009883A +@00000C6B 044BC83A +@00000C6C 1C87883A +@00000C6D 18800926 +@00000C6E 00035880 +@00000C6F 0005883A +@00000C70 DFC00417 +@00000C71 DC000317 +@00000C72 DC400217 +@00000C73 DC800117 +@00000C74 DCC00017 +@00000C75 DEC00504 +@00000C76 F800283A +@00000C77 8009883A +@00000C78 00030F40 +@00000C79 944DC83A +@00000C7A 00FFFFC4 +@00000C7B 8009883A +@00000C7C 000B883A +@00000C7D 01C00034 +@00000C7E 39D27F04 +@00000C7F 31800054 +@00000C80 10C00926 +@00000C81 38800017 +@00000C82 98C00217 +@00000C83 8009883A +@00000C84 1445C83A +@00000C85 38800015 +@00000C86 19800115 +@00000C87 00035880 +@00000C88 00800044 +@00000C89 003FE606 +@00000C8A 00030F40 +@00000C8B 99400217 +@00000C8C 100D883A +@00000C8D 8009883A +@00000C8E 1165C83A +@00000C8F 008003C4 +@00000C90 90C00054 +@00000C91 14BFDC0E +@00000C92 28C00115 +@00000C93 D0E01217 +@00000C94 00800034 +@00000C95 10927F04 +@00000C96 30C7C83A +@00000C97 10C00015 +@00000C98 003FD506 +@00000C99 DEFFFD04 +@00000C9A DC000115 +@00000C9B DC400015 +@00000C9C DFC00215 +@00000C9D 2821883A +@00000C9E 2023883A +@00000C9F 28003226 +@00000CA0 000356C0 +@00000CA1 82BFFE04 +@00000CA2 51400117 +@00000CA3 00BFFF84 +@00000CA4 03000034 +@00000CA5 63128904 +@00000CA6 2892703A +@00000CA7 524D883A +@00000CA8 30C00117 +@00000CA9 61000217 +@00000CAA 00BFFF04 +@00000CAB 1896703A +@00000CAC 21804E26 +@00000CAD 2880004C +@00000CAE 32C00115 +@00000CAF 000B883A +@00000CB0 1000091E +@00000CB1 50C00017 +@00000CB2 60800204 +@00000CB3 50D5C83A +@00000CB4 51000217 +@00000CB5 48D3883A +@00000CB6 20807426 +@00000CB7 52000317 +@00000CB8 41000215 +@00000CB9 22000315 +@00000CBA 32C7883A +@00000CBB 18800117 +@00000CBC 2808C03A +@00000CBD 1080004C +@00000CBE 1000061E +@00000CBF 4AD3883A +@00000CC0 20001626 +@00000CC1 30C00217 +@00000CC2 32000317 +@00000CC3 40C00215 +@00000CC4 1A000315 +@00000CC5 48800054 +@00000CC6 5247883A +@00000CC7 50800115 +@00000CC8 1A400015 +@00000CC9 20001726 +@00000CCA 8809883A +@00000CCB 02000034 +@00000CCC 420D6204 +@00000CCD DFC00217 +@00000CCE DC000117 +@00000CCF DC400017 +@00000CD0 DEC00304 +@00000CD1 4000683A +@00000CD2 DFC00217 +@00000CD3 DC000117 +@00000CD4 DC400017 +@00000CD5 DEC00304 +@00000CD6 F800283A +@00000CD7 30C00217 +@00000CD8 00800034 +@00000CD9 10928B04 +@00000CDA 18BFE71E +@00000CDB 1A800315 +@00000CDC 1A800215 +@00000CDD 01000044 +@00000CDE 50C00215 +@00000CDF 50C00315 +@00000CE0 003FE406 +@00000CE1 00807FC4 +@00000CE2 12402B36 +@00000CE3 4806D0FA +@00000CE4 01800034 +@00000CE5 31928904 +@00000CE6 00800044 +@00000CE7 180890FA +@00000CE8 1807D0BA +@00000CE9 31400117 +@00000CEA 2191883A +@00000CEB 41C00217 +@00000CEC 10C4983A +@00000CED 52000315 +@00000CEE 51C00215 +@00000CEF 288AB03A +@00000CF0 3A800315 +@00000CF1 31400115 +@00000CF2 42800215 +@00000CF3 8809883A +@00000CF4 02000034 +@00000CF5 420D6204 +@00000CF6 DFC00217 +@00000CF7 DC000117 +@00000CF8 DC400017 +@00000CF9 DEC00304 +@00000CFA 4000683A +@00000CFB 2880004C +@00000CFC 4AD3883A +@00000CFD 1000071E +@00000CFE 50C00017 +@00000CFF 50D5C83A +@00000D00 52000317 +@00000D01 51C00217 +@00000D02 48D3883A +@00000D03 41C00215 +@00000D04 3A000315 +@00000D05 D0A01417 +@00000D06 48C00054 +@00000D07 62800215 +@00000D08 50C00115 +@00000D09 48BFC036 +@00000D0A D1601317 +@00000D0B 8809883A +@00000D0C 00031400 +@00000D0D 003FBC06 +@00000D0E 4808D27A +@00000D0F 4806D0FA +@00000D10 2000151E +@00000D11 180490FA +@00000D12 01400034 +@00000D13 29528904 +@00000D14 1311883A +@00000D15 41C00217 +@00000D16 3A001E26 +@00000D17 38800117 +@00000D18 00FFFF04 +@00000D19 10C4703A +@00000D1A 4880052E +@00000D1B 39C00217 +@00000D1C 3A000326 +@00000D1D 38800117 +@00000D1E 10C4703A +@00000D1F 48BFFB36 +@00000D20 3A000317 +@00000D21 52000315 +@00000D22 51C00215 +@00000D23 3A800315 +@00000D24 42800215 +@00000D25 003FCD06 +@00000D26 00800104 +@00000D27 11000536 +@00000D28 4804D1BA +@00000D29 10C00E04 +@00000D2A 003FE606 +@00000D2B 01400044 +@00000D2C 003F8D06 +@00000D2D 00800504 +@00000D2E 20C016C4 +@00000D2F 113FE12E +@00000D30 00801504 +@00000D31 11000A36 +@00000D32 4804D33A +@00000D33 10C01B84 +@00000D34 003FDC06 +@00000D35 1805D0BA +@00000D36 00C00044 +@00000D37 29000117 +@00000D38 1886983A +@00000D39 20C8B03A +@00000D3A 29000115 +@00000D3B 003FE506 +@00000D3C 00805504 +@00000D3D 11000336 +@00000D3E 4804D3FA +@00000D3F 10C01DC4 +@00000D40 003FD006 +@00000D41 00815504 +@00000D42 00C01F84 +@00000D43 113FCD36 +@00000D44 4804D4BA +@00000D45 10C01F04 +@00000D46 003FCA06 +@00000D47 DEFFFD04 +@00000D48 DF000215 +@00000D49 D839883A +@00000D4A E1000015 +@00000D4B E0800017 +@00000D4C E0800115 +@00000D4D 00C00044 +@00000D4E E0800117 +@00000D4F 180171BA +@00000D50 DF000217 +@00000D51 DEC00304 +@00000D52 F800283A +@00000D53 DEFFFD04 +@00000D54 DFC00215 +@00000D55 DF000115 +@00000D56 D839883A +@00000D57 E1000015 +@00000D58 E1000017 +@00000D59 000351C0 +@00000D5A 003FFF06 +@00000D5B DEFFFE04 +@00000D5C DF000115 +@00000D5D D839883A +@00000D5E E1000015 +@00000D5F DF000117 +@00000D60 DEC00204 +@00000D61 F800283A +@00000D62 DEFFFE04 +@00000D63 DF000115 +@00000D64 D839883A +@00000D65 E1000015 +@00000D66 DF000117 +@00000D67 DEC00204 +@00000D68 F800283A +@00000D69 DEFFFA04 +@00000D6A DF000515 +@00000D6B D839883A +@00000D6C E1000015 +@00000D6D 0005303A +@00000D6E E0800415 +@00000D6F 0001703A +@00000D70 E0800417 +@00000D71 E0800315 +@00000D72 E0800317 +@00000D73 E0800115 +@00000D74 D0A01517 +@00000D75 10C000C4 +@00000D76 00BFFF04 +@00000D77 1884703A +@00000D78 D0A01515 +@00000D79 D0A01517 +@00000D7A E0800215 +@00000D7B D0E01517 +@00000D7C E0800017 +@00000D7D 1885883A +@00000D7E D0A01515 +@00000D7F E0800117 +@00000D80 E0800415 +@00000D81 E0800417 +@00000D82 1001703A +@00000D83 E0800217 +@00000D84 DF000517 +@00000D85 DEC00604 +@00000D86 F800283A +@00000D87 2A2A0A0A +@00000D88 2A2A2A2A +@00000D89 2A2A2A2A +@00000D8A 2A2A2A2A +@00000D8B 2A2A2A2A +@00000D8C 2A2A2A2A +@00000D8D 2A2A2A2A +@00000D8E 0000000A +@00000D8F 6548202A +@00000D90 206F6C6C +@00000D91 6D6F7266 +@00000D92 6F694E20 +@00000D93 49492073 +@00000D94 20202021 +@00000D95 000A2A20 +@00000D96 6F43202A +@00000D97 69746E75 +@00000D98 6620676E +@00000D99 206D6F72 +@00000D9A 74203030 +@00000D9B 6666206F +@00000D9C 000A2A20 +@00000D9D 2A2A2A2A +@00000D9E 2A2A2A2A +@00000D9F 2A2A2A2A +@00000DA0 2A2A2A2A +@00000DA1 2A2A2A2A +@00000DA2 2A2A2A2A +@00000DA3 000A2A2A +@00000DA4 78323025 +@00000DA5 0020202C +@00000DA6 74747542 +@00000DA7 31206E6F +@00000DA8 0000000A +@00000DA9 74747542 +@00000DAA 32206E6F +@00000DAB 0000000A +@00000DAC 74747542 +@00000DAD 33206E6F +@00000DAE 0000000A +@00000DAF 74747542 +@00000DB0 34206E6F +@00000DB1 0000000A +@00000DB2 6961570A +@00000DB3 676E6974 +@00000DB4 002E2E2E +@00000DB5 0000002E +@00000DB6 756F590A +@00000DB7 73757020 +@00000DB8 3A646568 +@00000DB9 00002020 +@00000DBA 00000838 +@00000DBB 000007F0 +@00000DBC 000007F0 +@00000DBD 000007F0 +@00000DBE 000007F0 +@00000DBF 000007F0 +@00000DC0 000007F0 +@00000DC1 000007F0 +@00000DC2 000007F0 +@00000DC3 000007F0 +@00000DC4 000007F0 +@00000DC5 0000098C +@00000DC6 00000848 +@00000DC7 000007F0 +@00000DC8 000007F0 +@00000DC9 000007F0 +@00000DCA 000007F0 +@00000DCB 00000848 +@00000DCC 000007F0 +@00000DCD 000007F0 +@00000DCE 000007F0 +@00000DCF 000007F0 +@00000DD0 000007F0 +@00000DD1 00000A68 +@00000DD2 000007F0 +@00000DD3 000007F0 +@00000DD4 000007F0 +@00000DD5 00000A00 +@00000DD6 000007F0 +@00000DD7 000009F8 +@00000DD8 000007F0 +@00000DD9 000007F0 +@00000DDA 000009EC +@00000DDB 7665642F +@00000DDC 61746A2F +@00000DDD 61755F67 +@00000DDE 305F7472 +@00000DDF 00000000 +@00000DE0 7665642F +@00000DE1 61746A2F +@00000DE2 61755F67 +@00000DE3 305F7472 +@00000DE4 00000000 +@00000DE5 7665642F +@00000DE6 6C756E2F +@00000DE7 0000006C +@00000DE8 000037D4 +@00000DE9 000037DC +@00000DEA 000037E4 +@00000DEB 00000000 +@00000DEC 00000000 +@00000DED 00000000 +@00000DEE 00000000 +@00000DEF 00000000 +@00000DF0 00000000 +@00000DF1 00000000 +@00000DF2 00000000 +@00000DF3 00000000 +@00000DF4 00000000 +@00000DF5 00000004 +@00000DF6 00000000 +@00000DF7 0001000A +@00000DF8 00000000 +@00000DF9 0002000A +@00000DFA 00000000 +@00000DFB 00000000 +@00000DFC 00000000 +@00000DFD 00000000 +@00000DFE 00000000 +@00000DFF 00003780 +@00000E00 00000000 +@00000E01 00000000 +@00000E02 00001000 +@00000E03 00001240 +@00000E04 00000000 +@00000E05 00000000 +@00000E06 000016B0 +@00000E07 01000850 +@00000E08 0000000A +@00000E09 00000000 +@00000E0A 00000000 +@00000E0B 00000000 +@00000E0C 00000000 +@00000E0D 00000000 +@00000E0E 00000000 +@00000E0F 00000000 +@00000E10 00000000 +@00000E11 00000000 +@00000E12 00000000 +@00000E13 00000000 +@00000E14 00000000 +@00000E15 00000000 +@00000E16 00000000 +@00000E17 00000000 +@00000E18 00000000 +@00000E19 00000000 +@00000E1A 00000000 +@00000E1B 00000000 +@00000E1C 00000000 +@00000E1D 00000000 +@00000E1E 00000000 +@00000E1F 00000000 +@00000E20 00000000 +@00000E21 00000000 +@00000E22 00000000 +@00000E23 00000000 +@00000E24 00000000 +@00000E25 00000000 +@00000E26 00000000 +@00000E27 00000000 +@00000E28 00000000 +@00000E29 00000000 +@00000E2A 00000000 +@00000E2B 00000000 +@00000E2C 00000000 +@00000E2D 00000000 +@00000E2E 00000000 +@00000E2F 00000000 +@00000E30 00000000 +@00000E31 00000000 +@00000E32 00000000 +@00000E33 00000000 +@00000E34 00000000 +@00000E35 00000000 +@00000E36 00000000 +@00000E37 00000000 +@00000E38 00000000 +@00000E39 00000000 +@00000E3A 00000000 +@00000E3B 00000000 +@00000E3C 00000000 +@00000E3D 00000000 +@00000E3E 00000000 +@00000E3F 00000000 +@00000E40 00000000 +@00000E41 00000000 +@00000E42 00000000 +@00000E43 00000000 +@00000E44 00000000 +@00000E45 00000000 +@00000E46 00000000 +@00000E47 00000000 +@00000E48 00000000 +@00000E49 00000000 +@00000E4A 00000000 +@00000E4B 00000000 +@00000E4C 00000000 +@00000E4D 00000000 +@00000E4E 00000000 +@00000E4F 00000000 +@00000E50 00000000 +@00000E51 00000000 +@00000E52 00000000 +@00000E53 00000000 +@00000E54 00000000 +@00000E55 00000000 +@00000E56 00000000 +@00000E57 00000000 +@00000E58 00000000 +@00000E59 00000000 +@00000E5A 00000000 +@00000E5B 00000000 +@00000E5C 00000000 +@00000E5D 00000000 +@00000E5E 00000000 +@00000E5F 00000000 +@00000E60 00000000 +@00000E61 00000000 +@00000E62 00000000 +@00000E63 00000000 +@00000E64 00000000 +@00000E65 00000000 +@00000E66 00000000 +@00000E67 00000000 +@00000E68 00000000 +@00000E69 00000000 +@00000E6A 00000000 +@00000E6B 00000000 +@00000E6C 00000000 +@00000E6D 00000000 +@00000E6E 00000000 +@00000E6F 00000000 +@00000E70 00000000 +@00000E71 00000000 +@00000E72 00000000 +@00000E73 00000000 +@00000E74 00000000 +@00000E75 00000000 +@00000E76 00000000 +@00000E77 00000000 +@00000E78 00000000 +@00000E79 00000000 +@00000E7A 00000000 +@00000E7B 00000000 +@00000E7C 00000000 +@00000E7D 00000000 +@00000E7E 00000000 +@00000E7F 00000000 +@00000E80 00000000 +@00000E81 00000000 +@00000E82 00000000 +@00000E83 00000000 +@00000E84 00000000 +@00000E85 00000000 +@00000E86 00000000 +@00000E87 00000000 +@00000E88 00000000 +@00000E89 00000000 +@00000E8A 00000000 +@00000E8B 00000000 +@00000E8C 00000000 +@00000E8D 00000000 +@00000E8E 00000000 +@00000E8F 00000000 +@00000E90 00000000 +@00000E91 00000000 +@00000E92 00000000 +@00000E93 00000000 +@00000E94 00000000 +@00000E95 00000000 +@00000E96 00000000 +@00000E97 00000000 +@00000E98 00000000 +@00000E99 00000000 +@00000E9A 00000000 +@00000E9B 00000000 +@00000E9C 00000000 +@00000E9D 00000000 +@00000E9E 00000000 +@00000E9F 00000000 +@00000EA0 00000000 +@00000EA1 00000000 +@00000EA2 00000000 +@00000EA3 00000000 +@00000EA4 00000000 +@00000EA5 00000000 +@00000EA6 00000000 +@00000EA7 00000000 +@00000EA8 00000000 +@00000EA9 00000000 +@00000EAA 00000000 +@00000EAB 00000000 +@00000EAC 00000000 +@00000EAD 00000000 +@00000EAE 00000000 +@00000EAF 00000000 +@00000EB0 00000000 +@00000EB1 00000000 +@00000EB2 00000000 +@00000EB3 00000000 +@00000EB4 00000000 +@00000EB5 00000000 +@00000EB6 00000000 +@00000EB7 00000000 +@00000EB8 00000000 +@00000EB9 00000000 +@00000EBA 00000000 +@00000EBB 00000000 +@00000EBC 00000000 +@00000EBD 00000000 +@00000EBE 00000000 +@00000EBF 00000000 +@00000EC0 00000000 +@00000EC1 00000000 +@00000EC2 00000000 +@00000EC3 00000000 +@00000EC4 00000000 +@00000EC5 00000000 +@00000EC6 00000000 +@00000EC7 00000000 +@00000EC8 00000000 +@00000EC9 00000000 +@00000ECA 00000000 +@00000ECB 00000000 +@00000ECC 00000000 +@00000ECD 00000000 +@00000ECE 00000000 +@00000ECF 00000000 +@00000ED0 00000000 +@00000ED1 00000000 +@00000ED2 00000000 +@00000ED3 00000000 +@00000ED4 00000000 +@00000ED5 00000000 +@00000ED6 00000000 +@00000ED7 00000000 +@00000ED8 00000000 +@00000ED9 00000000 +@00000EDA 00000000 +@00000EDB 00000000 +@00000EDC 00000000 +@00000EDD 00000000 +@00000EDE 00000000 +@00000EDF 00000000 +@00000EE0 00000000 +@00000EE1 00000000 +@00000EE2 00000000 +@00000EE3 00000000 +@00000EE4 00000000 +@00000EE5 00000000 +@00000EE6 00000000 +@00000EE7 00000000 +@00000EE8 00000000 +@00000EE9 00000000 +@00000EEA 00000000 +@00000EEB 00000000 +@00000EEC 00000000 +@00000EED 00000000 +@00000EEE 00000000 +@00000EEF 00000000 +@00000EF0 00000000 +@00000EF1 00000000 +@00000EF2 00000000 +@00000EF3 00000000 +@00000EF4 00000000 +@00000EF5 00000000 +@00000EF6 00000000 +@00000EF7 00000000 +@00000EF8 00000000 +@00000EF9 00000000 +@00000EFA 00000000 +@00000EFB 00000000 +@00000EFC 00000000 +@00000EFD 00000000 +@00000EFE 00000000 +@00000EFF 00000000 +@00000F00 00000000 +@00000F01 00000000 +@00000F02 00000000 +@00000F03 00000000 +@00000F04 00000000 +@00000F05 00000000 +@00000F06 00000000 +@00000F07 00000000 +@00000F08 00000000 +@00000F09 00000000 +@00000F0A 00000000 +@00000F0B 00000000 +@00000F0C 00000000 +@00000F0D 00000000 +@00000F0E 00000000 +@00000F0F 00000000 +@00000F10 00000000 +@00000F11 00000000 +@00000F12 00000000 +@00000F13 00000000 +@00000F14 00000000 +@00000F15 00000000 +@00000F16 00000000 +@00000F17 00000000 +@00000F18 00000000 +@00000F19 00000000 +@00000F1A 00000000 +@00000F1B 00000000 +@00000F1C 00000000 +@00000F1D 00000000 +@00000F1E 00000000 +@00000F1F 00000000 +@00000F20 00000000 +@00000F21 00000000 +@00000F22 00000000 +@00000F23 00000000 +@00000F24 00000000 +@00000F25 00000000 +@00000F26 00000000 +@00000F27 00000000 +@00000F28 00000000 +@00000F29 00000000 +@00000F2A 00000000 +@00000F2B 00000000 +@00000F2C 00000000 +@00000F2D 00000000 +@00000F2E 00000000 +@00000F2F 00000000 +@00000F30 00000000 +@00000F31 00000000 +@00000F32 00000000 +@00000F33 00000000 +@00000F34 00000000 +@00000F35 00000000 +@00000F36 00000000 +@00000F37 00000000 +@00000F38 00000000 +@00000F39 00000000 +@00000F3A 00000000 +@00000F3B 00000000 +@00000F3C 00000000 +@00000F3D 00000000 +@00000F3E 00000000 +@00000F3F 00000000 +@00000F40 00000000 +@00000F41 00000000 +@00000F42 00000000 +@00000F43 00000000 +@00000F44 00000000 +@00000F45 00000000 +@00000F46 00000000 +@00000F47 00000000 +@00000F48 00000000 +@00000F49 00000000 +@00000F4A 00000000 +@00000F4B 00000000 +@00000F4C 00000000 +@00000F4D 00000000 +@00000F4E 00000000 +@00000F4F 00000000 +@00000F50 00000000 +@00000F51 00000000 +@00000F52 00000000 +@00000F53 00000000 +@00000F54 00000000 +@00000F55 00000000 +@00000F56 00000000 +@00000F57 00000000 +@00000F58 00000000 +@00000F59 00000000 +@00000F5A 00000000 +@00000F5B 00000000 +@00000F5C 00000000 +@00000F5D 00000000 +@00000F5E 00000000 +@00000F5F 00000000 +@00000F60 00000000 +@00000F61 00000000 +@00000F62 00000000 +@00000F63 00000000 +@00000F64 00000000 +@00000F65 00000000 +@00000F66 00000000 +@00000F67 00000000 +@00000F68 00000000 +@00000F69 00000000 +@00000F6A 00000000 +@00000F6B 00000000 +@00000F6C 00000000 +@00000F6D 00000000 +@00000F6E 00000000 +@00000F6F 00000000 +@00000F70 00000000 +@00000F71 00000000 +@00000F72 00000000 +@00000F73 00000000 +@00000F74 00000000 +@00000F75 00000000 +@00000F76 00000000 +@00000F77 00000000 +@00000F78 00000000 +@00000F79 00000000 +@00000F7A 00000000 +@00000F7B 00000000 +@00000F7C 00000000 +@00000F7D 00000000 +@00000F7E 00000000 +@00000F7F 00000000 +@00000F80 00000000 +@00000F81 00000000 +@00000F82 00000000 +@00000F83 00000000 +@00000F84 00000000 +@00000F85 00000000 +@00000F86 00000000 +@00000F87 00000000 +@00000F88 00000000 +@00000F89 00000000 +@00000F8A 00000000 +@00000F8B 00000000 +@00000F8C 00000000 +@00000F8D 00000000 +@00000F8E 00000000 +@00000F8F 00000000 +@00000F90 00000000 +@00000F91 00000000 +@00000F92 00000000 +@00000F93 00000000 +@00000F94 00000000 +@00000F95 00000000 +@00000F96 00000000 +@00000F97 00000000 +@00000F98 00000000 +@00000F99 00000000 +@00000F9A 00000000 +@00000F9B 00000000 +@00000F9C 00000000 +@00000F9D 00000000 +@00000F9E 00000000 +@00000F9F 00000000 +@00000FA0 00000000 +@00000FA1 00000000 +@00000FA2 00000000 +@00000FA3 00000000 +@00000FA4 00000000 +@00000FA5 00000000 +@00000FA6 00000000 +@00000FA7 00000000 +@00000FA8 00000000 +@00000FA9 00000000 +@00000FAA 00000000 +@00000FAB 00000000 +@00000FAC 00000000 +@00000FAD 00000000 +@00000FAE 00000000 +@00000FAF 00000000 +@00000FB0 00000000 +@00000FB1 00000000 +@00000FB2 00000000 +@00000FB3 00000000 +@00000FB4 00000000 +@00000FB5 00000000 +@00000FB6 00000000 +@00000FB7 00000000 +@00000FB8 00000000 +@00000FB9 00000000 +@00000FBA 00000000 +@00000FBB 00000000 +@00000FBC 00000000 +@00000FBD 00000000 +@00000FBE 00000000 +@00000FBF 00000000 +@00000FC0 00000000 +@00000FC1 00000000 +@00000FC2 00000000 +@00000FC3 00000000 +@00000FC4 00000000 +@00000FC5 00000000 +@00000FC6 00000000 +@00000FC7 00000000 +@00000FC8 00000000 +@00000FC9 00000000 +@00000FCA 00000000 +@00000FCB 00000000 +@00000FCC 00000000 +@00000FCD 00000000 +@00000FCE 00000000 +@00000FCF 00000000 +@00000FD0 00000000 +@00000FD1 00000000 +@00000FD2 00000000 +@00000FD3 00000000 +@00000FD4 00000000 +@00000FD5 00000000 +@00000FD6 00000000 +@00000FD7 00000000 +@00000FD8 00000000 +@00000FD9 00000000 +@00000FDA 00000000 +@00000FDB 00000000 +@00000FDC 00000000 +@00000FDD 00000000 +@00000FDE 00000000 +@00000FDF 00000000 +@00000FE0 00000000 +@00000FE1 00000000 +@00000FE2 00000000 +@00000FE3 00000000 +@00000FE4 00000000 +@00000FE5 00000000 +@00000FE6 00000000 +@00000FE7 00000000 +@00000FE8 00000000 +@00000FE9 00000000 +@00000FEA 00000000 +@00000FEB 00000000 +@00000FEC 00000000 +@00000FED 00000000 +@00000FEE 00000000 +@00000FEF 00000000 +@00000FF0 00000000 +@00000FF1 00000000 +@00000FF2 00000000 +@00000FF3 00000000 +@00000FF4 00000000 +@00000FF5 00000000 +@00000FF6 00000000 +@00000FF7 00000000 +@00000FF8 00000000 +@00000FF9 00000000 +@00000FFA 00000000 +@00000FFB 00000000 +@00000FFC 00000000 +@00000FFD 00000000 +@00000FFE 00000000 +@00000FFF 00000000 +@00001000 00000000 +@00001001 00000000 +@00001002 00000000 +@00001003 00000000 +@00001004 00000000 +@00001005 00000000 +@00001006 00000000 +@00001007 00000000 +@00001008 00000000 +@00001009 00000000 +@0000100A 00000000 +@0000100B 00000000 +@0000100C 00000000 +@0000100D 00000000 +@0000100E 00000000 +@0000100F 00000000 +@00001010 00000000 +@00001011 00000000 +@00001012 00000000 +@00001013 00000000 +@00001014 00000000 +@00001015 00000000 +@00001016 00000000 +@00001017 00000000 +@00001018 00000000 +@00001019 00000000 +@0000101A 00000000 +@0000101B 00000000 +@0000101C 00000000 +@0000101D 00000000 +@0000101E 00000000 +@0000101F 00000000 +@00001020 00000000 +@00001021 00000000 +@00001022 00000000 +@00001023 00000000 +@00001024 00000000 +@00001025 00000000 +@00001026 00000000 +@00001027 00000000 +@00001028 00000000 +@00001029 00000000 +@0000102A 00000000 +@0000102B 00000000 +@0000102C 00000000 +@0000102D 00000000 +@0000102E 00000000 +@0000102F 00000000 +@00001030 00000000 +@00001031 00000000 +@00001032 00000000 +@00001033 00000000 +@00001034 00000000 +@00001035 00000000 +@00001036 00000000 +@00001037 00000000 +@00001038 00000000 +@00001039 00000000 +@0000103A 00000000 +@0000103B 00000000 +@0000103C 00000000 +@0000103D 00000000 +@0000103E 00000000 +@0000103F 00000000 +@00001040 00000000 +@00001041 00000000 +@00001042 00000000 +@00001043 00000000 +@00001044 00000000 +@00001045 00000000 +@00001046 00000000 +@00001047 00000000 +@00001048 00000000 +@00001049 00000000 +@0000104A 00000000 +@0000104B 00000000 +@0000104C 00000000 +@0000104D 00000000 +@0000104E 00000000 +@0000104F 00000000 +@00001050 00000000 +@00001051 00000000 +@00001052 00000000 +@00001053 00000000 +@00001054 00000000 +@00001055 00000000 +@00001056 00000000 +@00001057 00000000 +@00001058 00000000 +@00001059 00000000 +@0000105A 00000000 +@0000105B 00000000 +@0000105C 00000000 +@0000105D 00000000 +@0000105E 00000000 +@0000105F 00000000 +@00001060 00000000 +@00001061 00000000 +@00001062 00000000 +@00001063 00000000 +@00001064 00000000 +@00001065 00000000 +@00001066 00000000 +@00001067 00000000 +@00001068 00000000 +@00001069 00000000 +@0000106A 00000000 +@0000106B 00000000 +@0000106C 00000000 +@0000106D 00000000 +@0000106E 00000000 +@0000106F 00000000 +@00001070 00000000 +@00001071 00000000 +@00001072 00000000 +@00001073 00000000 +@00001074 00000000 +@00001075 00000000 +@00001076 00000000 +@00001077 00000000 +@00001078 00000000 +@00001079 00000000 +@0000107A 00000000 +@0000107B 00000000 +@0000107C 00000000 +@0000107D 00000000 +@0000107E 00000000 +@0000107F 00000000 +@00001080 00000000 +@00001081 00000000 +@00001082 00000000 +@00001083 00000000 +@00001084 00000000 +@00001085 00000000 +@00001086 00000000 +@00001087 00000000 +@00001088 00000000 +@00001089 00000000 +@0000108A 00000000 +@0000108B 00000000 +@0000108C 00000000 +@0000108D 00000000 +@0000108E 00000000 +@0000108F 00000000 +@00001090 00000000 +@00001091 00000000 +@00001092 00000000 +@00001093 00000000 +@00001094 00000000 +@00001095 00000000 +@00001096 00000000 +@00001097 00000000 +@00001098 00000000 +@00001099 00000000 +@0000109A 00000000 +@0000109B 00000000 +@0000109C 00000000 +@0000109D 00000000 +@0000109E 00000000 +@0000109F 00000000 +@000010A0 00000000 +@000010A1 00000000 +@000010A2 00000000 +@000010A3 00000000 +@000010A4 00000000 +@000010A5 00000000 +@000010A6 00000000 +@000010A7 00000000 +@000010A8 00000000 +@000010A9 00000000 +@000010AA 00000000 +@000010AB 00000000 +@000010AC 00000000 +@000010AD 00000000 +@000010AE 00000000 +@000010AF 00000000 +@000010B0 00000000 +@000010B1 00000000 +@000010B2 00000000 +@000010B3 00000000 +@000010B4 00000000 +@000010B5 00000000 +@000010B6 00000000 +@000010B7 00000000 +@000010B8 00000000 +@000010B9 00000000 +@000010BA 00000000 +@000010BB 00000000 +@000010BC 00000000 +@000010BD 00000000 +@000010BE 00000000 +@000010BF 00000000 +@000010C0 00000000 +@000010C1 00000000 +@000010C2 00000000 +@000010C3 00000000 +@000010C4 00000000 +@000010C5 00000000 +@000010C6 00000000 +@000010C7 00000000 +@000010C8 00000000 +@000010C9 00000000 +@000010CA 00000000 +@000010CB 00000000 +@000010CC 00000000 +@000010CD 00000000 +@000010CE 00000000 +@000010CF 00000000 +@000010D0 00000000 +@000010D1 00000000 +@000010D2 00000000 +@000010D3 00000000 +@000010D4 00000000 +@000010D5 00000000 +@000010D6 00000000 +@000010D7 00000000 +@000010D8 00000000 +@000010D9 00000000 +@000010DA 00000000 +@000010DB 00000000 +@000010DC 00000000 +@000010DD 00000000 +@000010DE 00000000 +@000010DF 00000000 +@000010E0 00000000 +@000010E1 00000000 +@000010E2 00000000 +@000010E3 00000000 +@000010E4 00000000 +@000010E5 00000000 +@000010E6 00000000 +@000010E7 00000000 +@000010E8 00000000 +@000010E9 00000000 +@000010EA 00000000 +@000010EB 00000000 +@000010EC 00000000 +@000010ED 00000000 +@000010EE 00000000 +@000010EF 00000000 +@000010F0 00000000 +@000010F1 00000000 +@000010F2 00000000 +@000010F3 00000000 +@000010F4 00000000 +@000010F5 00000000 +@000010F6 00000000 +@000010F7 00000000 +@000010F8 00000000 +@000010F9 00000000 +@000010FA 00000000 +@000010FB 00000000 +@000010FC 00000000 +@000010FD 00000000 +@000010FE 00000000 +@000010FF 00000000 +@00001100 00000000 +@00001101 00000000 +@00001102 00000000 +@00001103 00000000 +@00001104 00000000 +@00001105 00000000 +@00001106 00000000 +@00001107 00000000 +@00001108 00000000 +@00001109 00000000 +@0000110A 00000000 +@0000110B 00000000 +@0000110C 00000000 +@0000110D 00000000 +@0000110E 00000000 +@0000110F 00000000 +@00001110 00000000 +@00001111 00000000 +@00001112 00000000 +@00001113 00000000 +@00001114 00000000 +@00001115 00000000 +@00001116 00000000 +@00001117 00000000 +@00001118 00000000 +@00001119 00000000 +@0000111A 00000000 +@0000111B 00000000 +@0000111C 00000000 +@0000111D 00000000 +@0000111E 00000000 +@0000111F 00000000 +@00001120 00000000 +@00001121 00000000 +@00001122 00000000 +@00001123 00000000 +@00001124 00000000 +@00001125 00000000 +@00001126 00000000 +@00001127 00000000 +@00001128 00000000 +@00001129 00000000 +@0000112A 00000000 +@0000112B 00000000 +@0000112C 00000000 +@0000112D 00000000 +@0000112E 00000000 +@0000112F 00000000 +@00001130 00000000 +@00001131 00000000 +@00001132 00000000 +@00001133 00000000 +@00001134 00000000 +@00001135 00000000 +@00001136 00000000 +@00001137 00000000 +@00001138 00000000 +@00001139 00000000 +@0000113A 00000000 +@0000113B 00000000 +@0000113C 00000000 +@0000113D 00000000 +@0000113E 00000000 +@0000113F 00000000 +@00001140 00000000 +@00001141 00000000 +@00001142 00000000 +@00001143 00000000 +@00001144 00000000 +@00001145 00000000 +@00001146 00000000 +@00001147 00000000 +@00001148 00000000 +@00001149 00000000 +@0000114A 00000000 +@0000114B 00000000 +@0000114C 00000000 +@0000114D 00000000 +@0000114E 00000000 +@0000114F 00000000 +@00001150 00000000 +@00001151 00000000 +@00001152 00000000 +@00001153 00000000 +@00001154 00000000 +@00001155 00000000 +@00001156 00000000 +@00001157 00000000 +@00001158 00000000 +@00001159 00000000 +@0000115A 00000000 +@0000115B 00000000 +@0000115C 00000000 +@0000115D 00000000 +@0000115E 00000000 +@0000115F 00000000 +@00001160 00000000 +@00001161 00000000 +@00001162 00000000 +@00001163 00000000 +@00001164 00000000 +@00001165 00000000 +@00001166 00000000 +@00001167 00000000 +@00001168 00000000 +@00001169 00000000 +@0000116A 00000000 +@0000116B 00000000 +@0000116C 00000000 +@0000116D 00000000 +@0000116E 00000000 +@0000116F 00000000 +@00001170 00000000 +@00001171 00000000 +@00001172 00000000 +@00001173 00000000 +@00001174 00000000 +@00001175 00000000 +@00001176 00000000 +@00001177 00000000 +@00001178 00000000 +@00001179 00000000 +@0000117A 00000000 +@0000117B 00000000 +@0000117C 00000000 +@0000117D 00000000 +@0000117E 00000000 +@0000117F 00000000 +@00001180 00000000 +@00001181 00000000 +@00001182 00000000 +@00001183 00000000 +@00001184 00000000 +@00001185 00000000 +@00001186 00000000 +@00001187 00000000 +@00001188 00000000 +@00001189 00000000 +@0000118A 00000000 +@0000118B 00000000 +@0000118C 00000000 +@0000118D 00000000 +@0000118E 00000000 +@0000118F 00000000 +@00001190 00000000 +@00001191 00000000 +@00001192 00000000 +@00001193 00000000 +@00001194 00000000 +@00001195 00000000 +@00001196 00000000 +@00001197 00000000 +@00001198 00000000 +@00001199 00000000 +@0000119A 00000000 +@0000119B 00000000 +@0000119C 00000000 +@0000119D 00000000 +@0000119E 00000000 +@0000119F 00000000 +@000011A0 00000000 +@000011A1 00000000 +@000011A2 00000000 +@000011A3 00000000 +@000011A4 00000000 +@000011A5 00000000 +@000011A6 00000000 +@000011A7 00000000 +@000011A8 00000000 +@000011A9 00000000 +@000011AA 00000000 +@000011AB 00000000 +@000011AC 00000000 +@000011AD 00000000 +@000011AE 00000000 +@000011AF 00000000 +@000011B0 00000000 +@000011B1 00000000 +@000011B2 00000000 +@000011B3 00000000 +@000011B4 00000000 +@000011B5 00000000 +@000011B6 00000000 +@000011B7 00000000 +@000011B8 00000000 +@000011B9 00000000 +@000011BA 00000000 +@000011BB 00000000 +@000011BC 00000000 +@000011BD 00000000 +@000011BE 00000000 +@000011BF 00000000 +@000011C0 00000000 +@000011C1 00000000 +@000011C2 00000000 +@000011C3 00000000 +@000011C4 00000000 +@000011C5 00000000 +@000011C6 00000000 +@000011C7 00000000 +@000011C8 00000000 +@000011C9 00000000 +@000011CA 00000000 +@000011CB 00000000 +@000011CC 00000000 +@000011CD 00000000 +@000011CE 00000000 +@000011CF 00000000 +@000011D0 00000000 +@000011D1 00000000 +@000011D2 00000000 +@000011D3 00000000 +@000011D4 00000000 +@000011D5 00000000 +@000011D6 00000000 +@000011D7 00000000 +@000011D8 00000000 +@000011D9 00000000 +@000011DA 00000000 +@000011DB 00000000 +@000011DC 00000000 +@000011DD 00000000 +@000011DE 00000000 +@000011DF 00000000 +@000011E0 00000000 +@000011E1 00000000 +@000011E2 00000000 +@000011E3 00000000 +@000011E4 00000000 +@000011E5 00000000 +@000011E6 00000000 +@000011E7 00000000 +@000011E8 00000000 +@000011E9 00000000 +@000011EA 00000000 +@000011EB 00000000 +@000011EC 00000000 +@000011ED 00000000 +@000011EE 00000000 +@000011EF 00000000 +@000011F0 00000000 +@000011F1 00000000 +@000011F2 00000000 +@000011F3 00000000 +@000011F4 00000000 +@000011F5 00000000 +@000011F6 00000000 +@000011F7 00000000 +@000011F8 00000000 +@000011F9 00000000 +@000011FA 00000000 +@000011FB 00000000 +@000011FC 00000000 +@000011FD 00000000 +@000011FE 00000000 +@000011FF 00000000 +@00001200 00000000 +@00001201 00000000 +@00001202 00000000 +@00001203 00000000 +@00001204 00000000 +@00001205 00000000 +@00001206 00000000 +@00001207 00000000 +@00001208 00000000 +@00001209 00000000 +@0000120A 00000000 +@0000120B 00000000 +@0000120C 00000000 +@0000120D 00000000 +@0000120E 00000000 +@0000120F 00000000 +@00001210 00000000 +@00001211 00000000 +@00001212 00000000 +@00001213 00000000 +@00001214 00000000 +@00001215 00004E44 +@00001216 00004E44 +@00001217 00003794 +@00001218 00000000 +@00001219 00000000 +@0000121A 00000000 +@0000121B 00001CA8 +@0000121C 00000000 +@0000121D 00000000 +@0000121E 00000000 +@0000121F 00004854 +@00001220 00000000 +@00001221 00000000 +@00001222 00004854 +@00001223 00000000 +@00001224 00000000 +@00001225 00004854 +@00001226 00000000 +@00001227 00000000 +@00001228 00000000 +@00001229 00000000 +@0000122A 00000000 +@0000122B 00000000 +@0000122C 00000000 +@0000122D 00000000 +@0000122E 00000000 +@0000122F 00000000 +@00001230 00000000 +@00001231 00000000 +@00001232 00000000 +@00001233 00000000 +@00001234 00000000 +@00001235 00000000 +@00001236 00000000 +@00001237 00000000 +@00001238 00000000 +@00001239 00000000 +@0000123A 00000000 +@0000123B 00000000 +@0000123C 00000000 +@0000123D 00000000 +@0000123E 00000000 +@0000123F 00000000 +@00001240 00000000 +@00001241 00000000 +@00001242 00000000 +@00001243 00000000 +@00001244 00000000 +@00001245 00000000 +@00001246 00000000 +@00001247 00000000 +@00001248 00000000 +@00001249 00000000 +@0000124A 00000000 +@0000124B 00000000 +@0000124C 00000000 +@0000124D 00000000 +@0000124E 00000000 +@0000124F 00000000 +@00001250 00000000 +@00001251 00000000 +@00001252 00000000 +@00001253 00000000 +@00001254 00000000 +@00001255 00000000 +@00001256 00000000 +@00001257 00000000 +@00001258 00000000 +@00001259 00000000 +@0000125A 00000000 +@0000125B 00000000 +@0000125C 00000000 +@0000125D 00000000 +@0000125E 00000000 +@0000125F 00000000 +@00001260 00000000 +@00001261 00000000 +@00001262 00000000 +@00001263 00000000 +@00001264 00000000 +@00001265 00000000 +@00001266 00000000 +@00001267 00000000 +@00001268 00000000 +@00001269 00000000 +@0000126A 00000000 +@0000126B 00000000 +@0000126C 00000000 +@0000126D 00000000 +@0000126E 00000000 +@0000126F 00000000 +@00001270 00000000 +@00001271 00000000 +@00001272 00000000 +@00001273 00000000 +@00001274 00000000 +@00001275 00000000 +@00001276 00000000 +@00001277 00000000 +@00001278 00000000 +@00001279 00000000 +@0000127A 00000000 +@0000127B 00000000 +@0000127C 00000000 +@0000127D 00000000 +@0000127E 00000000 +@0000127F 00000000 +@00001280 00000000 +@00001281 00000000 +@00001282 00000000 +@00001283 00000000 +@00001284 00000000 +@00001285 00000000 +@00001286 00000000 +@00001287 00000000 +@00001288 00000000 +@00001289 00000000 +@0000128A 00000000 +@0000128B 00004A24 +@0000128C 00004A24 +@0000128D 00004A2C +@0000128E 00004A2C +@0000128F 00004A34 +@00001290 00004A34 +@00001291 00004A3C +@00001292 00004A3C +@00001293 00004A44 +@00001294 00004A44 +@00001295 00004A4C +@00001296 00004A4C +@00001297 00004A54 +@00001298 00004A54 +@00001299 00004A5C +@0000129A 00004A5C +@0000129B 00004A64 +@0000129C 00004A64 +@0000129D 00004A6C +@0000129E 00004A6C +@0000129F 00004A74 +@000012A0 00004A74 +@000012A1 00004A7C +@000012A2 00004A7C +@000012A3 00004A84 +@000012A4 00004A84 +@000012A5 00004A8C +@000012A6 00004A8C +@000012A7 00004A94 +@000012A8 00004A94 +@000012A9 00004A9C +@000012AA 00004A9C +@000012AB 00004AA4 +@000012AC 00004AA4 +@000012AD 00004AAC +@000012AE 00004AAC +@000012AF 00004AB4 +@000012B0 00004AB4 +@000012B1 00004ABC +@000012B2 00004ABC +@000012B3 00004AC4 +@000012B4 00004AC4 +@000012B5 00004ACC +@000012B6 00004ACC +@000012B7 00004AD4 +@000012B8 00004AD4 +@000012B9 00004ADC +@000012BA 00004ADC +@000012BB 00004AE4 +@000012BC 00004AE4 +@000012BD 00004AEC +@000012BE 00004AEC +@000012BF 00004AF4 +@000012C0 00004AF4 +@000012C1 00004AFC +@000012C2 00004AFC +@000012C3 00004B04 +@000012C4 00004B04 +@000012C5 00004B0C +@000012C6 00004B0C +@000012C7 00004B14 +@000012C8 00004B14 +@000012C9 00004B1C +@000012CA 00004B1C +@000012CB 00004B24 +@000012CC 00004B24 +@000012CD 00004B2C +@000012CE 00004B2C +@000012CF 00004B34 +@000012D0 00004B34 +@000012D1 00004B3C +@000012D2 00004B3C +@000012D3 00004B44 +@000012D4 00004B44 +@000012D5 00004B4C +@000012D6 00004B4C +@000012D7 00004B54 +@000012D8 00004B54 +@000012D9 00004B5C +@000012DA 00004B5C +@000012DB 00004B64 +@000012DC 00004B64 +@000012DD 00004B6C +@000012DE 00004B6C +@000012DF 00004B74 +@000012E0 00004B74 +@000012E1 00004B7C +@000012E2 00004B7C +@000012E3 00004B84 +@000012E4 00004B84 +@000012E5 00004B8C +@000012E6 00004B8C +@000012E7 00004B94 +@000012E8 00004B94 +@000012E9 00004B9C +@000012EA 00004B9C +@000012EB 00004BA4 +@000012EC 00004BA4 +@000012ED 00004BAC +@000012EE 00004BAC +@000012EF 00004BB4 +@000012F0 00004BB4 +@000012F1 00004BBC +@000012F2 00004BBC +@000012F3 00004BC4 +@000012F4 00004BC4 +@000012F5 00004BCC +@000012F6 00004BCC +@000012F7 00004BD4 +@000012F8 00004BD4 +@000012F9 00004BDC +@000012FA 00004BDC +@000012FB 00004BE4 +@000012FC 00004BE4 +@000012FD 00004BEC +@000012FE 00004BEC +@000012FF 00004BF4 +@00001300 00004BF4 +@00001301 00004BFC +@00001302 00004BFC +@00001303 00004C04 +@00001304 00004C04 +@00001305 00004C0C +@00001306 00004C0C +@00001307 00004C14 +@00001308 00004C14 +@00001309 00004C1C +@0000130A 00004C1C +@0000130B 00004C24 +@0000130C 00004C24 +@0000130D 00004C2C +@0000130E 00004C2C +@0000130F 00004C34 +@00001310 00004C34 +@00001311 00004C3C +@00001312 00004C3C +@00001313 00004C44 +@00001314 00004C44 +@00001315 00004C4C +@00001316 00004C4C +@00001317 00004C54 +@00001318 00004C54 +@00001319 00004C5C +@0000131A 00004C5C +@0000131B 00004C64 +@0000131C 00004C64 +@0000131D 00004C6C +@0000131E 00004C6C +@0000131F 00004C74 +@00001320 00004C74 +@00001321 00004C7C +@00001322 00004C7C +@00001323 00004C84 +@00001324 00004C84 +@00001325 00004C8C +@00001326 00004C8C +@00001327 00004C94 +@00001328 00004C94 +@00001329 00004C9C +@0000132A 00004C9C +@0000132B 00004CA4 +@0000132C 00004CA4 +@0000132D 00004CAC +@0000132E 00004CAC +@0000132F 00004CB4 +@00001330 00004CB4 +@00001331 00004CBC +@00001332 00004CBC +@00001333 00004CC4 +@00001334 00004CC4 +@00001335 00004CCC +@00001336 00004CCC +@00001337 00004CD4 +@00001338 00004CD4 +@00001339 00004CDC +@0000133A 00004CDC +@0000133B 00004CE4 +@0000133C 00004CE4 +@0000133D 00004CEC +@0000133E 00004CEC +@0000133F 00004CF4 +@00001340 00004CF4 +@00001341 00004CFC +@00001342 00004CFC +@00001343 00004D04 +@00001344 00004D04 +@00001345 00004D0C +@00001346 00004D0C +@00001347 00004D14 +@00001348 00004D14 +@00001349 00004D1C +@0000134A 00004D1C +@0000134B 00004D24 +@0000134C 00004D24 +@0000134D 00004D2C +@0000134E 00004D2C +@0000134F 00004D34 +@00001350 00004D34 +@00001351 00004D3C +@00001352 00004D3C +@00001353 00004D44 +@00001354 00004D44 +@00001355 00004D4C +@00001356 00004D4C +@00001357 00004D54 +@00001358 00004D54 +@00001359 00004D5C +@0000135A 00004D5C +@0000135B 00004D64 +@0000135C 00004D64 +@0000135D 00004D6C +@0000135E 00004D6C +@0000135F 00004D74 +@00001360 00004D74 +@00001361 00004D7C +@00001362 00004D7C +@00001363 00004D84 +@00001364 00004D84 +@00001365 00004D8C +@00001366 00004D8C +@00001367 00004D94 +@00001368 00004D94 +@00001369 00004D9C +@0000136A 00004D9C +@0000136B 00004DA4 +@0000136C 00004DA4 +@0000136D 00004DAC +@0000136E 00004DAC +@0000136F 00004DB4 +@00001370 00004DB4 +@00001371 00004DBC +@00001372 00004DBC +@00001373 00004DC4 +@00001374 00004DC4 +@00001375 00004DCC +@00001376 00004DCC +@00001377 00004DD4 +@00001378 00004DD4 +@00001379 00004DDC +@0000137A 00004DDC +@0000137B 00004DE4 +@0000137C 00004DE4 +@0000137D 00004DEC +@0000137E 00004DEC +@0000137F 00004DF4 +@00001380 00004DF4 +@00001381 00004DFC +@00001382 00004DFC +@00001383 00004E04 +@00001384 00004E04 +@00001385 00004E0C +@00001386 00004E0C +@00001387 00004E14 +@00001388 00004E14 +@00001389 00004E1C +@0000138A 00004E1C +@0000138B 000037A0 +@0000138C 00000000 +@0000138D 00000000 +@0000138E 00000000 +@0000138F 00004E3C +@00001390 00004E3C +@00001391 00004854 +@00001392 00004854 +@00001393 FFFFFFFF +@00001394 00000000 +@00001395 00000000 +@00001396 FFFFFFFF +@00001397 00000000 +@00001398 00000000 +@00001399 00004E64 +@0000139A 00004E64 +@0000139B 00000000 +@0000139C 00000000 +@0000139D FFFFFFFF +@0000139E 00000000 +@0000139F 00020000 +@000013A0 000050A0 Index: sdram_ctrl/trunk/doc/readme.txt =================================================================== --- sdram_ctrl/trunk/doc/readme.txt (nonexistent) +++ sdram_ctrl/trunk/doc/readme.txt (revision 8) @@ -0,0 +1 @@ +Please look up inside the source. \ No newline at end of file Index: sdram_ctrl/trunk/doc/sdram_ctrl.sxw =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: sdram_ctrl/trunk/doc/sdram_ctrl.sxw =================================================================== --- sdram_ctrl/trunk/doc/sdram_ctrl.sxw (nonexistent) +++ sdram_ctrl/trunk/doc/sdram_ctrl.sxw (revision 8)
sdram_ctrl/trunk/doc/sdram_ctrl.sxw Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: sdram_ctrl/trunk/syn/sdram_ctrl/cb_generator.pl =================================================================== --- sdram_ctrl/trunk/syn/sdram_ctrl/cb_generator.pl (nonexistent) +++ sdram_ctrl/trunk/syn/sdram_ctrl/cb_generator.pl (revision 8) @@ -0,0 +1,1159 @@ +# | file: cb_generator.pl +# | +# | This SOPC Builder Generator program is provided by +# | the Component Builder application. It is copied +# | straight across and is data-driven from its command +# | line arguments and the PTF files referenced. +# | +# | Its purpose is to construct an HDL "wrapper" for +# | a particular instance of a particular SOPC Builder +# | peripheral. This wrapper resolves the instance +# | name and any HDL parameterization. +# | +# +------------------------------------------- + + + +# +------------------------------------------- +# | + +use strict; +use format_conversion_utils; +use ptf_parse; +use wiz_utils; +use europa_all; +use run_system_command_utils; + +# | +# +------------------------------------------- + + + +# +------------------------------------------- +# | +# | first pass: include all of generator_libarary.pm RIGHT HERE. +# | dvb04.08.02 +# | then prune down to actual functionality. +# | +# | TODO: Rewrite this whole file into something readable +# | this is much more confusing than I'm comfortable with. dvb04. +# | (though it does seem to work.) +# | + +my $DEBUG_DEFAULT_GEN = 1; + +#This is the global hash of arguments passed in by the generator program + +my $generator_hr = { + wrapper_args => { + make_wrapper => 0, + top_module_name => "", + simulate_hdl => 1, + ports => "", + }, + class_ptf_hr => "", + module_ptf_hr => "", + system_ptf_hr => "", + language => "", + external_args => "", + external_args_hr => "", + project_path_widget => "__PROJECT_DIRECTORY__", + generator_mode => "silent", + }; + + +sub generator_print_verbose +{ + my ($info) = (@_); + + if($generator_hr->{generator_mode} eq "verbose"){ + print("cb_generator.pl: ".$info); + } +} + +sub generator_enable_mode +{ + my ($mode) = (@_); + $generator_hr->{generator_mode} = $mode; +} + +sub generator_get_system_ptf_handle +{ + return $generator_hr->{system_ptf_hr}; +} + +sub generator_get_language +{ + return $generator_hr->{language}; +} + +sub generator_get_class_ptf_handle +{ + return $generator_hr->{class_ptf_hr}; +} + +sub default_ribbit +{ + my ($arg) = (@_); + &ribbit("\n\n--Error: default_gen_lib: $arg\n"); +} + + +sub _copy_files +{ + my ($dest_dir, $source_dir, @files) = (@_); + my $function_name; + + #validate args + &default_ribbit("No target dir for function copy_files!") + unless ($dest_dir ne ""); + + &default_ribbit("No source dir for function copy_files!") + unless ($source_dir ne ""); + + &default_ribbit("No files for function copy_files!") + unless (@files != 0); + + + #check for valid directories + opendir (SDIR, $source_dir) or + &default_ribbit("can't open $source_dir !"); + + opendir (DDIR, $dest_dir) or + &default_ribbit("can't open $dest_dir !"); + + + foreach my $source_file(@files){ + # | + # | Separate out the source subdir and the source filename + # | + my $source_subdir = ""; + my $source_filename = $source_file; + + if($source_filename =~ /^(.*)\/(.*)$/) # break on last slash + { + $source_subdir = "/$1"; # embed its leading slash, for concatty + $source_filename = $2; + } + + my $source_fullpath = "$source_dir$source_subdir/$source_filename"; + my $dest_fullpath = "$dest_dir/$source_filename"; + + &Perlcopy($source_fullpath, $dest_fullpath); + &generator_print_verbose("Copying file: \"$source_fullpath\"" + . " to \"$dest_fullpath\".\n"); + } + + closedir (SDIR); + closedir (DDIR); +} + + +sub get_module_wrapper_arg_hash_from_system_ptf_file +{ + my $module_ptf_hr = $generator_hr->{module_ptf_hr}; + + my @list_of_sections = ("MASTER","SLAVE","PORT_WIRING"); + my @port_list; + foreach my $section(@list_of_sections){ + my $number = get_child_count($module_ptf_hr, $section); + + for(my $initial=0; $initial < $number; $initial++){ + + my $interface_section = get_child($module_ptf_hr, $initial, $section); + my $interface_section_name = get_data($interface_section); + + my $port_wiring_section; + if($section ne "PORT_WIRING"){ + $port_wiring_section = + get_child_by_path($module_ptf_hr, $section." ".$interface_section_name."/PORT_WIRING"); + }else{ + $port_wiring_section = + get_child_by_path($module_ptf_hr, $section); + } + my $num_ports = get_child_count($port_wiring_section, "PORT"); + foreach(my $port_count = 0; $port_count < $num_ports; $port_count++){ + my $port = get_child($port_wiring_section, $port_count, "PORT"); + + my %port_info_struct; + $port_info_struct{name} = get_data($port); + $port_info_struct{direction} = get_data_by_path($port, "direction"); + $port_info_struct{width} = get_data_by_path($port, "width"); + $port_info_struct{vhdl_record_name} = get_data_by_path($port, "vhdl_record_name"); + $port_info_struct{vhdl_record_type} = get_data_by_path($port, "vhdl_record_type"); + + push(@port_list, \%port_info_struct); + + } + } + } + $generator_hr->{wrapper_args}{ports} = \@port_list; +} + + +sub generator_make_module_wrapper +{ + my ($simulate_hdl, $top_module_name, $module_language) = (@_); + + &default_ribbit("generator_make_module_wrapper: no arg0 passed in for simulate_hdl\n") + if($simulate_hdl eq ''); + + &default_ribbit("generator_make_module_wrapper: no arg1 passed in for top_module_name\n") + unless($top_module_name); + + $generator_hr->{wrapper_args}{simulate_hdl} = $simulate_hdl; + $generator_hr->{wrapper_args}{top_module_name} = $top_module_name; + $generator_hr->{wrapper_args}{make_wrapper} = 1; + $generator_hr->{wrapper_args}{module_language} = $module_language; + +} + + + + +# | +# | recognize varous number forms, +# | return 'h0123abcd-ish. +# | +sub turn_anything_into_appropriate_string($$$$) + { + my ($value,$type,$editable,$module_language) = (@_); + + return $value if($value =~ /^\"/); # quoted string: unscathed + return $value if($type eq "string"); # string: anything is ok + + return $value if(!$editable); # and you know, if you can't change it, keep it! + + + # | + # | first, convert to a number + # | + my $base = 10; + my $n = $value; + my $width = 32; + my $number = 0; + + $value = lc($value); # lower case + + if($value =~ /^([0-9]*)\'([hbo])(.*)$/) + { + # | tick notation: AOK for verilog + if($module_language eq "verilog") + { + $number = $value; + } + # | + # | note: at this point, we could notice if the + # | result should be vhdl binary, and convert + # | to that, avoiding the precision-losing + # | integer intermediary + # | + # | (alternatively, we could use a binary string + # | always as the intermediate form, rather than + # | a precision-losing int.) + # | + else + { + $width = $1; + my $baseletter = $2; + my $digits = $3; + + if($baseletter eq "h") + { + $base = 16; + } + elsif($baseletter eq "b") + { + $base = 2; + } + elsif($baseletter eq "o") # must be + { + $base = 8; + } + + $digits =~ s/[ _-]//g; # crush out dividing value + + while(length($digits) > 0) + { + my $digit = substr($digits,0,1); + $digits = substr($digits,1); + my $digitvalue = hex($digit); # how handy + $number = $number * $base + $digitvalue; + } + } + } + elsif($value =~ /^0x(.*)$/) + { + $number = hex($1); + } + else # try for decimal + { + $number = int(1 * $value); + } + + # | + # | ok, we have a number. If our target type + # | is "std_logic_vector(this downto that)" + # | for tricky VHDL, we + # | must quote a binary string out of it. + # | + + if(($module_language eq "vhdl") and ($type =~ /^.*\((\d+) downto (\d+)\).*$/)) + { + my ($high_bit,$low_bit) = ($1,$2); + my $binary = ""; + for(my $bit = $low_bit; $bit <= $high_bit; $bit++) + { + $binary = ($number % 2) . $binary; + $number = int($number >> 1); + } + + $number = '"' . $binary . '"'; + } + + return $number; + } + +# +# return @array of vhdl libraries, if any, from the class.ptf +sub get_libraries() +{ + my $class_ptf = generator_get_class_ptf_handle(); + my @libraries; + my $libraries_ptf = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/LIBRARIES"); + + if($libraries_ptf) + { + my $library_count = get_child_count($libraries_ptf,"library"); + for(my $i = 0; $i < $library_count; $i++) + { + my $library_ptf = get_child($libraries_ptf,$i,"library"); + my $library_name = get_data($library_ptf); + push(@libraries,$library_name); + } + } + + return @libraries; +} + + + +sub _generator_make_module_wrapper +{ + + my $wrapper_args = $generator_hr->{wrapper_args}; + my $no_black_box = $wrapper_args->{simulate_hdl}; + my $top_module_name = $wrapper_args->{top_module_name}; + my $language = $generator_hr->{language}; + my @external_args = @{$generator_hr->{external_args}}; + my $module_ptf_hr = $generator_hr->{module_ptf_hr}; + + ### Build Module + my $project = e_project->new(@external_args); + my $top = $project->top(); + + # add the ports to the system module + my @ports; + + foreach my $port_hash(@{$wrapper_args->{ports}}){ + my $porto = e_port->new({ + name => $port_hash->{name}, + width => $port_hash->{width}, + direction => $port_hash->{direction}, + vhdl_record_name => $port_hash->{vhdl_record_name}, + vhdl_record_type => $port_hash->{vhdl_record_type} + }); + push(@ports, $porto); + } + $top->add_contents(@ports); + + + + + + # +---------------------------------------- + # | Get parameters from class.ptf + # | create @array of parameters, eacho + # | one like name=>, default=>, type=>, + # | + # | These are the definitions of parameters for + # | ANY instance of this module; we need to + # | have them in the "wrapee" module so that + # | when the system bus is knitted together + # | the parameter types can be properly used. + # | + # | (as it turns out, verilog doesnt need + # | them, but vhld does) + # | + # | dvb2004 + + + my @e_hdl_parameters; # list of e_parameters + + my $class_ptf = generator_get_class_ptf_handle(); + my $hdl_parameter_definitions_ptf = get_child_by_path($class_ptf,"CLASS/COMPONENT_BUILDER/HDL_PARAMETERS"); + + my @libraries = get_libraries(); + + my $hdl_parameter_count = get_child_count($hdl_parameter_definitions_ptf,"HDL_PARAMETER"); + + my $module_language = $generator_hr->{wrapper_args}{module_language}; + + for(my $i = 0; $i < $hdl_parameter_count; $i++) + { + my $a_parameter = get_child($hdl_parameter_definitions_ptf,$i,"HDL_PARAMETER"); + my $parameter_editable = get_data_by_path($a_parameter,"editable"); + if($parameter_editable) + { + my $boring_name = get_data($a_parameter); # legal guinevere-ized + my $name = get_data_by_path($a_parameter,"parameter_name"); # original HDL name + my $default = get_data_by_path($a_parameter,"default_value"); + my $type = get_data_by_path($a_parameter,"type"); + + $default = turn_anything_into_appropriate_string($default,$type,1,$module_language); + + my $a_parameter = e_parameter->new + ({ + name => $name, + default => $default, + type => $type + }); + + push (@e_hdl_parameters,$a_parameter); + } + } + + + + # | and @e_hdl_parameters is used below in the wrapee module + # +-------------------------------------------- + + # +-------------------------------------------- + # | Now, we build a "hdl_parameter_map", which is just + # | your basic hash table with keys (parameters) + # | and values (parameter values). + # | + # | these are the particular values for this instance. + # | + + my %hdl_parameter_map; + my $module_ptf = $generator_hr->{module_ptf_hr}; + my $hdl_parameters_ptf = + get_child_by_path($module_ptf,"WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"); + + my $child_count = get_child_count($hdl_parameters_ptf); + + for(my $i = 0; $i < $child_count; $i++) + { + my $a_parameter = get_child($hdl_parameters_ptf,$i); + + my $boring_name = get_name($a_parameter); + my $value = get_data($a_parameter); + + # refer back to the original HDL name... + my $parameter_definition_ptf = get_child_by_path($hdl_parameter_definitions_ptf,"HDL_PARAMETER $boring_name"); + my $parameter_name = get_data_by_path($parameter_definition_ptf,"parameter_name"); + my $parameter_type = get_data_by_path($parameter_definition_ptf,"type"); + my $parameter_editable = get_data_by_path($parameter_definition_ptf,"editable"); + + $value = turn_anything_into_appropriate_string($value,$parameter_type,$parameter_editable,$module_language); + + # | + # | our internal _dummy assignment shows up here + # | without a corresponding hdl entry. we + # | ignore it. + # | + + if(($parameter_name ne "") and $parameter_editable) + { + $hdl_parameter_map{$parameter_name} = $value; + } + } + + my $wrapee_module; + $wrapee_module = e_module->new({ + name => $top_module_name, + contents => [@ports,@e_hdl_parameters], + do_black_box => 0, + do_ptf => 0, + _hdl_generated => 1, + _explicitly_empty_module => 1, + }); + + # VHDL Libraries, from PTF file... + $wrapee_module->add_vhdl_libraries(@libraries); + $top->add_vhdl_libraries(@libraries); + + + $top->add_contents ( + e_instance->new({ + module => $wrapee_module, + parameter_map => \%hdl_parameter_map + }), + ); + + $project->top()->do_ptf(0); + $project->do_write_ptf(0); + + + my $module_file = $project->_target_module_name().".v"; + $module_file = $project->_target_module_name().".vhd" + if($language eq "vhdl"); + + $module_file = $generator_hr->{project_path_widget}."/".$module_file; + &generator_set_files_in_system_ptf("Synthesis_HDL_Files", ($module_file)); + $project->output(); + + + # if you don't want a simulation model, you don't get a simulation model + if($no_black_box eq "0") + { + my $black_project = e_project->new(@external_args); + $black_project->_target_module_name($top_module_name); + my $black_top = $black_project->top(); + + + + $black_top->add_contents(@ports); + my $black_top_instance; + $black_top_instance = e_module->new({ + name => $wrapper_args->{top_module_name}."_bb", + contents => [@ports], + do_black_box => 1, + do_ptf => 0, + _hdl_generated => 0, + _explicitly_empty_module => 1, + }); + + $black_top->add_contents ( + e_instance->new({ + module => $black_top_instance, + }), + ); + + + + + $black_project->top()->do_ptf(0); + $black_project->do_write_ptf(0); + + my $black_module_file = $black_project->_target_module_name().".v"; + $black_module_file = $black_project->_target_module_name().".vhd" + if($language eq "vhdl"); + + + $black_module_file = $generator_hr->{project_path_widget}."/".$black_module_file; + &generator_set_files_in_system_ptf("Simulation_HDL_Files", ($black_module_file)); + +# &set_data_by_path($module_ptf_hr, "HDL_INFO/Simulation_HDL_Files", $black_module_file); + + + $black_project->output(); + } + +} + +#### +# Args: $file_type : "synthesis", "synthesis_only", "simulation" +# @file_list : an array of files. This list of files is assumed to be relative to the +# component's directory + + +my $decoder_ring_hr = { + quartus_only => { + copy => 1, + copy_to => "project", + ptf_set => 0, + }, + simulation_only => { + copy => 1, + copy_to => "simulation", + ptf_set => 1, + ptf_section => "Simulation_HDL_Files", + }, + simulation_and_quartus => { + copy => 1, + copy_to => "project", + ptf_set => 1, + ptf_section => "Synthesis_HDL_Files", + }, + precompiled_simulation_files => { + copy => 0, + ptf_set => 1, + ptf_section => "Precompiled_Simulation_Library_Files", + }, + }; + + + + +sub generator_copy_files_and_set_system_ptf +{ + my ($hdl_section, @file_list) = (@_); + + my $ptf_path_prefix = ""; + my $external_args_hr = $generator_hr->{external_args_hr}; + my @new_file_array; + + #validate first + my $decoder_hash = $decoder_ring_hr->{$hdl_section}; + &default_ribbit("generator_copy_files_and_set_system_ptf: No understood HDL section passed in for first arg\n") + unless($decoder_ring_hr->{$hdl_section} ne ""); + + &generator_print_verbose("generator_copy_files_and_set_system_ptf: copying files for section ".$hdl_section."\n"); + + #copy second + my @new_file_array; + + # If we need to copy over some files, then we need to make sure we are + # keeping track of what files we copy over. + # Otherwise, we just need to keep track of the files that the user has asked to copy over + # and use these instead. + if($decoder_hash->{copy}){ + my $copy_to_location; + my $copy_from_location; + + if($decoder_hash->{copy_to} eq "project"){ + $copy_to_location = $external_args_hr->{system_directory}; + }elsif($decoder_hash->{copy_to} eq "simulation"){ + $copy_to_location = $external_args_hr->{system_sim_dir}; + }else{ + &default_ribbit("generator_copy_files_and_set_system_ptf: No understood copy files to location\n"); + } + + $copy_from_location = $external_args_hr->{class_directory}; + @new_file_array = &generator_copy_files($copy_to_location, $copy_from_location, @file_list); + }else{ + @new_file_array = @file_list; + } + + #scribble on PTF hash last + if($decoder_hash->{ptf_set}){ + + if($decoder_hash->{copy_to} eq "project"){ + foreach my $file(@new_file_array){ + $file =~ s/^.*\/(.*?)$/$1/; + $file = $generator_hr->{project_path_widget}."/".$file; + } + } + &generator_print_verbose("generator_copy_files_and_set_system_ptf: setting system PTF file in section ".$hdl_section."\n"); + if($decoder_hash->{ptf_section} eq "Precompiled_Simulation_Library_Files"){ + @new_file_array = map{$external_args_hr->{class_directory}."/".$_} @new_file_array; + } + &generator_set_files_in_system_ptf($decoder_hash->{ptf_section}, @new_file_array); + } +} + + + +#### +# Name: generator_set_files_in_system_ptf +# Args: $hdl_section +# @list_of_files +# Returns: 1 or 0 +# Purpose: This is an internal function used to set files in the module's section in the system PTF file +# +sub generator_set_files_in_system_ptf +{ + my ($hdl_section, @list_of_files) = (@_); + + my $file_list = join(",", @list_of_files); + my $previous_data; + + &generator_print_verbose("setting HDL_INFO/".$hdl_section." in system PTF file with ".$file_list."\n"); + my $previous_data = &get_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section); + if($previous_data){ + $file_list = $previous_data . ", $file_list"; # spr 132177 + # swapping order, dvb 2003 + } + &set_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section, $file_list); +} + +#### +# Name: generator_copy_files +# Args: $target_directory +# $source_directory +# @list_of_files +# Returns: The list of files which has been copied (suitable for framing!) +# Purpose: This is an internal function used to copy files around in the generator program. +# +sub generator_copy_files +{ + my ($target_directory, $source_directory, @list_of_files) = (@_); + + my @new_file_array; + + foreach my $file_name(@list_of_files){ + $file_name =~ s|\\|\/|g; + if($file_name =~ /\*\.*/){ + $file_name =~ s/\*/$1/; + my @found_list = &_find_all_dir_files_with_ext($source_directory, $file_name); + push(@new_file_array, @found_list); + }else{ + &generator_print_verbose("Copying: ".$file_name."\n"); + push(@new_file_array, $file_name); + } + } + + &_copy_files($target_directory, $source_directory, @new_file_array); + return @new_file_array; +} + + + +sub _find_all_dir_files_with_ext +{ + my ($dir, + $ext) = (@_); + + opendir (DIR, $dir) or + &default_ribbit("can't open $dir !"); + + my @all_files = readdir(DIR); + my @new_file_list; + + + foreach my $file (@all_files){ + if($file =~ /^.*($ext)$/){ + push(@new_file_list, $file); + } + } + + return @new_file_list; +} + +#### +# Name: generator_begin +# Args: Array of generator program launcher args +# Returns: A hash reference to the module's section in the system PTF file +# Purpose: This is the first subroutine a user should call before running the rest of their +# generator program. +# + +sub generator_begin +{ + my @external_args = (@_); + + my ($external_args_hr, + $temp_user_defined, + $temp_db_Module, + $temp_db_PTF_File) = Process_Wizard_Script_Arguments("", @external_args); + + &generator_print_verbose("generator_begin: initializing\n"); + + $generator_hr->{external_args_hr} = $external_args_hr; + $generator_hr->{external_args} = \@external_args; + + # open up class.ptf and + $generator_hr->{class_ptf_hr} = new_ptf_from_file($external_args_hr->{class_directory}."/class.ptf"); + + # get the system.ptf + $generator_hr->{system_ptf_hr} = new_ptf_from_file($external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"); + $generator_hr->{module_ptf_hr} = &get_child_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/MODULE $external_args_hr->{target_module_name}"); + my $class_name = get_data_by_path($generator_hr->{module_ptf_hr}, "class"); + + # find the default generator section + $generator_hr->{language} = get_data_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/WIZARD_SCRIPT_ARGUMENTS/hdl_language"); + + # get some wrapper settings + &get_module_wrapper_arg_hash_from_system_ptf_file(); + + # clear system ptf's HDL section + &delete_child($generator_hr->{module_ptf_hr}, "HDL_INFO"); + + return $generator_hr->{module_ptf_hr}; +} + +#### +# Name: generator_end +# Args: none +# Returns: nothing +# Purpose: This is the last subroutine a user should call from their generator program. +# Not calling this subroutine will make you very sad... =< +# + +sub generator_end +{ + # o.k., time to make the wrapper and output it. + if($generator_hr->{wrapper_args}{make_wrapper}){ + &_generator_make_module_wrapper(); + } + + + my $external_args_hr = $generator_hr->{external_args_hr}; + my $ptf_file_name = $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"; + &generator_print_verbose("generator_end: writing PTF file ".$external_args_hr->{system_name}.".ptf to ".$external_args_hr->{system_directory}."\n"); + + default_ribbit("Cannot write PTF file ".$ptf_file_name."!\n") + unless(&write_ptf_file($generator_hr->{system_ptf_hr}, $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf")); +} + +sub generator_end_read_module_wrapper_string +{ + my $language = &generator_get_language(); + my $ls; + + if($language =~ /vhdl/){ + $ls = ".vhd"; + }elsif($language =~ /verilog/){ + $ls = ".v"; + }else{ + &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); + } + my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; + my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; + + my $file = $system_dir."/".$module_name.$ls; + &generator_print_verbose("generator library reading file into string: $file\n"); + + open (FILE,"<$file") or ribbit "cannot open file ($file) ($!)\n"; + my $return_string; + while () + { + $return_string .= $_; + } + close (FILE); + return($return_string); +} + +sub generator_end_write_module_wrapper_string +{ + my $string = shift or ribbit "no string specified\n"; + + my $language = &generator_get_language(); + my $ls; + + print $language; + + if($language =~ /vhdl/){ + $ls = ".vhd"; + }elsif($language =~ /verilog/){ + $ls = ".v"; + }else{ + &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); + } + my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; + my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; + + my $file = $system_dir."/".$module_name.$ls; + &generator_print_verbose("generator library writing string into file: $file\n"); + + open (FILE,">$file") or ribbit "cannot open file ($file) ($!)\n"; + print FILE $string; + close (FILE); +} +# end of generator_library.pm + + + + + +# +# +# +# +# --------------------------------------------------------------------- + +# +---------------------------------------------------- +# | emit_system_h +# | +# | if "is_cpu", attempt to emit a system.h +# | memory map. +# | + +sub emit_system_h($$$) + { + my ($sopc_directory,$master,$system_ptf) = (@_); + + # | + # | Build a system.h file for masters. + # | + + +# as of quartus 5.0, we prefer gtf-generate in sopc_builder directly + + my $gtf_generate = "$sopc_directory/bin/gtf-generate"; + my $gtf_filename = "$sopc_directory/bin/gtf/system.h.gtf"; + + if(! -f $gtf_generate) + { + # but if sopc_builder is missing it for whatever reason, + # try the one in sopc_kit_nios2 + + my $sopc_kit_nios2 = $ENV{SOPC_KIT_NIOS2}; + if($sopc_kit_nios2 ne "") + { + $gtf_generate = "$sopc_kit_nios2/bin/gtf-generate"; + $gtf_filename = "$sopc_kit_nios2/bin/gtf/system.h.gtf"; + } + } + + # | + # | xml template + # | + + my $stf_template = < + + + + + + +EOP + + # | + # | THINK + # | + + my $output_directory = "./${master}_map"; + my $project_name = "ignored"; + my $stf_filename = "./${master}_project.stf"; + + # | + # | build up template variables + # | + + my %template_vars; + $template_vars{date} = fcu_date_time(); + $template_vars{whoami} = $0; + $template_vars{project_name} = $project_name; + $template_vars{system_ptf} = $system_ptf; + $template_vars{output_directory} = $output_directory; + $template_vars{master} = $master; + + # | + # | poke in the values to the template + # | + + foreach my $key (sort(keys(%template_vars))) + { + $stf_template =~ s/--$key--/$template_vars{$key}/gs; + } + + ## debug print $stf_template; + + # | + # | write out the stf file, so we can soon use it + # | + + fcu_write_file($stf_filename,$stf_template); + + # | + # | and use it + # | + + if(-e $gtf_generate && -e $gtf_filename) + { + + my $generate_cmd = $gtf_generate; + + $generate_cmd .= " --output-directory=$output_directory"; + $generate_cmd .= " --gtf=$gtf_filename"; + $generate_cmd .= " --stf=$stf_filename"; + + r_system($sopc_directory,$generate_cmd); + + # | + # | done with it + # | + + r_system($sopc_directory,"rm $stf_filename"); + + fcu_print_command("Generated memory map \"$output_directory/system.h\""); + } + else + { + fcu_print_command("Warning: did NOT emit system.h for $master"); + } + + + + + } + + +sub r_system($$) + { + my ($sopc_directory,$cmd) = (@_); + fcu_print_command($cmd); + return Run_Command_In_Unix_Like_Shell($sopc_directory,$cmd); + } + + + + + + + +# +------------------------------------------ +# | synthesis and simulation files are are +# | listed in CLASS/CB_GENERATOR/HDL_FILES. +# | + +sub get_synthesis_files($) + { + my ($class_ptf) = (@_); + my $synthesis_files = ""; + my $simulation_files = ""; + + my $hdl_files = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/HDL_FILES"); + my $child_count = get_child_count($hdl_files); + for(my $i = 0; $i < $child_count; $i++) + { + my $hdl_file = get_child($hdl_files,$i); + if(get_name($hdl_file) eq "FILE") + { + my $filename = get_data_by_path($hdl_file,"filepath"); + my $use_in_synthesis = get_data_by_path($hdl_file,"use_in_synthesis"); + my $use_in_simulation = get_data_by_path($hdl_file,"use_in_simulation"); + + if($use_in_synthesis) + { + $synthesis_files .= ", " if $synthesis_files; + $synthesis_files .= $filename; + } + + if($use_in_simulation) + { + $simulation_files .= ", " if $simulation_files; + $simulation_files .= $filename; + } + } + } + + return $synthesis_files; + } + + + + + + + + +sub main + { + + push(@ARGV,"--verbose=1") if 0; + my %args = fcu_parse_args(@ARGV); + + if(0) + { + foreach my $key (sort(keys(%args))) + { + print("--$key = $args{$key} \n"); + } + } + + # | + # | get the arguments we care about + # | + + my $class_dir = fcu_get_switch(\%args,"module_lib_dir"); + + + my $target_module_name = fcu_get_switch(\%args,"target_module_name"); + my $system_name = fcu_get_switch(\%args,"system_name"); + my $sopc_directory = fcu_get_switch(\%args,"sopc_directory"); + + # | + # | preflight the arguments a little + # | + + my $error_count = 0; + + my $class_ptf_path = "$class_dir/class.ptf"; + if(!-f $class_ptf_path) + { + print "error: no class.ptf at \"$class_dir\"\n"; + $error_count++; + } + + die "$error_count errors" if($error_count > 0); + + # +------------------------------------------- + # | ok, let us get to work + # | + + + my $class_ptf = new_ptf_from_file($class_ptf_path); + + # | + # | emit system.h for this module + # | TODO iff Is_CPU i guess. + # | + + my $do_emit_system_h = get_data_by_path($class_ptf, + "CLASS/CB_GENERATOR/emit_system_h"); + if($do_emit_system_h) + { + emit_system_h($sopc_directory, + $target_module_name, + "./$system_name.ptf"); + } + + my $top_module_name = get_data_by_path($class_ptf, + "CLASS/CB_GENERATOR/top_module_name"); + my $file_name = ""; + + # | stored as file_name.v:module_name, so we break it open + if($top_module_name =~ /^(.*):(.*)$/) + { + $file_name = $1; + my $module_name = $2; + $top_module_name = $module_name; + } + + # | language of this particular module... + + my $module_language = "verilog"; + if($file_name =~ /^.*\.vhd$/) + { + $module_language = "vhdl"; + } + + # | + # | consult the CB_GENERATOR/HDL_FILES section regarding + # | where our HDL files for synthesis are. + # | + + + my $synthesis_files = get_synthesis_files($class_ptf); + + + my $instantiate_in_system_module = get_data_by_path($class_ptf, + "CLASS/MODULE_DEFAULTS/SYSTEM_BUILDER_INFO/Instantiate_In_System_Module"); + + + + if($instantiate_in_system_module) + { + generator_enable_mode ("terse"); + + + generator_begin (@ARGV); + + + generator_make_module_wrapper(1,$top_module_name,$module_language); + + generator_copy_files_and_set_system_ptf + ( + "simulation_and_quartus", + split(/ *, */,$synthesis_files) +# "$synthesis_files" + ); + + generator_end (); + } + + exit (0); + } + +$| = 1; # always polite to flush. +main() + +# end of file Index: sdram_ctrl/trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd =================================================================== --- sdram_ctrl/trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (nonexistent) +++ sdram_ctrl/trunk/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (revision 8) @@ -0,0 +1,440 @@ +------------------------------------------------------------------ +-- +-- sdram_ctrl.vhd +-- +-- Module Description: +-- SDRAM small&fast controller +-- +-- +-- To Do: +-- configurable times +-- nios simulation support +-- +-- Author(s): +-- Aleksey Kuzmenok, ntpqa@opencores.org +-- +------------------------------------------------------------------ +-- +-- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG +-- +-- This module is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License, or (at your option) any later version. +-- +-- This module 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 +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this software; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +-- +------------------------------------------------------------------ +-- Test results +-- FPGA SDRAM CLK (not less than) +-- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz +-- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz +-- +------------------------------------------------------------------ + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity sdram_ctrl is + generic( + DATA_WIDTH: integer:=32; + BANK_WIDTH: integer:=4; + ROW_WIDTH: integer:=12; + COLUMN_WIDTH: integer:=8; + + clk_MHz: integer:=120 + ); + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + -- IMPORTANT: for this Avalon(tm) interface + -- 'Minimum Arbitration Shares'=1 + -- 'Max Pending Read Transactions'=9 + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR ((BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + + -- global export signals + signal sdram_cke : OUT STD_LOGIC; -- This pin has fixed state '1' + signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); + signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); + signal sdram_cs_n : OUT STD_LOGIC; -- This pin has fixed state '0' + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC; + signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) + ); +end sdram_ctrl; + +architecture behaviour of sdram_ctrl is + + CONSTANT FIFO_WIDTH: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + + CONSTANT MODE: std_logic_vector(11 downto 0):="000000110000"; -- 1 word burst, CAS latency=3 + -- Only two times are configurable + -- tINIT delay between powerup and load mode register = 100 us + -- tREF refresh period = 15.625 us (64ms/4096rows) + CONSTANT INIT_PAUSE_CLOCKS: integer:=(clk_MHz*10000)/91; -- 109.9 us just to be on the save side + CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*1000)/65; -- 15.384 us the same purpose + CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! + + COMPONENT scfifo + GENERIC ( + add_ram_output_register : STRING; + intended_device_family : STRING; + lpm_numwords : NATURAL; + lpm_showahead : STRING; + lpm_type : STRING; + lpm_width : NATURAL; + lpm_widthu : NATURAL; + overflow_checking : STRING; + underflow_checking : STRING; + use_eab : STRING + ); + PORT ( + rdreq : IN STD_LOGIC ; + empty : OUT STD_LOGIC ; + aclr : IN STD_LOGIC ; + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + wrreq : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + full : OUT STD_LOGIC + ); + END COMPONENT; + + -- If you ask me why there are so many states, I'll answer that all times are fixed. + -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. + -- tRP PRECHARGE command period = 3 clocks + -- tRFC AUTO REFRESH period = 10 clocks + -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks + -- tRCD ACTIVE to READ or WRITE delay = 3 clocks + -- tRAS ACTIVE to PRECHARGE command = 7 clocks + -- tRC ACTIVE to ACTIVE command period = 10 clocks + -- tWR2 Write recovery time = 2 clocks + type states is ( + INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, + INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, + INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, + REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, + REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, + ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, + IDLE,READ0,WRITE0); + signal operation: states; + + signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); + + signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); + signal refresh_counter: unsigned(15 downto 0); + signal active_counter: unsigned(2 downto 0); + signal active_address: unsigned((BANK_WIDTH+ROW_WIDTH-1) downto 0); + + signal bank: std_logic_vector((sdram_ba'length-1) downto 0); + signal row: std_logic_vector((sdram_addr'length-1) downto 0); + signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); + signal be: std_logic_vector((sdram_dqm'length-1) downto 0); + signal data: std_logic_vector((sdram_dq'length-1) downto 0); + + signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; + + signal fifo_rdreq,fifo_empty: std_logic; + + signal read_latency: std_logic_vector(CAS_LATENCY downto 0); + + signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); + signal fifo_wrreq,fifo_wrfull: std_logic; + + signal i_command : STD_LOGIC_VECTOR(4 downto 0); + CONSTANT NOP: STD_LOGIC_VECTOR(4 downto 0):="10111"; + CONSTANT ACTIVE: STD_LOGIC_VECTOR(4 downto 0):="10011"; + CONSTANT READ: STD_LOGIC_VECTOR(4 downto 0):="10101"; + CONSTANT WRITE: STD_LOGIC_VECTOR(4 downto 0):="10100"; + CONSTANT PRECHARGE: STD_LOGIC_VECTOR(4 downto 0):="10010"; + CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR(4 downto 0):="10001"; + CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR(4 downto 0):="10000"; + + signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); + signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); + signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); + signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); + attribute ALTERA_ATTRIBUTE : string; + attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; +begin + (sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; + sdram_addr <= i_address; + sdram_ba <= i_bank; + sdram_dqm <= i_dqm; + sdram_dq <= i_data; + + fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; + fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; + + avs_nios_waitrequest<=fifo_wrfull; + + fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; + + do_active<='0' when active_address=unsigned((fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length)))) else '1'; + read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; + ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; + + operation_machine:process(reset,clk) + begin + if reset='1' + then + operation<=INIT0; + active_address<=(others=>'1'); + elsif rising_edge(clk) + then + + bank<=fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length)); + row<=fifo_q((fifo_q'length-bank'length-1) downto (fifo_q'length-bank'length-row'length)); + column<=fifo_q((column'length+data'length+be'length+2-1) downto (data'length+be'length+2)); + data<=fifo_q((data'length+be'length+2-1) downto (be'length+2)); + be<=fifo_q((be'length+2-1) downto 2); + + case operation is + when INIT0=> + if do_init='1' + then operation<=INIT1;row(10)<='1'; + end if; + when INIT1=>operation<=INIT2; + when INIT2=>operation<=INIT3; + when INIT3=>operation<=INIT4; + when INIT4=>operation<=INIT5; + when INIT5=>operation<=INIT6; + when INIT6=>operation<=INIT7; + when INIT7=>operation<=INIT8; + when INIT8=>operation<=INIT9; + when INIT9=>operation<=INIT10; + when INIT10=>operation<=INIT11; + when INIT11=>operation<=INIT12; + when INIT12=>operation<=INIT13; + when INIT13=>operation<=INIT14; + when INIT14=>operation<=INIT15; + when INIT15=>operation<=INIT16; + when INIT16=>operation<=INIT17; + when INIT17=>operation<=INIT18; + when INIT18=>operation<=INIT19; + when INIT19=>operation<=INIT20; + when INIT20=>operation<=INIT21; + when INIT21=>operation<=INIT22; + when INIT22=>operation<=INIT23; + when INIT23=>operation<=INIT24;row<=MODE((row'length-1) downto 0); + when INIT24=>operation<=IDLE; + + when REFRESH0=>operation<=REFRESH1; + when REFRESH1=>operation<=REFRESH2; + when REFRESH2=>operation<=REFRESH3; + when REFRESH3=>operation<=REFRESH4; + when REFRESH4=>operation<=REFRESH5; + when REFRESH5=>operation<=REFRESH6; + when REFRESH6=>operation<=REFRESH7; + when REFRESH7=>operation<=REFRESH8; + when REFRESH8=>operation<=REFRESH9; + when REFRESH9=>operation<=REFRESH10; + when REFRESH10=>operation<=REFRESH11; + when REFRESH11=>operation<=REFRESH12; + when REFRESH12=>operation<=REFRESH13; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when REFRESH13=>operation<=REFRESH14; + when REFRESH14=>operation<=IDLE; + + when ACTIVE0=>operation<=ACTIVE1; + when ACTIVE1=>operation<=ACTIVE2; + when ACTIVE2=>operation<=ACTIVE3; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when ACTIVE3=>operation<=ACTIVE4; + when ACTIVE4=>operation<=IDLE; + + when others=> + if do_refresh='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=REFRESH0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif do_active='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=ACTIVE0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif fifo_empty='1' + then + operation<=IDLE; + elsif fifo_q(1)='1' --write + then + if read_latency(CAS_LATENCY-1 downto 0)>"000" + then operation<=IDLE; + else operation<=WRITE0; + end if; + elsif fifo_q(0)='1' --read + then + operation<=READ0; + end if; + end case; + end if; + end process; + + control_latency:process(reset,clk) + begin + if reset='1' + then + read_latency<=(others=>'0'); + elsif rising_edge(clk) + then + read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); + if operation=READ0 + then read_latency(0)<='1'; + else read_latency(0)<='0'; + end if; + end if; + end process; + latch_readdata:process(reset,clk) + begin + if reset='1' + then + avs_nios_readdata<=(others=>'0'); + avs_nios_readdatavalid<='0'; + elsif rising_edge(clk) + then + avs_nios_readdata<=sdram_dq; + avs_nios_readdatavalid<=read_latency(CAS_LATENCY); + end if; + end process; + initialization:process(reset,clk) + begin + if rising_edge(clk) + then + if init_counter>0 + then + init_counter<=init_counter-1; + else do_init<='1'; + end if; + end if; + end process; + refreshing:process(clk,reset) + begin + if reset='1' + then + refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='0'; + elsif rising_edge(clk) + then + if refresh_counter=to_unsigned(0,refresh_counter'length) + then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='1'; + else refresh_counter<=refresh_counter-1; + end if; + if operation=REFRESH0 or operation=REFRESH5 + then do_refresh<='0'; + end if; + end if; + end process; + active_period:process(reset,clk) + begin + if reset='1' + then + active_counter<=(others=>'0'); + tRCD_not_expired<='0'; + elsif rising_edge(clk) + then + if operation=ACTIVE3 or operation=REFRESH13 + then active_counter<=to_unsigned(5,active_counter'length); + elsif active_counter>0 + then active_counter<=active_counter-1; + end if; + end if; + if active_counter>0 + then tRCD_not_expired<='1'; + else tRCD_not_expired<='0'; + end if; + end process; + latch_controls:process(clk,reset) + begin + if reset='1' + then + i_command<=NOP; + i_address<=(others=>'0'); + i_bank<=(others=>'0'); + i_dqm<=(others=>'0'); + i_data<=(others=>'Z'); + elsif rising_edge(clk) + then + i_command<=NOP; + i_bank<=bank; + i_address<=(others=>'0'); + i_address((column'length-1) downto 0)<=column; + i_data<=(others=>'Z'); + i_dqm<=(others=>'0'); + + case operation is + when INIT1|REFRESH0|ACTIVE0 => + i_command<=PRECHARGE; + i_address<=row; + when INIT4|INIT14|REFRESH3 => + i_command<=AUTO_REFRESH; + when INIT24=> + i_command<=LOAD_MODE_REGISTER; + i_address<=row; + when ACTIVE3|REFRESH13 => + i_command<=ACTIVE; + i_address<=row; + when READ0 => + i_command<=READ; + when WRITE0 => + i_command<=WRITE; + i_dqm<=not be; + i_data<=data; + when OTHERS => + end case; + end if; + end process; + + fifo: scfifo + GENERIC MAP ( + add_ram_output_register => "ON", + intended_device_family => "Cyclone", + lpm_numwords => 4, + lpm_showahead => "ON", + lpm_type => "scfifo", + lpm_width => FIFO_WIDTH, + lpm_widthu => 2, + overflow_checking => "ON", + underflow_checking => "ON", + use_eab => "ON" + ) + PORT MAP ( + rdreq => fifo_rdreq, + aclr => reset, + clock => clk, + wrreq => fifo_wrreq, + data => fifo_data, + empty => fifo_empty, + q => fifo_q, + full => fifo_wrfull + ); +end behaviour; Index: sdram_ctrl/trunk/syn/sdram_ctrl/class.ptf =================================================================== --- sdram_ctrl/trunk/syn/sdram_ctrl/class.ptf (nonexistent) +++ sdram_ctrl/trunk/syn/sdram_ctrl/class.ptf (revision 8) @@ -0,0 +1,972 @@ +# +# This class.ptf file built by Component Editor +# 2006.09.25.10:24:12 +# +# DO NOT MODIFY THIS FILE +# If you hand-modify this file you will likely +# interfere with Component Editor's ability to +# read and edit it. And then Component Editor +# will overwrite your changes anyway. So, for +# the very best results, just relax and +# DO NOT MODIFY THIS FILE +# +CLASS sdram_ctrl +{ + CB_GENERATOR + { + HDL_FILES + { + FILE + { + use_in_simulation = "1"; + use_in_synthesis = "1"; + filepath = "hdl/sdram_ctrl.vhd"; + } + } + top_module_name = "sdram_ctrl.vhd:sdram_ctrl"; + emit_system_h = "0"; + LIBRARIES + { + library = "ieee.std_logic_1164.all"; + library = "ieee.numeric_std.all"; + library = "altera_mf.altera_mf_components.all"; + library = "std.standard.all"; + } + } + MODULE_DEFAULTS global_signals + { + class = "sdram_ctrl"; + class_version = "1.1"; + SYSTEM_BUILDER_INFO + { + Instantiate_In_System_Module = "1"; + Has_Clock = "1"; + Top_Level_Ports_Are_Enumerated = "1"; + } + COMPONENT_BUILDER + { + GLS_SETTINGS + { + } + } + PORT_WIRING + { + PORT clk + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "clk"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT reset + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "reset"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cke + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ba + { + width = "-1"; + width_expression = "((bank_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_addr + { + width = "-1"; + width_expression = "((row_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cs_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ras_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cas_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_we_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dq + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "inout"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dqm + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + WIZARD_SCRIPT_ARGUMENTS + { + hdl_parameters + { + data_width = "32"; + bank_width = "4"; + row_width = "12"; + column_width = "8"; + clk_mhz = "120"; + } + } + SIMULATION + { + DISPLAY + { + } + } + SLAVE nios + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + Address_Group = "1"; + Has_Clock = "0"; + Address_Width = "-1"; + Address_Alignment = "dynamic"; + Data_Width = "8"; + Has_Base_Address = "1"; + Has_IRQ = "0"; + Setup_Time = "0"; + Hold_Time = "0"; + Read_Wait_States = "peripheral_controlled"; + Write_Wait_States = "peripheral_controlled"; + Read_Latency = "0"; + Maximum_Pending_Read_Transactions = "9"; + Active_CS_Through_Read_Latency = "0"; + Is_Printable_Device = "1"; + Is_Memory_Device = "1"; + Is_Readable = "1"; + Is_Writable = "1"; + Minimum_Uninterrupted_Run_Length = "1"; + } + COMPONENT_BUILDER + { + AVS_SETTINGS + { + Setup_Value = "0"; + Read_Wait_Value = "1"; + Write_Wait_Value = "1"; + Hold_Value = "0"; + Timing_Units = "cycles"; + Read_Latency_Value = "0"; + Minimum_Arbitration_Shares = "1"; + Active_CS_Through_Read_Latency = "0"; + Max_Pending_Read_Transactions_Value = "9"; + Address_Alignment = "dynamic"; + Is_Printable_Device = "1"; + interface_name = "Avalon Slave"; + external_wait = "1"; + Is_Memory_Device = "1"; + } + } + PORT_WIRING + { + PORT avs_nios_chipselect + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "chipselect"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_address + { + width = "-1"; + width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; + direction = "input"; + type = "address"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_byteenable + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "input"; + type = "byteenable"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_writedata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "input"; + type = "writedata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_write + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "write"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_read + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "read"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_waitrequest + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "waitrequest"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "output"; + type = "readdata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdatavalid + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "readdatavalid"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + } + USER_INTERFACE + { + USER_LABELS + { + name = "sdram_ctrl"; + technology = "Opencores"; + } + WIZARD_UI the_wizard_ui + { + title = "sdram_ctrl - {{ $MOD }}"; + CONTEXT + { + H = "WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"; + M = ""; + SBI_global_signals = "SYSTEM_BUILDER_INFO"; + SBI_nios = "SLAVE nios/SYSTEM_BUILDER_INFO"; + # The following signals have parameterized widths: + PORT_sdram_ba = "PORT_WIRING/PORT sdram_ba"; + PORT_sdram_addr = "PORT_WIRING/PORT sdram_addr"; + PORT_sdram_dq = "PORT_WIRING/PORT sdram_dq"; + PORT_sdram_dqm = "PORT_WIRING/PORT sdram_dqm"; + PORT_avs_nios_address = "SLAVE nios/PORT_WIRING/PORT avs_nios_address"; + PORT_avs_nios_byteenable = "SLAVE nios/PORT_WIRING/PORT avs_nios_byteenable"; + PORT_avs_nios_writedata = "SLAVE nios/PORT_WIRING/PORT avs_nios_writedata"; + PORT_avs_nios_readdata = "SLAVE nios/PORT_WIRING/PORT avs_nios_readdata"; + } + PAGES main + { + PAGE 1 + { + align = "left"; + title = "sdram_ctrl 1.1 Settings"; + layout = "vertical"; + TEXT + { + title = "Built on: 2006.09.25.10:24:12"; + } + TEXT + { + title = "Class name: sdram_ctrl"; + } + TEXT + { + title = "Class version: 1.1"; + } + TEXT + { + title = "Component name: sdram_ctrl"; + } + TEXT + { + title = "Component Group: Opencores"; + } + GROUP parameters + { + title = "Parameters"; + layout = "form"; + align = "left"; + EDIT e1 + { + id = "data_width"; + editable = "1"; + title = "data_width:"; + columns = "40"; + tooltip = "default value: 32"; + DATA + { + $H/data_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/data_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/data_width,'ugly_-?[0-9]+')))'data_width must be numeric constant, not '+$H/data_width; }}"; + } + EDIT e2 + { + id = "bank_width"; + editable = "1"; + title = "bank_width:"; + columns = "40"; + tooltip = "default value: 4"; + DATA + { + $H/bank_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/bank_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/bank_width,'ugly_-?[0-9]+')))'bank_width must be numeric constant, not '+$H/bank_width; }}"; + } + EDIT e3 + { + id = "row_width"; + editable = "1"; + title = "row_width:"; + columns = "40"; + tooltip = "default value: 12"; + DATA + { + $H/row_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/row_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/row_width,'ugly_-?[0-9]+')))'row_width must be numeric constant, not '+$H/row_width; }}"; + } + EDIT e4 + { + id = "column_width"; + editable = "1"; + title = "column_width:"; + columns = "40"; + tooltip = "default value: 8"; + DATA + { + $H/column_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/column_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/column_width,'ugly_-?[0-9]+')))'column_width must be numeric constant, not '+$H/column_width; }}"; + } + EDIT e5 + { + id = "clk_mhz"; + editable = "1"; + title = "clk_mhz:"; + columns = "40"; + tooltip = "default value: 120"; + DATA + { + $H/clk_mhz = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/clk_mhz,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/clk_mhz,'ugly_-?[0-9]+')))'clk_mhz must be numeric constant, not '+$H/clk_mhz; }}"; + } + } + GROUP variable_port_widths + { + # This group is for display only, to preview parameterized port widths + title = "Parameterized Signal Widths"; + layout = "form"; + align = "left"; + EDIT sdram_ba_width + { + id = "sdram_ba_width"; + editable = "0"; + title = "sdram_ba[((bank_width - 1)) - (0) + 1]:"; + tooltip = "sdram_ba[((bank_width - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_ba/width = (int((( ( $H/bank_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_ba/width = "$"; + } + warning = "{{ if($PORT_sdram_ba/width <= 0)('width of sdram_ba must be greater than zero' ) }}"; + } + EDIT sdram_addr_width + { + id = "sdram_addr_width"; + editable = "0"; + title = "sdram_addr[((row_width - 1)) - (0) + 1]:"; + tooltip = "sdram_addr[((row_width - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_addr/width = (int((( ( $H/row_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_addr/width = "$"; + } + warning = "{{ if($PORT_sdram_addr/width <= 0)('width of sdram_addr must be greater than zero' ) }}"; + } + EDIT sdram_dq_width + { + id = "sdram_dq_width"; + editable = "0"; + title = "sdram_dq[((data_width - 1)) - (0) + 1]:"; + tooltip = "sdram_dq[((data_width - 1)) - (0) + 1]
direction: inout
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_dq/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_dq/width = "$"; + } + warning = "{{ if($PORT_sdram_dq/width <= 0)('width of sdram_dq must be greater than zero' ) }}"; + } + EDIT sdram_dqm_width + { + id = "sdram_dqm_width"; + editable = "0"; + title = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]:"; + tooltip = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_dqm/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_dqm/width = "$"; + } + warning = "{{ if($PORT_sdram_dqm/width <= 0)('width of sdram_dqm must be greater than zero' ) }}"; + } + EDIT avs_nios_address_width + { + id = "avs_nios_address_width"; + editable = "0"; + title = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]:"; + tooltip = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]
direction: input
signal type: address"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_address/width = (int((((( ( $H/bank_width ) + ( $H/row_width ) ) + ( $H/column_width ) ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Address_Width = $PORT_avs_nios_address/width; }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_address/width = "$"; + } + warning = "{{ if($PORT_avs_nios_address/width <= 0)('width of avs_nios_address must be greater than zero' ) }}"; + } + EDIT avs_nios_byteenable_width + { + id = "avs_nios_byteenable_width"; + editable = "0"; + title = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]:"; + tooltip = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]
direction: input
signal type: byteenable"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_byteenable/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_byteenable/width = "$"; + } + warning = "{{ if($PORT_avs_nios_byteenable/width <= 0)('width of avs_nios_byteenable must be greater than zero' ) }}"; + } + EDIT avs_nios_writedata_width + { + id = "avs_nios_writedata_width"; + editable = "0"; + title = "avs_nios_writedata[((data_width - 1)) - (0) + 1]:"; + tooltip = "avs_nios_writedata[((data_width - 1)) - (0) + 1]
direction: input
signal type: writedata"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_writedata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_writedata/width - 1) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_writedata/width = "$"; + } + warning = "{{ if($PORT_avs_nios_writedata/width <= 0)('width of avs_nios_writedata must be greater than zero' ) }}"; + } + EDIT avs_nios_readdata_width + { + id = "avs_nios_readdata_width"; + editable = "0"; + title = "avs_nios_readdata[((data_width - 1)) - (0) + 1]:"; + tooltip = "avs_nios_readdata[((data_width - 1)) - (0) + 1]
direction: output
signal type: readdata"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_readdata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_readdata/width - 1) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_readdata/width = "$"; + } + warning = "{{ if($PORT_avs_nios_readdata/width <= 0)('width of avs_nios_readdata must be greater than zero' ) }}"; + } + } + } + } + } + } + SOPC_Builder_Version = "5.10"; + COMPONENT_BUILDER + { + HDL_PARAMETERS + { + # generated by CBDocument.getParameterContainer + # used only by Component Editor + HDL_PARAMETER data_width + { + parameter_name = "data_width"; + type = "integer"; + default_value = "32"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER bank_width + { + parameter_name = "bank_width"; + type = "integer"; + default_value = "4"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER row_width + { + parameter_name = "row_width"; + type = "integer"; + default_value = "12"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER column_width + { + parameter_name = "column_width"; + type = "integer"; + default_value = "8"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER clk_mhz + { + parameter_name = "clk_mhz"; + type = "integer"; + default_value = "120"; + editable = "1"; + tooltip = ""; + } + } + SW_FILES + { + } + built_on = "2006.09.25.10:24:12"; + CACHED_HDL_INFO + { + # cached hdl info, emitted by CBFrameRealtime.getDocumentCachedHDLInfoSection + # used only by Component Builder + FILE sdram_ctrl.vhd + { + file_mod = "Mon Sep 18 18:08:50 EEST 2006"; + quartus_map_start = "Mon Sep 25 10:22:36 EEST 2006"; + quartus_map_finished = "Mon Sep 25 10:22:58 EEST 2006"; + #found 1 valid modules + WRAPPER sdram_ctrl + { + CLASS sdram_ctrl + { + CB_GENERATOR + { + HDL_FILES + { + FILE + { + use_in_simulation = "1"; + use_in_synthesis = "1"; + filepath = "H:/Work/Home_stuff/opencores/sdram_ctrl/src/sdram_ctrl.vhd"; + } + } + top_module_name = "sdram_ctrl"; + emit_system_h = "0"; + LIBRARIES + { + library = "ieee.std_logic_1164.all"; + library = "ieee.numeric_std.all"; + library = "altera_mf.altera_mf_components.all"; + library = "std.standard.all"; + } + } + MODULE_DEFAULTS global_signals + { + class = "sdram_ctrl"; + class_version = "1.0"; + SYSTEM_BUILDER_INFO + { + Instantiate_In_System_Module = "1"; + } + SLAVE nios + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + } + PORT_WIRING + { + PORT avs_nios_chipselect + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "chipselect"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_address + { + width = "-1"; + width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; + direction = "input"; + type = "address"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_byteenable + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "input"; + type = "byteenable"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_writedata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "input"; + type = "writedata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_write + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "write"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_read + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "read"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_waitrequest + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "waitrequest"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "output"; + type = "readdata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdatavalid + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "readdatavalid"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + SLAVE avalon_slave_0 + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + } + PORT_WIRING + { + PORT sdram_cke + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ba + { + width = "-1"; + width_expression = "((bank_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_addr + { + width = "-1"; + width_expression = "((row_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cs_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ras_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cas_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_we_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dq + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "inout"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dqm + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + PORT_WIRING + { + PORT clk + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "clk"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT reset + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "reset"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + USER_INTERFACE + { + USER_LABELS + { + name = "sdram_ctrl"; + technology = "imported components"; + } + } + SOPC_Builder_Version = "0.0"; + COMPONENT_BUILDER + { + HDL_PARAMETERS + { + # generated by CBDocument.getParameterContainer + # used only by Component Editor + HDL_PARAMETER data_width + { + parameter_name = "data_width"; + type = "integer"; + default_value = "32"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER bank_width + { + parameter_name = "bank_width"; + type = "integer"; + default_value = "4"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER row_width + { + parameter_name = "row_width"; + type = "integer"; + default_value = "12"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER column_width + { + parameter_name = "column_width"; + type = "integer"; + default_value = "8"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER clk_mhz + { + parameter_name = "clk_mhz"; + type = "integer"; + default_value = "120"; + editable = "1"; + tooltip = ""; + } + } + } + } + } + } + } + } + ASSOCIATED_FILES + { + Add_Program = "the_wizard_ui"; + Edit_Program = "the_wizard_ui"; + Generator_Program = "cb_generator.pl"; + } +} Index: sdram_ctrl/trunk =================================================================== --- sdram_ctrl/trunk (nonexistent) +++ sdram_ctrl/trunk (revision 8)
sdram_ctrl/trunk Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: sdram_ctrl/web_uploads =================================================================== --- sdram_ctrl/web_uploads (nonexistent) +++ sdram_ctrl/web_uploads (revision 8)
sdram_ctrl/web_uploads Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: sdram_ctrl/branches =================================================================== --- sdram_ctrl/branches (nonexistent) +++ sdram_ctrl/branches (revision 8)
sdram_ctrl/branches Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ## Index: sdram_ctrl/tags/V10/doc/sdram_ctrl.sxw =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: sdram_ctrl/tags/V10/doc/sdram_ctrl.sxw =================================================================== --- sdram_ctrl/tags/V10/doc/sdram_ctrl.sxw (nonexistent) +++ sdram_ctrl/tags/V10/doc/sdram_ctrl.sxw (revision 8)
sdram_ctrl/tags/V10/doc/sdram_ctrl.sxw Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: sdram_ctrl/tags/V10/src/sdram_ctrl.vhd =================================================================== --- sdram_ctrl/tags/V10/src/sdram_ctrl.vhd (nonexistent) +++ sdram_ctrl/tags/V10/src/sdram_ctrl.vhd (revision 8) @@ -0,0 +1,441 @@ +------------------------------------------------------------------ +-- +-- sdram_ctrl.vhd +-- +-- Module Description: +-- SDRAM small&fast controller +-- +-- +-- To Do: +-- multichipselect support +-- configurable times +-- nios simulation support +-- +-- Author(s): +-- Aleksey Kuzmenok, ntpqa@opencores.org +-- +------------------------------------------------------------------ +-- +-- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG +-- +-- This module is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License, or (at your option) any later version. +-- +-- This module 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 +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this software; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +-- +------------------------------------------------------------------ +-- Test results +-- FPGA SDRAM CLK (not less than) +-- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz +-- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz +-- +------------------------------------------------------------------ + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity sdram_ctrl is + generic( + DATA_WIDTH: integer:=32; + BANK_WIDTH: integer:=4; + ROW_WIDTH: integer:=12; + COLUMN_WIDTH: integer:=8; + + clk_MHz: integer:=120 + ); + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + -- IMPORTANT: for this Avalon(tm) interface + -- 'Minimum Arbitration Shares'=1 + -- 'Max Pending Read Transactions'=9 + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR ((BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + + -- global export signals + signal sdram_cke : OUT STD_LOGIC; -- This pin has fixed state '1' + signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); + signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); + signal sdram_cs_n : OUT STD_LOGIC; -- This pin has fixed state '0' + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC; + signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) + ); +end sdram_ctrl; + +architecture behaviour of sdram_ctrl is + + CONSTANT FIFO_WIDTH: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + + CONSTANT MODE: std_logic_vector(11 downto 0):="000000110000"; -- 1 word burst, CAS latency=3 + -- Only two times are configurable + -- tINIT delay between powerup and load mode register = 100 us + -- tREF refresh period = 15.625 us (64ms/4096rows) + CONSTANT INIT_PAUSE_CLOCKS: integer:=(clk_MHz*10000)/91; -- 109.9 us just to be on the save side + CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*1000)/65; -- 15.384 us the same purpose + CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! + + COMPONENT scfifo + GENERIC ( + add_ram_output_register : STRING; + intended_device_family : STRING; + lpm_numwords : NATURAL; + lpm_showahead : STRING; + lpm_type : STRING; + lpm_width : NATURAL; + lpm_widthu : NATURAL; + overflow_checking : STRING; + underflow_checking : STRING; + use_eab : STRING + ); + PORT ( + rdreq : IN STD_LOGIC ; + empty : OUT STD_LOGIC ; + aclr : IN STD_LOGIC ; + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + wrreq : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + full : OUT STD_LOGIC + ); + END COMPONENT; + + -- If you ask me why there are so many states, I'll answer that all times are fixed. + -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. + -- tRP PRECHARGE command period = 3 clocks + -- tRFC AUTO REFRESH period = 10 clocks + -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks + -- tRCD ACTIVE to READ or WRITE delay = 3 clocks + -- tRAS ACTIVE to PRECHARGE command = 7 clocks + -- tRC ACTIVE to ACTIVE command period = 10 clocks + -- tWR2 Write recovery time = 2 clocks + type states is ( + INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, + INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, + INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, + REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, + REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, + ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, + IDLE,READ0,WRITE0); + signal operation: states; + + signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); + + signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); + signal refresh_counter: unsigned(15 downto 0); + signal active_counter: unsigned(2 downto 0); + signal active_address: unsigned((BANK_WIDTH+ROW_WIDTH-1) downto 0); + + signal bank: std_logic_vector((sdram_ba'length-1) downto 0); + signal row: std_logic_vector((sdram_addr'length-1) downto 0); + signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); + signal be: std_logic_vector((sdram_dqm'length-1) downto 0); + signal data: std_logic_vector((sdram_dq'length-1) downto 0); + + signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; + + signal fifo_rdreq,fifo_empty: std_logic; + + signal read_latency: std_logic_vector(CAS_LATENCY downto 0); + + signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); + signal fifo_wrreq,fifo_wrfull: std_logic; + + signal i_command : STD_LOGIC_VECTOR(4 downto 0); + CONSTANT NOP: STD_LOGIC_VECTOR(4 downto 0):="10111"; + CONSTANT ACTIVE: STD_LOGIC_VECTOR(4 downto 0):="10011"; + CONSTANT READ: STD_LOGIC_VECTOR(4 downto 0):="10101"; + CONSTANT WRITE: STD_LOGIC_VECTOR(4 downto 0):="10100"; + CONSTANT PRECHARGE: STD_LOGIC_VECTOR(4 downto 0):="10010"; + CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR(4 downto 0):="10001"; + CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR(4 downto 0):="10000"; + + signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); + signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); + signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); + signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); + attribute ALTERA_ATTRIBUTE : string; + attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; +begin + (sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; + sdram_addr <= i_address; + sdram_ba <= i_bank; + sdram_dqm <= i_dqm; + sdram_dq <= i_data; + + fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; + fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; + + avs_nios_waitrequest<=fifo_wrfull; + + fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; + + do_active<='0' when active_address=unsigned((fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length)))) else '1'; + read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; + ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; + + operation_machine:process(reset,clk) + begin + if reset='1' + then + operation<=INIT0; + active_address<=(others=>'1'); + elsif rising_edge(clk) + then + + bank<=fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length)); + row<=fifo_q((fifo_q'length-bank'length-1) downto (fifo_q'length-bank'length-row'length)); + column<=fifo_q((column'length+data'length+be'length+2-1) downto (data'length+be'length+2)); + data<=fifo_q((data'length+be'length+2-1) downto (be'length+2)); + be<=fifo_q((be'length+2-1) downto 2); + + case operation is + when INIT0=> + if do_init='1' + then operation<=INIT1;row(10)<='1'; + end if; + when INIT1=>operation<=INIT2; + when INIT2=>operation<=INIT3; + when INIT3=>operation<=INIT4; + when INIT4=>operation<=INIT5; + when INIT5=>operation<=INIT6; + when INIT6=>operation<=INIT7; + when INIT7=>operation<=INIT8; + when INIT8=>operation<=INIT9; + when INIT9=>operation<=INIT10; + when INIT10=>operation<=INIT11; + when INIT11=>operation<=INIT12; + when INIT12=>operation<=INIT13; + when INIT13=>operation<=INIT14; + when INIT14=>operation<=INIT15; + when INIT15=>operation<=INIT16; + when INIT16=>operation<=INIT17; + when INIT17=>operation<=INIT18; + when INIT18=>operation<=INIT19; + when INIT19=>operation<=INIT20; + when INIT20=>operation<=INIT21; + when INIT21=>operation<=INIT22; + when INIT22=>operation<=INIT23; + when INIT23=>operation<=INIT24;row<=MODE((row'length-1) downto 0); + when INIT24=>operation<=IDLE; + + when REFRESH0=>operation<=REFRESH1; + when REFRESH1=>operation<=REFRESH2; + when REFRESH2=>operation<=REFRESH3; + when REFRESH3=>operation<=REFRESH4; + when REFRESH4=>operation<=REFRESH5; + when REFRESH5=>operation<=REFRESH6; + when REFRESH6=>operation<=REFRESH7; + when REFRESH7=>operation<=REFRESH8; + when REFRESH8=>operation<=REFRESH9; + when REFRESH9=>operation<=REFRESH10; + when REFRESH10=>operation<=REFRESH11; + when REFRESH11=>operation<=REFRESH12; + when REFRESH12=>operation<=REFRESH13; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when REFRESH13=>operation<=REFRESH14; + when REFRESH14=>operation<=IDLE; + + when ACTIVE0=>operation<=ACTIVE1; + when ACTIVE1=>operation<=ACTIVE2; + when ACTIVE2=>operation<=ACTIVE3; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when ACTIVE3=>operation<=ACTIVE4; + when ACTIVE4=>operation<=IDLE; + + when others=> + if do_refresh='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=REFRESH0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif do_active='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=ACTIVE0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif fifo_empty='1' + then + operation<=IDLE; + elsif fifo_q(1)='1' --write + then + if read_latency(CAS_LATENCY-1 downto 0)>"000" + then operation<=IDLE; + else operation<=WRITE0; + end if; + elsif fifo_q(0)='1' --read + then + operation<=READ0; + end if; + end case; + end if; + end process; + + control_latency:process(reset,clk) + begin + if reset='1' + then + read_latency<=(others=>'0'); + elsif rising_edge(clk) + then + read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); + if operation=READ0 + then read_latency(0)<='1'; + else read_latency(0)<='0'; + end if; + end if; + end process; + latch_readdata:process(reset,clk) + begin + if reset='1' + then + avs_nios_readdata<=(others=>'0'); + avs_nios_readdatavalid<='0'; + elsif rising_edge(clk) + then + avs_nios_readdata<=sdram_dq; + avs_nios_readdatavalid<=read_latency(CAS_LATENCY); + end if; + end process; + initialization:process(reset,clk) + begin + if rising_edge(clk) + then + if init_counter>0 + then + init_counter<=init_counter-1; + else do_init<='1'; + end if; + end if; + end process; + refreshing:process(clk,reset) + begin + if reset='1' + then + refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='0'; + elsif rising_edge(clk) + then + if refresh_counter=to_unsigned(0,refresh_counter'length) + then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='1'; + else refresh_counter<=refresh_counter-1; + end if; + if operation=REFRESH0 or operation=REFRESH5 + then do_refresh<='0'; + end if; + end if; + end process; + active_period:process(reset,clk) + begin + if reset='1' + then + active_counter<=(others=>'0'); + tRCD_not_expired<='0'; + elsif rising_edge(clk) + then + if operation=ACTIVE3 or operation=REFRESH13 + then active_counter<=to_unsigned(5,active_counter'length); + elsif active_counter>0 + then active_counter<=active_counter-1; + end if; + end if; + if active_counter>0 + then tRCD_not_expired<='1'; + else tRCD_not_expired<='0'; + end if; + end process; + latch_controls:process(clk,reset) + begin + if reset='1' + then + i_command<=NOP; + i_address<=(others=>'0'); + i_bank<=(others=>'0'); + i_dqm<=(others=>'0'); + i_data<=(others=>'Z'); + elsif rising_edge(clk) + then + i_command<=NOP; + i_bank<=bank; + i_address<=(others=>'0'); + i_address((column'length-1) downto 0)<=column; + i_data<=(others=>'Z'); + i_dqm<=(others=>'0'); + + case operation is + when INIT1|REFRESH0|ACTIVE0 => + i_command<=PRECHARGE; + i_address<=row; + when INIT4|INIT14|REFRESH3 => + i_command<=AUTO_REFRESH; + when INIT24=> + i_command<=LOAD_MODE_REGISTER; + i_address<=row; + when ACTIVE3|REFRESH13 => + i_command<=ACTIVE; + i_address<=row; + when READ0 => + i_command<=READ; + when WRITE0 => + i_command<=WRITE; + i_dqm<=not be; + i_data<=data; + when OTHERS => + end case; + end if; + end process; + + fifo: scfifo + GENERIC MAP ( + add_ram_output_register => "ON", + intended_device_family => "Cyclone", + lpm_numwords => 4, + lpm_showahead => "ON", + lpm_type => "scfifo", + lpm_width => FIFO_WIDTH, + lpm_widthu => 2, + overflow_checking => "ON", + underflow_checking => "ON", + use_eab => "ON" + ) + PORT MAP ( + rdreq => fifo_rdreq, + aclr => reset, + clock => clk, + wrreq => fifo_wrreq, + data => fifo_data, + empty => fifo_empty, + q => fifo_q, + full => fifo_wrfull + ); +end behaviour; Index: sdram_ctrl/tags/V10/syn/sdram_ctrl/cb_generator.pl =================================================================== --- sdram_ctrl/tags/V10/syn/sdram_ctrl/cb_generator.pl (nonexistent) +++ sdram_ctrl/tags/V10/syn/sdram_ctrl/cb_generator.pl (revision 8) @@ -0,0 +1,1159 @@ +# | file: cb_generator.pl +# | +# | This SOPC Builder Generator program is provided by +# | the Component Builder application. It is copied +# | straight across and is data-driven from its command +# | line arguments and the PTF files referenced. +# | +# | Its purpose is to construct an HDL "wrapper" for +# | a particular instance of a particular SOPC Builder +# | peripheral. This wrapper resolves the instance +# | name and any HDL parameterization. +# | +# +------------------------------------------- + + + +# +------------------------------------------- +# | + +use strict; +use format_conversion_utils; +use ptf_parse; +use wiz_utils; +use europa_all; +use run_system_command_utils; + +# | +# +------------------------------------------- + + + +# +------------------------------------------- +# | +# | first pass: include all of generator_libarary.pm RIGHT HERE. +# | dvb04.08.02 +# | then prune down to actual functionality. +# | +# | TODO: Rewrite this whole file into something readable +# | this is much more confusing than I'm comfortable with. dvb04. +# | (though it does seem to work.) +# | + +my $DEBUG_DEFAULT_GEN = 1; + +#This is the global hash of arguments passed in by the generator program + +my $generator_hr = { + wrapper_args => { + make_wrapper => 0, + top_module_name => "", + simulate_hdl => 1, + ports => "", + }, + class_ptf_hr => "", + module_ptf_hr => "", + system_ptf_hr => "", + language => "", + external_args => "", + external_args_hr => "", + project_path_widget => "__PROJECT_DIRECTORY__", + generator_mode => "silent", + }; + + +sub generator_print_verbose +{ + my ($info) = (@_); + + if($generator_hr->{generator_mode} eq "verbose"){ + print("cb_generator.pl: ".$info); + } +} + +sub generator_enable_mode +{ + my ($mode) = (@_); + $generator_hr->{generator_mode} = $mode; +} + +sub generator_get_system_ptf_handle +{ + return $generator_hr->{system_ptf_hr}; +} + +sub generator_get_language +{ + return $generator_hr->{language}; +} + +sub generator_get_class_ptf_handle +{ + return $generator_hr->{class_ptf_hr}; +} + +sub default_ribbit +{ + my ($arg) = (@_); + &ribbit("\n\n--Error: default_gen_lib: $arg\n"); +} + + +sub _copy_files +{ + my ($dest_dir, $source_dir, @files) = (@_); + my $function_name; + + #validate args + &default_ribbit("No target dir for function copy_files!") + unless ($dest_dir ne ""); + + &default_ribbit("No source dir for function copy_files!") + unless ($source_dir ne ""); + + &default_ribbit("No files for function copy_files!") + unless (@files != 0); + + + #check for valid directories + opendir (SDIR, $source_dir) or + &default_ribbit("can't open $source_dir !"); + + opendir (DDIR, $dest_dir) or + &default_ribbit("can't open $dest_dir !"); + + + foreach my $source_file(@files){ + # | + # | Separate out the source subdir and the source filename + # | + my $source_subdir = ""; + my $source_filename = $source_file; + + if($source_filename =~ /^(.*)\/(.*)$/) # break on last slash + { + $source_subdir = "/$1"; # embed its leading slash, for concatty + $source_filename = $2; + } + + my $source_fullpath = "$source_dir$source_subdir/$source_filename"; + my $dest_fullpath = "$dest_dir/$source_filename"; + + &Perlcopy($source_fullpath, $dest_fullpath); + &generator_print_verbose("Copying file: \"$source_fullpath\"" + . " to \"$dest_fullpath\".\n"); + } + + closedir (SDIR); + closedir (DDIR); +} + + +sub get_module_wrapper_arg_hash_from_system_ptf_file +{ + my $module_ptf_hr = $generator_hr->{module_ptf_hr}; + + my @list_of_sections = ("MASTER","SLAVE","PORT_WIRING"); + my @port_list; + foreach my $section(@list_of_sections){ + my $number = get_child_count($module_ptf_hr, $section); + + for(my $initial=0; $initial < $number; $initial++){ + + my $interface_section = get_child($module_ptf_hr, $initial, $section); + my $interface_section_name = get_data($interface_section); + + my $port_wiring_section; + if($section ne "PORT_WIRING"){ + $port_wiring_section = + get_child_by_path($module_ptf_hr, $section." ".$interface_section_name."/PORT_WIRING"); + }else{ + $port_wiring_section = + get_child_by_path($module_ptf_hr, $section); + } + my $num_ports = get_child_count($port_wiring_section, "PORT"); + foreach(my $port_count = 0; $port_count < $num_ports; $port_count++){ + my $port = get_child($port_wiring_section, $port_count, "PORT"); + + my %port_info_struct; + $port_info_struct{name} = get_data($port); + $port_info_struct{direction} = get_data_by_path($port, "direction"); + $port_info_struct{width} = get_data_by_path($port, "width"); + $port_info_struct{vhdl_record_name} = get_data_by_path($port, "vhdl_record_name"); + $port_info_struct{vhdl_record_type} = get_data_by_path($port, "vhdl_record_type"); + + push(@port_list, \%port_info_struct); + + } + } + } + $generator_hr->{wrapper_args}{ports} = \@port_list; +} + + +sub generator_make_module_wrapper +{ + my ($simulate_hdl, $top_module_name, $module_language) = (@_); + + &default_ribbit("generator_make_module_wrapper: no arg0 passed in for simulate_hdl\n") + if($simulate_hdl eq ''); + + &default_ribbit("generator_make_module_wrapper: no arg1 passed in for top_module_name\n") + unless($top_module_name); + + $generator_hr->{wrapper_args}{simulate_hdl} = $simulate_hdl; + $generator_hr->{wrapper_args}{top_module_name} = $top_module_name; + $generator_hr->{wrapper_args}{make_wrapper} = 1; + $generator_hr->{wrapper_args}{module_language} = $module_language; + +} + + + + +# | +# | recognize varous number forms, +# | return 'h0123abcd-ish. +# | +sub turn_anything_into_appropriate_string($$$$) + { + my ($value,$type,$editable,$module_language) = (@_); + + return $value if($value =~ /^\"/); # quoted string: unscathed + return $value if($type eq "string"); # string: anything is ok + + return $value if(!$editable); # and you know, if you can't change it, keep it! + + + # | + # | first, convert to a number + # | + my $base = 10; + my $n = $value; + my $width = 32; + my $number = 0; + + $value = lc($value); # lower case + + if($value =~ /^([0-9]*)\'([hbo])(.*)$/) + { + # | tick notation: AOK for verilog + if($module_language eq "verilog") + { + $number = $value; + } + # | + # | note: at this point, we could notice if the + # | result should be vhdl binary, and convert + # | to that, avoiding the precision-losing + # | integer intermediary + # | + # | (alternatively, we could use a binary string + # | always as the intermediate form, rather than + # | a precision-losing int.) + # | + else + { + $width = $1; + my $baseletter = $2; + my $digits = $3; + + if($baseletter eq "h") + { + $base = 16; + } + elsif($baseletter eq "b") + { + $base = 2; + } + elsif($baseletter eq "o") # must be + { + $base = 8; + } + + $digits =~ s/[ _-]//g; # crush out dividing value + + while(length($digits) > 0) + { + my $digit = substr($digits,0,1); + $digits = substr($digits,1); + my $digitvalue = hex($digit); # how handy + $number = $number * $base + $digitvalue; + } + } + } + elsif($value =~ /^0x(.*)$/) + { + $number = hex($1); + } + else # try for decimal + { + $number = int(1 * $value); + } + + # | + # | ok, we have a number. If our target type + # | is "std_logic_vector(this downto that)" + # | for tricky VHDL, we + # | must quote a binary string out of it. + # | + + if(($module_language eq "vhdl") and ($type =~ /^.*\((\d+) downto (\d+)\).*$/)) + { + my ($high_bit,$low_bit) = ($1,$2); + my $binary = ""; + for(my $bit = $low_bit; $bit <= $high_bit; $bit++) + { + $binary = ($number % 2) . $binary; + $number = int($number >> 1); + } + + $number = '"' . $binary . '"'; + } + + return $number; + } + +# +# return @array of vhdl libraries, if any, from the class.ptf +sub get_libraries() +{ + my $class_ptf = generator_get_class_ptf_handle(); + my @libraries; + my $libraries_ptf = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/LIBRARIES"); + + if($libraries_ptf) + { + my $library_count = get_child_count($libraries_ptf,"library"); + for(my $i = 0; $i < $library_count; $i++) + { + my $library_ptf = get_child($libraries_ptf,$i,"library"); + my $library_name = get_data($library_ptf); + push(@libraries,$library_name); + } + } + + return @libraries; +} + + + +sub _generator_make_module_wrapper +{ + + my $wrapper_args = $generator_hr->{wrapper_args}; + my $no_black_box = $wrapper_args->{simulate_hdl}; + my $top_module_name = $wrapper_args->{top_module_name}; + my $language = $generator_hr->{language}; + my @external_args = @{$generator_hr->{external_args}}; + my $module_ptf_hr = $generator_hr->{module_ptf_hr}; + + ### Build Module + my $project = e_project->new(@external_args); + my $top = $project->top(); + + # add the ports to the system module + my @ports; + + foreach my $port_hash(@{$wrapper_args->{ports}}){ + my $porto = e_port->new({ + name => $port_hash->{name}, + width => $port_hash->{width}, + direction => $port_hash->{direction}, + vhdl_record_name => $port_hash->{vhdl_record_name}, + vhdl_record_type => $port_hash->{vhdl_record_type} + }); + push(@ports, $porto); + } + $top->add_contents(@ports); + + + + + + # +---------------------------------------- + # | Get parameters from class.ptf + # | create @array of parameters, eacho + # | one like name=>, default=>, type=>, + # | + # | These are the definitions of parameters for + # | ANY instance of this module; we need to + # | have them in the "wrapee" module so that + # | when the system bus is knitted together + # | the parameter types can be properly used. + # | + # | (as it turns out, verilog doesnt need + # | them, but vhld does) + # | + # | dvb2004 + + + my @e_hdl_parameters; # list of e_parameters + + my $class_ptf = generator_get_class_ptf_handle(); + my $hdl_parameter_definitions_ptf = get_child_by_path($class_ptf,"CLASS/COMPONENT_BUILDER/HDL_PARAMETERS"); + + my @libraries = get_libraries(); + + my $hdl_parameter_count = get_child_count($hdl_parameter_definitions_ptf,"HDL_PARAMETER"); + + my $module_language = $generator_hr->{wrapper_args}{module_language}; + + for(my $i = 0; $i < $hdl_parameter_count; $i++) + { + my $a_parameter = get_child($hdl_parameter_definitions_ptf,$i,"HDL_PARAMETER"); + my $parameter_editable = get_data_by_path($a_parameter,"editable"); + if($parameter_editable) + { + my $boring_name = get_data($a_parameter); # legal guinevere-ized + my $name = get_data_by_path($a_parameter,"parameter_name"); # original HDL name + my $default = get_data_by_path($a_parameter,"default_value"); + my $type = get_data_by_path($a_parameter,"type"); + + $default = turn_anything_into_appropriate_string($default,$type,1,$module_language); + + my $a_parameter = e_parameter->new + ({ + name => $name, + default => $default, + type => $type + }); + + push (@e_hdl_parameters,$a_parameter); + } + } + + + + # | and @e_hdl_parameters is used below in the wrapee module + # +-------------------------------------------- + + # +-------------------------------------------- + # | Now, we build a "hdl_parameter_map", which is just + # | your basic hash table with keys (parameters) + # | and values (parameter values). + # | + # | these are the particular values for this instance. + # | + + my %hdl_parameter_map; + my $module_ptf = $generator_hr->{module_ptf_hr}; + my $hdl_parameters_ptf = + get_child_by_path($module_ptf,"WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"); + + my $child_count = get_child_count($hdl_parameters_ptf); + + for(my $i = 0; $i < $child_count; $i++) + { + my $a_parameter = get_child($hdl_parameters_ptf,$i); + + my $boring_name = get_name($a_parameter); + my $value = get_data($a_parameter); + + # refer back to the original HDL name... + my $parameter_definition_ptf = get_child_by_path($hdl_parameter_definitions_ptf,"HDL_PARAMETER $boring_name"); + my $parameter_name = get_data_by_path($parameter_definition_ptf,"parameter_name"); + my $parameter_type = get_data_by_path($parameter_definition_ptf,"type"); + my $parameter_editable = get_data_by_path($parameter_definition_ptf,"editable"); + + $value = turn_anything_into_appropriate_string($value,$parameter_type,$parameter_editable,$module_language); + + # | + # | our internal _dummy assignment shows up here + # | without a corresponding hdl entry. we + # | ignore it. + # | + + if(($parameter_name ne "") and $parameter_editable) + { + $hdl_parameter_map{$parameter_name} = $value; + } + } + + my $wrapee_module; + $wrapee_module = e_module->new({ + name => $top_module_name, + contents => [@ports,@e_hdl_parameters], + do_black_box => 0, + do_ptf => 0, + _hdl_generated => 1, + _explicitly_empty_module => 1, + }); + + # VHDL Libraries, from PTF file... + $wrapee_module->add_vhdl_libraries(@libraries); + $top->add_vhdl_libraries(@libraries); + + + $top->add_contents ( + e_instance->new({ + module => $wrapee_module, + parameter_map => \%hdl_parameter_map + }), + ); + + $project->top()->do_ptf(0); + $project->do_write_ptf(0); + + + my $module_file = $project->_target_module_name().".v"; + $module_file = $project->_target_module_name().".vhd" + if($language eq "vhdl"); + + $module_file = $generator_hr->{project_path_widget}."/".$module_file; + &generator_set_files_in_system_ptf("Synthesis_HDL_Files", ($module_file)); + $project->output(); + + + # if you don't want a simulation model, you don't get a simulation model + if($no_black_box eq "0") + { + my $black_project = e_project->new(@external_args); + $black_project->_target_module_name($top_module_name); + my $black_top = $black_project->top(); + + + + $black_top->add_contents(@ports); + my $black_top_instance; + $black_top_instance = e_module->new({ + name => $wrapper_args->{top_module_name}."_bb", + contents => [@ports], + do_black_box => 1, + do_ptf => 0, + _hdl_generated => 0, + _explicitly_empty_module => 1, + }); + + $black_top->add_contents ( + e_instance->new({ + module => $black_top_instance, + }), + ); + + + + + $black_project->top()->do_ptf(0); + $black_project->do_write_ptf(0); + + my $black_module_file = $black_project->_target_module_name().".v"; + $black_module_file = $black_project->_target_module_name().".vhd" + if($language eq "vhdl"); + + + $black_module_file = $generator_hr->{project_path_widget}."/".$black_module_file; + &generator_set_files_in_system_ptf("Simulation_HDL_Files", ($black_module_file)); + +# &set_data_by_path($module_ptf_hr, "HDL_INFO/Simulation_HDL_Files", $black_module_file); + + + $black_project->output(); + } + +} + +#### +# Args: $file_type : "synthesis", "synthesis_only", "simulation" +# @file_list : an array of files. This list of files is assumed to be relative to the +# component's directory + + +my $decoder_ring_hr = { + quartus_only => { + copy => 1, + copy_to => "project", + ptf_set => 0, + }, + simulation_only => { + copy => 1, + copy_to => "simulation", + ptf_set => 1, + ptf_section => "Simulation_HDL_Files", + }, + simulation_and_quartus => { + copy => 1, + copy_to => "project", + ptf_set => 1, + ptf_section => "Synthesis_HDL_Files", + }, + precompiled_simulation_files => { + copy => 0, + ptf_set => 1, + ptf_section => "Precompiled_Simulation_Library_Files", + }, + }; + + + + +sub generator_copy_files_and_set_system_ptf +{ + my ($hdl_section, @file_list) = (@_); + + my $ptf_path_prefix = ""; + my $external_args_hr = $generator_hr->{external_args_hr}; + my @new_file_array; + + #validate first + my $decoder_hash = $decoder_ring_hr->{$hdl_section}; + &default_ribbit("generator_copy_files_and_set_system_ptf: No understood HDL section passed in for first arg\n") + unless($decoder_ring_hr->{$hdl_section} ne ""); + + &generator_print_verbose("generator_copy_files_and_set_system_ptf: copying files for section ".$hdl_section."\n"); + + #copy second + my @new_file_array; + + # If we need to copy over some files, then we need to make sure we are + # keeping track of what files we copy over. + # Otherwise, we just need to keep track of the files that the user has asked to copy over + # and use these instead. + if($decoder_hash->{copy}){ + my $copy_to_location; + my $copy_from_location; + + if($decoder_hash->{copy_to} eq "project"){ + $copy_to_location = $external_args_hr->{system_directory}; + }elsif($decoder_hash->{copy_to} eq "simulation"){ + $copy_to_location = $external_args_hr->{system_sim_dir}; + }else{ + &default_ribbit("generator_copy_files_and_set_system_ptf: No understood copy files to location\n"); + } + + $copy_from_location = $external_args_hr->{class_directory}; + @new_file_array = &generator_copy_files($copy_to_location, $copy_from_location, @file_list); + }else{ + @new_file_array = @file_list; + } + + #scribble on PTF hash last + if($decoder_hash->{ptf_set}){ + + if($decoder_hash->{copy_to} eq "project"){ + foreach my $file(@new_file_array){ + $file =~ s/^.*\/(.*?)$/$1/; + $file = $generator_hr->{project_path_widget}."/".$file; + } + } + &generator_print_verbose("generator_copy_files_and_set_system_ptf: setting system PTF file in section ".$hdl_section."\n"); + if($decoder_hash->{ptf_section} eq "Precompiled_Simulation_Library_Files"){ + @new_file_array = map{$external_args_hr->{class_directory}."/".$_} @new_file_array; + } + &generator_set_files_in_system_ptf($decoder_hash->{ptf_section}, @new_file_array); + } +} + + + +#### +# Name: generator_set_files_in_system_ptf +# Args: $hdl_section +# @list_of_files +# Returns: 1 or 0 +# Purpose: This is an internal function used to set files in the module's section in the system PTF file +# +sub generator_set_files_in_system_ptf +{ + my ($hdl_section, @list_of_files) = (@_); + + my $file_list = join(",", @list_of_files); + my $previous_data; + + &generator_print_verbose("setting HDL_INFO/".$hdl_section." in system PTF file with ".$file_list."\n"); + my $previous_data = &get_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section); + if($previous_data){ + $file_list = $previous_data . ", $file_list"; # spr 132177 + # swapping order, dvb 2003 + } + &set_data_by_path($generator_hr->{module_ptf_hr}, "HDL_INFO/".$hdl_section, $file_list); +} + +#### +# Name: generator_copy_files +# Args: $target_directory +# $source_directory +# @list_of_files +# Returns: The list of files which has been copied (suitable for framing!) +# Purpose: This is an internal function used to copy files around in the generator program. +# +sub generator_copy_files +{ + my ($target_directory, $source_directory, @list_of_files) = (@_); + + my @new_file_array; + + foreach my $file_name(@list_of_files){ + $file_name =~ s|\\|\/|g; + if($file_name =~ /\*\.*/){ + $file_name =~ s/\*/$1/; + my @found_list = &_find_all_dir_files_with_ext($source_directory, $file_name); + push(@new_file_array, @found_list); + }else{ + &generator_print_verbose("Copying: ".$file_name."\n"); + push(@new_file_array, $file_name); + } + } + + &_copy_files($target_directory, $source_directory, @new_file_array); + return @new_file_array; +} + + + +sub _find_all_dir_files_with_ext +{ + my ($dir, + $ext) = (@_); + + opendir (DIR, $dir) or + &default_ribbit("can't open $dir !"); + + my @all_files = readdir(DIR); + my @new_file_list; + + + foreach my $file (@all_files){ + if($file =~ /^.*($ext)$/){ + push(@new_file_list, $file); + } + } + + return @new_file_list; +} + +#### +# Name: generator_begin +# Args: Array of generator program launcher args +# Returns: A hash reference to the module's section in the system PTF file +# Purpose: This is the first subroutine a user should call before running the rest of their +# generator program. +# + +sub generator_begin +{ + my @external_args = (@_); + + my ($external_args_hr, + $temp_user_defined, + $temp_db_Module, + $temp_db_PTF_File) = Process_Wizard_Script_Arguments("", @external_args); + + &generator_print_verbose("generator_begin: initializing\n"); + + $generator_hr->{external_args_hr} = $external_args_hr; + $generator_hr->{external_args} = \@external_args; + + # open up class.ptf and + $generator_hr->{class_ptf_hr} = new_ptf_from_file($external_args_hr->{class_directory}."/class.ptf"); + + # get the system.ptf + $generator_hr->{system_ptf_hr} = new_ptf_from_file($external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"); + $generator_hr->{module_ptf_hr} = &get_child_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/MODULE $external_args_hr->{target_module_name}"); + my $class_name = get_data_by_path($generator_hr->{module_ptf_hr}, "class"); + + # find the default generator section + $generator_hr->{language} = get_data_by_path($generator_hr->{system_ptf_hr}, "SYSTEM $external_args_hr->{system_name}/WIZARD_SCRIPT_ARGUMENTS/hdl_language"); + + # get some wrapper settings + &get_module_wrapper_arg_hash_from_system_ptf_file(); + + # clear system ptf's HDL section + &delete_child($generator_hr->{module_ptf_hr}, "HDL_INFO"); + + return $generator_hr->{module_ptf_hr}; +} + +#### +# Name: generator_end +# Args: none +# Returns: nothing +# Purpose: This is the last subroutine a user should call from their generator program. +# Not calling this subroutine will make you very sad... =< +# + +sub generator_end +{ + # o.k., time to make the wrapper and output it. + if($generator_hr->{wrapper_args}{make_wrapper}){ + &_generator_make_module_wrapper(); + } + + + my $external_args_hr = $generator_hr->{external_args_hr}; + my $ptf_file_name = $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf"; + &generator_print_verbose("generator_end: writing PTF file ".$external_args_hr->{system_name}.".ptf to ".$external_args_hr->{system_directory}."\n"); + + default_ribbit("Cannot write PTF file ".$ptf_file_name."!\n") + unless(&write_ptf_file($generator_hr->{system_ptf_hr}, $external_args_hr->{system_directory}."/".$external_args_hr->{system_name}.".ptf")); +} + +sub generator_end_read_module_wrapper_string +{ + my $language = &generator_get_language(); + my $ls; + + if($language =~ /vhdl/){ + $ls = ".vhd"; + }elsif($language =~ /verilog/){ + $ls = ".v"; + }else{ + &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); + } + my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; + my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; + + my $file = $system_dir."/".$module_name.$ls; + &generator_print_verbose("generator library reading file into string: $file\n"); + + open (FILE,"<$file") or ribbit "cannot open file ($file) ($!)\n"; + my $return_string; + while () + { + $return_string .= $_; + } + close (FILE); + return($return_string); +} + +sub generator_end_write_module_wrapper_string +{ + my $string = shift or ribbit "no string specified\n"; + + my $language = &generator_get_language(); + my $ls; + + print $language; + + if($language =~ /vhdl/){ + $ls = ".vhd"; + }elsif($language =~ /verilog/){ + $ls = ".v"; + }else{ + &ribbit("generator_end_read_module_wrapper_string invoked with unkown language"); + } + my $system_dir = $generator_hr->{external_args_hr}->{system_directory}; + my $module_name = $generator_hr->{external_args_hr}->{target_module_name}; + + my $file = $system_dir."/".$module_name.$ls; + &generator_print_verbose("generator library writing string into file: $file\n"); + + open (FILE,">$file") or ribbit "cannot open file ($file) ($!)\n"; + print FILE $string; + close (FILE); +} +# end of generator_library.pm + + + + + +# +# +# +# +# --------------------------------------------------------------------- + +# +---------------------------------------------------- +# | emit_system_h +# | +# | if "is_cpu", attempt to emit a system.h +# | memory map. +# | + +sub emit_system_h($$$) + { + my ($sopc_directory,$master,$system_ptf) = (@_); + + # | + # | Build a system.h file for masters. + # | + + +# as of quartus 5.0, we prefer gtf-generate in sopc_builder directly + + my $gtf_generate = "$sopc_directory/bin/gtf-generate"; + my $gtf_filename = "$sopc_directory/bin/gtf/system.h.gtf"; + + if(! -f $gtf_generate) + { + # but if sopc_builder is missing it for whatever reason, + # try the one in sopc_kit_nios2 + + my $sopc_kit_nios2 = $ENV{SOPC_KIT_NIOS2}; + if($sopc_kit_nios2 ne "") + { + $gtf_generate = "$sopc_kit_nios2/bin/gtf-generate"; + $gtf_filename = "$sopc_kit_nios2/bin/gtf/system.h.gtf"; + } + } + + # | + # | xml template + # | + + my $stf_template = < + + + + + + +EOP + + # | + # | THINK + # | + + my $output_directory = "./${master}_map"; + my $project_name = "ignored"; + my $stf_filename = "./${master}_project.stf"; + + # | + # | build up template variables + # | + + my %template_vars; + $template_vars{date} = fcu_date_time(); + $template_vars{whoami} = $0; + $template_vars{project_name} = $project_name; + $template_vars{system_ptf} = $system_ptf; + $template_vars{output_directory} = $output_directory; + $template_vars{master} = $master; + + # | + # | poke in the values to the template + # | + + foreach my $key (sort(keys(%template_vars))) + { + $stf_template =~ s/--$key--/$template_vars{$key}/gs; + } + + ## debug print $stf_template; + + # | + # | write out the stf file, so we can soon use it + # | + + fcu_write_file($stf_filename,$stf_template); + + # | + # | and use it + # | + + if(-e $gtf_generate && -e $gtf_filename) + { + + my $generate_cmd = $gtf_generate; + + $generate_cmd .= " --output-directory=$output_directory"; + $generate_cmd .= " --gtf=$gtf_filename"; + $generate_cmd .= " --stf=$stf_filename"; + + r_system($sopc_directory,$generate_cmd); + + # | + # | done with it + # | + + r_system($sopc_directory,"rm $stf_filename"); + + fcu_print_command("Generated memory map \"$output_directory/system.h\""); + } + else + { + fcu_print_command("Warning: did NOT emit system.h for $master"); + } + + + + + } + + +sub r_system($$) + { + my ($sopc_directory,$cmd) = (@_); + fcu_print_command($cmd); + return Run_Command_In_Unix_Like_Shell($sopc_directory,$cmd); + } + + + + + + + +# +------------------------------------------ +# | synthesis and simulation files are are +# | listed in CLASS/CB_GENERATOR/HDL_FILES. +# | + +sub get_synthesis_files($) + { + my ($class_ptf) = (@_); + my $synthesis_files = ""; + my $simulation_files = ""; + + my $hdl_files = get_child_by_path($class_ptf,"CLASS/CB_GENERATOR/HDL_FILES"); + my $child_count = get_child_count($hdl_files); + for(my $i = 0; $i < $child_count; $i++) + { + my $hdl_file = get_child($hdl_files,$i); + if(get_name($hdl_file) eq "FILE") + { + my $filename = get_data_by_path($hdl_file,"filepath"); + my $use_in_synthesis = get_data_by_path($hdl_file,"use_in_synthesis"); + my $use_in_simulation = get_data_by_path($hdl_file,"use_in_simulation"); + + if($use_in_synthesis) + { + $synthesis_files .= ", " if $synthesis_files; + $synthesis_files .= $filename; + } + + if($use_in_simulation) + { + $simulation_files .= ", " if $simulation_files; + $simulation_files .= $filename; + } + } + } + + return $synthesis_files; + } + + + + + + + + +sub main + { + + push(@ARGV,"--verbose=1") if 0; + my %args = fcu_parse_args(@ARGV); + + if(0) + { + foreach my $key (sort(keys(%args))) + { + print("--$key = $args{$key} \n"); + } + } + + # | + # | get the arguments we care about + # | + + my $class_dir = fcu_get_switch(\%args,"module_lib_dir"); + + + my $target_module_name = fcu_get_switch(\%args,"target_module_name"); + my $system_name = fcu_get_switch(\%args,"system_name"); + my $sopc_directory = fcu_get_switch(\%args,"sopc_directory"); + + # | + # | preflight the arguments a little + # | + + my $error_count = 0; + + my $class_ptf_path = "$class_dir/class.ptf"; + if(!-f $class_ptf_path) + { + print "error: no class.ptf at \"$class_dir\"\n"; + $error_count++; + } + + die "$error_count errors" if($error_count > 0); + + # +------------------------------------------- + # | ok, let us get to work + # | + + + my $class_ptf = new_ptf_from_file($class_ptf_path); + + # | + # | emit system.h for this module + # | TODO iff Is_CPU i guess. + # | + + my $do_emit_system_h = get_data_by_path($class_ptf, + "CLASS/CB_GENERATOR/emit_system_h"); + if($do_emit_system_h) + { + emit_system_h($sopc_directory, + $target_module_name, + "./$system_name.ptf"); + } + + my $top_module_name = get_data_by_path($class_ptf, + "CLASS/CB_GENERATOR/top_module_name"); + my $file_name = ""; + + # | stored as file_name.v:module_name, so we break it open + if($top_module_name =~ /^(.*):(.*)$/) + { + $file_name = $1; + my $module_name = $2; + $top_module_name = $module_name; + } + + # | language of this particular module... + + my $module_language = "verilog"; + if($file_name =~ /^.*\.vhd$/) + { + $module_language = "vhdl"; + } + + # | + # | consult the CB_GENERATOR/HDL_FILES section regarding + # | where our HDL files for synthesis are. + # | + + + my $synthesis_files = get_synthesis_files($class_ptf); + + + my $instantiate_in_system_module = get_data_by_path($class_ptf, + "CLASS/MODULE_DEFAULTS/SYSTEM_BUILDER_INFO/Instantiate_In_System_Module"); + + + + if($instantiate_in_system_module) + { + generator_enable_mode ("terse"); + + + generator_begin (@ARGV); + + + generator_make_module_wrapper(1,$top_module_name,$module_language); + + generator_copy_files_and_set_system_ptf + ( + "simulation_and_quartus", + split(/ *, */,$synthesis_files) +# "$synthesis_files" + ); + + generator_end (); + } + + exit (0); + } + +$| = 1; # always polite to flush. +main() + +# end of file Index: sdram_ctrl/tags/V10/syn/sdram_ctrl/hdl/sdram_ctrl.vhd =================================================================== --- sdram_ctrl/tags/V10/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (nonexistent) +++ sdram_ctrl/tags/V10/syn/sdram_ctrl/hdl/sdram_ctrl.vhd (revision 8) @@ -0,0 +1,440 @@ +------------------------------------------------------------------ +-- +-- sdram_ctrl.vhd +-- +-- Module Description: +-- SDRAM small&fast controller +-- +-- +-- To Do: +-- configurable times +-- nios simulation support +-- +-- Author(s): +-- Aleksey Kuzmenok, ntpqa@opencores.org +-- +------------------------------------------------------------------ +-- +-- Copyright (C) 2006 Aleksey Kuzmenok and OPENCORES.ORG +-- +-- This module is free software; you can redistribute it and/or +-- modify it under the terms of the GNU Lesser General Public +-- License as published by the Free Software Foundation; either +-- version 2.1 of the License, or (at your option) any later version. +-- +-- This module 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 +-- Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public +-- License along with this software; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +-- +------------------------------------------------------------------ +-- Test results +-- FPGA SDRAM CLK (not less than) +-- EP1C12XXXXC8 MT48LC4M32B2TG-7:G 125 MHz +-- EP1C6XXXXC8 IS42S16100C1-7TL 125 MHz +-- +------------------------------------------------------------------ + +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +entity sdram_ctrl is + generic( + DATA_WIDTH: integer:=32; + BANK_WIDTH: integer:=4; + ROW_WIDTH: integer:=12; + COLUMN_WIDTH: integer:=8; + + clk_MHz: integer:=120 + ); + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + -- IMPORTANT: for this Avalon(tm) interface + -- 'Minimum Arbitration Shares'=1 + -- 'Max Pending Read Transactions'=9 + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR ((BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH-1) DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + + -- global export signals + signal sdram_cke : OUT STD_LOGIC; -- This pin has fixed state '1' + signal sdram_ba : OUT STD_LOGIC_VECTOR ((BANK_WIDTH-1) DOWNTO 0); + signal sdram_addr : OUT STD_LOGIC_VECTOR ((ROW_WIDTH-1) DOWNTO 0); + signal sdram_cs_n : OUT STD_LOGIC; -- This pin has fixed state '0' + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC; + signal sdram_dq : INOUT STD_LOGIC_VECTOR ((DATA_WIDTH-1) DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (((DATA_WIDTH/8)-1) DOWNTO 0) + ); +end sdram_ctrl; + +architecture behaviour of sdram_ctrl is + + CONSTANT FIFO_WIDTH: integer:=BANK_WIDTH+ROW_WIDTH+COLUMN_WIDTH+DATA_WIDTH+(DATA_WIDTH/8)+2; + + CONSTANT MODE: std_logic_vector(11 downto 0):="000000110000"; -- 1 word burst, CAS latency=3 + -- Only two times are configurable + -- tINIT delay between powerup and load mode register = 100 us + -- tREF refresh period = 15.625 us (64ms/4096rows) + CONSTANT INIT_PAUSE_CLOCKS: integer:=(clk_MHz*10000)/91; -- 109.9 us just to be on the save side + CONSTANT REFRESH_PERIOD_CLOCKS: integer:=(clk_MHz*1000)/65; -- 15.384 us the same purpose + CONSTANT CAS_LATENCY: integer:=3; -- other latencies weren't been tested! + + COMPONENT scfifo + GENERIC ( + add_ram_output_register : STRING; + intended_device_family : STRING; + lpm_numwords : NATURAL; + lpm_showahead : STRING; + lpm_type : STRING; + lpm_width : NATURAL; + lpm_widthu : NATURAL; + overflow_checking : STRING; + underflow_checking : STRING; + use_eab : STRING + ); + PORT ( + rdreq : IN STD_LOGIC ; + empty : OUT STD_LOGIC ; + aclr : IN STD_LOGIC ; + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + wrreq : IN STD_LOGIC ; + data : IN STD_LOGIC_VECTOR ((FIFO_WIDTH-1) DOWNTO 0); + full : OUT STD_LOGIC + ); + END COMPONENT; + + -- If you ask me why there are so many states, I'll answer that all times are fixed. + -- The top speed for MT48LC4M32B2TG-7:G is 7 ns, therefore all times were based on it. + -- tRP PRECHARGE command period = 3 clocks + -- tRFC AUTO REFRESH period = 10 clocks + -- tMRD LOAD MODE REGISTER command to ACTIVE or REFRESH command = 2 clocks + -- tRCD ACTIVE to READ or WRITE delay = 3 clocks + -- tRAS ACTIVE to PRECHARGE command = 7 clocks + -- tRC ACTIVE to ACTIVE command period = 10 clocks + -- tWR2 Write recovery time = 2 clocks + type states is ( + INIT0,INIT1,INIT2,INIT3,INIT4,INIT5,INIT6,INIT7, + INIT8,INIT9,INIT10,INIT11,INIT12,INIT13,INIT14,INIT15, + INIT16,INIT17,INIT18,INIT19,INIT20,INIT21,INIT22,INIT23,INIT24, + REFRESH0,REFRESH1,REFRESH2,REFRESH3,REFRESH4,REFRESH5,REFRESH6,REFRESH7, + REFRESH8,REFRESH9,REFRESH10,REFRESH11,REFRESH12,REFRESH13,REFRESH14, + ACTIVE0,ACTIVE1,ACTIVE2,ACTIVE3,ACTIVE4, + IDLE,READ0,WRITE0); + signal operation: states; + + signal fifo_q: std_logic_vector((FIFO_WIDTH-1) downto 0); + + signal init_counter: unsigned(15 downto 0):=to_unsigned(INIT_PAUSE_CLOCKS,16); + signal refresh_counter: unsigned(15 downto 0); + signal active_counter: unsigned(2 downto 0); + signal active_address: unsigned((BANK_WIDTH+ROW_WIDTH-1) downto 0); + + signal bank: std_logic_vector((sdram_ba'length-1) downto 0); + signal row: std_logic_vector((sdram_addr'length-1) downto 0); + signal column: std_logic_vector((COLUMN_WIDTH-1) downto 0); + signal be: std_logic_vector((sdram_dqm'length-1) downto 0); + signal data: std_logic_vector((sdram_dq'length-1) downto 0); + + signal do_init,do_refresh,do_active,read_is_active,ready,tRCD_not_expired: std_logic:='0'; + + signal fifo_rdreq,fifo_empty: std_logic; + + signal read_latency: std_logic_vector(CAS_LATENCY downto 0); + + signal fifo_data: std_logic_vector((FIFO_WIDTH-1) downto 0); + signal fifo_wrreq,fifo_wrfull: std_logic; + + signal i_command : STD_LOGIC_VECTOR(4 downto 0); + CONSTANT NOP: STD_LOGIC_VECTOR(4 downto 0):="10111"; + CONSTANT ACTIVE: STD_LOGIC_VECTOR(4 downto 0):="10011"; + CONSTANT READ: STD_LOGIC_VECTOR(4 downto 0):="10101"; + CONSTANT WRITE: STD_LOGIC_VECTOR(4 downto 0):="10100"; + CONSTANT PRECHARGE: STD_LOGIC_VECTOR(4 downto 0):="10010"; + CONSTANT AUTO_REFRESH: STD_LOGIC_VECTOR(4 downto 0):="10001"; + CONSTANT LOAD_MODE_REGISTER: STD_LOGIC_VECTOR(4 downto 0):="10000"; + + signal i_address : STD_LOGIC_VECTOR((sdram_addr'length-1) DOWNTO 0); + signal i_bank : STD_LOGIC_VECTOR((sdram_ba'length-1) DOWNTO 0); + signal i_dqm : STD_LOGIC_VECTOR((sdram_dqm'length-1) DOWNTO 0); + signal i_data : STD_LOGIC_VECTOR((sdram_dq'length-1) DOWNTO 0); + attribute ALTERA_ATTRIBUTE : string; + attribute ALTERA_ATTRIBUTE of i_command : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_address : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_bank : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_dqm : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of i_data : signal is "FAST_OUTPUT_REGISTER=ON"; + attribute ALTERA_ATTRIBUTE of avs_nios_readdata : signal is "FAST_INPUT_REGISTER=ON"; +begin + (sdram_cke,sdram_cs_n,sdram_ras_n,sdram_cas_n,sdram_we_n) <= i_command; + sdram_addr <= i_address; + sdram_ba <= i_bank; + sdram_dqm <= i_dqm; + sdram_dq <= i_data; + + fifo_data<=avs_nios_address & avs_nios_writedata & avs_nios_byteenable & avs_nios_write & avs_nios_read; + fifo_wrreq<=(avs_nios_write or avs_nios_read) and avs_nios_chipselect and not fifo_wrfull; + + avs_nios_waitrequest<=fifo_wrfull; + + fifo_rdreq<=not fifo_empty and not do_refresh and not do_active and not read_is_active and ready; + + do_active<='0' when active_address=unsigned((fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length)))) else '1'; + read_is_active<='1' when read_latency(CAS_LATENCY-1 downto 0)>"000" and fifo_q(1)='1' else '0'; + ready<='1' when operation=IDLE or operation=READ0 or operation=WRITE0 else '0'; + + operation_machine:process(reset,clk) + begin + if reset='1' + then + operation<=INIT0; + active_address<=(others=>'1'); + elsif rising_edge(clk) + then + + bank<=fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length)); + row<=fifo_q((fifo_q'length-bank'length-1) downto (fifo_q'length-bank'length-row'length)); + column<=fifo_q((column'length+data'length+be'length+2-1) downto (data'length+be'length+2)); + data<=fifo_q((data'length+be'length+2-1) downto (be'length+2)); + be<=fifo_q((be'length+2-1) downto 2); + + case operation is + when INIT0=> + if do_init='1' + then operation<=INIT1;row(10)<='1'; + end if; + when INIT1=>operation<=INIT2; + when INIT2=>operation<=INIT3; + when INIT3=>operation<=INIT4; + when INIT4=>operation<=INIT5; + when INIT5=>operation<=INIT6; + when INIT6=>operation<=INIT7; + when INIT7=>operation<=INIT8; + when INIT8=>operation<=INIT9; + when INIT9=>operation<=INIT10; + when INIT10=>operation<=INIT11; + when INIT11=>operation<=INIT12; + when INIT12=>operation<=INIT13; + when INIT13=>operation<=INIT14; + when INIT14=>operation<=INIT15; + when INIT15=>operation<=INIT16; + when INIT16=>operation<=INIT17; + when INIT17=>operation<=INIT18; + when INIT18=>operation<=INIT19; + when INIT19=>operation<=INIT20; + when INIT20=>operation<=INIT21; + when INIT21=>operation<=INIT22; + when INIT22=>operation<=INIT23; + when INIT23=>operation<=INIT24;row<=MODE((row'length-1) downto 0); + when INIT24=>operation<=IDLE; + + when REFRESH0=>operation<=REFRESH1; + when REFRESH1=>operation<=REFRESH2; + when REFRESH2=>operation<=REFRESH3; + when REFRESH3=>operation<=REFRESH4; + when REFRESH4=>operation<=REFRESH5; + when REFRESH5=>operation<=REFRESH6; + when REFRESH6=>operation<=REFRESH7; + when REFRESH7=>operation<=REFRESH8; + when REFRESH8=>operation<=REFRESH9; + when REFRESH9=>operation<=REFRESH10; + when REFRESH10=>operation<=REFRESH11; + when REFRESH11=>operation<=REFRESH12; + when REFRESH12=>operation<=REFRESH13; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when REFRESH13=>operation<=REFRESH14; + when REFRESH14=>operation<=IDLE; + + when ACTIVE0=>operation<=ACTIVE1; + when ACTIVE1=>operation<=ACTIVE2; + when ACTIVE2=>operation<=ACTIVE3; + active_address<=unsigned(fifo_q((fifo_q'length-1) downto (fifo_q'length-bank'length-row'length))); + when ACTIVE3=>operation<=ACTIVE4; + when ACTIVE4=>operation<=IDLE; + + when others=> + if do_refresh='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=REFRESH0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif do_active='1' + then + if tRCD_not_expired='0' and operation=IDLE + then operation<=ACTIVE0;row(10)<='1'; + else operation<=IDLE; + end if; + elsif fifo_empty='1' + then + operation<=IDLE; + elsif fifo_q(1)='1' --write + then + if read_latency(CAS_LATENCY-1 downto 0)>"000" + then operation<=IDLE; + else operation<=WRITE0; + end if; + elsif fifo_q(0)='1' --read + then + operation<=READ0; + end if; + end case; + end if; + end process; + + control_latency:process(reset,clk) + begin + if reset='1' + then + read_latency<=(others=>'0'); + elsif rising_edge(clk) + then + read_latency<=std_logic_vector(unsigned(read_latency) SLL 1); + if operation=READ0 + then read_latency(0)<='1'; + else read_latency(0)<='0'; + end if; + end if; + end process; + latch_readdata:process(reset,clk) + begin + if reset='1' + then + avs_nios_readdata<=(others=>'0'); + avs_nios_readdatavalid<='0'; + elsif rising_edge(clk) + then + avs_nios_readdata<=sdram_dq; + avs_nios_readdatavalid<=read_latency(CAS_LATENCY); + end if; + end process; + initialization:process(reset,clk) + begin + if rising_edge(clk) + then + if init_counter>0 + then + init_counter<=init_counter-1; + else do_init<='1'; + end if; + end if; + end process; + refreshing:process(clk,reset) + begin + if reset='1' + then + refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='0'; + elsif rising_edge(clk) + then + if refresh_counter=to_unsigned(0,refresh_counter'length) + then refresh_counter<=to_unsigned(REFRESH_PERIOD_CLOCKS,16); + do_refresh<='1'; + else refresh_counter<=refresh_counter-1; + end if; + if operation=REFRESH0 or operation=REFRESH5 + then do_refresh<='0'; + end if; + end if; + end process; + active_period:process(reset,clk) + begin + if reset='1' + then + active_counter<=(others=>'0'); + tRCD_not_expired<='0'; + elsif rising_edge(clk) + then + if operation=ACTIVE3 or operation=REFRESH13 + then active_counter<=to_unsigned(5,active_counter'length); + elsif active_counter>0 + then active_counter<=active_counter-1; + end if; + end if; + if active_counter>0 + then tRCD_not_expired<='1'; + else tRCD_not_expired<='0'; + end if; + end process; + latch_controls:process(clk,reset) + begin + if reset='1' + then + i_command<=NOP; + i_address<=(others=>'0'); + i_bank<=(others=>'0'); + i_dqm<=(others=>'0'); + i_data<=(others=>'Z'); + elsif rising_edge(clk) + then + i_command<=NOP; + i_bank<=bank; + i_address<=(others=>'0'); + i_address((column'length-1) downto 0)<=column; + i_data<=(others=>'Z'); + i_dqm<=(others=>'0'); + + case operation is + when INIT1|REFRESH0|ACTIVE0 => + i_command<=PRECHARGE; + i_address<=row; + when INIT4|INIT14|REFRESH3 => + i_command<=AUTO_REFRESH; + when INIT24=> + i_command<=LOAD_MODE_REGISTER; + i_address<=row; + when ACTIVE3|REFRESH13 => + i_command<=ACTIVE; + i_address<=row; + when READ0 => + i_command<=READ; + when WRITE0 => + i_command<=WRITE; + i_dqm<=not be; + i_data<=data; + when OTHERS => + end case; + end if; + end process; + + fifo: scfifo + GENERIC MAP ( + add_ram_output_register => "ON", + intended_device_family => "Cyclone", + lpm_numwords => 4, + lpm_showahead => "ON", + lpm_type => "scfifo", + lpm_width => FIFO_WIDTH, + lpm_widthu => 2, + overflow_checking => "ON", + underflow_checking => "ON", + use_eab => "ON" + ) + PORT MAP ( + rdreq => fifo_rdreq, + aclr => reset, + clock => clk, + wrreq => fifo_wrreq, + data => fifo_data, + empty => fifo_empty, + q => fifo_q, + full => fifo_wrfull + ); +end behaviour; Index: sdram_ctrl/tags/V10/syn/sdram_ctrl/class.ptf =================================================================== --- sdram_ctrl/tags/V10/syn/sdram_ctrl/class.ptf (nonexistent) +++ sdram_ctrl/tags/V10/syn/sdram_ctrl/class.ptf (revision 8) @@ -0,0 +1,972 @@ +# +# This class.ptf file built by Component Editor +# 2006.09.25.10:24:12 +# +# DO NOT MODIFY THIS FILE +# If you hand-modify this file you will likely +# interfere with Component Editor's ability to +# read and edit it. And then Component Editor +# will overwrite your changes anyway. So, for +# the very best results, just relax and +# DO NOT MODIFY THIS FILE +# +CLASS sdram_ctrl +{ + CB_GENERATOR + { + HDL_FILES + { + FILE + { + use_in_simulation = "1"; + use_in_synthesis = "1"; + filepath = "hdl/sdram_ctrl.vhd"; + } + } + top_module_name = "sdram_ctrl.vhd:sdram_ctrl"; + emit_system_h = "0"; + LIBRARIES + { + library = "ieee.std_logic_1164.all"; + library = "ieee.numeric_std.all"; + library = "altera_mf.altera_mf_components.all"; + library = "std.standard.all"; + } + } + MODULE_DEFAULTS global_signals + { + class = "sdram_ctrl"; + class_version = "1.1"; + SYSTEM_BUILDER_INFO + { + Instantiate_In_System_Module = "1"; + Has_Clock = "1"; + Top_Level_Ports_Are_Enumerated = "1"; + } + COMPONENT_BUILDER + { + GLS_SETTINGS + { + } + } + PORT_WIRING + { + PORT clk + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "clk"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT reset + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "reset"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cke + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ba + { + width = "-1"; + width_expression = "((bank_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_addr + { + width = "-1"; + width_expression = "((row_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cs_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ras_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cas_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_we_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dq + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "inout"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dqm + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + WIZARD_SCRIPT_ARGUMENTS + { + hdl_parameters + { + data_width = "32"; + bank_width = "4"; + row_width = "12"; + column_width = "8"; + clk_mhz = "120"; + } + } + SIMULATION + { + DISPLAY + { + } + } + SLAVE nios + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + Address_Group = "1"; + Has_Clock = "0"; + Address_Width = "-1"; + Address_Alignment = "dynamic"; + Data_Width = "8"; + Has_Base_Address = "1"; + Has_IRQ = "0"; + Setup_Time = "0"; + Hold_Time = "0"; + Read_Wait_States = "peripheral_controlled"; + Write_Wait_States = "peripheral_controlled"; + Read_Latency = "0"; + Maximum_Pending_Read_Transactions = "9"; + Active_CS_Through_Read_Latency = "0"; + Is_Printable_Device = "1"; + Is_Memory_Device = "1"; + Is_Readable = "1"; + Is_Writable = "1"; + Minimum_Uninterrupted_Run_Length = "1"; + } + COMPONENT_BUILDER + { + AVS_SETTINGS + { + Setup_Value = "0"; + Read_Wait_Value = "1"; + Write_Wait_Value = "1"; + Hold_Value = "0"; + Timing_Units = "cycles"; + Read_Latency_Value = "0"; + Minimum_Arbitration_Shares = "1"; + Active_CS_Through_Read_Latency = "0"; + Max_Pending_Read_Transactions_Value = "9"; + Address_Alignment = "dynamic"; + Is_Printable_Device = "1"; + interface_name = "Avalon Slave"; + external_wait = "1"; + Is_Memory_Device = "1"; + } + } + PORT_WIRING + { + PORT avs_nios_chipselect + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "chipselect"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_address + { + width = "-1"; + width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; + direction = "input"; + type = "address"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_byteenable + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "input"; + type = "byteenable"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_writedata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "input"; + type = "writedata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_write + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "write"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_read + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "read"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_waitrequest + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "waitrequest"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "output"; + type = "readdata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdatavalid + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "readdatavalid"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + } + USER_INTERFACE + { + USER_LABELS + { + name = "sdram_ctrl"; + technology = "Opencores"; + } + WIZARD_UI the_wizard_ui + { + title = "sdram_ctrl - {{ $MOD }}"; + CONTEXT + { + H = "WIZARD_SCRIPT_ARGUMENTS/hdl_parameters"; + M = ""; + SBI_global_signals = "SYSTEM_BUILDER_INFO"; + SBI_nios = "SLAVE nios/SYSTEM_BUILDER_INFO"; + # The following signals have parameterized widths: + PORT_sdram_ba = "PORT_WIRING/PORT sdram_ba"; + PORT_sdram_addr = "PORT_WIRING/PORT sdram_addr"; + PORT_sdram_dq = "PORT_WIRING/PORT sdram_dq"; + PORT_sdram_dqm = "PORT_WIRING/PORT sdram_dqm"; + PORT_avs_nios_address = "SLAVE nios/PORT_WIRING/PORT avs_nios_address"; + PORT_avs_nios_byteenable = "SLAVE nios/PORT_WIRING/PORT avs_nios_byteenable"; + PORT_avs_nios_writedata = "SLAVE nios/PORT_WIRING/PORT avs_nios_writedata"; + PORT_avs_nios_readdata = "SLAVE nios/PORT_WIRING/PORT avs_nios_readdata"; + } + PAGES main + { + PAGE 1 + { + align = "left"; + title = "sdram_ctrl 1.1 Settings"; + layout = "vertical"; + TEXT + { + title = "Built on: 2006.09.25.10:24:12"; + } + TEXT + { + title = "Class name: sdram_ctrl"; + } + TEXT + { + title = "Class version: 1.1"; + } + TEXT + { + title = "Component name: sdram_ctrl"; + } + TEXT + { + title = "Component Group: Opencores"; + } + GROUP parameters + { + title = "Parameters"; + layout = "form"; + align = "left"; + EDIT e1 + { + id = "data_width"; + editable = "1"; + title = "data_width:"; + columns = "40"; + tooltip = "default value: 32"; + DATA + { + $H/data_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/data_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/data_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/data_width,'ugly_-?[0-9]+')))'data_width must be numeric constant, not '+$H/data_width; }}"; + } + EDIT e2 + { + id = "bank_width"; + editable = "1"; + title = "bank_width:"; + columns = "40"; + tooltip = "default value: 4"; + DATA + { + $H/bank_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/bank_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/bank_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/bank_width,'ugly_-?[0-9]+')))'bank_width must be numeric constant, not '+$H/bank_width; }}"; + } + EDIT e3 + { + id = "row_width"; + editable = "1"; + title = "row_width:"; + columns = "40"; + tooltip = "default value: 12"; + DATA + { + $H/row_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/row_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/row_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/row_width,'ugly_-?[0-9]+')))'row_width must be numeric constant, not '+$H/row_width; }}"; + } + EDIT e4 + { + id = "column_width"; + editable = "1"; + title = "column_width:"; + columns = "40"; + tooltip = "default value: 8"; + DATA + { + $H/column_width = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/column_width,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/column_width,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/column_width,'ugly_-?[0-9]+')))'column_width must be numeric constant, not '+$H/column_width; }}"; + } + EDIT e5 + { + id = "clk_mhz"; + editable = "1"; + title = "clk_mhz:"; + columns = "40"; + tooltip = "default value: 120"; + DATA + { + $H/clk_mhz = "$"; + } + q = "'"; + warning = "{{ if(!(regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[bB][01][_01]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[hH][0-9a-fA-F][_0-9a-fA-F]*')||regexp('ugly_'+$H/clk_mhz,'ugly_[0-9]*'+$q+'[oO][0-7][_0-7]*')||regexp('ugly_'+$H/clk_mhz,'ugly_0x[0-9a-fA-F]+')||regexp('ugly_'+$H/clk_mhz,'ugly_-?[0-9]+')))'clk_mhz must be numeric constant, not '+$H/clk_mhz; }}"; + } + } + GROUP variable_port_widths + { + # This group is for display only, to preview parameterized port widths + title = "Parameterized Signal Widths"; + layout = "form"; + align = "left"; + EDIT sdram_ba_width + { + id = "sdram_ba_width"; + editable = "0"; + title = "sdram_ba[((bank_width - 1)) - (0) + 1]:"; + tooltip = "sdram_ba[((bank_width - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_ba/width = (int((( ( $H/bank_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_ba/width = "$"; + } + warning = "{{ if($PORT_sdram_ba/width <= 0)('width of sdram_ba must be greater than zero' ) }}"; + } + EDIT sdram_addr_width + { + id = "sdram_addr_width"; + editable = "0"; + title = "sdram_addr[((row_width - 1)) - (0) + 1]:"; + tooltip = "sdram_addr[((row_width - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_addr/width = (int((( ( $H/row_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_addr/width = "$"; + } + warning = "{{ if($PORT_sdram_addr/width <= 0)('width of sdram_addr must be greater than zero' ) }}"; + } + EDIT sdram_dq_width + { + id = "sdram_dq_width"; + editable = "0"; + title = "sdram_dq[((data_width - 1)) - (0) + 1]:"; + tooltip = "sdram_dq[((data_width - 1)) - (0) + 1]
direction: inout
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_dq/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_dq/width = "$"; + } + warning = "{{ if($PORT_sdram_dq/width <= 0)('width of sdram_dq must be greater than zero' ) }}"; + } + EDIT sdram_dqm_width + { + id = "sdram_dqm_width"; + editable = "0"; + title = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]:"; + tooltip = "sdram_dqm[(((data_width / 8) - 1)) - (0) + 1]
direction: output
signal type: export"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_sdram_dqm/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_sdram_dqm/width = "$"; + } + warning = "{{ if($PORT_sdram_dqm/width <= 0)('width of sdram_dqm must be greater than zero' ) }}"; + } + EDIT avs_nios_address_width + { + id = "avs_nios_address_width"; + editable = "0"; + title = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]:"; + tooltip = "avs_nios_address[((((bank_width + row_width) + column_width) - 1)) - (0) + 1]
direction: input
signal type: address"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_address/width = (int((((( ( $H/bank_width ) + ( $H/row_width ) ) + ( $H/column_width ) ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Address_Width = $PORT_avs_nios_address/width; }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_address/width = "$"; + } + warning = "{{ if($PORT_avs_nios_address/width <= 0)('width of avs_nios_address must be greater than zero' ) }}"; + } + EDIT avs_nios_byteenable_width + { + id = "avs_nios_byteenable_width"; + editable = "0"; + title = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]:"; + tooltip = "avs_nios_byteenable[(((data_width / 8) - 1)) - (0) + 1]
direction: input
signal type: byteenable"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_byteenable/width = (int(((( ( $H/data_width ) / 8) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_byteenable/width = "$"; + } + warning = "{{ if($PORT_avs_nios_byteenable/width <= 0)('width of avs_nios_byteenable must be greater than zero' ) }}"; + } + EDIT avs_nios_writedata_width + { + id = "avs_nios_writedata_width"; + editable = "0"; + title = "avs_nios_writedata[((data_width - 1)) - (0) + 1]:"; + tooltip = "avs_nios_writedata[((data_width - 1)) - (0) + 1]
direction: input
signal type: writedata"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_writedata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_writedata/width - 1) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_writedata/width = "$"; + } + warning = "{{ if($PORT_avs_nios_writedata/width <= 0)('width of avs_nios_writedata must be greater than zero' ) }}"; + } + EDIT avs_nios_readdata_width + { + id = "avs_nios_readdata_width"; + editable = "0"; + title = "avs_nios_readdata[((data_width - 1)) - (0) + 1]:"; + tooltip = "avs_nios_readdata[((data_width - 1)) - (0) + 1]
direction: output
signal type: readdata"; + # This expression should emulate the HDL, and assign the port width + dummy = "{{ $PORT_avs_nios_readdata/width = (int((( ( $H/data_width ) - 1)) - (0) + 1-1) - int(0) + 1); }}"; + dummy_dummy = "{{ $SBI_nios/Data_Width = 2 ^ int(log2($PORT_avs_nios_readdata/width - 1) + 1); }}"; + DATA + { + # The EDIT field is noneditable, so this just reads the current width. + $PORT_avs_nios_readdata/width = "$"; + } + warning = "{{ if($PORT_avs_nios_readdata/width <= 0)('width of avs_nios_readdata must be greater than zero' ) }}"; + } + } + } + } + } + } + SOPC_Builder_Version = "5.10"; + COMPONENT_BUILDER + { + HDL_PARAMETERS + { + # generated by CBDocument.getParameterContainer + # used only by Component Editor + HDL_PARAMETER data_width + { + parameter_name = "data_width"; + type = "integer"; + default_value = "32"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER bank_width + { + parameter_name = "bank_width"; + type = "integer"; + default_value = "4"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER row_width + { + parameter_name = "row_width"; + type = "integer"; + default_value = "12"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER column_width + { + parameter_name = "column_width"; + type = "integer"; + default_value = "8"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER clk_mhz + { + parameter_name = "clk_mhz"; + type = "integer"; + default_value = "120"; + editable = "1"; + tooltip = ""; + } + } + SW_FILES + { + } + built_on = "2006.09.25.10:24:12"; + CACHED_HDL_INFO + { + # cached hdl info, emitted by CBFrameRealtime.getDocumentCachedHDLInfoSection + # used only by Component Builder + FILE sdram_ctrl.vhd + { + file_mod = "Mon Sep 18 18:08:50 EEST 2006"; + quartus_map_start = "Mon Sep 25 10:22:36 EEST 2006"; + quartus_map_finished = "Mon Sep 25 10:22:58 EEST 2006"; + #found 1 valid modules + WRAPPER sdram_ctrl + { + CLASS sdram_ctrl + { + CB_GENERATOR + { + HDL_FILES + { + FILE + { + use_in_simulation = "1"; + use_in_synthesis = "1"; + filepath = "H:/Work/Home_stuff/opencores/sdram_ctrl/src/sdram_ctrl.vhd"; + } + } + top_module_name = "sdram_ctrl"; + emit_system_h = "0"; + LIBRARIES + { + library = "ieee.std_logic_1164.all"; + library = "ieee.numeric_std.all"; + library = "altera_mf.altera_mf_components.all"; + library = "std.standard.all"; + } + } + MODULE_DEFAULTS global_signals + { + class = "sdram_ctrl"; + class_version = "1.0"; + SYSTEM_BUILDER_INFO + { + Instantiate_In_System_Module = "1"; + } + SLAVE nios + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + } + PORT_WIRING + { + PORT avs_nios_chipselect + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "chipselect"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_address + { + width = "-1"; + width_expression = "((((bank_width + row_width) + column_width) - 1)) - (0) + 1"; + direction = "input"; + type = "address"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_byteenable + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "input"; + type = "byteenable"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_writedata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "input"; + type = "writedata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_write + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "write"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_read + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "read"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_waitrequest + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "waitrequest"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdata + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "output"; + type = "readdata"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT avs_nios_readdatavalid + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "readdatavalid"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + SLAVE avalon_slave_0 + { + SYSTEM_BUILDER_INFO + { + Bus_Type = "avalon"; + } + PORT_WIRING + { + PORT sdram_cke + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ba + { + width = "-1"; + width_expression = "((bank_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_addr + { + width = "-1"; + width_expression = "((row_width - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cs_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_ras_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_cas_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_we_n + { + width = "1"; + width_expression = ""; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dq + { + width = "-1"; + width_expression = "((data_width - 1)) - (0) + 1"; + direction = "inout"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT sdram_dqm + { + width = "-1"; + width_expression = "(((data_width / 8) - 1)) - (0) + 1"; + direction = "output"; + type = "export"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + PORT_WIRING + { + PORT clk + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "clk"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + PORT reset + { + width = "1"; + width_expression = ""; + direction = "input"; + type = "reset"; + is_shared = "0"; + vhdl_record_name = ""; + vhdl_record_type = ""; + } + } + } + USER_INTERFACE + { + USER_LABELS + { + name = "sdram_ctrl"; + technology = "imported components"; + } + } + SOPC_Builder_Version = "0.0"; + COMPONENT_BUILDER + { + HDL_PARAMETERS + { + # generated by CBDocument.getParameterContainer + # used only by Component Editor + HDL_PARAMETER data_width + { + parameter_name = "data_width"; + type = "integer"; + default_value = "32"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER bank_width + { + parameter_name = "bank_width"; + type = "integer"; + default_value = "4"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER row_width + { + parameter_name = "row_width"; + type = "integer"; + default_value = "12"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER column_width + { + parameter_name = "column_width"; + type = "integer"; + default_value = "8"; + editable = "1"; + tooltip = ""; + } + HDL_PARAMETER clk_mhz + { + parameter_name = "clk_mhz"; + type = "integer"; + default_value = "120"; + editable = "1"; + tooltip = ""; + } + } + } + } + } + } + } + } + ASSOCIATED_FILES + { + Add_Program = "the_wizard_ui"; + Edit_Program = "the_wizard_ui"; + Generator_Program = "cb_generator.pl"; + } +} Index: sdram_ctrl/tags/V10/test_bench/sdram_ctrl_tb.vhd =================================================================== --- sdram_ctrl/tags/V10/test_bench/sdram_ctrl_tb.vhd (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/sdram_ctrl_tb.vhd (revision 8) @@ -0,0 +1,169 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +entity sdram_ctrl_tb is +end sdram_ctrl_tb; + +architecture structure of sdram_ctrl_tb is + component pll + port ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + e0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ) ; + end component ; + component sdram_ctrl is + port( + signal clk : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + signal avs_nios_chipselect : IN STD_LOGIC; + signal avs_nios_address : IN STD_LOGIC_VECTOR (21 DOWNTO 0); + signal avs_nios_byteenable : IN STD_LOGIC_VECTOR (3 DOWNTO 0); + signal avs_nios_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); + signal avs_nios_write : IN STD_LOGIC; + signal avs_nios_read : IN STD_LOGIC; + signal avs_nios_readdata : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); + signal avs_nios_readdatavalid : OUT STD_LOGIC; + signal avs_nios_waitrequest : OUT STD_LOGIC; + + signal sdram_addr : OUT STD_LOGIC_VECTOR (11 DOWNTO 0); + signal sdram_ba : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); + signal sdram_cas_n : OUT STD_LOGIC; + signal sdram_cke : OUT STD_LOGIC; + signal sdram_cs_n : OUT STD_LOGIC; + signal sdram_dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0); + signal sdram_dqm : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); + signal sdram_ras_n : OUT STD_LOGIC; + signal sdram_we_n : OUT STD_LOGIC + ); + end component; + + component mt48lc4m32b2 IS + PORT ( + Dq : INOUT STD_LOGIC_VECTOR (31 DOWNTO 0) := (OTHERS => 'Z'); + Addr : IN STD_LOGIC_VECTOR (11 DOWNTO 0) := (OTHERS => '0'); + Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + Clk : IN STD_LOGIC := '0'; + Cke : IN STD_LOGIC := '1'; + Cs_n : IN STD_LOGIC := '1'; + Ras_n : IN STD_LOGIC := '1'; + Cas_n : IN STD_LOGIC := '1'; + We_n : IN STD_LOGIC := '1'; + Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" + ); + END component; + + component cpu_simulator IS + PORT(clk, reset: IN std_logic; + address : OUT std_logic_vector(21 downto 0):=(others=>'0'); + writedata : out std_logic_vector(31 downto 0):=(others=>'0'); + byteenable : out std_logic_vector(3 downto 0):=(others=>'0'); + write : out std_logic:='0'; + read : out std_logic:='0'; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); + END component; + + signal reset, clk_ok: std_logic; + signal run_nios_n : std_logic:='1'; + signal clk,i_clk: std_logic:='0'; + + signal SDRAM_CLK : std_logic; + signal SDRAM_CKE : std_logic; + signal SDRAM_NCS : std_logic; + signal SDRAM_NRAS : std_logic; + signal SDRAM_NCAS : std_logic; + signal SDRAM_NWE : std_logic; + signal SDRAM_ADDRESS : std_logic_vector(11 downto 0); + signal SDRAM_BANK : std_logic_vector(1 downto 0); + signal SDRAM_DQM : std_logic_vector(3 downto 0); + signal SDRAM_DATA : std_logic_vector(31 downto 0); + + signal address : std_logic_vector(21 downto 0); + signal writedata : std_logic_vector(31 downto 0):=(others=>'0'); + signal byteenable : std_logic_vector(3 downto 0):=(others=>'0'); + signal write : std_logic; + signal read : std_logic; + signal chipselect : std_logic:='1'; + signal readdata : std_logic_vector(31 downto 0); + signal waitrequest : std_logic; + signal readdatavalid : std_logic; + +begin + + reset<= not clk_ok; + run_nios_n<= reset after 140 us; + + UUT: sdram_ctrl + port map( + clk => i_clk, + reset => reset, + + avs_nios_chipselect => chipselect, + avs_nios_address => address, + avs_nios_byteenable => byteenable, + avs_nios_writedata => writedata, + avs_nios_write => write, + avs_nios_read => read, + avs_nios_readdata => readdata, + avs_nios_readdatavalid => readdatavalid, + avs_nios_waitrequest => waitrequest, + + sdram_addr => SDRAM_ADDRESS, + sdram_ba => SDRAM_BANK, + sdram_cas_n => SDRAM_NCAS, + sdram_cke => SDRAM_CKE, + sdram_cs_n => SDRAM_NCS, + sdram_dq => SDRAM_DATA, + sdram_dqm => SDRAM_DQM, + sdram_ras_n => SDRAM_NRAS, + sdram_we_n => SDRAM_NWE + ); + + sdram:mt48lc4m32b2 + PORT MAP( + Dq => SDRAM_DATA, + Addr => SDRAM_ADDRESS, + Ba => SDRAM_BANK, + Clk => SDRAM_CLK, + Cke => SDRAM_CKE, + Cs_n => SDRAM_NCS, + Ras_n => SDRAM_NRAS, + Cas_n => SDRAM_NCAS, + We_n => SDRAM_NWE, + Dqm => SDRAM_DQM + ); + + cpu: cpu_simulator + PORT MAP( + clk => i_clk, + reset => run_nios_n, + address => address, + writedata => writedata, + byteenable => byteenable, + write => write, + read => read, + readdata => readdata, + waitrequest => waitrequest, + readdatavalid => readdatavalid + ); + + U1 : pll + port map( + inclk0 => clk, + c0 => i_clk, + e0 => SDRAM_CLK, + locked =>clk_ok + ); + + clock_generator:process + begin + wait for 21 ns; + clk<= clk xor '1'; + end process; +end structure; Index: sdram_ctrl/tags/V10/test_bench/mt48lc4m32b2.vhd =================================================================== --- sdram_ctrl/tags/V10/test_bench/mt48lc4m32b2.vhd (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/mt48lc4m32b2.vhd (revision 8) @@ -0,0 +1,1134 @@ +----------------------------------------------------------------------------------------- +-- +-- File Name: MT48LC4M32B2.VHD +-- Version: 2.0 +-- Date: January 24th, 2002 +-- Model: Behavioral +-- Simulator: Model Technology +-- +-- Dependencies: None +-- +-- Email: modelsupport@micron.com +-- Company: Micron Technology, Inc. +-- Part Number: MT48LC4M32A2 (1Mb x 32 x 4 Banks) +-- +-- Description: Micron 128Mb SDRAM +-- +-- Limitation: - Doesn't check for 4096-cycle refresh +-- +-- Note: - Set simulator resolution to "ps" accuracy +-- +-- Disclaimer: THESE DESIGNS ARE PROVIDED "AS IS" WITH NO WARRANTY +-- WHATSOEVER AND MICRON SPECIFICALLY DISCLAIMS ANY +-- IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR +-- A PARTICULAR PURPOSE, OR AGAINST INFRINGEMENT. +-- +-- Copyright (c) 1998 Micron Semiconductor Products, Inc. +-- All rights researved +-- +-- Rev Author Date Changes +-- --- -------------------------- ------------------------------------- +-- 2.0 SH 01/24/2002 - Second Release +-- Micron Technology Inc. +-- +-------------------------------------------------------------------------- + +LIBRARY IEEE; + USE IEEE.STD_LOGIC_1164.ALL; + USE IEEE.STD_LOGIC_UNSIGNED.ALL; + USE IEEE.STD_LOGIC_ARITH.ALL; + +ENTITY mt48lc4m32b2 IS + GENERIC ( + -- Timing Parameters for -75 (PC133) and CL = 3 + tAC : TIME := 5.4 ns; + tHZ : TIME := 5.4 ns; + tOH : TIME := 2.7 ns; + tMRD : INTEGER := 2; -- 2 Clk Cycles + tRAS : TIME := 44.0 ns; + tRC : TIME := 66.0 ns; + tRCD : TIME := 20.0 ns; + tRFC : TIME := 66.0 ns; + tRP : TIME := 20.0 ns; + tRRD : TIME := 15.0 ns; + tWRa : TIME := 7.5 ns; -- Auto precharge + tWRm : TIME := 15.0 ns; -- Manual Precharge + + tAH : TIME := 0.8 ns; + tAS : TIME := 1.5 ns; + tCH : TIME := 2.5 ns; + tCL : TIME := 2.5 ns; + tCK : TIME := 7.5 ns; + tDH : TIME := 0.8 ns; + tDS : TIME := 1.5 ns; + tCKH : TIME := 0.8 ns; + tCKS : TIME := 1.5 ns; + tCMH : TIME := 0.8 ns; + tCMS : TIME := 1.5 ns; + + addr_bits : INTEGER := 12; + data_bits : INTEGER := 32; + col_bits : INTEGER := 8 + ); + PORT ( + Dq : INOUT STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => 'Z'); + Addr : IN STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + Ba : IN STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + Clk : IN STD_LOGIC := '0'; + Cke : IN STD_LOGIC := '1'; + Cs_n : IN STD_LOGIC := '1'; + Ras_n : IN STD_LOGIC := '1'; + Cas_n : IN STD_LOGIC := '1'; + We_n : IN STD_LOGIC := '1'; + Dqm : IN STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000" + ); +END mt48lc4m32b2; + +ARCHITECTURE behave OF mt48lc4m32b2 IS + TYPE State IS (BST, NOP, PRECH, READ, WRITE); + TYPE Array4xI IS ARRAY (3 DOWNTO 0) OF INTEGER; + TYPE Array4xT IS ARRAY (3 DOWNTO 0) OF TIME; + TYPE Array4xB IS ARRAY (3 DOWNTO 0) OF STD_LOGIC; + TYPE Array4x2BV IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR (1 DOWNTO 0); + TYPE Array4xCBV IS ARRAY (4 DOWNTO 0) OF STD_LOGIC_VECTOR (Col_bits - 1 DOWNTO 0); + TYPE Array_state IS ARRAY (4 DOWNTO 0) OF State; + SIGNAL Mode_reg : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + SIGNAL Active_enable, Aref_enable, Burst_term : STD_LOGIC := '0'; + SIGNAL Mode_reg_enable, Prech_enable, Read_enable, Write_enable : STD_LOGIC := '0'; + SIGNAL Burst_length_1, Burst_length_2, Burst_length_4, Burst_length_8 : STD_LOGIC := '0'; + SIGNAL Cas_latency_1, Cas_latency_2, Cas_latency_3 : STD_LOGIC := '0'; + SIGNAL Cs_in, Ras_in, Cas_in, We_in : STD_LOGIC := '0'; + SIGNAL Write_burst_mode : STD_LOGIC := '0'; + SIGNAL Sys_clk, CkeZ : STD_LOGIC := '0'; + +BEGIN + -- Strip the strength + Cs_in <= To_X01 (Cs_n); + Ras_in <= To_X01 (Ras_n); + Cas_in <= To_X01 (Cas_n); + We_in <= To_X01 (We_n); + + -- Commands Decode + Active_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND We_in; + Aref_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND We_in; + Burst_term <= NOT(Cs_in) AND Ras_in AND Cas_in AND NOT(We_in); + Mode_reg_enable <= NOT(Cs_in) AND NOT(Ras_in) AND NOT(Cas_in) AND NOT(We_in); + Prech_enable <= NOT(Cs_in) AND NOT(Ras_in) AND Cas_in AND NOT(We_in); + Read_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND We_in; + Write_enable <= NOT(Cs_in) AND Ras_in AND NOT(Cas_in) AND NOT(We_in); + + -- Burst Length Decode + Burst_length_1 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND NOT(Mode_reg(0)); + Burst_length_2 <= NOT(Mode_reg(2)) AND NOT(Mode_reg(1)) AND Mode_reg(0); + Burst_length_4 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND NOT(Mode_reg(0)); + Burst_length_8 <= NOT(Mode_reg(2)) AND Mode_reg(1) AND Mode_reg(0); + + -- CAS Latency Decode + Cas_latency_1 <= NOT(Mode_reg(6)) AND NOT(Mode_reg(5)) AND Mode_reg(4); + Cas_latency_2 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND NOT(Mode_reg(4)); + Cas_latency_3 <= NOT(Mode_reg(6)) AND Mode_reg(5) AND Mode_reg(4); + + -- Write Burst Mode + Write_burst_mode <= Mode_reg(9); + + -- System Clock + int_clk : PROCESS (Clk) + BEGIN + IF Clk'LAST_VALUE = '0' AND Clk = '1' THEN + CkeZ <= Cke; + END IF; + Sys_clk <= CkeZ AND Clk; + END PROCESS; + + state_register : PROCESS + TYPE ram_type IS ARRAY (2**col_bits - 1 DOWNTO 0) OF STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0); + TYPE ram_pntr IS ACCESS ram_type; + TYPE ram_stor IS ARRAY (2**addr_bits - 1 DOWNTO 0) OF ram_pntr; + VARIABLE Bank0 : ram_stor; + VARIABLE Bank1 : ram_stor; + VARIABLE Bank2 : ram_stor; + VARIABLE Bank3 : ram_stor; + VARIABLE Row_index, Col_index : INTEGER := 0; + VARIABLE Dq_temp : STD_LOGIC_VECTOR (data_bits - 1 DOWNTO 0) := (OTHERS => '0'); + + VARIABLE Col_addr : Array4xCBV; + VARIABLE Bank_addr : Array4x2BV; + VARIABLE Dqm_reg0, Dqm_reg1 : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0000"; + + VARIABLE Bank, Prev_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + VARIABLE B0_row_addr, B1_row_addr, B2_row_addr, B3_row_addr : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Col_brst : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Row : STD_LOGIC_VECTOR (addr_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Col : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + VARIABLE Burst_counter : INTEGER := 0; + + VARIABLE Command : Array_state; + VARIABLE Bank_precharge : Array4x2BV; + VARIABLE A10_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Auto_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Read_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE Write_precharge : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_read : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_write : Array4xB := ('0' & '0' & '0' & '0'); + VARIABLE RW_interrupt_bank : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; + VARIABLE RW_interrupt_counter : Array4xI := (0 & 0 & 0 & 0); + VARIABLE Count_precharge : Array4xI := (0 & 0 & 0 & 0); + + VARIABLE Data_in_enable, Data_out_enable : STD_LOGIC := '0'; + VARIABLE Pc_b0, Pc_b1, Pc_b2, Pc_b3 : STD_LOGIC := '0'; + VARIABLE Act_b0, Act_b1, Act_b2, Act_b3 : STD_LOGIC := '1'; + + -- Timing Check + VARIABLE MRD_chk : INTEGER := 0; + VARIABLE RFC_chk : TIME := 0 ns; + VARIABLE RRD_chk : TIME := 0 ns; + VARIABLE WR_chkm : Array4xT := (0 ns & 0 ns & 0 ns & 0 ns); + VARIABLE RAS_chk0, RAS_chk1, RAS_chk2, RAS_chk3 : TIME := 0 ns; + VARIABLE RC_chk0, RC_chk1, RC_chk2, RC_chk3 : TIME := 0 ns; + VARIABLE RCD_chk0, RCD_chk1, RCD_chk2, RCD_chk3 : TIME := 0 ns; + VARIABLE RP_chk0, RP_chk1, RP_chk2, RP_chk3 : TIME := 0 ns; + + -- Initialize empty rows + PROCEDURE Init_mem (Bank : STD_LOGIC_VECTOR (1 DOWNTO 0); Row_index : INTEGER) IS + VARIABLE i, j : INTEGER := 0; + BEGIN + IF Bank = "00" THEN + IF Bank0 (Row_index) = NULL THEN -- Check to see if row empty + Bank0 (Row_index) := NEW ram_type; -- Open new row for access + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP -- Filled row with zeros + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank0 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "01" THEN + IF Bank1 (Row_index) = NULL THEN + Bank1 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank1 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "10" THEN + IF Bank2 (Row_index) = NULL THEN + Bank2 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank2 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + ELSIF Bank = "11" THEN + IF Bank3 (Row_index) = NULL THEN + Bank3 (Row_index) := NEW ram_type; + FOR i IN (2**col_bits - 1) DOWNTO 0 LOOP + FOR j IN (data_bits - 1) DOWNTO 0 LOOP + Bank3 (Row_index) (i) (j) := '0'; + END LOOP; + END LOOP; + END IF; + END IF; + END; + + -- Burst Counter + PROCEDURE Burst_decode IS + VARIABLE Col_int : INTEGER := 0; + VARIABLE Col_vec, Col_temp : STD_LOGIC_VECTOR (col_bits - 1 DOWNTO 0) := (OTHERS => '0'); + BEGIN + -- Advance Burst Counter + Burst_counter := Burst_counter + 1; + + -- Burst Type + IF Mode_reg (3) = '0' THEN + Col_int := conv_integer(Col) + 1; + Col_temp := CONV_STD_LOGIC_VECTOR(Col_int, col_bits); + ELSIF Mode_reg (3) = '1' THEN + Col_vec := CONV_STD_LOGIC_VECTOR(Burst_counter, col_bits); + Col_temp (2) := Col_vec (2) XOR Col_brst (2); + Col_temp (1) := Col_vec (1) XOR Col_brst (1); + Col_temp (0) := Col_vec (0) XOR Col_brst (0); + END IF; + + -- Burst Length + IF Burst_length_2 = '1' THEN + Col (0) := Col_temp (0); + ELSIF Burst_length_4 = '1' THEN + Col (1 DOWNTO 0) := Col_temp (1 DOWNTO 0); + ELSIF Burst_length_8 = '1' THEN + Col (2 DOWNTO 0) := Col_temp (2 DOWNTO 0); + ELSE + Col := Col_temp; + END IF; + + -- Burst Read Single Write + IF Write_burst_mode = '1' AND Data_in_enable = '1' THEN + Data_in_enable := '0'; + END IF; + + -- Data counter + IF Burst_length_1 = '1' THEN + IF Burst_counter >= 1 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_2 = '1' THEN + IF Burst_counter >= 2 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_4 = '1' THEN + IF Burst_counter >= 4 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Burst_length_8 = '1' THEN + IF Burst_counter >= 8 THEN + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + ELSIF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + END IF; + END; + + BEGIN + WAIT ON Sys_clk; + IF Sys_clk'event AND Sys_clk = '1' THEN + -- Internal Pipeline + Command(0) := Command(1); + Command(1) := Command(2); + Command(2) := Command(3); + Command(3) := NOP; + + Col_addr(0) := Col_addr(1); + Col_addr(1) := Col_addr(2); + Col_addr(2) := Col_addr(3); + Col_addr(3) := (OTHERS => '0'); + + Bank_addr(0) := Bank_addr(1); + Bank_addr(1) := Bank_addr(2); + Bank_addr(2) := Bank_addr(3); + Bank_addr(3) := "00"; + + Bank_precharge(0) := Bank_precharge(1); + Bank_precharge(1) := Bank_precharge(2); + Bank_precharge(2) := Bank_precharge(3); + Bank_precharge(3) := "00"; + + A10_precharge(0) := A10_precharge(1); + A10_precharge(1) := A10_precharge(2); + A10_precharge(2) := A10_precharge(3); + A10_precharge(3) := '0'; + + -- Dqm pipeline for Read + Dqm_reg0 := Dqm_reg1; + Dqm_reg1 := Dqm; + + -- Read or Write with Auto Precharge Counter + IF Auto_precharge (0) = '1' THEN + Count_precharge (0) := Count_precharge (0) + 1; + END IF; + IF Auto_precharge (1) = '1' THEN + Count_precharge (1) := Count_precharge (1) + 1; + END IF; + IF Auto_precharge (2) = '1' THEN + Count_precharge (2) := Count_precharge (2) + 1; + END IF; + IF Auto_precharge (3) = '1' THEN + Count_precharge (3) := Count_precharge (3) + 1; + END IF; + + -- Read or Write Interrupt Counter + IF RW_interrupt_write (0) = '1' THEN + RW_interrupt_counter (0) := RW_interrupt_counter (0) + 1; + END IF; + IF RW_interrupt_write (1) = '1' THEN + RW_interrupt_counter (1) := RW_interrupt_counter (1) + 1; + END IF; + IF RW_interrupt_write (2) = '1' THEN + RW_interrupt_counter (2) := RW_interrupt_counter (2) + 1; + END IF; + IF RW_interrupt_write (3) = '1' THEN + RW_interrupt_counter (3) := RW_interrupt_counter (3) + 1; + END IF; + + -- tMRD Counter + MRD_chk := MRD_chk + 1; + + -- Auto Refresh + IF Aref_enable = '1' THEN + -- Auto Refresh to Auto Refresh + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Auto Refresh" + SEVERITY WARNING; + + -- Precharge to Auto Refresh + ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR + (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) + REPORT "tRP violation during Auto Refresh" + SEVERITY WARNING; + + -- Precharge to Auto Refresh + ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') + REPORT "All banks must be Precharge before Auto Refresh" + SEVERITY WARNING; + + -- Load Mode Register to Auto Refresh + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Auto Refresh" + SEVERITY WARNING; + + -- Record current tRFC time + RFC_chk := NOW; + END IF; + + -- Load Mode Register + IF Mode_reg_enable = '1' THEN + -- Register Mode + Mode_reg <= Addr; + + -- Precharge to Load Mode Register + ASSERT (Pc_b0 ='1' AND Pc_b1 = '1' AND Pc_b2 ='1' AND Pc_b3 = '1') + REPORT "All banks must be Precharge before Load Mode Register" + SEVERITY WARNING; + + -- Precharge to Load Mode Register + ASSERT ((NOW - RP_chk0 >= tRP) OR (NOW - RP_chk1 >= tRP) OR + (NOW - RP_chk2 >= tRP) OR (NOW - RP_chk3 >= tRP)) + REPORT "tRP violation during Load Mode Register" + SEVERITY WARNING; + + -- Auto Refresh to Load Mode Register + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Load Mode Register" + SEVERITY WARNING; + + -- Load Mode Register to Load Mode Register + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Load Mode Register" + SEVERITY WARNING; + + -- Record current tMRD time + MRD_chk := 0; + END IF; + + -- Active Block (Latch Bank and Row Address) + IF Active_enable = '1' THEN + -- Activate an OPEN bank can corrupt data + ASSERT ((Ba = "00" AND Act_b0 = '0') OR (Ba = "01" AND Act_b1 = '0') OR + (Ba = "10" AND Act_b2 = '0') OR (Ba = "11" AND Act_b3 = '0')) + REPORT "Bank is already activated - data can be corrupted" + SEVERITY WARNING; + + -- Activate Bank 0 + IF Ba = "00" AND Pc_b0 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk0 >= tRC) + REPORT "tRC violation during Activate Bank 0" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk0 >= tRP) + REPORT "tRP violation during Activate Bank 0" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b0 := '1'; + Pc_b0 := '0'; + B0_row_addr := Addr; + RAS_chk0 := NOW; + RC_chk0 := NOW; + RCD_chk0 := NOW; + END IF; + + -- Activate Bank 1 + IF Ba = "01" AND Pc_b1 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk1 >= tRC) + REPORT "tRC violation during Activate Bank 1" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk1 >= tRP) + REPORT "tRP violation during Activate Bank 1" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b1 := '1'; + Pc_b1 := '0'; + B1_row_addr := Addr; + RAS_chk1 := NOW; + RC_chk1 := NOW; + RCD_chk1 := NOW; + END IF; + + -- Activate Bank 2 + IF Ba = "10" AND Pc_b2 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk2 >= tRC) + REPORT "tRC violation during Activate Bank 2" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk2 >= tRP) + REPORT "tRP violation during Activate Bank 2" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b2 := '1'; + Pc_b2 := '0'; + B2_row_addr := Addr; + RAS_chk2 := NOW; + RC_chk2 := NOW; + RCD_chk2 := NOW; + END IF; + + -- Activate Bank 3 + IF Ba = "11" AND Pc_b3 = '1' THEN + -- Activate to Activate (same bank) + ASSERT (NOW - RC_chk3 >= tRC) + REPORT "tRC violation during Activate Bank 3" + SEVERITY WARNING; + + -- Precharge to Activate + ASSERT (NOW - RP_chk3 >= tRP) + REPORT "tRP violation during Activate Bank 3" + SEVERITY WARNING; + + -- Record variables for checking violation + Act_b3 := '1'; + Pc_b3 := '0'; + B3_row_addr := Addr; + RAS_chk3 := NOW; + RC_chk3 := NOW; + RCD_chk3 := NOW; + END IF; + + -- Activate to Activate (different bank) + IF (Prev_bank /= Ba) THEN + ASSERT (NOW - RRD_chk >= tRRD) + REPORT "tRRD violation during Activate" + SEVERITY WARNING; + END IF; + + -- Auto Refresh to Activate + ASSERT (NOW - RFC_chk >= tRFC) + REPORT "tRFC violation during Activate" + SEVERITY WARNING; + + -- Load Mode Register to Activate + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Activate" + SEVERITY WARNING; + + -- Record variable for checking violation + RRD_chk := NOW; + Prev_Bank := Ba; + END IF; + + -- Precharge Block + IF Prech_enable = '1' THEN + -- Load Mode Register to Precharge + ASSERT (MRD_chk >= tMRD) + REPORT "tMRD violation during Precharge" + SEVERITY WARNING; + + -- Precharge Bank 0 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "00")) AND Act_b0 = '1') THEN + Act_b0 := '0'; + Pc_b0 := '1'; + RP_chk0 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk0 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(0) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 1 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "01")) AND Act_b1 = '1') THEN + Act_b1 := '0'; + Pc_b1 := '1'; + RP_chk1 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk1 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(1) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 2 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "10")) AND Act_b2 = '1') THEN + Act_b2 := '0'; + Pc_b2 := '1'; + RP_chk2 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk2 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(2) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Precharge Bank 3 + IF ((Addr (10) = '1' OR (Addr (10) = '0' AND Ba = "11")) AND Act_b3 = '1') THEN + Act_b3 := '0'; + Pc_b3 := '1'; + RP_chk3 := NOW; + + -- Activate to Precharge + ASSERT (NOW - RAS_chk3 >= tRAS) + REPORT "tRAS violation during Precharge" + SEVERITY WARNING; + + -- tWR violation check for Write + ASSERT (NOW - WR_chkm(3) >= tWRm) + REPORT "tWR violation during Precharge" + SEVERITY WARNING; + END IF; + + -- Terminate a Write Immediately (if same bank or all banks) + IF (Data_in_enable = '1' AND (Bank = Ba OR Addr(10) = '1')) THEN + Data_in_enable := '0'; + END IF; + + -- Precharge Command Pipeline for READ + IF CAS_latency_3 = '1' THEN + Command(2) := PRECH; + Bank_precharge(2) := Ba; + A10_precharge(2) := Addr(10); + ELSIF CAS_latency_2 = '1' THEN + Command(1) := PRECH; + Bank_precharge(1) := Ba; + A10_precharge(1) := Addr(10); + END IF; + END IF; + + -- Burst Terminate + IF Burst_term = '1' THEN + -- Terminate a Write immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + END IF; + + -- Terminate a Read depend on CAS Latency + IF CAS_latency_3 = '1' THEN + Command(2) := BST; + ELSIF CAS_latency_2 = '1' THEN + Command(1) := BST; + END IF; + END IF; + + -- Read Command + IF Read_enable = '1' THEN + -- Activate to Read + ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR + (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) + REPORT "Bank is not Activated for Read" + SEVERITY WARNING; + + -- Activate to Read + ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR + (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR + (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR + (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) + REPORT "tRCD violation during Read" + SEVERITY WARNING; + + -- CAS Latency Pipeline + IF Cas_latency_3 = '1' THEN + Command(2) := READ; + Col_addr (2) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (2) := Ba; + ELSIF Cas_latency_2 = '1' THEN + Command(1) := READ; + Col_addr (1) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (1) := Ba; + ELSIF Cas_latency_1 = '1' THEN + Command(0) := READ; + Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (0) := Ba; + END IF; + + -- Read Terminate Write Immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + -- Interrupt a Write with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; + ASSERT FALSE REPORT "Read interrupt a Write with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Read Terminate Read after CL - 1 + IF (Data_out_enable = '1' AND ((Cas_latency_2 = '1' AND ((Burst_length_2 = '1' AND Burst_counter < 1) OR + (Burst_length_4 = '1' AND Burst_counter < 3) OR + (Burst_length_8 = '1' AND Burst_counter < 7))) OR + (Cas_latency_3 = '1' AND ((Burst_length_4 = '1' AND Burst_counter < 2) OR + (Burst_length_8 = '1' AND Burst_counter < 6))))) THEN + -- Interrupt a Read with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + ASSERT FALSE REPORT "Read interrupt a Read with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Auto Precharge + IF Addr(10) = '1' THEN + Auto_precharge (CONV_INTEGER(Ba)) := '1'; + Count_precharge (CONV_INTEGER(Ba)) := 0; + RW_Interrupt_Bank := Ba; + Read_precharge (CONV_INTEGER(Ba)) := '1'; + END IF; + END IF; + + -- Write Command + IF Write_enable = '1' THEN + -- Activate to Write + ASSERT ((Ba="00" AND Act_b0='1') OR (Ba="01" AND Act_b1='1') OR + (Ba="10" AND Act_b2='1') OR (Ba="11" AND Act_b3='1')) + REPORT "Bank is not Activated for Write" + SEVERITY WARNING; + + -- Activate to Write + ASSERT ((Ba = "00" AND NOW - RCD_chk0 >= tRCD) OR + (Ba = "01" AND NOW - RCD_chk1 >= tRCD) OR + (Ba = "10" AND NOW - RCD_chk2 >= tRCD) OR + (Ba = "11" AND NOW - RCD_chk3 >= tRCD)) + REPORT "tRCD violation during Write" + SEVERITY WARNING; + + -- Latch write command, bank, column + Command(0) := WRITE; + Col_addr (0) := Addr(col_bits - 1 DOWNTO 0); + Bank_addr (0) := Ba; + + -- Write Terminate Write Immediately + IF Data_in_enable = '1' THEN + Data_in_enable := '0'; + + -- Interrupt a Write with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Write_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_write(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + RW_interrupt_counter (CONV_INTEGER(RW_Interrupt_Bank)) := 0; + ASSERT FALSE REPORT "Write interrupt a Write with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Write Terminate Read Immediately + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + + -- Interrupt a Read with Auto Precharge + IF Auto_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' AND Read_precharge(CONV_INTEGER(RW_Interrupt_Bank)) = '1' THEN + RW_interrupt_read(CONV_INTEGER(RW_Interrupt_Bank)) := '1'; + ASSERT FALSE REPORT "Write interrupt a Read with Auto Precharge." SEVERITY NOTE; + END IF; + END IF; + + -- Auto Precharge + IF Addr(10) = '1' THEN + Auto_precharge (CONV_INTEGER(Ba)) := '1'; + Count_precharge (CONV_INTEGER(Ba)) := 0; + RW_Interrupt_Bank := Ba; + Write_precharge (CONV_INTEGER(Ba)) := '1'; + END IF; + END IF; + + -- Write with AutoPrecharge Calculation + -- The device start internal precharge when: + -- 1. Meet tRAS requirement + -- and 2. tWR cycle(s) after last valid data + -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) + -- + -- Note: Model is starting the internal precharge 1 cycle after they meet all the + -- requirement but tRP will be compensate for the time after the 1 cycle. + IF ((Auto_precharge(0) = '1') AND (Write_precharge(0) = '1')) THEN + IF (((NOW - RAS_chk0 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(0) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR + (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(0) >= 1)) THEN + Auto_precharge(0) := '0'; + Write_precharge(0) := '0'; + RW_interrupt_write(0) := '0'; + Pc_b0 := '1'; + Act_b0 := '0'; + RP_chk0 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(1) = '1') AND (Write_precharge(1) = '1')) THEN + IF (((NOW - RAS_chk1 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(1) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR + (RW_interrupt_write(1) = '1' AND RW_interrupt_counter(1) >= 1)) THEN + Auto_precharge(1) := '0'; + Write_precharge(1) := '0'; + RW_interrupt_write(1) := '0'; + Pc_b1 := '1'; + Act_b1 := '0'; + RP_chk1 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(2) = '1') AND (Write_precharge(2) = '1')) THEN + IF (((NOW - RAS_chk2 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(2) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR + (RW_interrupt_write(2) = '1' AND RW_interrupt_counter(2) >= 1)) THEN + Auto_precharge(2) := '0'; + Write_precharge(2) := '0'; + RW_interrupt_write(2) := '0'; + Pc_b2 := '1'; + Act_b2 := '0'; + RP_chk2 := NOW + tWRa; + END IF; + END IF; + IF ((Auto_precharge(3) = '1') AND (Write_precharge(3) = '1')) THEN + IF (((NOW - RAS_chk3 >= tRAS) AND + (((Burst_length_1 = '1' OR Write_burst_mode = '1' ) AND Count_precharge(3) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR + (RW_interrupt_write(0) = '1' AND RW_interrupt_counter(3) >= 1)) THEN + Auto_precharge(3) := '0'; + Write_precharge(3) := '0'; + RW_interrupt_write(3) := '0'; + Pc_b3 := '1'; + Act_b3 := '0'; + RP_chk3 := NOW + tWRa; + END IF; + END IF; + + -- Read with AutoPrecharge Calculation + -- The device start internal precharge when: + -- 1. Meet minimum tRAS requirement + -- and 2. CL - 1 cycle(s) before last valid data + -- or 3. Interrupt by a Read or Write (with or without Auto Precharge) + IF ((Auto_precharge(0) = '1') AND (Read_precharge(0) = '1')) THEN + IF (((NOW - RAS_chk0 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(0) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(0) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(0) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(0) >= 8))) OR + (RW_interrupt_read(0) = '1')) THEN + Pc_b0 := '1'; + Act_b0 := '0'; + RP_chk0 := NOW; + Auto_precharge(0) := '0'; + Read_precharge(0) := '0'; + RW_interrupt_read(0) := '0'; + END IF; + END IF; + IF ((Auto_precharge(1) = '1') AND (Read_precharge(1) = '1')) THEN + IF (((NOW - RAS_chk1 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(1) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(1) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(1) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(1) >= 8))) OR + (RW_interrupt_read(1) = '1')) THEN + Pc_b1 := '1'; + Act_b1 := '0'; + RP_chk1 := NOW; + Auto_precharge(1) := '0'; + Read_precharge(1) := '0'; + RW_interrupt_read(1) := '0'; + END IF; + END IF; + IF ((Auto_precharge(2) = '1') AND (Read_precharge(2) = '1')) THEN + IF (((NOW - RAS_chk2 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(2) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(2) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(2) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(2) >= 8))) OR + (RW_interrupt_read(2) = '1')) THEN + Pc_b2 := '1'; + Act_b2 := '0'; + RP_chk2 := NOW; + Auto_precharge(2) := '0'; + Read_precharge(2) := '0'; + RW_interrupt_read(2) := '0'; + END IF; + END IF; + IF ((Auto_precharge(3) = '1') AND (Read_precharge(3) = '1')) THEN + IF (((NOW - RAS_chk3 >= tRAS) AND + ((Burst_length_1 = '1' AND Count_precharge(3) >= 1) OR + (Burst_length_2 = '1' AND Count_precharge(3) >= 2) OR + (Burst_length_4 = '1' AND Count_precharge(3) >= 4) OR + (Burst_length_8 = '1' AND Count_precharge(3) >= 8))) OR + (RW_interrupt_read(3) = '1')) THEN + Pc_b3 := '1'; + Act_b3 := '0'; + RP_chk3 := NOW; + Auto_precharge(3) := '0'; + Read_precharge(3) := '0'; + RW_interrupt_read(3) := '0'; + END IF; + END IF; + + -- Internal Precharge or Bst + IF Command(0) = PRECH THEN -- PRECH terminate a read if same bank or all banks + IF Bank_precharge(0) = Bank OR A10_precharge(0) = '1' THEN + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + ELSIF Command(0) = BST THEN -- BST terminate a read regardless of bank + IF Data_out_enable = '1' THEN + Data_out_enable := '0'; + END IF; + END IF; + + IF Data_out_enable = '0' THEN + Dq <= TRANSPORT (OTHERS => 'Z') AFTER tOH; + END IF; + + -- Detect Read or Write Command + IF Command(0) = READ THEN + Bank := Bank_addr (0); + Col := Col_addr (0); + Col_brst := Col_addr (0); + IF Bank_addr (0) = "00" THEN + Row := B0_row_addr; + ELSIF Bank_addr (0) = "01" THEN + Row := B1_row_addr; + ELSIF Bank_addr (0) = "10" THEN + Row := B2_row_addr; + ELSE + Row := B3_row_addr; + END IF; + Burst_counter := 0; + Data_in_enable := '0'; + Data_out_enable := '1'; + ELSIF Command(0) = WRITE THEN + Bank := Bank_addr(0); + Col := Col_addr(0); + Col_brst := Col_addr(0); + IF Bank_addr (0) = "00" THEN + Row := B0_row_addr; + ELSIF Bank_addr (0) = "01" THEN + Row := B1_row_addr; + ELSIF Bank_addr (0) = "10" THEN + Row := B2_row_addr; + ELSE + Row := B3_row_addr; + END IF; + Burst_counter := 0; + Data_in_enable := '1'; + Data_out_enable := '0'; + END IF; + + -- DQ (Driver / Receiver) + Row_index := CONV_INTEGER (Row); + Col_index := CONV_INTEGER (Col); + + IF Data_in_enable = '1' THEN + IF Dqm /= "1111" THEN + -- Initialize Memory + Init_mem (Bank, Row_index); + + -- Array Buffer + CASE Bank IS + WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); + WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); + WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); + WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); + END CASE; + + -- Dqm Operation + IF Dqm (0) = '0' THEN + Dq_temp ( 7 DOWNTO 0) := Dq ( 7 DOWNTO 0); + END IF; + IF Dqm (1) = '0' THEN + Dq_temp (15 DOWNTO 8) := Dq (15 DOWNTO 8); + END IF; + IF Dqm (2) = '0' THEN + Dq_temp (23 DOWNTO 16) := Dq (23 DOWNTO 16); + END IF; + IF Dqm (3) = '0' THEN + Dq_temp (31 DOWNTO 24) := Dq (31 DOWNTO 24); + END IF; + + -- Write to Memory + CASE Bank IS + WHEN "00" => Bank0 (Row_index) (Col_index) := Dq_temp; + WHEN "01" => Bank1 (Row_index) (Col_index) := Dq_temp; + WHEN "10" => Bank2 (Row_index) (Col_index) := Dq_temp; + WHEN OTHERS => Bank3 (Row_index) (Col_index) := Dq_temp; + END CASE; + + -- Record tWR for manual precharge + WR_chkm(CONV_INTEGER(Bank)) := NOW; + END IF; + + -- Advance Burst Counter + Burst_decode; + + ELSIF Data_out_enable = '1' THEN + IF Dqm_reg0 /= "1111" THEN + -- Initialize Memory + Init_mem (Bank, Row_index); + + -- Array Buffer + CASE Bank IS + WHEN "00" => Dq_temp := Bank0 (Row_index) (Col_index); + WHEN "01" => Dq_temp := Bank1 (Row_index) (Col_index); + WHEN "10" => Dq_temp := Bank2 (Row_index) (Col_index); + WHEN OTHERS => Dq_temp := Bank3 (Row_index) (Col_index); + END CASE; + + -- Dqm Operation + IF Dqm_reg0 (0) = '1' THEN + Dq_temp ( 7 DOWNTO 0) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (1) = '1' THEN + Dq_temp (15 DOWNTO 8) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (2) = '1' THEN + Dq_temp (23 DOWNTO 16) := (OTHERS => 'Z'); + END IF; + IF Dqm_reg0 (3) = '1' THEN + Dq_temp (31 DOWNTO 24) := (OTHERS => 'Z'); + END IF; + + -- Output + Dq <= TRANSPORT Dq_temp AFTER tAC; + ELSE + Dq <= TRANSPORT (OTHERS => 'Z') AFTER tHZ; + END IF; + + -- Advance Burst Counter + Burst_decode; + END IF; + END IF; + + END PROCESS; + + -- Clock timing checks + Clock_check : PROCESS + VARIABLE Clk_low, Clk_high : TIME := 0 ns; + BEGIN + WAIT ON Clk; + IF (Clk = '1' AND NOW >= 10 ns) THEN + ASSERT (NOW - Clk_low >= tCL) + REPORT "tCL violation" + SEVERITY WARNING; + ASSERT (NOW - Clk_high >= tCK) + REPORT "tCK violation" + SEVERITY WARNING; + Clk_high := NOW; + ELSIF (Clk = '0' AND NOW /= 0 ns) THEN + ASSERT (NOW - Clk_high >= tCH) + REPORT "tCH violation" + SEVERITY WARNING; + Clk_low := NOW; + END IF; + END PROCESS; + + -- Setup timing checks + Setup_check : PROCESS + BEGIN + WAIT ON Clk; + IF Clk = '1' THEN + ASSERT(Cke'LAST_EVENT >= tCKS) + REPORT "CKE Setup time violation -- tCKS" + SEVERITY WARNING; + ASSERT(Cs_n'LAST_EVENT >= tCMS) + REPORT "CS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Cas_n'LAST_EVENT >= tCMS) + REPORT "CAS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Ras_n'LAST_EVENT >= tCMS) + REPORT "RAS# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(We_n'LAST_EVENT >= tCMS) + REPORT "WE# Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Dqm'LAST_EVENT >= tCMS) + REPORT "Dqm Setup time violation -- tCMS" + SEVERITY WARNING; + ASSERT(Addr'LAST_EVENT >= tAS) + REPORT "ADDR Setup time violation -- tAS" + SEVERITY WARNING; + ASSERT(Ba'LAST_EVENT >= tAS) + REPORT "BA Setup time violation -- tAS" + SEVERITY WARNING; + ASSERT(Dq'LAST_EVENT >= tDS) + REPORT "Dq Setup time violation -- tDS" + SEVERITY WARNING; + END IF; + END PROCESS; + + -- Hold timing checks + Hold_check : PROCESS + BEGIN + WAIT ON Clk'DELAYED (tCKH), Clk'DELAYED (tCMH), Clk'DELAYED (tAH), Clk'DELAYED (tDH); + IF Clk'DELAYED (tCKH) = '1' THEN + ASSERT(Cke'LAST_EVENT > tCKH) + REPORT "CKE Hold time violation -- tCKH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tCMH) = '1' THEN + ASSERT(Cs_n'LAST_EVENT > tCMH) + REPORT "CS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Cas_n'LAST_EVENT > tCMH) + REPORT "CAS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Ras_n'LAST_EVENT > tCMH) + REPORT "RAS# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(We_n'LAST_EVENT > tCMH) + REPORT "WE# Hold time violation -- tCMH" + SEVERITY WARNING; + ASSERT(Dqm'LAST_EVENT > tCMH) + REPORT "Dqm Hold time violation -- tCMH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tAH) = '1' THEN + ASSERT(Addr'LAST_EVENT > tAH) + REPORT "ADDR Hold time violation -- tAH" + SEVERITY WARNING; + ASSERT(Ba'LAST_EVENT > tAH) + REPORT "BA Hold time violation -- tAH" + SEVERITY WARNING; + END IF; + IF Clk'DELAYED (tDH) = '1' THEN + ASSERT(Dq'LAST_EVENT > tDH) + REPORT "Dq Hold time violation -- tDH" + SEVERITY WARNING; + END IF; + END PROCESS; + +END behave; Index: sdram_ctrl/tags/V10/test_bench/cpu_simulator.vhd =================================================================== --- sdram_ctrl/tags/V10/test_bench/cpu_simulator.vhd (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/cpu_simulator.vhd (revision 8) @@ -0,0 +1,72 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +ENTITY cpu_simulator IS + PORT(clk, reset: in std_logic; + + address : out std_logic_vector(21 downto 0); + writedata : out std_logic_vector(31 downto 0); + byteenable : out std_logic_vector(3 downto 0); + write : out std_logic; + read : out std_logic; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); +END cpu_simulator; + +ARCHITECTURE behaviour OF cpu_simulator IS + signal counter: unsigned(3 downto 0); + type vector is + record + address: integer; + writedata: integer; + byteenable: std_logic_vector(3 downto 0); + write: std_logic; + read: std_logic; + end record; + type script is array(0 to (2**counter'length)-1) of vector; + signal wave_form: script:=( + (0,0,"1111",'1','0'), + (1,1,"1111",'1','0'), + (2,2,"1111",'1','0'), + (3,3,"1111",'1','0'), + (1024,1024,"1111",'0','1'), + (1025,1025,"1111",'0','1'), + (1026,1026,"1111",'0','1'), + (1027,1027,"1111",'0','1'), + (1024,1024,"1111",'1','0'), + (1025,1025,"1111",'1','0'), + (1026,1026,"1111",'1','0'), + (1027,1027,"1111",'1','0'), + (0,0,"1111",'0','1'), + (1,1,"1111",'0','1'), + (2,2,"1111",'0','1'), + (3,3,"1111",'0','1') + ); +BEGIN + process(clk,reset) + begin + if reset='1' + then + counter<=(others=>'0'); + address<=(others=>'0'); + writedata<=(others=>'0'); + byteenable<=(others=>'0'); + write<='0'; + read<='0'; + elsif rising_edge(clk) + then + if waitrequest='0' + then + counter<=counter+1; + address<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).address,address'length)); + writedata<=std_logic_vector(to_unsigned(wave_form(to_integer(counter)).writedata,writedata'length)); + byteenable<=wave_form(to_integer(counter)).byteenable; + write<=wave_form(to_integer(counter)).write; + read<=wave_form(to_integer(counter)).read; + end if; + end if; + end process; +END behaviour; \ No newline at end of file Index: sdram_ctrl/tags/V10/test_bench/pll.vhd =================================================================== --- sdram_ctrl/tags/V10/test_bench/pll.vhd (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/pll.vhd (revision 8) @@ -0,0 +1,256 @@ +-- megafunction wizard: %ALTPLL% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altpll + +-- ============================================================ +-- File Name: pll.vhd +-- Megafunction Name(s): +-- altpll +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 5.1 Build 213 01/19/2006 SP 1 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2006 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 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.altera_mf_components.all; + +ENTITY pll IS + PORT + ( + inclk0 : IN STD_LOGIC := '0'; + c0 : OUT STD_LOGIC ; + e0 : OUT STD_LOGIC ; + locked : OUT STD_LOGIC + ); +END pll; + + +ARCHITECTURE SYN OF pll 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_VECTOR (3 DOWNTO 0); + SIGNAL sub_wire4 : STD_LOGIC ; + SIGNAL sub_wire5 : STD_LOGIC ; + SIGNAL sub_wire6 : STD_LOGIC_VECTOR (1 DOWNTO 0); + SIGNAL sub_wire7_bv : BIT_VECTOR (0 DOWNTO 0); + SIGNAL sub_wire7 : 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; + extclk0_divide_by : NATURAL; + extclk0_duty_cycle : NATURAL; + extclk0_multiply_by : NATURAL; + extclk0_phase_shift : STRING; + inclk0_input_frequency : NATURAL; + intended_device_family : STRING; + invalid_lock_multiplier : NATURAL; + lpm_type : STRING; + operation_mode : STRING; + pll_type : STRING; + valid_lock_multiplier : NATURAL + ); + PORT ( + extclk : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); + inclk : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + locked : OUT STD_LOGIC ; + clk : OUT STD_LOGIC_VECTOR (5 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + sub_wire7_bv(0 DOWNTO 0) <= "0"; + sub_wire7 <= To_stdlogicvector(sub_wire7_bv); + sub_wire1 <= sub_wire0(0); + c0 <= sub_wire1; + locked <= sub_wire2; + sub_wire4 <= sub_wire3(0); + e0 <= sub_wire4; + sub_wire5 <= inclk0; + sub_wire6 <= sub_wire7(0 DOWNTO 0) & sub_wire5; + + altpll_component : altpll + GENERIC MAP ( + clk0_divide_by => 2, + clk0_duty_cycle => 50, + clk0_multiply_by => 11, + clk0_phase_shift => "0", + compensate_clock => "CLK0", + extclk0_divide_by => 2, + extclk0_duty_cycle => 50, + extclk0_multiply_by => 11, + extclk0_phase_shift => "5682", + inclk0_input_frequency => 41666, + intended_device_family => "Cyclone", + invalid_lock_multiplier => 5, + lpm_type => "altpll", + operation_mode => "NORMAL", + pll_type => "AUTO", + valid_lock_multiplier => 1 + ) + PORT MAP ( + inclk => sub_wire6, + clk => sub_wire0, + locked => sub_wire2, + extclk => sub_wire3 + ); + + + +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 "0" +-- 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_FAMILY NUMERIC "11" +-- Retrieval info: PRIVATE: DEVICE_SPEED_GRADE STRING "Any" +-- Retrieval info: PRIVATE: DEV_FAMILY STRING "Cyclone" +-- Retrieval info: PRIVATE: DIV_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: DIV_FACTOR6 NUMERIC "1" +-- Retrieval info: PRIVATE: DUTY_CYCLE0 STRING "50.00000000" +-- Retrieval info: PRIVATE: DUTY_CYCLE6 STRING "50.00000000" +-- Retrieval info: PRIVATE: EXT_FEEDBACK_RADIO STRING "0" +-- Retrieval info: PRIVATE: GLOCKED_COUNTER_EDIT_CHANGED STRING "1" +-- Retrieval info: PRIVATE: GLOCKED_FEATURE_ENABLED STRING "0" +-- 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: INT_FEEDBACK__MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: LOCKED_OUTPUT_CHECK STRING "1" +-- Retrieval info: PRIVATE: LOCK_LOSS_SWITCHOVER_CHECK STRING "0" +-- Retrieval info: PRIVATE: LONG_SCAN_RADIO STRING "1" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE STRING "504.000" +-- Retrieval info: PRIVATE: LVDS_MODE_DATA_RATE_DIRTY NUMERIC "0" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: LVDS_PHASE_SHIFT_UNIT6 STRING "deg" +-- Retrieval info: PRIVATE: MIRROR_CLK0 STRING "0" +-- Retrieval info: PRIVATE: MIRROR_CLK6 STRING "0" +-- Retrieval info: PRIVATE: MULT_FACTOR0 NUMERIC "1" +-- Retrieval info: PRIVATE: MULT_FACTOR6 NUMERIC "1" +-- Retrieval info: PRIVATE: NORMAL_MODE_RADIO STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ0 STRING "132.000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ6 STRING "100.000" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE0 STRING "1" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_MODE6 STRING "0" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT0 STRING "MHz" +-- Retrieval info: PRIVATE: OUTPUT_FREQ_UNIT6 STRING "MHz" +-- Retrieval info: PRIVATE: PHASE_SHIFT0 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT6 STRING "0.00000000" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT0 STRING "deg" +-- Retrieval info: PRIVATE: PHASE_SHIFT_UNIT6 STRING "deg" +-- Retrieval info: PRIVATE: PLL_ADVANCED_PARAM_CHECK STRING "0" +-- Retrieval info: PRIVATE: PLL_ARESET_CHECK STRING "0" +-- 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_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: SACN_INPUTS_CHECK STRING "0" +-- Retrieval info: PRIVATE: SCAN_FEATURE_ENABLED 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: STICKY_CLK6 STRING "0" +-- Retrieval info: PRIVATE: SWITCHOVER_COUNT_EDIT NUMERIC "1" +-- Retrieval info: PRIVATE: SWITCHOVER_FEATURE_ENABLED STRING "0" +-- Retrieval info: PRIVATE: USE_CLK0 STRING "1" +-- Retrieval info: PRIVATE: USE_CLK6 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA0 STRING "0" +-- Retrieval info: PRIVATE: USE_CLKENA6 STRING "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 "2" +-- Retrieval info: CONSTANT: CLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: CLK0_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: CLK0_PHASE_SHIFT STRING "0" +-- Retrieval info: CONSTANT: COMPENSATE_CLOCK STRING "CLK0" +-- Retrieval info: CONSTANT: EXTCLK0_DIVIDE_BY NUMERIC "2" +-- Retrieval info: CONSTANT: EXTCLK0_DUTY_CYCLE NUMERIC "50" +-- Retrieval info: CONSTANT: EXTCLK0_MULTIPLY_BY NUMERIC "11" +-- Retrieval info: CONSTANT: EXTCLK0_PHASE_SHIFT STRING "5682" +-- Retrieval info: CONSTANT: INCLK0_INPUT_FREQUENCY NUMERIC "41666" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone" +-- 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: PLL_TYPE STRING "AUTO" +-- Retrieval info: CONSTANT: VALID_LOCK_MULTIPLIER NUMERIC "1" +-- Retrieval info: USED_PORT: @clk 0 0 6 0 OUTPUT VCC "@clk[5..0]" +-- Retrieval info: USED_PORT: @extclk 0 0 4 0 OUTPUT VCC "@extclk[3..0]" +-- Retrieval info: USED_PORT: @inclk 0 0 2 0 INPUT VCC "@inclk[1..0]" +-- Retrieval info: USED_PORT: c0 0 0 0 0 OUTPUT VCC "c0" +-- Retrieval info: USED_PORT: e0 0 0 0 0 OUTPUT VCC "e0" +-- Retrieval info: USED_PORT: inclk0 0 0 0 0 INPUT 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: e0 0 0 0 0 @extclk 0 0 1 0 +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.vhd TRUE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.inc FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.cmp FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll.bsf FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_inst.vhd FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_waveforms.html FALSE FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL pll_wave*.jpg FALSE FALSE Index: sdram_ctrl/tags/V10/test_bench/old/nios.dat =================================================================== --- sdram_ctrl/tags/V10/test_bench/old/nios.dat (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/old/nios.dat (revision 8) @@ -0,0 +1 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file Index: sdram_ctrl/tags/V10/test_bench/old/Hello_LED_sdram_0.dat =================================================================== --- sdram_ctrl/tags/V10/test_bench/old/Hello_LED_sdram_0.dat (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/old/Hello_LED_sdram_0.dat (revision 8) @@ -0,0 +1,49 @@ +@00000000 00400034 +@00000001 08400804 +@00000002 0800683A +@00000003 00000000 +@00000004 00000000 +@00000005 00000000 +@00000006 00000000 +@00000007 00000000 +@00000008 06C04034 +@00000009 DEC00004 +@0000000A 06800074 +@0000000B D6A03104 +@0000000C 00000340 +@0000000D DEFFFD04 +@0000000E DF000215 +@0000000F D839883A +@00000010 00800084 +@00000011 E0800005 +@00000012 E0000045 +@00000013 E0800003 +@00000014 1080204C +@00000015 1005003A +@00000016 1000031E +@00000017 E0800043 +@00000018 1080005C +@00000019 E0800045 +@0000001A E0800043 +@0000001B 1005003A +@0000001C 1000041E +@0000001D E0800003 +@0000001E 1004D07A +@0000001F E0800005 +@00000020 00000306 +@00000021 E0800003 +@00000022 1085883A +@00000023 E0800005 +@00000024 00C04034 +@00000025 18C21004 +@00000026 E0800003 +@00000027 18800035 +@00000028 E0000115 +@00000029 E0C00117 +@0000002A 008000F4 +@0000002B 10834FC4 +@0000002C 10FFE616 +@0000002D E0800117 +@0000002E 10800044 +@0000002F E0800115 +@00000030 003FF806 Index: sdram_ctrl/tags/V10/test_bench/old/cpu_simulator_file_based.vhd =================================================================== --- sdram_ctrl/tags/V10/test_bench/old/cpu_simulator_file_based.vhd (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/old/cpu_simulator_file_based.vhd (revision 8) @@ -0,0 +1,79 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; + +ENTITY cpu_simulator IS + PORT(clk, reset: in std_logic; + + address : out std_logic_vector(21 downto 0); + writedata : out std_logic_vector(31 downto 0); + byteenable : out std_logic_vector(3 downto 0); + write : out std_logic; + read : out std_logic; + readdata : in std_logic_vector(31 downto 0); + waitrequest : in std_logic; + readdatavalid : in std_logic + ); +END cpu_simulator; + +ARCHITECTURE behaviour OF cpu_simulator IS + signal address: std_logic_vector(21 downto 0); + signal writedata: std_logic_vector(31 downto 0); + signal byteenable: std_logic_vector(3 downto 0); + signal write: std_logic; + signal read: std_logic; + +BEGIN + process(clk,reset) + variable service: std_logic_vector(7 downto 0); + variable b0,b1,b2,b3,b4,b5,b6,b7: BYTE; + begin + if reset='1' + then + file_close(NIOS); + file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); + elsif rising_edge(clk) + then + if waitrequest='0' + then + if Endfile(NIOS) + then + file_close(NIOS); + file_open(NIOS, FILES_PATH&"nios.dat", READ_MODE); + else + Read(NIOS,b0); + Read(NIOS,b1); + Read(NIOS,b2); + Read(NIOS,b3); + Read(NIOS,b4); + Read(NIOS,b5); + Read(NIOS,b6); + Read(NIOS,b7); + service:=char2std_logic_vector(b0); + address<=service(5 downto 0)&char2std_logic_vector(b1)&char2std_logic_vector(b2); + writedata<=char2std_logic_vector(b3)&char2std_logic_vector(b4)&char2std_logic_vector(b5)&char2std_logic_vector(b6); + service:=char2std_logic_vector(b7); + byteenable<=not service(7 downto 4); + write<=service(3); + read<=service(2); + end if; + end if; + end if; + end process; + + process(clk,reset) + begin + if reset='1' + then + readed<=(others=>'0'); + new_data<='0'; + elsif rising_edge(clk) + then + new_data<=readdatavalid; + if readdatavalid='1' + then + readed<=readdata; + end if; + end if; + end process; +END behaviour; \ No newline at end of file Index: sdram_ctrl/tags/V10/test_bench/old/Count_Binary_sdram_0.dat =================================================================== --- sdram_ctrl/tags/V10/test_bench/old/Count_Binary_sdram_0.dat (nonexistent) +++ sdram_ctrl/tags/V10/test_bench/old/Count_Binary_sdram_0.dat (revision 8) @@ -0,0 +1,5026 @@ +;Count Binary +@00000000 00820014 +@00000001 1001483A +@00000002 10BFF804 +@00000003 00BFFD16 +@00000004 00400034 +@00000005 08407204 +@00000006 0800683A +@00000007 00000000 +@00000008 DEFFED04 +@00000009 DFC00015 +@0000000A D8400215 +@0000000B D8800315 +@0000000C D8C00415 +@0000000D D9000515 +@0000000E D9400615 +@0000000F D9800715 +@00000010 D9C00815 +@00000011 000B307A +@00000012 DA000915 +@00000013 DA400A15 +@00000014 DA800B15 +@00000015 DAC00C15 +@00000016 DB000D15 +@00000017 DB400E15 +@00000018 DB800F15 +@00000019 DBC01015 +@0000001A D9401115 +@0000001B EBFFFF04 +@0000001C DBC01215 +@0000001D 0009313A +@0000001E 2880004C +@0000001F 10000326 +@00000020 20000226 +@00000021 00000EC0 +@00000022 00000306 +@00000023 DF401215 +@00000024 E8BFFF17 +@00000025 003DA03A +@00000026 D9401117 +@00000027 DF401217 +@00000028 DFC00017 +@00000029 2801707A +@0000002A D8400217 +@0000002B D8800317 +@0000002C D8C00417 +@0000002D D9000517 +@0000002E D9400617 +@0000002F D9800717 +@00000030 D9C00817 +@00000031 DA000917 +@00000032 DA400A17 +@00000033 DA800B17 +@00000034 DAC00C17 +@00000035 DB000D17 +@00000036 DB400E17 +@00000037 DB800F17 +@00000038 DBC01017 +@00000039 DEC01304 +@0000003A E800083A +@0000003B DEFFF904 +@0000003C DFC00615 +@0000003D DF000515 +@0000003E D839883A +@0000003F 0005313A +@00000040 E0800415 +@00000041 E0800417 +@00000042 E0800315 +@00000043 E0800317 +@00000044 E0800015 +@00000045 E0000215 +@00000046 00800044 +@00000047 E0800115 +@00000048 E0C00017 +@00000049 E0800117 +@0000004A 1884703A +@0000004B 1005003A +@0000004C 1000101E +@0000004D 00C00034 +@0000004E 18D3A504 +@0000004F E0800217 +@00000050 100490FA +@00000051 10C9883A +@00000052 00C00034 +@00000053 18D3A504 +@00000054 E0800217 +@00000055 100490FA +@00000056 10C5883A +@00000057 10800104 +@00000058 20C00017 +@00000059 11000017 +@0000005A E1400217 +@0000005B 183EE83A +@0000005C 00000706 +@0000005D E0800117 +@0000005E 1085883A +@0000005F E0800115 +@00000060 E0800217 +@00000061 10800044 +@00000062 E0800215 +@00000063 003FE406 +@00000064 0005313A +@00000065 E0800315 +@00000066 E0800317 +@00000067 E0800415 +@00000068 E0800417 +@00000069 E0800015 +@0000006A E0800017 +@0000006B 1005003A +@0000006C 1000011E +@0000006D 003FD706 +@0000006E DFC00617 +@0000006F DF000517 +@00000070 DEC00704 +@00000071 F800283A +@00000072 06C04034 +@00000073 DEC00004 +@00000074 06800074 +@00000075 D6B38B04 +@00000076 00800034 +@00000077 1093A104 +@00000078 00C00034 +@00000079 18D42804 +@0000007A 10C00326 +@0000007B 10000015 +@0000007C 10800104 +@0000007D 10FFFD36 +@0000007E 0000DB40 +@0000007F DEFFFE04 +@00000080 DFC00115 +@00000081 DF000015 +@00000082 D839883A +@00000083 01000034 +@00000084 210D8704 +@00000085 00005100 +@00000086 01000034 +@00000087 210D8F04 +@00000088 00005100 +@00000089 01000034 +@0000008A 210D9604 +@0000008B 00005100 +@0000008C 01000034 +@0000008D 210D9D04 +@0000008E 00005100 +@0000008F DFC00117 +@00000090 DF000017 +@00000091 DEC00204 +@00000092 F800283A +@00000093 DEFFFF04 +@00000094 DF000015 +@00000095 D839883A +@00000096 00C04034 +@00000097 18C21004 +@00000098 D0A01603 +@00000099 18800035 +@0000009A DF000017 +@0000009B DEC00104 +@0000009C F800283A +@0000009D DEFFFF04 +@0000009E DF000015 +@0000009F D839883A +@000000A0 DF000017 +@000000A1 DEC00104 +@000000A2 F800283A +@000000A3 DEFFFE04 +@000000A4 DF000115 +@000000A5 D839883A +@000000A6 E1000015 +@000000A7 DF000117 +@000000A8 DEC00204 +@000000A9 F800283A +@000000AA DEFFFD04 +@000000AB DFC00215 +@000000AC DF000115 +@000000AD D839883A +@000000AE E1000015 +@000000AF 000024C0 +@000000B0 00002740 +@000000B1 E1000017 +@000000B2 000028C0 +@000000B3 D1601603 +@000000B4 01000034 +@000000B5 210DA404 +@000000B6 00005100 +@000000B7 DFC00217 +@000000B8 DF000117 +@000000B9 DEC00304 +@000000BA F800283A +@000000BB DEFFFA04 +@000000BC DFC00515 +@000000BD DF000415 +@000000BE D839883A +@000000BF E1400115 +@000000C0 E1000005 +@000000C1 E0800003 +@000000C2 108018D8 +@000000C3 1000201E +@000000C4 D0A01717 +@000000C5 E0800215 +@000000C6 E0C00217 +@000000C7 188000A0 +@000000C8 1000101E +@000000C9 E0C00217 +@000000CA 188000C8 +@000000CB 1000041E +@000000CC E0C00217 +@000000CD 18800060 +@000000CE 1000081E +@000000CF 00001106 +@000000D0 E0C00217 +@000000D1 18800120 +@000000D2 1000081E +@000000D3 E0C00217 +@000000D4 18800220 +@000000D5 1000081E +@000000D6 00000A06 +@000000D7 000024C0 +@000000D8 00003106 +@000000D9 00002740 +@000000DA 00002F06 +@000000DB E1000117 +@000000DC 000028C0 +@000000DD 00002C06 +@000000DE E1000117 +@000000DF 00002A80 +@000000E0 00002906 +@000000E1 E1000117 +@000000E2 00002A80 +@000000E3 00002606 +@000000E4 D0A01717 +@000000E5 E0800315 +@000000E6 E0C00317 +@000000E7 188000A0 +@000000E8 1000131E +@000000E9 E0C00317 +@000000EA 188000C8 +@000000EB 1000041E +@000000EC E0C00317 +@000000ED 18800060 +@000000EE 1000081E +@000000EF 00001A06 +@000000F0 E0C00317 +@000000F1 18800120 +@000000F2 10000E1E +@000000F3 E0C00317 +@000000F4 18800220 +@000000F5 1000101E +@000000F6 00001306 +@000000F7 01000034 +@000000F8 210DA604 +@000000F9 00005100 +@000000FA D0201715 +@000000FB 00000E06 +@000000FC 01000034 +@000000FD 210DA904 +@000000FE 00005100 +@000000FF D0201715 +@00000100 00000906 +@00000101 01000034 +@00000102 210DAC04 +@00000103 00005100 +@00000104 D0201715 +@00000105 00000406 +@00000106 01000034 +@00000107 210DAF04 +@00000108 00005100 +@00000109 D0201715 +@0000010A DFC00517 +@0000010B DF000417 +@0000010C DEC00604 +@0000010D F800283A +@0000010E DEFFFB04 +@0000010F DFC00415 +@00000110 DF000315 +@00000111 D839883A +@00000112 D0201605 +@00000113 00001FC0 +@00000114 010000B4 +@00000115 2121A804 +@00000116 0000E6C0 +@00000117 D0A01717 +@00000118 1005003A +@00000119 1000041E +@0000011A 010018C4 +@0000011B E1400217 +@0000011C 00002EC0 +@0000011D 00000206 +@0000011E E1000217 +@0000011F 00002A80 +@00000120 D0A01603 +@00000121 10803FD8 +@00000122 10001D1E +@00000123 01000034 +@00000124 210DB204 +@00000125 00005100 +@00000126 D0201715 +@00000127 E0000115 +@00000128 E0000015 +@00000129 E0800017 +@0000012A 10801188 +@0000012B 1000131E +@0000012C 01000034 +@0000012D 210DB504 +@0000012E 00005100 +@0000012F D0A01717 +@00000130 1005003A +@00000131 1000061E +@00000132 01000034 +@00000133 210DB604 +@00000134 00005100 +@00000135 01001DC4 +@00000136 E1400217 +@00000137 00002EC0 +@00000138 010000B4 +@00000139 2121A804 +@0000013A 0000E6C0 +@0000013B E0800017 +@0000013C 10800044 +@0000013D E0800015 +@0000013E 003FEA06 +@0000013F 00001FC0 +@00000140 D0A01603 +@00000141 10800044 +@00000142 D0A01605 +@00000143 003FD006 +@00000144 DEFFFC04 +@00000145 DFC00015 +@00000146 D9400115 +@00000147 D9800215 +@00000148 D9C00315 +@00000149 D0A00017 +@0000014A 200B883A +@0000014B D9800104 +@0000014C 11000117 +@0000014D 00800034 +@0000014E 1082C604 +@0000014F 20800115 +@00000150 0000AF40 +@00000151 DFC00017 +@00000152 DEC00404 +@00000153 F800283A +@00000154 DEFFFB04 +@00000155 DC000315 +@00000156 DC400215 +@00000157 DC800115 +@00000158 DFC00415 +@00000159 D9800005 +@0000015A 2025883A +@0000015B 2823883A +@0000015C 3C3FFFC4 +@0000015D 01C00A0E +@0000015E 88C00117 +@0000015F 9009883A +@00000160 880B883A +@00000161 D80D883A +@00000162 01C00044 +@00000163 183EE83A +@00000164 8007883A +@00000165 843FFFC4 +@00000166 1000081E +@00000167 00FFF616 +@00000168 0005883A +@00000169 DFC00417 +@0000016A DC000317 +@0000016B DC400217 +@0000016C DC800117 +@0000016D DEC00504 +@0000016E F800283A +@0000016F 00BFFFC4 +@00000170 DFC00417 +@00000171 DC000317 +@00000172 DC400217 +@00000173 DC800117 +@00000174 DEC00504 +@00000175 F800283A +@00000176 DEFFEC04 +@00000177 DF001215 +@00000178 DC001115 +@00000179 DC401015 +@0000017A DC800F15 +@0000017B DD000D15 +@0000017C DD800B15 +@0000017D DDC00A15 +@0000017E DFC01315 +@0000017F DCC00E15 +@00000180 DD400C15 +@00000181 30800003 +@00000182 202F883A +@00000183 2829883A +@00000184 1021883A +@00000185 D9C00215 +@00000186 34800044 +@00000187 D8000315 +@00000188 D8000415 +@00000189 D8000515 +@0000018A D8000615 +@0000018B 0039883A +@0000018C D8000715 +@0000018D D8000815 +@0000018E 002D883A +@0000018F 0023883A +@00000190 1000061E +@00000191 00002206 +@00000192 88002E26 +@00000193 90800003 +@00000194 94800044 +@00000195 1021883A +@00000196 10001D26 +@00000197 01C00044 +@00000198 89C03626 +@00000199 3C7FF80E +@0000019A 00800084 +@0000019B 88BFF71E +@0000019C 81003FCC +@0000019D 2100201C +@0000019E 213FE004 +@0000019F 00800B84 +@000001A0 20803826 +@000001A1 817FF404 +@000001A2 28C03FCC +@000001A3 00800244 +@000001A4 10C03636 +@000001A5 D8C00617 +@000001A6 2821883A +@000001A7 18005916 +@000001A8 D9000617 +@000001A9 01400284 +@000001AA 0000D8C0 +@000001AB 80C03FCC +@000001AC 18C0201C +@000001AD 18FFE004 +@000001AE 10C5883A +@000001AF D8800615 +@000001B0 90800003 +@000001B1 94800044 +@000001B2 1021883A +@000001B3 103FE31E +@000001B4 B005883A +@000001B5 DFC01317 +@000001B6 DF001217 +@000001B7 DC001117 +@000001B8 DC401017 +@000001B9 DC800F17 +@000001BA DCC00E17 +@000001BB DD000D17 +@000001BC DD400C17 +@000001BD DD800B17 +@000001BE DDC00A17 +@000001BF DEC01404 +@000001C0 F800283A +@000001C1 80C03FCC +@000001C2 18C0201C +@000001C3 18FFE004 +@000001C4 00800944 +@000001C5 18802026 +@000001C6 A0C00117 +@000001C7 B809883A +@000001C8 DC000005 +@000001C9 A00B883A +@000001CA D80D883A +@000001CB 183EE83A +@000001CC 1000E81E +@000001CD B5800044 +@000001CE 003FC406 +@000001CF 81003FCC +@000001D0 2100201C +@000001D1 213FE004 +@000001D2 00800C04 +@000001D3 20801C26 +@000001D4 00800944 +@000001D5 20801D26 +@000001D6 00800B84 +@000001D7 04400084 +@000001D8 20BFC81E +@000001D9 D8000615 +@000001DA 003FB806 +@000001DB 00801B04 +@000001DC 20802126 +@000001DD 20FFEA04 +@000001DE 00800804 +@000001DF 10C01C36 +@000001E0 180490BA +@000001E1 00C00034 +@000001E2 18CDBA04 +@000001E3 10C5883A +@000001E4 11000017 +@000001E5 2000683A +@000001E6 00BFFFC4 +@000001E7 07000284 +@000001E8 3823883A +@000001E9 D9C00715 +@000001EA D8800515 +@000001EB D8000315 +@000001EC D8000415 +@000001ED D8000815 +@000001EE D8800615 +@000001EF 003FA306 +@000001F0 DC400315 +@000001F1 04400084 +@000001F2 003FA006 +@000001F3 A0C00117 +@000001F4 B809883A +@000001F5 DC000045 +@000001F6 A00B883A +@000001F7 D9800044 +@000001F8 880F883A +@000001F9 183EE83A +@000001FA 1000BA1E +@000001FB B46D883A +@000001FC 0023883A +@000001FD 003F9506 +@000001FE 00800044 +@000001FF D8800415 +@00000200 003F9206 +@00000201 D8800517 +@00000202 1000B416 +@00000203 D9000517 +@00000204 01400284 +@00000205 0000D8C0 +@00000206 D8800515 +@00000207 D8C00517 +@00000208 80803FCC +@00000209 1080201C +@0000020A 10BFE004 +@0000020B 1887883A +@0000020C D8C00515 +@0000020D 003F8506 +@0000020E 00C00044 +@0000020F D8000715 +@00000210 07000404 +@00000211 D8C00815 +@00000212 D8800717 +@00000213 D8000915 +@00000214 1007003A +@00000215 D8800217 +@00000216 15400017 +@00000217 10800104 +@00000218 D8800215 +@00000219 1800011E +@0000021A A8009E16 +@0000021B 04C00044 +@0000021C A821883A +@0000021D 9823883A +@0000021E 00000506 +@0000021F 9809883A +@00000220 E00B883A +@00000221 0000D8C0 +@00000222 1027883A +@00000223 8C400044 +@00000224 8009883A +@00000225 E00B883A +@00000226 0000D6C0 +@00000227 1021883A +@00000228 103FF61E +@00000229 D8800517 +@0000022A D8C00317 +@0000022B 1445C83A +@0000022C D8800515 +@0000022D 18006F26 +@0000022E D8800917 +@0000022F 10000D26 +@00000230 A0C00117 +@00000231 00800B44 +@00000232 D8800085 +@00000233 B809883A +@00000234 A00B883A +@00000235 D9800084 +@00000236 01C00044 +@00000237 183EE83A +@00000238 10007C1E +@00000239 D8C00517 +@0000023A B5800044 +@0000023B 18FFFFC4 +@0000023C D8C00515 +@0000023D D9C00517 +@0000023E B809883A +@0000023F A00B883A +@00000240 01800C04 +@00000241 00005500 +@00000242 1000721E +@00000243 D8800517 +@00000244 B0AD883A +@00000245 983FB626 +@00000246 A809883A +@00000247 980B883A +@00000248 0000D6C0 +@00000249 11000C04 +@0000024A 20C03FCC +@0000024B 00800E44 +@0000024C 10C0042E +@0000024D D8800817 +@0000024E 190001C4 +@0000024F 1000011E +@00000250 190009C4 +@00000251 A0C00117 +@00000252 A00B883A +@00000253 D9000105 +@00000254 D9800104 +@00000255 B809883A +@00000256 01C00044 +@00000257 183EE83A +@00000258 10005C1E +@00000259 A809883A +@0000025A 980B883A +@0000025B 0000D7C0 +@0000025C 9809883A +@0000025D E00B883A +@0000025E 102B883A +@0000025F 0000D6C0 +@00000260 1027883A +@00000261 B5800044 +@00000262 003FE206 +@00000263 D8800517 +@00000264 B809883A +@00000265 A00B883A +@00000266 01800804 +@00000267 11FFFFC4 +@00000268 00005500 +@00000269 10004B1E +@0000026A D8800217 +@0000026B A2000117 +@0000026C B809883A +@0000026D 10C00017 +@0000026E 10800104 +@0000026F A00B883A +@00000270 D8C00145 +@00000271 D8C00517 +@00000272 D9800144 +@00000273 01C00044 +@00000274 D8800215 +@00000275 1DA1883A +@00000276 403EE83A +@00000277 10003D1E +@00000278 802D883A +@00000279 0023883A +@0000027A 003F1806 +@0000027B 07000404 +@0000027C D8000715 +@0000027D 003F9406 +@0000027E D8000715 +@0000027F 003F9206 +@00000280 D8800217 +@00000281 14400017 +@00000282 10C00104 +@00000283 D8C00215 +@00000284 8809883A +@00000285 0000BEC0 +@00000286 1021883A +@00000287 D8800517 +@00000288 B809883A +@00000289 A00B883A +@0000028A 1427C83A +@0000028B 01800804 +@0000028C 980F883A +@0000028D 00005500 +@0000028E 1000261E +@0000028F A0C00117 +@00000290 880D883A +@00000291 B809883A +@00000292 A00B883A +@00000293 800F883A +@00000294 B4ED883A +@00000295 183EE83A +@00000296 10001E1E +@00000297 B42D883A +@00000298 0023883A +@00000299 003EF906 +@0000029A 07000204 +@0000029B D8000715 +@0000029C 003F7506 +@0000029D D8C00917 +@0000029E 1821003A +@0000029F 8000031E +@000002A0 D8800517 +@000002A1 10BFFFC4 +@000002A2 D8800515 +@000002A3 D9C00517 +@000002A4 B809883A +@000002A5 A00B883A +@000002A6 01800804 +@000002A7 00005500 +@000002A8 10000C1E +@000002A9 D8C00517 +@000002AA B0ED883A +@000002AB 803F991E +@000002AC A0C00117 +@000002AD 00800B44 +@000002AE D88000C5 +@000002AF B809883A +@000002B0 A00B883A +@000002B1 D98000C4 +@000002B2 01C00044 +@000002B3 183EE83A +@000002B4 103FAC26 +@000002B5 00BFFFC4 +@000002B6 003EFE06 +@000002B7 D8000515 +@000002B8 003F4E06 +@000002B9 00C00044 +@000002BA 056BC83A +@000002BB D8C00915 +@000002BC 003F5E06 +@000002BD 2013883A +@000002BE D1200017 +@000002BF 2807883A +@000002C0 300F883A +@000002C1 480B883A +@000002C2 180D883A +@000002C3 02000034 +@000002C4 42017604 +@000002C5 4000683A +@000002C6 DEFFFA04 +@000002C7 DC400315 +@000002C8 DC800215 +@000002C9 DCC00115 +@000002CA DFC00515 +@000002CB DC000415 +@000002CC DD000015 +@000002CD 28C0000B +@000002CE 2027883A +@000002CF 2825883A +@000002D0 1804D0FA +@000002D1 3023883A +@000002D2 013FFFC4 +@000002D3 1080004C +@000002D4 10001B26 +@000002D5 2940008B +@000002D6 28BFFFCC +@000002D7 10A0001C +@000002D8 10A00004 +@000002D9 10001316 +@000002DA 3821883A +@000002DB 05010004 +@000002DC 01C00316 +@000002DD 00001B06 +@000002DE 04001A0E +@000002DF 9140008B +@000002E0 297FFFCC +@000002E1 2960001C +@000002E2 880D883A +@000002E3 9809883A +@000002E4 29600004 +@000002E5 800F883A +@000002E6 A400010E +@000002E7 01C10004 +@000002E8 0000C0C0 +@000002E9 80A1C83A +@000002EA 88A3883A +@000002EB 00BFF216 +@000002EC 90C0000B +@000002ED 18801014 +@000002EE 9080000D +@000002EF 013FFFC4 +@000002F0 2005883A +@000002F1 DFC00517 +@000002F2 DC000417 +@000002F3 DC400317 +@000002F4 DC800217 +@000002F5 DCC00117 +@000002F6 DD000017 +@000002F7 DEC00604 +@000002F8 F800283A +@000002F9 0009883A +@000002FA 003FF506 +@000002FB 20800007 +@000002FC 2007883A +@000002FD 10000326 +@000002FE 21000044 +@000002FF 20800007 +@00000300 103FFD1E +@00000301 20C5C83A +@00000302 F800283A +@00000303 DEFFFE04 +@00000304 DC000015 +@00000305 2021883A +@00000306 2809883A +@00000307 300B883A +@00000308 380D883A +@00000309 DFC00115 +@0000030A D0201815 +@0000030B 0000E980 +@0000030C 1007883A +@0000030D 00BFFFC4 +@0000030E 18800526 +@0000030F 1805883A +@00000310 DFC00117 +@00000311 DC000017 +@00000312 DEC00204 +@00000313 F800283A +@00000314 D0A01817 +@00000315 103FF926 +@00000316 80800315 +@00000317 1805883A +@00000318 DFC00117 +@00000319 DC000017 +@0000031A DEC00204 +@0000031B F800283A +@0000031C 00800044 +@0000031D 000F883A +@0000031E 2900082E +@0000031F 28000716 +@00000320 294B883A +@00000321 1085883A +@00000322 29000E2E +@00000323 1007003A +@00000324 1800081E +@00000325 283FFA0E +@00000326 1800061E +@00000327 21400236 +@00000328 2149C83A +@00000329 388EB03A +@0000032A 1004D07A +@0000032B 280AD07A +@0000032C 103FFA1E +@0000032D 3000011E +@0000032E 3809883A +@0000032F 2005883A +@00000330 F800283A +@00000331 1007003A +@00000332 183FF426 +@00000333 003FF906 +@00000334 DEFFFE04 +@00000335 DC000015 +@00000336 DFC00115 +@00000337 000D883A +@00000338 0021883A +@00000339 20000816 +@0000033A 28000A16 +@0000033B 0000C700 +@0000033C 80000126 +@0000033D 0085C83A +@0000033E DFC00117 +@0000033F DC000017 +@00000340 DEC00204 +@00000341 F800283A +@00000342 0109C83A +@00000343 0021003A +@00000344 283FF60E +@00000345 014BC83A +@00000346 8021003A +@00000347 003FF306 +@00000348 DEFFFE04 +@00000349 DC000015 +@0000034A DFC00115 +@0000034B 01800044 +@0000034C 0021883A +@0000034D 20000816 +@0000034E 28000A16 +@0000034F 0000C700 +@00000350 80000126 +@00000351 0085C83A +@00000352 DFC00117 +@00000353 DC000017 +@00000354 DEC00204 +@00000355 F800283A +@00000356 0109C83A +@00000357 3021883A +@00000358 283FF60E +@00000359 014BC83A +@0000035A 003FF406 +@0000035B 000D883A +@0000035C 02000034 +@0000035D 42031C04 +@0000035E 4000683A +@0000035F 01800044 +@00000360 02000034 +@00000361 42031C04 +@00000362 4000683A +@00000363 0007883A +@00000364 20000626 +@00000365 2080004C +@00000366 2008D07A +@00000367 10000126 +@00000368 1947883A +@00000369 294B883A +@0000036A 203FFA1E +@0000036B 1805883A +@0000036C F800283A +@0000036D DEFFFD04 +@0000036E DFC00215 +@0000036F DF000115 +@00000370 D839883A +@00000371 E0000015 +@00000372 000170FA +@00000373 00800044 +@00000374 1001703A +@00000375 E0000015 +@00000376 0000E200 +@00000377 01000034 +@00000378 210DDB04 +@00000379 01400034 +@0000037A 294DDB04 +@0000037B 01800034 +@0000037C 318DDB04 +@0000037D 0001F540 +@0000037E 0001DC80 +@0000037F 01000034 +@00000380 21078804 +@00000381 000283C0 +@00000382 D1200117 +@00000383 D1600217 +@00000384 D1A00317 +@00000385 00004380 +@00000386 1009883A +@00000387 00028D80 +@00000388 DEFFFE04 +@00000389 DFC00115 +@0000038A DF000015 +@0000038B D839883A +@0000038C 01004034 +@0000038D 21020004 +@0000038E 01400044 +@0000038F 0180FA04 +@00000390 00019880 +@00000391 01000034 +@00000392 210DFD04 +@00000393 01404034 +@00000394 29421404 +@00000395 01800404 +@00000396 00018600 +@00000397 DFC00117 +@00000398 DF000017 +@00000399 DEC00204 +@0000039A F800283A +@0000039B DEFFFD04 +@0000039C DFC00215 +@0000039D DF000115 +@0000039E D839883A +@0000039F E1000015 +@000003A0 E1000017 +@000003A1 0001B500 +@000003A2 DFC00217 +@000003A3 DF000117 +@000003A4 DEC00304 +@000003A5 F800283A +@000003A6 DEFFF704 +@000003A7 DFC00815 +@000003A8 DF000715 +@000003A9 D839883A +@000003AA E1000015 +@000003AB E1400115 +@000003AC E1800215 +@000003AD E0800017 +@000003AE 1004803A +@000003AF 1000091E +@000003B0 E1000017 +@000003B1 01400304 +@000003B2 0000D8C0 +@000003B3 1007883A +@000003B4 00800034 +@000003B5 10921F04 +@000003B6 1887883A +@000003B7 E0C00615 +@000003B8 00000106 +@000003B9 E0000615 +@000003BA E0800617 +@000003BB E0800315 +@000003BC E0800317 +@000003BD 1005003A +@000003BE 1000241E +@000003BF E0800317 +@000003C0 10800217 +@000003C1 108000CC +@000003C2 1005003A +@000003C3 10001A1E +@000003C4 E0800317 +@000003C5 10800017 +@000003C6 10800617 +@000003C7 1005003A +@000003C8 1000151E +@000003C9 E0800317 +@000003CA 10800017 +@000003CB 10800617 +@000003CC E1000317 +@000003CD E1400117 +@000003CE E1800217 +@000003CF 103EE83A +@000003D0 E0800415 +@000003D1 E0800417 +@000003D2 1004403A +@000003D3 1000071E +@000003D4 0000FB80 +@000003D5 E0C00417 +@000003D6 00C7C83A +@000003D7 10C00015 +@000003D8 00BFFFC4 +@000003D9 E0800515 +@000003DA 00000E06 +@000003DB E0800417 +@000003DC E0800515 +@000003DD 00000B06 +@000003DE 0000FB80 +@000003DF 1007883A +@000003E0 00800344 +@000003E1 18800015 +@000003E2 00000406 +@000003E3 0000FB80 +@000003E4 1007883A +@000003E5 00801444 +@000003E6 18800015 +@000003E7 00BFFFC4 +@000003E8 E0800515 +@000003E9 E0800517 +@000003EA DFC00817 +@000003EB DF000717 +@000003EC DEC00904 +@000003ED F800283A +@000003EE DEFFFD04 +@000003EF DFC00215 +@000003F0 DF000115 +@000003F1 D839883A +@000003F2 D0A00917 +@000003F3 1005003A +@000003F4 1000041E +@000003F5 D0A00917 +@000003F6 103EE83A +@000003F7 E0800015 +@000003F8 00000206 +@000003F9 D0A01804 +@000003FA E0800015 +@000003FB E0800017 +@000003FC DFC00217 +@000003FD DF000117 +@000003FE DEC00304 +@000003FF F800283A +@00000400 DEFFF204 +@00000401 DFC00D15 +@00000402 DF000C15 +@00000403 D839883A +@00000404 E1000015 +@00000405 E1400115 +@00000406 E1800215 +@00000407 E0800017 +@00000408 10800017 +@00000409 E0800315 +@0000040A E0800117 +@0000040B E0800415 +@0000040C E0000715 +@0000040D E0800217 +@0000040E 10800050 +@0000040F 10004D1E +@00000410 E0800317 +@00000411 10801417 +@00000412 E0800815 +@00000413 E0800317 +@00000414 10801517 +@00000415 E0800915 +@00000416 E0C00817 +@00000417 E0800917 +@00000418 18800536 +@00000419 E0800817 +@0000041A E0C00917 +@0000041B 10C5C83A +@0000041C E0800615 +@0000041D 00000406 +@0000041E 00820004 +@0000041F E0C00917 +@00000420 10C5C83A +@00000421 E0800615 +@00000422 E0800617 +@00000423 1004C03A +@00000424 1000011E +@00000425 00001E06 +@00000426 E0C00217 +@00000427 E0800617 +@00000428 1880022E +@00000429 E0800217 +@0000042A E0800615 +@0000042B E0C00317 +@0000042C E0800917 +@0000042D 1885883A +@0000042E 11401804 +@0000042F E1000417 +@00000430 E1800617 +@00000431 00030C00 +@00000432 E0C00417 +@00000433 E0800617 +@00000434 1885883A +@00000435 E0800415 +@00000436 E0C00217 +@00000437 E0800617 +@00000438 1885C83A +@00000439 E0800215 +@0000043A E1000317 +@0000043B E0C00917 +@0000043C E0800617 +@0000043D 1885883A +@0000043E 1081FFCC +@0000043F 20801515 +@00000440 E0800217 +@00000441 10800050 +@00000442 1000011E +@00000443 003FCC06 +@00000444 E0C00417 +@00000445 E0800117 +@00000446 18800126 +@00000447 00001506 +@00000448 E0800017 +@00000449 10800217 +@0000044A 1004D3BA +@0000044B 1080004C +@0000044C 1005003A +@0000044D 1000011E +@0000044E 00000E06 +@0000044F E0800317 +@00000450 10C01417 +@00000451 E0800817 +@00000452 1880061E +@00000453 E0800317 +@00000454 E0C00317 +@00000455 11001317 +@00000456 18800B17 +@00000457 2080012E +@00000458 003FF606 +@00000459 E0800317 +@0000045A 10C01417 +@0000045B E0800817 +@0000045C 18BFB01E +@0000045D E0000915 +@0000045E E0C00417 +@0000045F E0800117 +@00000460 18801726 +@00000461 0005303A +@00000462 E0800A15 +@00000463 0001703A +@00000464 E0800A17 +@00000465 E0800815 +@00000466 E0800817 +@00000467 E0800515 +@00000468 E0C00317 +@00000469 E0800317 +@0000046A 10801217 +@0000046B 10800054 +@0000046C 18801215 +@0000046D E0800317 +@0000046E 10800A17 +@0000046F 10800104 +@00000470 1007883A +@00000471 E0800317 +@00000472 10801217 +@00000473 18800035 +@00000474 E0800517 +@00000475 E0800A15 +@00000476 E0800A17 +@00000477 1001703A +@00000478 E0C00417 +@00000479 E0800117 +@0000047A 18800526 +@0000047B E0800417 +@0000047C E0C00117 +@0000047D 10C5C83A +@0000047E E0800B15 +@0000047F 00000B06 +@00000480 E0800017 +@00000481 10800217 +@00000482 1004D3BA +@00000483 1080004C +@00000484 1005003A +@00000485 1000031E +@00000486 00BFFD44 +@00000487 E0800B15 +@00000488 00000206 +@00000489 00BFFEC4 +@0000048A E0800B15 +@0000048B E0800B17 +@0000048C DFC00D17 +@0000048D DF000C17 +@0000048E DEC00E04 +@0000048F F800283A +@00000490 DEFFF104 +@00000491 DFC00E15 +@00000492 DF000D15 +@00000493 D839883A +@00000494 E1000015 +@00000495 E1400115 +@00000496 E1800215 +@00000497 E0000415 +@00000498 E0800017 +@00000499 10800017 +@0000049A E0800715 +@0000049B E0800117 +@0000049C E0800815 +@0000049D E0000915 +@0000049E E0800217 +@0000049F 10800050 +@000004A0 10003A1E +@000004A1 E0800717 +@000004A2 10801617 +@000004A3 E0800315 +@000004A4 E0800717 +@000004A5 10801717 +@000004A6 E0800415 +@000004A7 E0C00317 +@000004A8 E0800417 +@000004A9 1880062E +@000004AA E0C00417 +@000004AB E0800317 +@000004AC 1885C83A +@000004AD 10BFFFC4 +@000004AE E0800515 +@000004AF 00000C06 +@000004B0 E0800417 +@000004B1 1005003A +@000004B2 1000051E +@000004B3 00820004 +@000004B4 E0C00317 +@000004B5 10C5C83A +@000004B6 E0800515 +@000004B7 00000406 +@000004B8 0081FFC4 +@000004B9 E0C00317 +@000004BA 10C5C83A +@000004BB E0800515 +@000004BC E0800517 +@000004BD 1004C03A +@000004BE 1000011E +@000004BF 00001B06 +@000004C0 E0C00217 +@000004C1 E0800517 +@000004C2 1880022E +@000004C3 E0800217 +@000004C4 E0800515 +@000004C5 E0C00717 +@000004C6 E0800317 +@000004C7 1885883A +@000004C8 11021804 +@000004C9 E1400117 +@000004CA E1800517 +@000004CB 00030C00 +@000004CC E0C00117 +@000004CD E0800517 +@000004CE 1885883A +@000004CF E0800115 +@000004D0 E0C00217 +@000004D1 E0800517 +@000004D2 1885C83A +@000004D3 E0800215 +@000004D4 E1000717 +@000004D5 E0C00317 +@000004D6 E0800517 +@000004D7 1885883A +@000004D8 1081FFCC +@000004D9 20801615 +@000004DA 003FC306 +@000004DB 0005303A +@000004DC E0800B15 +@000004DD 0001703A +@000004DE E0800B17 +@000004DF E0800A15 +@000004E0 E0800A17 +@000004E1 E0800615 +@000004E2 E0C00717 +@000004E3 E0800717 +@000004E4 10801217 +@000004E5 10800094 +@000004E6 18801215 +@000004E7 E0800717 +@000004E8 10800A17 +@000004E9 10800104 +@000004EA 1007883A +@000004EB E0800717 +@000004EC 10801217 +@000004ED 18800035 +@000004EE E0800617 +@000004EF E0800B15 +@000004F0 E0800B17 +@000004F1 1001703A +@000004F2 E0800217 +@000004F3 10800050 +@000004F4 1000161E +@000004F5 E0800017 +@000004F6 10800217 +@000004F7 1004D3BA +@000004F8 1080004C +@000004F9 1005003A +@000004FA 1000011E +@000004FB 00001306 +@000004FC E0800717 +@000004FD 10C01717 +@000004FE E0800417 +@000004FF 1880061E +@00000500 E0800717 +@00000501 E0C00717 +@00000502 11001317 +@00000503 18800B17 +@00000504 2080012E +@00000505 003FF606 +@00000506 E0800717 +@00000507 10C01717 +@00000508 E0800417 +@00000509 1880011E +@0000050A 00000406 +@0000050B E0800217 +@0000050C 10800050 +@0000050D 1000011E +@0000050E 003F8F06 +@0000050F E0000B15 +@00000510 E0C00117 +@00000511 E0800817 +@00000512 18800526 +@00000513 E0800117 +@00000514 E0C00817 +@00000515 10C5C83A +@00000516 E0800C15 +@00000517 00000B06 +@00000518 E0800017 +@00000519 10800217 +@0000051A 1004D3BA +@0000051B 1080004C +@0000051C 1005003A +@0000051D 1000031E +@0000051E 00BFFD44 +@0000051F E0800C15 +@00000520 00000206 +@00000521 00BFFEC4 +@00000522 E0800C15 +@00000523 E0800C17 +@00000524 DFC00E17 +@00000525 DF000D17 +@00000526 DEC00F04 +@00000527 F800283A +@00000528 DEFFF804 +@00000529 DF000715 +@0000052A D839883A +@0000052B E1000015 +@0000052C E1400115 +@0000052D E0800017 +@0000052E E0800215 +@0000052F E0800217 +@00000530 10800A17 +@00000531 E0800315 +@00000532 E0800317 +@00000533 10800104 +@00000534 10800037 +@00000535 E0800415 +@00000536 E0800417 +@00000537 1080C00C +@00000538 1004C03A +@00000539 1000011E +@0000053A 00006E06 +@0000053B E0800417 +@0000053C 1004D23A +@0000053D 1080004C +@0000053E 1005003A +@0000053F 1000351E +@00000540 00800074 +@00000541 10800004 +@00000542 E0800515 +@00000543 E0800217 +@00000544 10801417 +@00000545 10800044 +@00000546 1081FFCC +@00000547 E0800615 +@00000548 E0800217 +@00000549 10C01517 +@0000054A E0800617 +@0000054B 1880011E +@0000054C 00001806 +@0000054D E0800317 +@0000054E 10800037 +@0000054F E0800515 +@00000550 E0800517 +@00000551 1004D3FA +@00000552 1080005C +@00000553 1080004C +@00000554 1005003A +@00000555 1000011E +@00000556 00000E06 +@00000557 E0C00217 +@00000558 E0800217 +@00000559 10801417 +@0000055A 1885883A +@0000055B 10C01804 +@0000055C E0800517 +@0000055D 18800005 +@0000055E E0C00217 +@0000055F E0800217 +@00000560 10801417 +@00000561 10800044 +@00000562 1081FFCC +@00000563 18801415 +@00000564 003FDE06 +@00000565 E0800517 +@00000566 10BFFFEC +@00000567 1005003A +@00000568 10000C1E +@00000569 E1000217 +@0000056A E0800217 +@0000056B 10C01217 +@0000056C 00BFFF84 +@0000056D 1884703A +@0000056E 20801215 +@0000056F E0800317 +@00000570 10800104 +@00000571 1007883A +@00000572 E0800217 +@00000573 10801217 +@00000574 18800035 +@00000575 E0800417 +@00000576 1004D27A +@00000577 1080004C +@00000578 1005003A +@00000579 103FB81E +@0000057A E0800417 +@0000057B 10BFFFEC +@0000057C 1004D43A +@0000057D E0800615 +@0000057E E0800617 +@0000057F 1005003A +@00000580 1000171E +@00000581 E0800217 +@00000582 E0C00217 +@00000583 11001717 +@00000584 18801617 +@00000585 20801226 +@00000586 E1000317 +@00000587 E0C00217 +@00000588 E0800217 +@00000589 10801717 +@0000058A 1885883A +@0000058B 10821804 +@0000058C 10800007 +@0000058D 20800035 +@0000058E E0C00217 +@0000058F E0800217 +@00000590 10801717 +@00000591 10800044 +@00000592 1081FFCC +@00000593 18801715 +@00000594 E0800617 +@00000595 10BFFFC4 +@00000596 E0800615 +@00000597 003FE606 +@00000598 E0800617 +@00000599 1005003A +@0000059A 103F971E +@0000059B E1000217 +@0000059C E0800217 +@0000059D 10C01217 +@0000059E 00BFFF44 +@0000059F 1884703A +@000005A0 20801215 +@000005A1 E0800217 +@000005A2 10800A17 +@000005A3 10800104 +@000005A4 1007883A +@000005A5 E0800217 +@000005A6 10801217 +@000005A7 18800035 +@000005A8 003F8906 +@000005A9 DF000717 +@000005AA DEC00804 +@000005AB F800283A +@000005AC DEFFF604 +@000005AD DF000915 +@000005AE D839883A +@000005AF E1000015 +@000005B0 E1400115 +@000005B1 E1800215 +@000005B2 E0800017 +@000005B3 10800017 +@000005B4 E0800315 +@000005B5 00BFF9C4 +@000005B6 E0800415 +@000005B7 E0800117 +@000005B8 E0800815 +@000005B9 E0C00817 +@000005BA 189A8060 +@000005BB 1000041E +@000005BC E0C00817 +@000005BD 189A80A0 +@000005BE 10001D1E +@000005BF 00002906 +@000005C0 E0800317 +@000005C1 10C00B17 +@000005C2 00A00034 +@000005C3 10BFFFC4 +@000005C4 18802426 +@000005C5 E0800217 +@000005C6 10800017 +@000005C7 E0800515 +@000005C8 E0800317 +@000005C9 E0800615 +@000005CA E0800517 +@000005CB 10800090 +@000005CC 1000071E +@000005CD E0C00517 +@000005CE 00A00034 +@000005CF 10BFFFC4 +@000005D0 18800326 +@000005D1 E0C00517 +@000005D2 E0C00715 +@000005D3 00000306 +@000005D4 00A00034 +@000005D5 10BFFF84 +@000005D6 E0800715 +@000005D7 E0C00717 +@000005D8 E0800617 +@000005D9 10C00B15 +@000005DA E0000415 +@000005DB 00000D06 +@000005DC E0800317 +@000005DD 10C00B17 +@000005DE 00A00034 +@000005DF 10BFFFC4 +@000005E0 18800826 +@000005E1 E1400217 +@000005E2 E0800317 +@000005E3 E0C00317 +@000005E4 11001317 +@000005E5 18800B17 +@000005E6 2085803A +@000005E7 28800015 +@000005E8 E0000415 +@000005E9 E0800417 +@000005EA DF000917 +@000005EB DEC00A04 +@000005EC F800283A +@000005ED DEFFFB04 +@000005EE DF000415 +@000005EF D839883A +@000005F0 E1000015 +@000005F1 E0800017 +@000005F2 E0800215 +@000005F3 E0800217 +@000005F4 10800A17 +@000005F5 10800104 +@000005F6 10800037 +@000005F7 E0800115 +@000005F8 E0800117 +@000005F9 1004D2BA +@000005FA 1080004C +@000005FB 1005003A +@000005FC 10000B1E +@000005FD E0800217 +@000005FE 10800A17 +@000005FF 10800104 +@00000600 1007883A +@00000601 E0800217 +@00000602 10801217 +@00000603 10810014 +@00000604 18800035 +@00000605 E0800217 +@00000606 10001315 +@00000607 00000A06 +@00000608 E0800217 +@00000609 10C01317 +@0000060A 00A00034 +@0000060B 10BFFF04 +@0000060C 10C00536 +@0000060D E0C00217 +@0000060E E0800217 +@0000060F 10801317 +@00000610 10800044 +@00000611 18801315 +@00000612 D0A00C17 +@00000613 E0800315 +@00000614 E0800317 +@00000615 DF000417 +@00000616 DEC00504 +@00000617 F800283A +@00000618 DEFFF704 +@00000619 DFC00815 +@0000061A DF000715 +@0000061B D839883A +@0000061C E1000015 +@0000061D E1400115 +@0000061E E1800215 +@0000061F E0000315 +@00000620 E0000415 +@00000621 E0000515 +@00000622 E0C00017 +@00000623 00800044 +@00000624 18801215 +@00000625 E0800117 +@00000626 10800104 +@00000627 1007883A +@00000628 E0800017 +@00000629 10801217 +@0000062A 18800035 +@0000062B E1000217 +@0000062C E1400017 +@0000062D 01800034 +@0000062E 31852804 +@0000062F 0001FC80 +@00000630 1004803A +@00000631 1000021E +@00000632 E1000017 +@00000633 00019240 +@00000634 E0800017 +@00000635 10001315 +@00000636 D0A00C17 +@00000637 E0800615 +@00000638 E1400617 +@00000639 E0800017 +@0000063A 11000C04 +@0000063B 01800034 +@0000063C 3185ED04 +@0000063D E1C00017 +@0000063E 0001A080 +@0000063F 1004403A +@00000640 1000041E +@00000641 E0C00017 +@00000642 00A00034 +@00000643 10BFFFC4 +@00000644 18800B15 +@00000645 DFC00817 +@00000646 DF000717 +@00000647 DEC00904 +@00000648 F800283A +@00000649 DEFFFD04 +@0000064A DFC00215 +@0000064B DF000115 +@0000064C D839883A +@0000064D E1000015 +@0000064E E1000017 +@0000064F D1600604 +@00000650 0001CD00 +@00000651 DFC00217 +@00000652 DF000117 +@00000653 DEC00304 +@00000654 F800283A +@00000655 DEFFFC04 +@00000656 DFC00315 +@00000657 DF000215 +@00000658 D839883A +@00000659 E1000015 +@0000065A E1400115 +@0000065B E0800017 +@0000065C 10000035 +@0000065D 00025040 +@0000065E DFC00317 +@0000065F DF000217 +@00000660 DEC00404 +@00000661 F800283A +@00000662 DEFFF904 +@00000663 DFC00615 +@00000664 DF000515 +@00000665 D839883A +@00000666 E1000015 +@00000667 E1400115 +@00000668 E1800215 +@00000669 E0800217 +@0000066A E0800315 +@0000066B D0A00C17 +@0000066C 1004C03A +@0000066D 1000041E +@0000066E E0800317 +@0000066F D0A00C15 +@00000670 E0000415 +@00000671 00000206 +@00000672 00BFFFC4 +@00000673 E0800415 +@00000674 E0800017 +@00000675 10800104 +@00000676 1007883A +@00000677 008001C4 +@00000678 18800035 +@00000679 E1000117 +@0000067A E1400017 +@0000067B 01800034 +@0000067C 31865504 +@0000067D 0001FC80 +@0000067E DFC00617 +@0000067F DF000517 +@00000680 DEC00704 +@00000681 F800283A +@00000682 DEFFF504 +@00000683 DF000A15 +@00000684 D839883A +@00000685 E1000015 +@00000686 E1400115 +@00000687 E1800215 +@00000688 E1C00315 +@00000689 E0000515 +@0000068A D0A00C17 +@0000068B E0800615 +@0000068C E0800617 +@0000068D 1005003A +@0000068E 10003F1E +@0000068F E0800017 +@00000690 1005003A +@00000691 1000391E +@00000692 E0C00017 +@00000693 E0800217 +@00000694 18800315 +@00000695 E0C00017 +@00000696 E0800317 +@00000697 18800515 +@00000698 0005303A +@00000699 E0800815 +@0000069A 0001703A +@0000069B E0800817 +@0000069C E0800715 +@0000069D E0800717 +@0000069E E0800415 +@0000069F D0A00D17 +@000006A0 E0800815 +@000006A1 E0800817 +@000006A2 E0800515 +@000006A3 E1000017 +@000006A4 E0C00117 +@000006A5 E0800517 +@000006A6 1885883A +@000006A7 10800044 +@000006A8 20800215 +@000006A9 E0800017 +@000006AA 10C00217 +@000006AB E0800517 +@000006AC 1880042E +@000006AD E0C00017 +@000006AE 00800044 +@000006AF 18800405 +@000006B0 00000206 +@000006B1 E0800017 +@000006B2 10000405 +@000006B3 D0A00E04 +@000006B4 E0800815 +@000006B5 E0800017 +@000006B6 E0800715 +@000006B7 E0C00717 +@000006B8 E0800817 +@000006B9 18800115 +@000006BA E0C00717 +@000006BB E0800817 +@000006BC 10800017 +@000006BD 18800015 +@000006BE E0800817 +@000006BF 10C00017 +@000006C0 E0800717 +@000006C1 18800115 +@000006C2 E0C00817 +@000006C3 E0800717 +@000006C4 18800015 +@000006C5 E0800417 +@000006C6 E0800815 +@000006C7 E0800817 +@000006C8 1001703A +@000006C9 E0000915 +@000006CA 00000506 +@000006CB 00BFFA84 +@000006CC E0800915 +@000006CD 00000206 +@000006CE 00BFDE84 +@000006CF E0800915 +@000006D0 E0800917 +@000006D1 DF000A17 +@000006D2 DEC00B04 +@000006D3 F800283A +@000006D4 DEFFFA04 +@000006D5 DFC00515 +@000006D6 DF000415 +@000006D7 D839883A +@000006D8 E1000015 +@000006D9 008000C4 +@000006DA E0800315 +@000006DB E1000317 +@000006DC 014003F4 +@000006DD 29509004 +@000006DE 0000D8C0 +@000006DF 100B883A +@000006E0 01005BB4 +@000006E1 210D8004 +@000006E2 0000D6C0 +@000006E3 100B883A +@000006E4 01200034 +@000006E5 213FFFC4 +@000006E6 0000D6C0 +@000006E7 100B883A +@000006E8 E1000017 +@000006E9 0000D6C0 +@000006EA E0800215 +@000006EB E0800217 +@000006EC 1005003A +@000006ED 10002A1E +@000006EE E0000115 +@000006EF E0C00117 +@000006F0 E0800217 +@000006F1 1880180E +@000006F2 00A00034 +@000006F3 10BFFFC4 +@000006F4 10BFFFC4 +@000006F5 103FFE1E +@000006F6 E1000317 +@000006F7 014003F4 +@000006F8 29509004 +@000006F9 0000D8C0 +@000006FA 100B883A +@000006FB 01005BB4 +@000006FC 210D8004 +@000006FD 0000D6C0 +@000006FE 100B883A +@000006FF 01200034 +@00000700 213FFFC4 +@00000701 0000D6C0 +@00000702 1007883A +@00000703 E0800017 +@00000704 10C5C83A +@00000705 E0800015 +@00000706 E0800117 +@00000707 10800044 +@00000708 E0800115 +@00000709 003FE506 +@0000070A E1000317 +@0000070B 014003F4 +@0000070C 29509004 +@0000070D 0000D8C0 +@0000070E 100B883A +@0000070F 01005BB4 +@00000710 210D8004 +@00000711 0000D6C0 +@00000712 1009883A +@00000713 E1400017 +@00000714 0000D8C0 +@00000715 10BFFFC4 +@00000716 103FFE1E +@00000717 00000D06 +@00000718 E1000317 +@00000719 014003F4 +@0000071A 29509004 +@0000071B 0000D8C0 +@0000071C 100B883A +@0000071D 01005BB4 +@0000071E 210D8004 +@0000071F 0000D6C0 +@00000720 1009883A +@00000721 E1400017 +@00000722 0000D8C0 +@00000723 10BFFFC4 +@00000724 00BFFE16 +@00000725 0005883A +@00000726 DFC00517 +@00000727 DF000417 +@00000728 DEC00604 +@00000729 F800283A +@0000072A DEFFFC04 +@0000072B DF000315 +@0000072C D839883A +@0000072D E1000015 +@0000072E E1400115 +@0000072F E1800215 +@00000730 E0800217 +@00000731 DF000317 +@00000732 DEC00404 +@00000733 F800283A +@00000734 DEFFF904 +@00000735 DFC00615 +@00000736 DF000515 +@00000737 D839883A +@00000738 E1000015 +@00000739 E1400115 +@0000073A E0800017 +@0000073B 1005003A +@0000073C 1000041E +@0000073D E0800017 +@0000073E 10800217 +@0000073F 1004C03A +@00000740 1000071E +@00000741 0001D800 +@00000742 1007883A +@00000743 00800584 +@00000744 18800015 +@00000745 00BFFA84 +@00000746 E0800415 +@00000747 00001306 +@00000748 E0800117 +@00000749 E0800215 +@0000074A E0800017 +@0000074B E0800315 +@0000074C E0C00317 +@0000074D E0800217 +@0000074E 18800115 +@0000074F E0C00317 +@00000750 E0800217 +@00000751 10800017 +@00000752 18800015 +@00000753 E0800217 +@00000754 10C00017 +@00000755 E0800317 +@00000756 18800115 +@00000757 E0C00217 +@00000758 E0800317 +@00000759 18800015 +@0000075A E0000415 +@0000075B E0800417 +@0000075C DFC00617 +@0000075D DF000517 +@0000075E DEC00704 +@0000075F F800283A +@00000760 DEFFFD04 +@00000761 DFC00215 +@00000762 DF000115 +@00000763 D839883A +@00000764 D0A00917 +@00000765 1005003A +@00000766 1000041E +@00000767 D0A00917 +@00000768 103EE83A +@00000769 E0800015 +@0000076A 00000206 +@0000076B D0A01804 +@0000076C E0800015 +@0000076D E0800017 +@0000076E DFC00217 +@0000076F DF000117 +@00000770 DEC00304 +@00000771 F800283A +@00000772 DEFFFD04 +@00000773 DFC00215 +@00000774 DF000115 +@00000775 D839883A +@00000776 00800034 +@00000777 108D8604 +@00000778 E0800015 +@00000779 E0C00017 +@0000077A 00800034 +@0000077B 108D8704 +@0000077C 18800736 +@0000077D E0800017 +@0000077E 10800017 +@0000077F 103EE83A +@00000780 E0800017 +@00000781 10BFFF04 +@00000782 E0800015 +@00000783 003FF506 +@00000784 DFC00217 +@00000785 DF000117 +@00000786 DEC00304 +@00000787 F800283A +@00000788 DEFFFD04 +@00000789 DFC00215 +@0000078A DF000115 +@0000078B D839883A +@0000078C 00800034 +@0000078D 108D8604 +@0000078E E0800015 +@0000078F E0C00017 +@00000790 00800034 +@00000791 108D8704 +@00000792 18800736 +@00000793 E0800017 +@00000794 10800017 +@00000795 103EE83A +@00000796 E0800017 +@00000797 10BFFF04 +@00000798 E0800015 +@00000799 003FF506 +@0000079A DFC00217 +@0000079B DF000117 +@0000079C DEC00304 +@0000079D F800283A +@0000079E DEFFF704 +@0000079F DFC00815 +@000007A0 DF000715 +@000007A1 DC000615 +@000007A2 DC400515 +@000007A3 D839883A +@000007A4 E1000015 +@000007A5 E1400115 +@000007A6 E1800215 +@000007A7 E1C00315 +@000007A8 E1000117 +@000007A9 E1400217 +@000007AA E1800317 +@000007AB 00022300 +@000007AC E0800415 +@000007AD E0800417 +@000007AE 1004803A +@000007AF 10001F1E +@000007B0 E4000017 +@000007B1 04400034 +@000007B2 8C521F04 +@000007B3 E1000417 +@000007B4 01400304 +@000007B5 0000D8C0 +@000007B6 1445883A +@000007B7 10800017 +@000007B8 80800015 +@000007B9 E4000017 +@000007BA 04400034 +@000007BB 8C521F04 +@000007BC E1000417 +@000007BD 01400304 +@000007BE 0000D8C0 +@000007BF 1445883A +@000007C0 10800104 +@000007C1 10800017 +@000007C2 80800115 +@000007C3 E4000017 +@000007C4 04400034 +@000007C5 8C521F04 +@000007C6 E1000417 +@000007C7 01400304 +@000007C8 0000D8C0 +@000007C9 1445883A +@000007CA 10800204 +@000007CB 10800017 +@000007CC 80800215 +@000007CD E1000417 +@000007CE 00024000 +@000007CF DFC00817 +@000007D0 DF000717 +@000007D1 DC000617 +@000007D2 DC400517 +@000007D3 DEC00904 +@000007D4 F800283A +@000007D5 DEFFFB04 +@000007D6 DFC00415 +@000007D7 DF000315 +@000007D8 D839883A +@000007D9 E1000015 +@000007DA E1400115 +@000007DB E1800215 +@000007DC 01000034 +@000007DD 21122204 +@000007DE E1400017 +@000007DF 01800044 +@000007E0 01C07FC4 +@000007E1 0001E780 +@000007E2 01000034 +@000007E3 21121F04 +@000007E4 E1400117 +@000007E5 000D883A +@000007E6 01C07FC4 +@000007E7 0001E780 +@000007E8 01000034 +@000007E9 21122504 +@000007EA E1400217 +@000007EB 01800044 +@000007EC 01C07FC4 +@000007ED 0001E780 +@000007EE DFC00417 +@000007EF DF000317 +@000007F0 DEC00504 +@000007F1 F800283A +@000007F2 DEFFF304 +@000007F3 DF000C15 +@000007F4 D839883A +@000007F5 E1000015 +@000007F6 E1400115 +@000007F7 E1800215 +@000007F8 00BFFA84 +@000007F9 E0800315 +@000007FA E0800017 +@000007FB 10800828 +@000007FC 1000511E +@000007FD 0005303A +@000007FE E0800615 +@000007FF 0001703A +@00000800 E0800617 +@00000801 E0800515 +@00000802 E0800517 +@00000803 E0800415 +@00000804 00C00034 +@00000805 18D3A504 +@00000806 E0800017 +@00000807 100490FA +@00000808 10C7883A +@00000809 E0800217 +@0000080A 18800015 +@0000080B 00C00034 +@0000080C 18D3A504 +@0000080D E0800017 +@0000080E 100490FA +@0000080F 10C5883A +@00000810 10C00104 +@00000811 E0800117 +@00000812 18800015 +@00000813 E0800217 +@00000814 1005003A +@00000815 1000191E +@00000816 E0800017 +@00000817 E0800615 +@00000818 0005303A +@00000819 E0800915 +@0000081A 0001703A +@0000081B E0800917 +@0000081C E0800815 +@0000081D E0800817 +@0000081E E0800715 +@0000081F 00C00044 +@00000820 E0800617 +@00000821 1886983A +@00000822 D0A00A17 +@00000823 10C4B03A +@00000824 D0A00A15 +@00000825 D0A00A17 +@00000826 100170FA +@00000827 E0800717 +@00000828 E0800915 +@00000829 E0800917 +@0000082A 1001703A +@0000082B E0000515 +@0000082C E0800517 +@0000082D E0800B15 +@0000082E 00001906 +@0000082F E0800017 +@00000830 E0800915 +@00000831 0005303A +@00000832 E0800A15 +@00000833 0001703A +@00000834 E0800A17 +@00000835 E0800615 +@00000836 E0800617 +@00000837 E0800715 +@00000838 00C00044 +@00000839 E0800917 +@0000083A 1884983A +@0000083B 0086303A +@0000083C D0A00A17 +@0000083D 10C4703A +@0000083E D0A00A15 +@0000083F D0A00A17 +@00000840 100170FA +@00000841 E0800717 +@00000842 E0800A15 +@00000843 E0800A17 +@00000844 1001703A +@00000845 E0000815 +@00000846 E0800817 +@00000847 E0800B15 +@00000848 E0800B17 +@00000849 E0800315 +@0000084A E0800417 +@0000084B E0800A15 +@0000084C E0800A17 +@0000084D 1001703A +@0000084E E0800317 +@0000084F DF000C17 +@00000850 DEC00D04 +@00000851 F800283A +@00000852 DEFFFA04 +@00000853 DFC00515 +@00000854 DF000415 +@00000855 DC000315 +@00000856 D839883A +@00000857 E1000015 +@00000858 E0C00017 +@00000859 E0800017 +@0000085A 10800217 +@0000085B 10900034 +@0000085C 18800215 +@0000085D E0000115 +@0000085E D0E00817 +@0000085F E0800117 +@00000860 18802436 +@00000861 04000034 +@00000862 84121F04 +@00000863 E1000117 +@00000864 01400304 +@00000865 0000D8C0 +@00000866 1405883A +@00000867 E0C00017 +@00000868 11000017 +@00000869 18800017 +@0000086A 2080161E +@0000086B 04000034 +@0000086C 84121F04 +@0000086D E1000117 +@0000086E 01400304 +@0000086F 0000D8C0 +@00000870 1405883A +@00000871 10800204 +@00000872 10800017 +@00000873 1004403A +@00000874 10000C1E +@00000875 E1000117 +@00000876 01400304 +@00000877 0000D8C0 +@00000878 1007883A +@00000879 00800034 +@0000087A 10921F04 +@0000087B 1887883A +@0000087C E0800017 +@0000087D 18800326 +@0000087E 00BFFCC4 +@0000087F E0800215 +@00000880 00000506 +@00000881 E0800117 +@00000882 10800044 +@00000883 E0800115 +@00000884 003FD906 +@00000885 E0000215 +@00000886 E0800217 +@00000887 DFC00517 +@00000888 DF000417 +@00000889 DC000317 +@0000088A DEC00604 +@0000088B F800283A +@0000088C DEFFF404 +@0000088D DFC00B15 +@0000088E DF000A15 +@0000088F D839883A +@00000890 E1000015 +@00000891 E1400115 +@00000892 E1800215 +@00000893 00BFFFC4 +@00000894 E0800515 +@00000895 00BFFB44 +@00000896 E0800615 +@00000897 E0000715 +@00000898 E1000017 +@00000899 D1600604 +@0000089A 00026040 +@0000089B E0800315 +@0000089C E0800317 +@0000089D 1004C03A +@0000089E 1000051E +@0000089F E1000017 +@000008A0 00026940 +@000008A1 E0800315 +@000008A2 00800044 +@000008A3 E0800715 +@000008A4 E0800317 +@000008A5 1005003A +@000008A6 1000321E +@000008A7 E1000317 +@000008A8 00027780 +@000008A9 E0800515 +@000008AA E0800517 +@000008AB 1004403A +@000008AC 1000031E +@000008AD E0800517 +@000008AE E0800615 +@000008AF 00002B06 +@000008B0 E1000517 +@000008B1 01400304 +@000008B2 0000D8C0 +@000008B3 1007883A +@000008B4 00800034 +@000008B5 10921F04 +@000008B6 1885883A +@000008B7 E0800415 +@000008B8 E1000417 +@000008B9 E0C00117 +@000008BA 00900034 +@000008BB 10BFFFC4 +@000008BC 1884703A +@000008BD 20800215 +@000008BE E0800717 +@000008BF 1004C03A +@000008C0 1000071E +@000008C1 E1000417 +@000008C2 00021480 +@000008C3 E0800615 +@000008C4 E0800617 +@000008C5 1004403A +@000008C6 1000011E +@000008C7 00001306 +@000008C8 E0800317 +@000008C9 10800317 +@000008CA 1005003A +@000008CB 1000091E +@000008CC E0800317 +@000008CD 10800317 +@000008CE E1000417 +@000008CF E1400017 +@000008D0 E1800117 +@000008D1 E1C00217 +@000008D2 103EE83A +@000008D3 E0800915 +@000008D4 00000106 +@000008D5 E0000915 +@000008D6 E0800917 +@000008D7 E0800615 +@000008D8 00000206 +@000008D9 00BFFB44 +@000008DA E0800615 +@000008DB E0800617 +@000008DC 1004403A +@000008DD 1000091E +@000008DE E1000517 +@000008DF 00024000 +@000008E0 00023B80 +@000008E1 E0C00617 +@000008E2 00C7C83A +@000008E3 10C00015 +@000008E4 00BFFFC4 +@000008E5 E0800815 +@000008E6 00000206 +@000008E7 E0800517 +@000008E8 E0800815 +@000008E9 E0800817 +@000008EA DFC00B17 +@000008EB DF000A17 +@000008EC DEC00C04 +@000008ED F800283A +@000008EE DEFFFD04 +@000008EF DFC00215 +@000008F0 DF000115 +@000008F1 D839883A +@000008F2 D0A00917 +@000008F3 1005003A +@000008F4 1000041E +@000008F5 D0A00917 +@000008F6 103EE83A +@000008F7 E0800015 +@000008F8 00000206 +@000008F9 D0A01804 +@000008FA E0800015 +@000008FB E0800017 +@000008FC DFC00217 +@000008FD DF000117 +@000008FE DEC00304 +@000008FF F800283A +@00000900 DEFFFC04 +@00000901 DFC00315 +@00000902 DF000215 +@00000903 DC000115 +@00000904 D839883A +@00000905 E1000015 +@00000906 E0800017 +@00000907 108000D0 +@00000908 10000F1E +@00000909 04000034 +@0000090A 84121F04 +@0000090B E1000017 +@0000090C 01400304 +@0000090D 0000D8C0 +@0000090E 1405883A +@0000090F 10800204 +@00000910 10000015 +@00000911 04000034 +@00000912 84121F04 +@00000913 E1000017 +@00000914 01400304 +@00000915 0000D8C0 +@00000916 1405883A +@00000917 10000015 +@00000918 DFC00317 +@00000919 DF000217 +@0000091A DC000117 +@0000091B DEC00404 +@0000091C F800283A +@0000091D DEFFFB04 +@0000091E DF000415 +@0000091F D839883A +@00000920 E1000015 +@00000921 0005303A +@00000922 E0800315 +@00000923 0001703A +@00000924 E0800317 +@00000925 E0800215 +@00000926 E0800217 +@00000927 E0800115 +@00000928 E0800017 +@00000929 E0800315 +@0000092A E0800317 +@0000092B 10C00017 +@0000092C E0800317 +@0000092D 10800117 +@0000092E 18800115 +@0000092F E0800317 +@00000930 10C00117 +@00000931 E0800317 +@00000932 10800017 +@00000933 18800015 +@00000934 E0C00317 +@00000935 E0800317 +@00000936 18800115 +@00000937 E0C00317 +@00000938 E0800317 +@00000939 18800015 +@0000093A E0800117 +@0000093B E0800315 +@0000093C E0800317 +@0000093D 1001703A +@0000093E DF000417 +@0000093F DEC00504 +@00000940 F800283A +@00000941 DEFFFB04 +@00000942 DFC00415 +@00000943 DF000315 +@00000944 D839883A +@00000945 D0A00E17 +@00000946 E0800115 +@00000947 D0A00D17 +@00000948 10800044 +@00000949 D0A00D15 +@0000094A E0C00117 +@0000094B D0A00E04 +@0000094C 18803026 +@0000094D E0800117 +@0000094E 10800017 +@0000094F E0800015 +@00000950 E0800117 +@00000951 10800403 +@00000952 1005003A +@00000953 1000051E +@00000954 D0A00D17 +@00000955 1004C03A +@00000956 1000021E +@00000957 E0800117 +@00000958 10000405 +@00000959 E0800117 +@0000095A 10C00217 +@0000095B D0A00D17 +@0000095C 10C01D36 +@0000095D E0800117 +@0000095E 10800403 +@0000095F 1004C03A +@00000960 1000191E +@00000961 E0800117 +@00000962 E0C00117 +@00000963 10800317 +@00000964 19000517 +@00000965 103EE83A +@00000966 E0800215 +@00000967 E0800217 +@00000968 1004C03A +@00000969 1000031E +@0000096A E1000117 +@0000096B 00024740 +@0000096C 00000D06 +@0000096D E1000117 +@0000096E E0800117 +@0000096F 10C00217 +@00000970 E0800217 +@00000971 1885883A +@00000972 20800215 +@00000973 E0800117 +@00000974 10C00217 +@00000975 D0A00D17 +@00000976 1880032E +@00000977 E0C00117 +@00000978 00800044 +@00000979 18800405 +@0000097A E0800017 +@0000097B E0800115 +@0000097C 003FCD06 +@0000097D DFC00417 +@0000097E DF000317 +@0000097F DEC00504 +@00000980 F800283A +@00000981 DEFFF904 +@00000982 DFC00615 +@00000983 DF000515 +@00000984 D839883A +@00000985 E1000015 +@00000986 E1400115 +@00000987 E0800117 +@00000988 10800017 +@00000989 E0800215 +@0000098A E1000017 +@0000098B 0000BEC0 +@0000098C 10800044 +@0000098D E0800315 +@0000098E E0C00217 +@0000098F E0800117 +@00000990 18800E26 +@00000991 E0800217 +@00000992 11000217 +@00000993 E1400017 +@00000994 E1800317 +@00000995 00030840 +@00000996 1004C03A +@00000997 1000031E +@00000998 E0800217 +@00000999 E0800415 +@0000099A 00000506 +@0000099B E0800217 +@0000099C 10800017 +@0000099D E0800215 +@0000099E 003FEF06 +@0000099F E0000415 +@000009A0 E0800417 +@000009A1 DFC00617 +@000009A2 DF000517 +@000009A3 DEC00704 +@000009A4 F800283A +@000009A5 DEFFFA04 +@000009A6 DFC00515 +@000009A7 DF000415 +@000009A8 D839883A +@000009A9 E1000015 +@000009AA D0A00417 +@000009AB E0800115 +@000009AC E0C00117 +@000009AD D0A00404 +@000009AE 18802926 +@000009AF E0800117 +@000009B0 11000217 +@000009B1 0000BEC0 +@000009B2 E0800215 +@000009B3 E0800117 +@000009B4 10C00217 +@000009B5 E0800217 +@000009B6 1885883A +@000009B7 10BFFFC4 +@000009B8 10800007 +@000009B9 10800BD8 +@000009BA 1000031E +@000009BB E0800217 +@000009BC 10BFFFC4 +@000009BD E0800215 +@000009BE E0C00017 +@000009BF E0800217 +@000009C0 1885883A +@000009C1 10800007 +@000009C2 10800BE0 +@000009C3 1000061E +@000009C4 E0C00017 +@000009C5 E0800217 +@000009C6 1885883A +@000009C7 10800007 +@000009C8 1004C03A +@000009C9 10000A1E +@000009CA E0800117 +@000009CB 11000217 +@000009CC E1400017 +@000009CD E1800217 +@000009CE 00030840 +@000009CF 1004C03A +@000009D0 1000031E +@000009D1 E0800117 +@000009D2 E0800315 +@000009D3 00000506 +@000009D4 E0800117 +@000009D5 10800017 +@000009D6 E0800115 +@000009D7 003FD406 +@000009D8 E0000315 +@000009D9 E0800317 +@000009DA DFC00517 +@000009DB DF000417 +@000009DC DEC00604 +@000009DD F800283A +@000009DE DEFFF804 +@000009DF DFC00715 +@000009E0 DF000615 +@000009E1 DC000515 +@000009E2 D839883A +@000009E3 E1000015 +@000009E4 00BFFA04 +@000009E5 E0800215 +@000009E6 E0000315 +@000009E7 E0000115 +@000009E8 E0800117 +@000009E9 10800808 +@000009EA 10001D1E +@000009EB 04000034 +@000009EC 84121F04 +@000009ED E1000117 +@000009EE 01400304 +@000009EF 0000D8C0 +@000009F0 1405883A +@000009F1 10800017 +@000009F2 1004C03A +@000009F3 1000101E +@000009F4 04000034 +@000009F5 84121F04 +@000009F6 E1000117 +@000009F7 01400304 +@000009F8 0000D8C0 +@000009F9 1407883A +@000009FA E0800017 +@000009FB 18800015 +@000009FC E0C00117 +@000009FD D0A00817 +@000009FE 10C0020E +@000009FF E0800117 +@00000A00 D0A00815 +@00000A01 E0800117 +@00000A02 E0800215 +@00000A03 00000406 +@00000A04 E0800117 +@00000A05 10800044 +@00000A06 E0800115 +@00000A07 003FE006 +@00000A08 E0000415 +@00000A09 E0800217 +@00000A0A DFC00717 +@00000A0B DF000617 +@00000A0C DC000517 +@00000A0D DEC00804 +@00000A0E F800283A +@00000A0F D0A00017 +@00000A10 DEFFFE04 +@00000A11 DC000015 +@00000A12 DFC00115 +@00000A13 11400C17 +@00000A14 2021883A +@00000A15 01004304 +@00000A16 28001B26 +@00000A17 28C00117 +@00000A18 008007C4 +@00000A19 10C00D16 +@00000A1A 28800104 +@00000A1B 10C00017 +@00000A1C 000D883A +@00000A1D 180890BA +@00000A1E 18C00044 +@00000A1F 10C00015 +@00000A20 2149883A +@00000A21 24000215 +@00000A22 3005883A +@00000A23 DFC00117 +@00000A24 DC000017 +@00000A25 DEC00204 +@00000A26 F800283A +@00000A27 00029A40 +@00000A28 100B883A +@00000A29 01BFFFC4 +@00000A2A 103FF726 +@00000A2B D0E00017 +@00000A2C 10004215 +@00000A2D 10000115 +@00000A2E 18800C17 +@00000A2F 28800015 +@00000A30 19400C15 +@00000A31 003FE806 +@00000A32 01400034 +@00000A33 2953E504 +@00000A34 11400C15 +@00000A35 003FE106 +@00000A36 D0A00017 +@00000A37 DEFFF804 +@00000A38 DD800015 +@00000A39 DFC00715 +@00000A3A DC000615 +@00000A3B DC400515 +@00000A3C DC800415 +@00000A3D DCC00315 +@00000A3E DD000215 +@00000A3F DD400115 +@00000A40 15000C17 +@00000A41 202D883A +@00000A42 A0002426 +@00000A43 A0800117 +@00000A44 A5402204 +@00000A45 0027883A +@00000A46 14BFFFC4 +@00000A47 9006803A +@00000A48 1800021E +@00000A49 00800044 +@00000A4A 14A6983A +@00000A4B 1800191E +@00000A4C 900690BA +@00000A4D 1D05883A +@00000A4E 14400204 +@00000A4F 1821883A +@00000A50 00000806 +@00000A51 88800017 +@00000A52 29400017 +@00000A53 94BFFFC4 +@00000A54 843FFF04 +@00000A55 103EE83A +@00000A56 8C7FFF04 +@00000A57 9827D07A +@00000A58 90000C16 +@00000A59 A8802017 +@00000A5A 854B883A +@00000A5B B009883A +@00000A5C 14C4703A +@00000A5D 103FF31E +@00000A5E 88800017 +@00000A5F 94BFFFC4 +@00000A60 843FFF04 +@00000A61 103EE83A +@00000A62 8C7FFF04 +@00000A63 9827D07A +@00000A64 903FF40E +@00000A65 A5000017 +@00000A66 A03FDC1E +@00000A67 B009883A +@00000A68 000354C0 +@00000A69 200B883A +@00000A6A D1200017 +@00000A6B 02000034 +@00000A6C 420A7304 +@00000A6D 4000683A +@00000A6E 200B883A +@00000A6F D1200017 +@00000A70 02000034 +@00000A71 420C9904 +@00000A72 4000683A +@00000A73 DEFFF504 +@00000A74 28C002C4 +@00000A75 00800584 +@00000A76 DC400715 +@00000A77 DC800615 +@00000A78 DFC00A15 +@00000A79 DF000915 +@00000A7A DC000815 +@00000A7B DCC00515 +@00000A7C DD000415 +@00000A7D DD400315 +@00000A7E DD800215 +@00000A7F DDC00115 +@00000A80 2025883A +@00000A81 04400404 +@00000A82 10C0032E +@00000A83 00BFFE04 +@00000A84 18A2703A +@00000A85 88000116 +@00000A86 89400D2E +@00000A87 0005883A +@00000A88 DFC00A17 +@00000A89 DF000917 +@00000A8A DC000817 +@00000A8B DC400717 +@00000A8C DC800617 +@00000A8D DCC00517 +@00000A8E DD000417 +@00000A8F DD400317 +@00000A90 DD800217 +@00000A91 DDC00117 +@00000A92 DEC00B04 +@00000A93 F800283A +@00000A94 9009883A +@00000A95 000356C0 +@00000A96 00807DC4 +@00000A97 14401536 +@00000A98 03400034 +@00000A99 6B528904 +@00000A9A 8B4D883A +@00000A9B 34000317 +@00000A9C 8812D0FA +@00000A9D 81803E26 +@00000A9E 80C00117 +@00000A9F 00BFFF04 +@00000AA0 82000317 +@00000AA1 1886703A +@00000AA2 80CB883A +@00000AA3 28800117 +@00000AA4 81C00217 +@00000AA5 9009883A +@00000AA6 10800054 +@00000AA7 41C00215 +@00000AA8 28800115 +@00000AA9 3A000315 +@00000AAA 00035880 +@00000AAB 80800204 +@00000AAC 003FDB06 +@00000AAD 8806D27A +@00000AAE 8812D0FA +@00000AAF 18000926 +@00000AB0 00800104 +@00000AB1 10C02F2E +@00000AB2 00800504 +@00000AB3 1A4016C4 +@00000AB4 10C0042E +@00000AB5 00801504 +@00000AB6 10C11536 +@00000AB7 8804D33A +@00000AB8 12401B84 +@00000AB9 480490FA +@00000ABA 03400034 +@00000ABB 6B528904 +@00000ABC 134B883A +@00000ABD 2C000317 +@00000ABE 81400926 +@00000ABF 01FFFF04 +@00000AC0 018003C4 +@00000AC1 80800117 +@00000AC2 11C6703A +@00000AC3 1C49C83A +@00000AC4 3100AA16 +@00000AC5 2000690E +@00000AC6 84000317 +@00000AC7 817FF91E +@00000AC8 4A400044 +@00000AC9 03000034 +@00000ACA 63128B04 +@00000ACB 64000217 +@00000ACC 83002826 +@00000ACD 80800117 +@00000ACE 00FFFF04 +@00000ACF 10C6703A +@00000AD0 1C49C83A +@00000AD1 008003C4 +@00000AD2 11006616 +@00000AD3 63000315 +@00000AD4 63000215 +@00000AD5 20000E16 +@00000AD6 80C7883A +@00000AD7 18800117 +@00000AD8 9009883A +@00000AD9 10800054 +@00000ADA 18800115 +@00000ADB 003FCE06 +@00000ADC 81800204 +@00000ADD 34000317 +@00000ADE 81BFBF1E +@00000ADF 4A400084 +@00000AE0 003FE806 +@00000AE1 8804D1BA +@00000AE2 12400E04 +@00000AE3 003FD506 +@00000AE4 00807FC4 +@00000AE5 10C09436 +@00000AE6 1808D0FA +@00000AE7 61BFFE04 +@00000AE8 00800044 +@00000AE9 200A90FA +@00000AEA 2007D0BA +@00000AEB 31000117 +@00000AEC 2991883A +@00000AED 41C00217 +@00000AEE 10C4983A +@00000AEF 82000315 +@00000AF0 81C00215 +@00000AF1 2088B03A +@00000AF2 3C000315 +@00000AF3 31000115 +@00000AF4 44000215 +@00000AF5 4807883A +@00000AF6 4800A616 +@00000AF7 1807D0BA +@00000AF8 03400034 +@00000AF9 6B528904 +@00000AFA 00800044 +@00000AFB 10CE983A +@00000AFC 69000117 +@00000AFD 21C04836 +@00000AFE 21C4703A +@00000AFF 10000A1E +@00000B00 39CF883A +@00000B01 00BFFF04 +@00000B02 4884703A +@00000B03 21C6703A +@00000B04 12400104 +@00000B05 1800041E +@00000B06 39CF883A +@00000B07 4A400104 +@00000B08 21C4703A +@00000B09 103FFC26 +@00000B0A 480490FA +@00000B0B 4817883A +@00000B0C 134D883A +@00000B0D 300B883A +@00000B0E 2C000317 +@00000B0F 81400926 +@00000B10 02BFFF04 +@00000B11 020003C4 +@00000B12 80800117 +@00000B13 1286703A +@00000B14 1C49C83A +@00000B15 41008016 +@00000B16 2000180E +@00000B17 84000317 +@00000B18 817FF91E +@00000B19 4A400044 +@00000B1A 488000CC +@00000B1B 29400204 +@00000B1C 103FF11E +@00000B1D 588000CC +@00000B1E 31BFFE04 +@00000B1F 5AFFFFC4 +@00000B20 1000E526 +@00000B21 30800217 +@00000B22 11BFFA26 +@00000B23 03400034 +@00000B24 6B528904 +@00000B25 39CF883A +@00000B26 68C00117 +@00000B27 19C01E36 +@00000B28 3800031E +@00000B29 00001C06 +@00000B2A 39CF883A +@00000B2B 4A400104 +@00000B2C 19C4703A +@00000B2D 103FFC26 +@00000B2E 003FDB06 +@00000B2F 80C7883A +@00000B30 18800117 +@00000B31 82000317 +@00000B32 81C00217 +@00000B33 10800054 +@00000B34 9009883A +@00000B35 18800115 +@00000B36 41C00215 +@00000B37 3A000315 +@00000B38 003F7106 +@00000B39 88800054 +@00000B3A 844B883A +@00000B3B 80800115 +@00000B3C 2905883A +@00000B3D 20C00054 +@00000B3E 61400315 +@00000B3F 61400215 +@00000B40 11000015 +@00000B41 9009883A +@00000B42 2B000215 +@00000B43 28C00115 +@00000B44 2B000315 +@00000B45 003F6406 +@00000B46 6D400217 +@00000B47 00BFFF04 +@00000B48 A8C00117 +@00000B49 18AC703A +@00000B4A B449C83A +@00000B4B B4400236 +@00000B4C 008003C4 +@00000B4D 11002316 +@00000B4E D0A01317 +@00000B4F 073FFFC4 +@00000B50 B02F883A +@00000B51 8887883A +@00000B52 D0A01217 +@00000B53 ADA7883A +@00000B54 1D000404 +@00000B55 17000326 +@00000B56 18C023C4 +@00000B57 00BFE004 +@00000B58 18A8703A +@00000B59 9009883A +@00000B5A A00B883A +@00000B5B DB400015 +@00000B5C 00030F40 +@00000B5D 1021883A +@00000B5E DB400017 +@00000B5F 17000426 +@00000B60 14C03E2E +@00000B61 00800034 +@00000B62 10928904 +@00000B63 A8803B26 +@00000B64 68800217 +@00000B65 013FFF04 +@00000B66 10C00117 +@00000B67 1906703A +@00000B68 1C49C83A +@00000B69 1C400236 +@00000B6A 008003C4 +@00000B6B 11000516 +@00000B6C 9009883A +@00000B6D 00035880 +@00000B6E 003F1806 +@00000B6F 4A7FFFC4 +@00000B70 003F5706 +@00000B71 6C000217 +@00000B72 88800054 +@00000B73 21000054 +@00000B74 8447883A +@00000B75 80800115 +@00000B76 19000115 +@00000B77 9009883A +@00000B78 68C00215 +@00000B79 003F3006 +@00000B7A 180AD27A +@00000B7B 1808D0FA +@00000B7C 28000426 +@00000B7D 00800104 +@00000B7E 11405836 +@00000B7F 1804D1BA +@00000B80 11000E04 +@00000B81 200490FA +@00000B82 01400034 +@00000B83 29528904 +@00000B84 1351883A +@00000B85 41C00217 +@00000B86 3A006D26 +@00000B87 38800117 +@00000B88 013FFF04 +@00000B89 1104703A +@00000B8A 1880052E +@00000B8B 39C00217 +@00000B8C 3A000326 +@00000B8D 38800117 +@00000B8E 1104703A +@00000B8F 18BFFB36 +@00000B90 3A000317 +@00000B91 82000315 +@00000B92 81C00215 +@00000B93 3C000315 +@00000B94 44000215 +@00000B95 003F5F06 +@00000B96 82000317 +@00000B97 81C00217 +@00000B98 88800054 +@00000B99 844B883A +@00000B9A 41C00215 +@00000B9B 3A000315 +@00000B9C 003F9E06 +@00000B9D 48C000C4 +@00000B9E 003F5806 +@00000B9F 07000034 +@00000BA0 E7127F04 +@00000BA1 E0800017 +@00000BA2 1505883A +@00000BA3 E0800015 +@00000BA4 84C05826 +@00000BA5 D0E01217 +@00000BA6 00BFFFC4 +@00000BA7 18805326 +@00000BA8 E0800017 +@00000BA9 84C7C83A +@00000BAA 10C5883A +@00000BAB E0800015 +@00000BAC 80C001CC +@00000BAD 0027883A +@00000BAE 18000326 +@00000BAF 00800204 +@00000BB0 10E7C83A +@00000BB1 84E1883A +@00000BB2 8505883A +@00000BB3 10801FCC +@00000BB4 00C02004 +@00000BB5 1887C83A +@00000BB6 98E7883A +@00000BB7 9009883A +@00000BB8 980B883A +@00000BB9 DB400015 +@00000BBA 00030F40 +@00000BBB 1007883A +@00000BBC 00BFFFC4 +@00000BBD DB400017 +@00000BBE 18804E26 +@00000BBF E0800017 +@00000BC0 1C07C83A +@00000BC1 1CC9883A +@00000BC2 14C5883A +@00000BC3 E0800015 +@00000BC4 6C000215 +@00000BC5 20800054 +@00000BC6 AB404426 +@00000BC7 014003C4 +@00000BC8 2D801636 +@00000BC9 00800044 +@00000BCA 80800115 +@00000BCB 003F9806 +@00000BCC 00805504 +@00000BCD 10C00336 +@00000BCE 8804D3FA +@00000BCF 12401DC4 +@00000BD0 003EE806 +@00000BD1 00815504 +@00000BD2 02401F84 +@00000BD3 10FEE536 +@00000BD4 8804D4BA +@00000BD5 12401F04 +@00000BD6 003EE206 +@00000BD7 00800504 +@00000BD8 290016C4 +@00000BD9 117FA72E +@00000BDA 00801504 +@00000BDB 11403A36 +@00000BDC 1804D33A +@00000BDD 11001B84 +@00000BDE 003FA206 +@00000BDF 80800115 +@00000BE0 A8800117 +@00000BE1 00FFFE04 +@00000BE2 B13FFD04 +@00000BE3 20EE703A +@00000BE4 1080004C +@00000BE5 15C4B03A +@00000BE6 A8800115 +@00000BE7 ADC7883A +@00000BE8 00800144 +@00000BE9 18800215 +@00000BEA 18800115 +@00000BEB 2DC02436 +@00000BEC E0C00017 +@00000BED D0A01117 +@00000BEE 10C0012E +@00000BEF D0E01115 +@00000BF0 D0A01017 +@00000BF1 10FF722E +@00000BF2 D0E01015 +@00000BF3 003F7006 +@00000BF4 2005D0BA +@00000BF5 00C00044 +@00000BF6 29000117 +@00000BF7 1886983A +@00000BF8 20C8B03A +@00000BF9 29000115 +@00000BFA 003F9606 +@00000BFB D4201215 +@00000BFC 003FAF06 +@00000BFD 80801FCC +@00000BFE 103FA61E +@00000BFF 00800034 +@00000C00 10928904 +@00000C01 10C00217 +@00000C02 A5C9883A +@00000C03 20800054 +@00000C04 18800115 +@00000C05 003FE606 +@00000C06 68800117 +@00000C07 01C6303A +@00000C08 10C4703A +@00000C09 68800115 +@00000C0A 003F1806 +@00000C0B 80800115 +@00000C0C 003FDF06 +@00000C0D 0027883A +@00000C0E 8007883A +@00000C0F 003FAF06 +@00000C10 A9400204 +@00000C11 9009883A +@00000C12 DB400015 +@00000C13 00032640 +@00000C14 DB400017 +@00000C15 003FD606 +@00000C16 00805504 +@00000C17 11400336 +@00000C18 1804D3FA +@00000C19 11001DC4 +@00000C1A 003F6606 +@00000C1B 00815504 +@00000C1C 01001F84 +@00000C1D 117F6336 +@00000C1E 1804D4BA +@00000C1F 11001F04 +@00000C20 003F6006 +@00000C21 31BFFFC4 +@00000C22 00BFFFC4 +@00000C23 30800826 +@00000C24 100F883A +@00000C25 20C00003 +@00000C26 28800003 +@00000C27 31BFFFC4 +@00000C28 21000044 +@00000C29 29400044 +@00000C2A 1880031E +@00000C2B 31FFF91E +@00000C2C 0005883A +@00000C2D F800283A +@00000C2E 1885C83A +@00000C2F F800283A +@00000C30 31BFFFC4 +@00000C31 00BFFFC4 +@00000C32 2007883A +@00000C33 30800726 +@00000C34 100F883A +@00000C35 28800003 +@00000C36 31BFFFC4 +@00000C37 29400044 +@00000C38 18800005 +@00000C39 18C00044 +@00000C3A 31FFFA1E +@00000C3B 2005883A +@00000C3C F800283A +@00000C3D DEFFFE04 +@00000C3E DC000015 +@00000C3F 2021883A +@00000C40 2809883A +@00000C41 DFC00115 +@00000C42 D0201815 +@00000C43 00035A40 +@00000C44 1007883A +@00000C45 00BFFFC4 +@00000C46 18800526 +@00000C47 1805883A +@00000C48 DFC00117 +@00000C49 DC000017 +@00000C4A DEC00204 +@00000C4B F800283A +@00000C4C D0A01817 +@00000C4D 103FF926 +@00000C4E 80800315 +@00000C4F 003FF706 +@00000C50 DEFFFB04 +@00000C51 DCC00015 +@00000C52 04C00034 +@00000C53 9CD28904 +@00000C54 DC000315 +@00000C55 DC400215 +@00000C56 DC800115 +@00000C57 2823883A +@00000C58 2021883A +@00000C59 DFC00415 +@00000C5A 000356C0 +@00000C5B 98800217 +@00000C5C 8009883A +@00000C5D 000B883A +@00000C5E 10C00117 +@00000C5F 00BFFF04 +@00000C60 18A4703A +@00000C61 9463C83A +@00000C62 8C401BC4 +@00000C63 8822D1FA +@00000C64 00802004 +@00000C65 8C7FFFC4 +@00000C66 882291FA +@00000C67 88800616 +@00000C68 00030F40 +@00000C69 98C00217 +@00000C6A 8009883A +@00000C6B 044BC83A +@00000C6C 1C87883A +@00000C6D 18800926 +@00000C6E 00035880 +@00000C6F 0005883A +@00000C70 DFC00417 +@00000C71 DC000317 +@00000C72 DC400217 +@00000C73 DC800117 +@00000C74 DCC00017 +@00000C75 DEC00504 +@00000C76 F800283A +@00000C77 8009883A +@00000C78 00030F40 +@00000C79 944DC83A +@00000C7A 00FFFFC4 +@00000C7B 8009883A +@00000C7C 000B883A +@00000C7D 01C00034 +@00000C7E 39D27F04 +@00000C7F 31800054 +@00000C80 10C00926 +@00000C81 38800017 +@00000C82 98C00217 +@00000C83 8009883A +@00000C84 1445C83A +@00000C85 38800015 +@00000C86 19800115 +@00000C87 00035880 +@00000C88 00800044 +@00000C89 003FE606 +@00000C8A 00030F40 +@00000C8B 99400217 +@00000C8C 100D883A +@00000C8D 8009883A +@00000C8E 1165C83A +@00000C8F 008003C4 +@00000C90 90C00054 +@00000C91 14BFDC0E +@00000C92 28C00115 +@00000C93 D0E01217 +@00000C94 00800034 +@00000C95 10927F04 +@00000C96 30C7C83A +@00000C97 10C00015 +@00000C98 003FD506 +@00000C99 DEFFFD04 +@00000C9A DC000115 +@00000C9B DC400015 +@00000C9C DFC00215 +@00000C9D 2821883A +@00000C9E 2023883A +@00000C9F 28003226 +@00000CA0 000356C0 +@00000CA1 82BFFE04 +@00000CA2 51400117 +@00000CA3 00BFFF84 +@00000CA4 03000034 +@00000CA5 63128904 +@00000CA6 2892703A +@00000CA7 524D883A +@00000CA8 30C00117 +@00000CA9 61000217 +@00000CAA 00BFFF04 +@00000CAB 1896703A +@00000CAC 21804E26 +@00000CAD 2880004C +@00000CAE 32C00115 +@00000CAF 000B883A +@00000CB0 1000091E +@00000CB1 50C00017 +@00000CB2 60800204 +@00000CB3 50D5C83A +@00000CB4 51000217 +@00000CB5 48D3883A +@00000CB6 20807426 +@00000CB7 52000317 +@00000CB8 41000215 +@00000CB9 22000315 +@00000CBA 32C7883A +@00000CBB 18800117 +@00000CBC 2808C03A +@00000CBD 1080004C +@00000CBE 1000061E +@00000CBF 4AD3883A +@00000CC0 20001626 +@00000CC1 30C00217 +@00000CC2 32000317 +@00000CC3 40C00215 +@00000CC4 1A000315 +@00000CC5 48800054 +@00000CC6 5247883A +@00000CC7 50800115 +@00000CC8 1A400015 +@00000CC9 20001726 +@00000CCA 8809883A +@00000CCB 02000034 +@00000CCC 420D6204 +@00000CCD DFC00217 +@00000CCE DC000117 +@00000CCF DC400017 +@00000CD0 DEC00304 +@00000CD1 4000683A +@00000CD2 DFC00217 +@00000CD3 DC000117 +@00000CD4 DC400017 +@00000CD5 DEC00304 +@00000CD6 F800283A +@00000CD7 30C00217 +@00000CD8 00800034 +@00000CD9 10928B04 +@00000CDA 18BFE71E +@00000CDB 1A800315 +@00000CDC 1A800215 +@00000CDD 01000044 +@00000CDE 50C00215 +@00000CDF 50C00315 +@00000CE0 003FE406 +@00000CE1 00807FC4 +@00000CE2 12402B36 +@00000CE3 4806D0FA +@00000CE4 01800034 +@00000CE5 31928904 +@00000CE6 00800044 +@00000CE7 180890FA +@00000CE8 1807D0BA +@00000CE9 31400117 +@00000CEA 2191883A +@00000CEB 41C00217 +@00000CEC 10C4983A +@00000CED 52000315 +@00000CEE 51C00215 +@00000CEF 288AB03A +@00000CF0 3A800315 +@00000CF1 31400115 +@00000CF2 42800215 +@00000CF3 8809883A +@00000CF4 02000034 +@00000CF5 420D6204 +@00000CF6 DFC00217 +@00000CF7 DC000117 +@00000CF8 DC400017 +@00000CF9 DEC00304 +@00000CFA 4000683A +@00000CFB 2880004C +@00000CFC 4AD3883A +@00000CFD 1000071E +@00000CFE 50C00017 +@00000CFF 50D5C83A +@00000D00 52000317 +@00000D01 51C00217 +@00000D02 48D3883A +@00000D03 41C00215 +@00000D04 3A000315 +@00000D05 D0A01417 +@00000D06 48C00054 +@00000D07 62800215 +@00000D08 50C00115 +@00000D09 48BFC036 +@00000D0A D1601317 +@00000D0B 8809883A +@00000D0C 00031400 +@00000D0D 003FBC06 +@00000D0E 4808D27A +@00000D0F 4806D0FA +@00000D10 2000151E +@00000D11 180490FA +@00000D12 01400034 +@00000D13 29528904 +@00000D14 1311883A +@00000D15 41C00217 +@00000D16 3A001E26 +@00000D17 38800117 +@00000D18 00FFFF04 +@00000D19 10C4703A +@00000D1A 4880052E +@00000D1B 39C00217 +@00000D1C 3A000326 +@00000D1D 38800117 +@00000D1E 10C4703A +@00000D1F 48BFFB36 +@00000D20 3A000317 +@00000D21 52000315 +@00000D22 51C00215 +@00000D23 3A800315 +@00000D24 42800215 +@00000D25 003FCD06 +@00000D26 00800104 +@00000D27 11000536 +@00000D28 4804D1BA +@00000D29 10C00E04 +@00000D2A 003FE606 +@00000D2B 01400044 +@00000D2C 003F8D06 +@00000D2D 00800504 +@00000D2E 20C016C4 +@00000D2F 113FE12E +@00000D30 00801504 +@00000D31 11000A36 +@00000D32 4804D33A +@00000D33 10C01B84 +@00000D34 003FDC06 +@00000D35 1805D0BA +@00000D36 00C00044 +@00000D37 29000117 +@00000D38 1886983A +@00000D39 20C8B03A +@00000D3A 29000115 +@00000D3B 003FE506 +@00000D3C 00805504 +@00000D3D 11000336 +@00000D3E 4804D3FA +@00000D3F 10C01DC4 +@00000D40 003FD006 +@00000D41 00815504 +@00000D42 00C01F84 +@00000D43 113FCD36 +@00000D44 4804D4BA +@00000D45 10C01F04 +@00000D46 003FCA06 +@00000D47 DEFFFD04 +@00000D48 DF000215 +@00000D49 D839883A +@00000D4A E1000015 +@00000D4B E0800017 +@00000D4C E0800115 +@00000D4D 00C00044 +@00000D4E E0800117 +@00000D4F 180171BA +@00000D50 DF000217 +@00000D51 DEC00304 +@00000D52 F800283A +@00000D53 DEFFFD04 +@00000D54 DFC00215 +@00000D55 DF000115 +@00000D56 D839883A +@00000D57 E1000015 +@00000D58 E1000017 +@00000D59 000351C0 +@00000D5A 003FFF06 +@00000D5B DEFFFE04 +@00000D5C DF000115 +@00000D5D D839883A +@00000D5E E1000015 +@00000D5F DF000117 +@00000D60 DEC00204 +@00000D61 F800283A +@00000D62 DEFFFE04 +@00000D63 DF000115 +@00000D64 D839883A +@00000D65 E1000015 +@00000D66 DF000117 +@00000D67 DEC00204 +@00000D68 F800283A +@00000D69 DEFFFA04 +@00000D6A DF000515 +@00000D6B D839883A +@00000D6C E1000015 +@00000D6D 0005303A +@00000D6E E0800415 +@00000D6F 0001703A +@00000D70 E0800417 +@00000D71 E0800315 +@00000D72 E0800317 +@00000D73 E0800115 +@00000D74 D0A01517 +@00000D75 10C000C4 +@00000D76 00BFFF04 +@00000D77 1884703A +@00000D78 D0A01515 +@00000D79 D0A01517 +@00000D7A E0800215 +@00000D7B D0E01517 +@00000D7C E0800017 +@00000D7D 1885883A +@00000D7E D0A01515 +@00000D7F E0800117 +@00000D80 E0800415 +@00000D81 E0800417 +@00000D82 1001703A +@00000D83 E0800217 +@00000D84 DF000517 +@00000D85 DEC00604 +@00000D86 F800283A +@00000D87 2A2A0A0A +@00000D88 2A2A2A2A +@00000D89 2A2A2A2A +@00000D8A 2A2A2A2A +@00000D8B 2A2A2A2A +@00000D8C 2A2A2A2A +@00000D8D 2A2A2A2A +@00000D8E 0000000A +@00000D8F 6548202A +@00000D90 206F6C6C +@00000D91 6D6F7266 +@00000D92 6F694E20 +@00000D93 49492073 +@00000D94 20202021 +@00000D95 000A2A20 +@00000D96 6F43202A +@00000D97 69746E75 +@00000D98 6620676E +@00000D99 206D6F72 +@00000D9A 74203030 +@00000D9B 6666206F +@00000D9C 000A2A20 +@00000D9D 2A2A2A2A +@00000D9E 2A2A2A2A +@00000D9F 2A2A2A2A +@00000DA0 2A2A2A2A +@00000DA1 2A2A2A2A +@00000DA2 2A2A2A2A +@00000DA3 000A2A2A +@00000DA4 78323025 +@00000DA5 0020202C +@00000DA6 74747542 +@00000DA7 31206E6F +@00000DA8 0000000A +@00000DA9 74747542 +@00000DAA 32206E6F +@00000DAB 0000000A +@00000DAC 74747542 +@00000DAD 33206E6F +@00000DAE 0000000A +@00000DAF 74747542 +@00000DB0 34206E6F +@00000DB1 0000000A +@00000DB2 6961570A +@00000DB3 676E6974 +@00000DB4 002E2E2E +@00000DB5 0000002E +@00000DB6 756F590A +@00000DB7 73757020 +@00000DB8 3A646568 +@00000DB9 00002020 +@00000DBA 00000838 +@00000DBB 000007F0 +@00000DBC 000007F0 +@00000DBD 000007F0 +@00000DBE 000007F0 +@00000DBF 000007F0 +@00000DC0 000007F0 +@00000DC1 000007F0 +@00000DC2 000007F0 +@00000DC3 000007F0 +@00000DC4 000007F0 +@00000DC5 0000098C +@00000DC6 00000848 +@00000DC7 000007F0 +@00000DC8 000007F0 +@00000DC9 000007F0 +@00000DCA 000007F0 +@00000DCB 00000848 +@00000DCC 000007F0 +@00000DCD 000007F0 +@00000DCE 000007F0 +@00000DCF 000007F0 +@00000DD0 000007F0 +@00000DD1 00000A68 +@00000DD2 000007F0 +@00000DD3 000007F0 +@00000DD4 000007F0 +@00000DD5 00000A00 +@00000DD6 000007F0 +@00000DD7 000009F8 +@00000DD8 000007F0 +@00000DD9 000007F0 +@00000DDA 000009EC +@00000DDB 7665642F +@00000DDC 61746A2F +@00000DDD 61755F67 +@00000DDE 305F7472 +@00000DDF 00000000 +@00000DE0 7665642F +@00000DE1 61746A2F +@00000DE2 61755F67 +@00000DE3 305F7472 +@00000DE4 00000000 +@00000DE5 7665642F +@00000DE6 6C756E2F +@00000DE7 0000006C +@00000DE8 000037D4 +@00000DE9 000037DC +@00000DEA 000037E4 +@00000DEB 00000000 +@00000DEC 00000000 +@00000DED 00000000 +@00000DEE 00000000 +@00000DEF 00000000 +@00000DF0 00000000 +@00000DF1 00000000 +@00000DF2 00000000 +@00000DF3 00000000 +@00000DF4 00000000 +@00000DF5 00000004 +@00000DF6 00000000 +@00000DF7 0001000A +@00000DF8 00000000 +@00000DF9 0002000A +@00000DFA 00000000 +@00000DFB 00000000 +@00000DFC 00000000 +@00000DFD 00000000 +@00000DFE 00000000 +@00000DFF 00003780 +@00000E00 00000000 +@00000E01 00000000 +@00000E02 00001000 +@00000E03 00001240 +@00000E04 00000000 +@00000E05 00000000 +@00000E06 000016B0 +@00000E07 01000850 +@00000E08 0000000A +@00000E09 00000000 +@00000E0A 00000000 +@00000E0B 00000000 +@00000E0C 00000000 +@00000E0D 00000000 +@00000E0E 00000000 +@00000E0F 00000000 +@00000E10 00000000 +@00000E11 00000000 +@00000E12 00000000 +@00000E13 00000000 +@00000E14 00000000 +@00000E15 00000000 +@00000E16 00000000 +@00000E17 00000000 +@00000E18 00000000 +@00000E19 00000000 +@00000E1A 00000000 +@00000E1B 00000000 +@00000E1C 00000000 +@00000E1D 00000000 +@00000E1E 00000000 +@00000E1F 00000000 +@00000E20 00000000 +@00000E21 00000000 +@00000E22 00000000 +@00000E23 00000000 +@00000E24 00000000 +@00000E25 00000000 +@00000E26 00000000 +@00000E27 00000000 +@00000E28 00000000 +@00000E29 00000000 +@00000E2A 00000000 +@00000E2B 00000000 +@00000E2C 00000000 +@00000E2D 00000000 +@00000E2E 00000000 +@00000E2F 00000000 +@00000E30 00000000 +@00000E31 00000000 +@00000E32 00000000 +@00000E33 00000000 +@00000E34 00000000 +@00000E35 00000000 +@00000E36 00000000 +@00000E37 00000000 +@00000E38 00000000 +@00000E39 00000000 +@00000E3A 00000000 +@00000E3B 00000000 +@00000E3C 00000000 +@00000E3D 00000000 +@00000E3E 00000000 +@00000E3F 00000000 +@00000E40 00000000 +@00000E41 00000000 +@00000E42 00000000 +@00000E43 00000000 +@00000E44 00000000 +@00000E45 00000000 +@00000E46 00000000 +@00000E47 00000000 +@00000E48 00000000 +@00000E49 00000000 +@00000E4A 00000000 +@00000E4B 00000000 +@00000E4C 00000000 +@00000E4D 00000000 +@00000E4E 00000000 +@00000E4F 00000000 +@00000E50 00000000 +@00000E51 00000000 +@00000E52 00000000 +@00000E53 00000000 +@00000E54 00000000 +@00000E55 00000000 +@00000E56 00000000 +@00000E57 00000000 +@00000E58 00000000 +@00000E59 00000000 +@00000E5A 00000000 +@00000E5B 00000000 +@00000E5C 00000000 +@00000E5D 00000000 +@00000E5E 00000000 +@00000E5F 00000000 +@00000E60 00000000 +@00000E61 00000000 +@00000E62 00000000 +@00000E63 00000000 +@00000E64 00000000 +@00000E65 00000000 +@00000E66 00000000 +@00000E67 00000000 +@00000E68 00000000 +@00000E69 00000000 +@00000E6A 00000000 +@00000E6B 00000000 +@00000E6C 00000000 +@00000E6D 00000000 +@00000E6E 00000000 +@00000E6F 00000000 +@00000E70 00000000 +@00000E71 00000000 +@00000E72 00000000 +@00000E73 00000000 +@00000E74 00000000 +@00000E75 00000000 +@00000E76 00000000 +@00000E77 00000000 +@00000E78 00000000 +@00000E79 00000000 +@00000E7A 00000000 +@00000E7B 00000000 +@00000E7C 00000000 +@00000E7D 00000000 +@00000E7E 00000000 +@00000E7F 00000000 +@00000E80 00000000 +@00000E81 00000000 +@00000E82 00000000 +@00000E83 00000000 +@00000E84 00000000 +@00000E85 00000000 +@00000E86 00000000 +@00000E87 00000000 +@00000E88 00000000 +@00000E89 00000000 +@00000E8A 00000000 +@00000E8B 00000000 +@00000E8C 00000000 +@00000E8D 00000000 +@00000E8E 00000000 +@00000E8F 00000000 +@00000E90 00000000 +@00000E91 00000000 +@00000E92 00000000 +@00000E93 00000000 +@00000E94 00000000 +@00000E95 00000000 +@00000E96 00000000 +@00000E97 00000000 +@00000E98 00000000 +@00000E99 00000000 +@00000E9A 00000000 +@00000E9B 00000000 +@00000E9C 00000000 +@00000E9D 00000000 +@00000E9E 00000000 +@00000E9F 00000000 +@00000EA0 00000000 +@00000EA1 00000000 +@00000EA2 00000000 +@00000EA3 00000000 +@00000EA4 00000000 +@00000EA5 00000000 +@00000EA6 00000000 +@00000EA7 00000000 +@00000EA8 00000000 +@00000EA9 00000000 +@00000EAA 00000000 +@00000EAB 00000000 +@00000EAC 00000000 +@00000EAD 00000000 +@00000EAE 00000000 +@00000EAF 00000000 +@00000EB0 00000000 +@00000EB1 00000000 +@00000EB2 00000000 +@00000EB3 00000000 +@00000EB4 00000000 +@00000EB5 00000000 +@00000EB6 00000000 +@00000EB7 00000000 +@00000EB8 00000000 +@00000EB9 00000000 +@00000EBA 00000000 +@00000EBB 00000000 +@00000EBC 00000000 +@00000EBD 00000000 +@00000EBE 00000000 +@00000EBF 00000000 +@00000EC0 00000000 +@00000EC1 00000000 +@00000EC2 00000000 +@00000EC3 00000000 +@00000EC4 00000000 +@00000EC5 00000000 +@00000EC6 00000000 +@00000EC7 00000000 +@00000EC8 00000000 +@00000EC9 00000000 +@00000ECA 00000000 +@00000ECB 00000000 +@00000ECC 00000000 +@00000ECD 00000000 +@00000ECE 00000000 +@00000ECF 00000000 +@00000ED0 00000000 +@00000ED1 00000000 +@00000ED2 00000000 +@00000ED3 00000000 +@00000ED4 00000000 +@00000ED5 00000000 +@00000ED6 00000000 +@00000ED7 00000000 +@00000ED8 00000000 +@00000ED9 00000000 +@00000EDA 00000000 +@00000EDB 00000000 +@00000EDC 00000000 +@00000EDD 00000000 +@00000EDE 00000000 +@00000EDF 00000000 +@00000EE0 00000000 +@00000EE1 00000000 +@00000EE2 00000000 +@00000EE3 00000000 +@00000EE4 00000000 +@00000EE5 00000000 +@00000EE6 00000000 +@00000EE7 00000000 +@00000EE8 00000000 +@00000EE9 00000000 +@00000EEA 00000000 +@00000EEB 00000000 +@00000EEC 00000000 +@00000EED 00000000 +@00000EEE 00000000 +@00000EEF 00000000 +@00000EF0 00000000 +@00000EF1 00000000 +@00000EF2 00000000 +@00000EF3 00000000 +@00000EF4 00000000 +@00000EF5 00000000 +@00000EF6 00000000 +@00000EF7 00000000 +@00000EF8 00000000 +@00000EF9 00000000 +@00000EFA 00000000 +@00000EFB 00000000 +@00000EFC 00000000 +@00000EFD 00000000 +@00000EFE 00000000 +@00000EFF 00000000 +@00000F00 00000000 +@00000F01 00000000 +@00000F02 00000000 +@00000F03 00000000 +@00000F04 00000000 +@00000F05 00000000 +@00000F06 00000000 +@00000F07 00000000 +@00000F08 00000000 +@00000F09 00000000 +@00000F0A 00000000 +@00000F0B 00000000 +@00000F0C 00000000 +@00000F0D 00000000 +@00000F0E 00000000 +@00000F0F 00000000 +@00000F10 00000000 +@00000F11 00000000 +@00000F12 00000000 +@00000F13 00000000 +@00000F14 00000000 +@00000F15 00000000 +@00000F16 00000000 +@00000F17 00000000 +@00000F18 00000000 +@00000F19 00000000 +@00000F1A 00000000 +@00000F1B 00000000 +@00000F1C 00000000 +@00000F1D 00000000 +@00000F1E 00000000 +@00000F1F 00000000 +@00000F20 00000000 +@00000F21 00000000 +@00000F22 00000000 +@00000F23 00000000 +@00000F24 00000000 +@00000F25 00000000 +@00000F26 00000000 +@00000F27 00000000 +@00000F28 00000000 +@00000F29 00000000 +@00000F2A 00000000 +@00000F2B 00000000 +@00000F2C 00000000 +@00000F2D 00000000 +@00000F2E 00000000 +@00000F2F 00000000 +@00000F30 00000000 +@00000F31 00000000 +@00000F32 00000000 +@00000F33 00000000 +@00000F34 00000000 +@00000F35 00000000 +@00000F36 00000000 +@00000F37 00000000 +@00000F38 00000000 +@00000F39 00000000 +@00000F3A 00000000 +@00000F3B 00000000 +@00000F3C 00000000 +@00000F3D 00000000 +@00000F3E 00000000 +@00000F3F 00000000 +@00000F40 00000000 +@00000F41 00000000 +@00000F42 00000000 +@00000F43 00000000 +@00000F44 00000000 +@00000F45 00000000 +@00000F46 00000000 +@00000F47 00000000 +@00000F48 00000000 +@00000F49 00000000 +@00000F4A 00000000 +@00000F4B 00000000 +@00000F4C 00000000 +@00000F4D 00000000 +@00000F4E 00000000 +@00000F4F 00000000 +@00000F50 00000000 +@00000F51 00000000 +@00000F52 00000000 +@00000F53 00000000 +@00000F54 00000000 +@00000F55 00000000 +@00000F56 00000000 +@00000F57 00000000 +@00000F58 00000000 +@00000F59 00000000 +@00000F5A 00000000 +@00000F5B 00000000 +@00000F5C 00000000 +@00000F5D 00000000 +@00000F5E 00000000 +@00000F5F 00000000 +@00000F60 00000000 +@00000F61 00000000 +@00000F62 00000000 +@00000F63 00000000 +@00000F64 00000000 +@00000F65 00000000 +@00000F66 00000000 +@00000F67 00000000 +@00000F68 00000000 +@00000F69 00000000 +@00000F6A 00000000 +@00000F6B 00000000 +@00000F6C 00000000 +@00000F6D 00000000 +@00000F6E 00000000 +@00000F6F 00000000 +@00000F70 00000000 +@00000F71 00000000 +@00000F72 00000000 +@00000F73 00000000 +@00000F74 00000000 +@00000F75 00000000 +@00000F76 00000000 +@00000F77 00000000 +@00000F78 00000000 +@00000F79 00000000 +@00000F7A 00000000 +@00000F7B 00000000 +@00000F7C 00000000 +@00000F7D 00000000 +@00000F7E 00000000 +@00000F7F 00000000 +@00000F80 00000000 +@00000F81 00000000 +@00000F82 00000000 +@00000F83 00000000 +@00000F84 00000000 +@00000F85 00000000 +@00000F86 00000000 +@00000F87 00000000 +@00000F88 00000000 +@00000F89 00000000 +@00000F8A 00000000 +@00000F8B 00000000 +@00000F8C 00000000 +@00000F8D 00000000 +@00000F8E 00000000 +@00000F8F 00000000 +@00000F90 00000000 +@00000F91 00000000 +@00000F92 00000000 +@00000F93 00000000 +@00000F94 00000000 +@00000F95 00000000 +@00000F96 00000000 +@00000F97 00000000 +@00000F98 00000000 +@00000F99 00000000 +@00000F9A 00000000 +@00000F9B 00000000 +@00000F9C 00000000 +@00000F9D 00000000 +@00000F9E 00000000 +@00000F9F 00000000 +@00000FA0 00000000 +@00000FA1 00000000 +@00000FA2 00000000 +@00000FA3 00000000 +@00000FA4 00000000 +@00000FA5 00000000 +@00000FA6 00000000 +@00000FA7 00000000 +@00000FA8 00000000 +@00000FA9 00000000 +@00000FAA 00000000 +@00000FAB 00000000 +@00000FAC 00000000 +@00000FAD 00000000 +@00000FAE 00000000 +@00000FAF 00000000 +@00000FB0 00000000 +@00000FB1 00000000 +@00000FB2 00000000 +@00000FB3 00000000 +@00000FB4 00000000 +@00000FB5 00000000 +@00000FB6 00000000 +@00000FB7 00000000 +@00000FB8 00000000 +@00000FB9 00000000 +@00000FBA 00000000 +@00000FBB 00000000 +@00000FBC 00000000 +@00000FBD 00000000 +@00000FBE 00000000 +@00000FBF 00000000 +@00000FC0 00000000 +@00000FC1 00000000 +@00000FC2 00000000 +@00000FC3 00000000 +@00000FC4 00000000 +@00000FC5 00000000 +@00000FC6 00000000 +@00000FC7 00000000 +@00000FC8 00000000 +@00000FC9 00000000 +@00000FCA 00000000 +@00000FCB 00000000 +@00000FCC 00000000 +@00000FCD 00000000 +@00000FCE 00000000 +@00000FCF 00000000 +@00000FD0 00000000 +@00000FD1 00000000 +@00000FD2 00000000 +@00000FD3 00000000 +@00000FD4 00000000 +@00000FD5 00000000 +@00000FD6 00000000 +@00000FD7 00000000 +@00000FD8 00000000 +@00000FD9 00000000 +@00000FDA 00000000 +@00000FDB 00000000 +@00000FDC 00000000 +@00000FDD 00000000 +@00000FDE 00000000 +@00000FDF 00000000 +@00000FE0 00000000 +@00000FE1 00000000 +@00000FE2 00000000 +@00000FE3 00000000 +@00000FE4 00000000 +@00000FE5 00000000 +@00000FE6 00000000 +@00000FE7 00000000 +@00000FE8 00000000 +@00000FE9 00000000 +@00000FEA 00000000 +@00000FEB 00000000 +@00000FEC 00000000 +@00000FED 00000000 +@00000FEE 00000000 +@00000FEF 00000000 +@00000FF0 00000000 +@00000FF1 00000000 +@00000FF2 00000000 +@00000FF3 00000000 +@00000FF4 00000000 +@00000FF5 00000000 +@00000FF6 00000000 +@00000FF7 00000000 +@00000FF8 00000000 +@00000FF9 00000000 +@00000FFA 00000000 +@00000FFB 00000000 +@00000FFC 00000000 +@00000FFD 00000000 +@00000FFE 00000000 +@00000FFF 00000000 +@00001000 00000000 +@00001001 00000000 +@00001002 00000000 +@00001003 00000000 +@00001004 00000000 +@00001005 00000000 +@00001006 00000000 +@00001007 00000000 +@00001008 00000000 +@00001009 00000000 +@0000100A 00000000 +@0000100B 00000000 +@0000100C 00000000 +@0000100D 00000000 +@0000100E 00000000 +@0000100F 00000000 +@00001010 00000000 +@00001011 00000000 +@00001012 00000000 +@00001013 00000000 +@00001014 00000000 +@00001015 00000000 +@00001016 00000000 +@00001017 00000000 +@00001018 00000000 +@00001019 00000000 +@0000101A 00000000 +@0000101B 00000000 +@0000101C 00000000 +@0000101D 00000000 +@0000101E 00000000 +@0000101F 00000000 +@00001020 00000000 +@00001021 00000000 +@00001022 00000000 +@00001023 00000000 +@00001024 00000000 +@00001025 00000000 +@00001026 00000000 +@00001027 00000000 +@00001028 00000000 +@00001029 00000000 +@0000102A 00000000 +@0000102B 00000000 +@0000102C 00000000 +@0000102D 00000000 +@0000102E 00000000 +@0000102F 00000000 +@00001030 00000000 +@00001031 00000000 +@00001032 00000000 +@00001033 00000000 +@00001034 00000000 +@00001035 00000000 +@00001036 00000000 +@00001037 00000000 +@00001038 00000000 +@00001039 00000000 +@0000103A 00000000 +@0000103B 00000000 +@0000103C 00000000 +@0000103D 00000000 +@0000103E 00000000 +@0000103F 00000000 +@00001040 00000000 +@00001041 00000000 +@00001042 00000000 +@00001043 00000000 +@00001044 00000000 +@00001045 00000000 +@00001046 00000000 +@00001047 00000000 +@00001048 00000000 +@00001049 00000000 +@0000104A 00000000 +@0000104B 00000000 +@0000104C 00000000 +@0000104D 00000000 +@0000104E 00000000 +@0000104F 00000000 +@00001050 00000000 +@00001051 00000000 +@00001052 00000000 +@00001053 00000000 +@00001054 00000000 +@00001055 00000000 +@00001056 00000000 +@00001057 00000000 +@00001058 00000000 +@00001059 00000000 +@0000105A 00000000 +@0000105B 00000000 +@0000105C 00000000 +@0000105D 00000000 +@0000105E 00000000 +@0000105F 00000000 +@00001060 00000000 +@00001061 00000000 +@00001062 00000000 +@00001063 00000000 +@00001064 00000000 +@00001065 00000000 +@00001066 00000000 +@00001067 00000000 +@00001068 00000000 +@00001069 00000000 +@0000106A 00000000 +@0000106B 00000000 +@0000106C 00000000 +@0000106D 00000000 +@0000106E 00000000 +@0000106F 00000000 +@00001070 00000000 +@00001071 00000000 +@00001072 00000000 +@00001073 00000000 +@00001074 00000000 +@00001075 00000000 +@00001076 00000000 +@00001077 00000000 +@00001078 00000000 +@00001079 00000000 +@0000107A 00000000 +@0000107B 00000000 +@0000107C 00000000 +@0000107D 00000000 +@0000107E 00000000 +@0000107F 00000000 +@00001080 00000000 +@00001081 00000000 +@00001082 00000000 +@00001083 00000000 +@00001084 00000000 +@00001085 00000000 +@00001086 00000000 +@00001087 00000000 +@00001088 00000000 +@00001089 00000000 +@0000108A 00000000 +@0000108B 00000000 +@0000108C 00000000 +@0000108D 00000000 +@0000108E 00000000 +@0000108F 00000000 +@00001090 00000000 +@00001091 00000000 +@00001092 00000000 +@00001093 00000000 +@00001094 00000000 +@00001095 00000000 +@00001096 00000000 +@00001097 00000000 +@00001098 00000000 +@00001099 00000000 +@0000109A 00000000 +@0000109B 00000000 +@0000109C 00000000 +@0000109D 00000000 +@0000109E 00000000 +@0000109F 00000000 +@000010A0 00000000 +@000010A1 00000000 +@000010A2 00000000 +@000010A3 00000000 +@000010A4 00000000 +@000010A5 00000000 +@000010A6 00000000 +@000010A7 00000000 +@000010A8 00000000 +@000010A9 00000000 +@000010AA 00000000 +@000010AB 00000000 +@000010AC 00000000 +@000010AD 00000000 +@000010AE 00000000 +@000010AF 00000000 +@000010B0 00000000 +@000010B1 00000000 +@000010B2 00000000 +@000010B3 00000000 +@000010B4 00000000 +@000010B5 00000000 +@000010B6 00000000 +@000010B7 00000000 +@000010B8 00000000 +@000010B9 00000000 +@000010BA 00000000 +@000010BB 00000000 +@000010BC 00000000 +@000010BD 00000000 +@000010BE 00000000 +@000010BF 00000000 +@000010C0 00000000 +@000010C1 00000000 +@000010C2 00000000 +@000010C3 00000000 +@000010C4 00000000 +@000010C5 00000000 +@000010C6 00000000 +@000010C7 00000000 +@000010C8 00000000 +@000010C9 00000000 +@000010CA 00000000 +@000010CB 00000000 +@000010CC 00000000 +@000010CD 00000000 +@000010CE 00000000 +@000010CF 00000000 +@000010D0 00000000 +@000010D1 00000000 +@000010D2 00000000 +@000010D3 00000000 +@000010D4 00000000 +@000010D5 00000000 +@000010D6 00000000 +@000010D7 00000000 +@000010D8 00000000 +@000010D9 00000000 +@000010DA 00000000 +@000010DB 00000000 +@000010DC 00000000 +@000010DD 00000000 +@000010DE 00000000 +@000010DF 00000000 +@000010E0 00000000 +@000010E1 00000000 +@000010E2 00000000 +@000010E3 00000000 +@000010E4 00000000 +@000010E5 00000000 +@000010E6 00000000 +@000010E7 00000000 +@000010E8 00000000 +@000010E9 00000000 +@000010EA 00000000 +@000010EB 00000000 +@000010EC 00000000 +@000010ED 00000000 +@000010EE 00000000 +@000010EF 00000000 +@000010F0 00000000 +@000010F1 00000000 +@000010F2 00000000 +@000010F3 00000000 +@000010F4 00000000 +@000010F5 00000000 +@000010F6 00000000 +@000010F7 00000000 +@000010F8 00000000 +@000010F9 00000000 +@000010FA 00000000 +@000010FB 00000000 +@000010FC 00000000 +@000010FD 00000000 +@000010FE 00000000 +@000010FF 00000000 +@00001100 00000000 +@00001101 00000000 +@00001102 00000000 +@00001103 00000000 +@00001104 00000000 +@00001105 00000000 +@00001106 00000000 +@00001107 00000000 +@00001108 00000000 +@00001109 00000000 +@0000110A 00000000 +@0000110B 00000000 +@0000110C 00000000 +@0000110D 00000000 +@0000110E 00000000 +@0000110F 00000000 +@00001110 00000000 +@00001111 00000000 +@00001112 00000000 +@00001113 00000000 +@00001114 00000000 +@00001115 00000000 +@00001116 00000000 +@00001117 00000000 +@00001118 00000000 +@00001119 00000000 +@0000111A 00000000 +@0000111B 00000000 +@0000111C 00000000 +@0000111D 00000000 +@0000111E 00000000 +@0000111F 00000000 +@00001120 00000000 +@00001121 00000000 +@00001122 00000000 +@00001123 00000000 +@00001124 00000000 +@00001125 00000000 +@00001126 00000000 +@00001127 00000000 +@00001128 00000000 +@00001129 00000000 +@0000112A 00000000 +@0000112B 00000000 +@0000112C 00000000 +@0000112D 00000000 +@0000112E 00000000 +@0000112F 00000000 +@00001130 00000000 +@00001131 00000000 +@00001132 00000000 +@00001133 00000000 +@00001134 00000000 +@00001135 00000000 +@00001136 00000000 +@00001137 00000000 +@00001138 00000000 +@00001139 00000000 +@0000113A 00000000 +@0000113B 00000000 +@0000113C 00000000 +@0000113D 00000000 +@0000113E 00000000 +@0000113F 00000000 +@00001140 00000000 +@00001141 00000000 +@00001142 00000000 +@00001143 00000000 +@00001144 00000000 +@00001145 00000000 +@00001146 00000000 +@00001147 00000000 +@00001148 00000000 +@00001149 00000000 +@0000114A 00000000 +@0000114B 00000000 +@0000114C 00000000 +@0000114D 00000000 +@0000114E 00000000 +@0000114F 00000000 +@00001150 00000000 +@00001151 00000000 +@00001152 00000000 +@00001153 00000000 +@00001154 00000000 +@00001155 00000000 +@00001156 00000000 +@00001157 00000000 +@00001158 00000000 +@00001159 00000000 +@0000115A 00000000 +@0000115B 00000000 +@0000115C 00000000 +@0000115D 00000000 +@0000115E 00000000 +@0000115F 00000000 +@00001160 00000000 +@00001161 00000000 +@00001162 00000000 +@00001163 00000000 +@00001164 00000000 +@00001165 00000000 +@00001166 00000000 +@00001167 00000000 +@00001168 00000000 +@00001169 00000000 +@0000116A 00000000 +@0000116B 00000000 +@0000116C 00000000 +@0000116D 00000000 +@0000116E 00000000 +@0000116F 00000000 +@00001170 00000000 +@00001171 00000000 +@00001172 00000000 +@00001173 00000000 +@00001174 00000000 +@00001175 00000000 +@00001176 00000000 +@00001177 00000000 +@00001178 00000000 +@00001179 00000000 +@0000117A 00000000 +@0000117B 00000000 +@0000117C 00000000 +@0000117D 00000000 +@0000117E 00000000 +@0000117F 00000000 +@00001180 00000000 +@00001181 00000000 +@00001182 00000000 +@00001183 00000000 +@00001184 00000000 +@00001185 00000000 +@00001186 00000000 +@00001187 00000000 +@00001188 00000000 +@00001189 00000000 +@0000118A 00000000 +@0000118B 00000000 +@0000118C 00000000 +@0000118D 00000000 +@0000118E 00000000 +@0000118F 00000000 +@00001190 00000000 +@00001191 00000000 +@00001192 00000000 +@00001193 00000000 +@00001194 00000000 +@00001195 00000000 +@00001196 00000000 +@00001197 00000000 +@00001198 00000000 +@00001199 00000000 +@0000119A 00000000 +@0000119B 00000000 +@0000119C 00000000 +@0000119D 00000000 +@0000119E 00000000 +@0000119F 00000000 +@000011A0 00000000 +@000011A1 00000000 +@000011A2 00000000 +@000011A3 00000000 +@000011A4 00000000 +@000011A5 00000000 +@000011A6 00000000 +@000011A7 00000000 +@000011A8 00000000 +@000011A9 00000000 +@000011AA 00000000 +@000011AB 00000000 +@000011AC 00000000 +@000011AD 00000000 +@000011AE 00000000 +@000011AF 00000000 +@000011B0 00000000 +@000011B1 00000000 +@000011B2 00000000 +@000011B3 00000000 +@000011B4 00000000 +@000011B5 00000000 +@000011B6 00000000 +@000011B7 00000000 +@000011B8 00000000 +@000011B9 00000000 +@000011BA 00000000 +@000011BB 00000000 +@000011BC 00000000 +@000011BD 00000000 +@000011BE 00000000 +@000011BF 00000000 +@000011C0 00000000 +@000011C1 00000000 +@000011C2 00000000 +@000011C3 00000000 +@000011C4 00000000 +@000011C5 00000000 +@000011C6 00000000 +@000011C7 00000000 +@000011C8 00000000 +@000011C9 00000000 +@000011CA 00000000 +@000011CB 00000000 +@000011CC 00000000 +@000011CD 00000000 +@000011CE 00000000 +@000011CF 00000000 +@000011D0 00000000 +@000011D1 00000000 +@000011D2 00000000 +@000011D3 00000000 +@000011D4 00000000 +@000011D5 00000000 +@000011D6 00000000 +@000011D7 00000000 +@000011D8 00000000 +@000011D9 00000000 +@000011DA 00000000 +@000011DB 00000000 +@000011DC 00000000 +@000011DD 00000000 +@000011DE 00000000 +@000011DF 00000000 +@000011E0 00000000 +@000011E1 00000000 +@000011E2 00000000 +@000011E3 00000000 +@000011E4 00000000 +@000011E5 00000000 +@000011E6 00000000 +@000011E7 00000000 +@000011E8 00000000 +@000011E9 00000000 +@000011EA 00000000 +@000011EB 00000000 +@000011EC 00000000 +@000011ED 00000000 +@000011EE 00000000 +@000011EF 00000000 +@000011F0 00000000 +@000011F1 00000000 +@000011F2 00000000 +@000011F3 00000000 +@000011F4 00000000 +@000011F5 00000000 +@000011F6 00000000 +@000011F7 00000000 +@000011F8 00000000 +@000011F9 00000000 +@000011FA 00000000 +@000011FB 00000000 +@000011FC 00000000 +@000011FD 00000000 +@000011FE 00000000 +@000011FF 00000000 +@00001200 00000000 +@00001201 00000000 +@00001202 00000000 +@00001203 00000000 +@00001204 00000000 +@00001205 00000000 +@00001206 00000000 +@00001207 00000000 +@00001208 00000000 +@00001209 00000000 +@0000120A 00000000 +@0000120B 00000000 +@0000120C 00000000 +@0000120D 00000000 +@0000120E 00000000 +@0000120F 00000000 +@00001210 00000000 +@00001211 00000000 +@00001212 00000000 +@00001213 00000000 +@00001214 00000000 +@00001215 00004E44 +@00001216 00004E44 +@00001217 00003794 +@00001218 00000000 +@00001219 00000000 +@0000121A 00000000 +@0000121B 00001CA8 +@0000121C 00000000 +@0000121D 00000000 +@0000121E 00000000 +@0000121F 00004854 +@00001220 00000000 +@00001221 00000000 +@00001222 00004854 +@00001223 00000000 +@00001224 00000000 +@00001225 00004854 +@00001226 00000000 +@00001227 00000000 +@00001228 00000000 +@00001229 00000000 +@0000122A 00000000 +@0000122B 00000000 +@0000122C 00000000 +@0000122D 00000000 +@0000122E 00000000 +@0000122F 00000000 +@00001230 00000000 +@00001231 00000000 +@00001232 00000000 +@00001233 00000000 +@00001234 00000000 +@00001235 00000000 +@00001236 00000000 +@00001237 00000000 +@00001238 00000000 +@00001239 00000000 +@0000123A 00000000 +@0000123B 00000000 +@0000123C 00000000 +@0000123D 00000000 +@0000123E 00000000 +@0000123F 00000000 +@00001240 00000000 +@00001241 00000000 +@00001242 00000000 +@00001243 00000000 +@00001244 00000000 +@00001245 00000000 +@00001246 00000000 +@00001247 00000000 +@00001248 00000000 +@00001249 00000000 +@0000124A 00000000 +@0000124B 00000000 +@0000124C 00000000 +@0000124D 00000000 +@0000124E 00000000 +@0000124F 00000000 +@00001250 00000000 +@00001251 00000000 +@00001252 00000000 +@00001253 00000000 +@00001254 00000000 +@00001255 00000000 +@00001256 00000000 +@00001257 00000000 +@00001258 00000000 +@00001259 00000000 +@0000125A 00000000 +@0000125B 00000000 +@0000125C 00000000 +@0000125D 00000000 +@0000125E 00000000 +@0000125F 00000000 +@00001260 00000000 +@00001261 00000000 +@00001262 00000000 +@00001263 00000000 +@00001264 00000000 +@00001265 00000000 +@00001266 00000000 +@00001267 00000000 +@00001268 00000000 +@00001269 00000000 +@0000126A 00000000 +@0000126B 00000000 +@0000126C 00000000 +@0000126D 00000000 +@0000126E 00000000 +@0000126F 00000000 +@00001270 00000000 +@00001271 00000000 +@00001272 00000000 +@00001273 00000000 +@00001274 00000000 +@00001275 00000000 +@00001276 00000000 +@00001277 00000000 +@00001278 00000000 +@00001279 00000000 +@0000127A 00000000 +@0000127B 00000000 +@0000127C 00000000 +@0000127D 00000000 +@0000127E 00000000 +@0000127F 00000000 +@00001280 00000000 +@00001281 00000000 +@00001282 00000000 +@00001283 00000000 +@00001284 00000000 +@00001285 00000000 +@00001286 00000000 +@00001287 00000000 +@00001288 00000000 +@00001289 00000000 +@0000128A 00000000 +@0000128B 00004A24 +@0000128C 00004A24 +@0000128D 00004A2C +@0000128E 00004A2C +@0000128F 00004A34 +@00001290 00004A34 +@00001291 00004A3C +@00001292 00004A3C +@00001293 00004A44 +@00001294 00004A44 +@00001295 00004A4C +@00001296 00004A4C +@00001297 00004A54 +@00001298 00004A54 +@00001299 00004A5C +@0000129A 00004A5C +@0000129B 00004A64 +@0000129C 00004A64 +@0000129D 00004A6C +@0000129E 00004A6C +@0000129F 00004A74 +@000012A0 00004A74 +@000012A1 00004A7C +@000012A2 00004A7C +@000012A3 00004A84 +@000012A4 00004A84 +@000012A5 00004A8C +@000012A6 00004A8C +@000012A7 00004A94 +@000012A8 00004A94 +@000012A9 00004A9C +@000012AA 00004A9C +@000012AB 00004AA4 +@000012AC 00004AA4 +@000012AD 00004AAC +@000012AE 00004AAC +@000012AF 00004AB4 +@000012B0 00004AB4 +@000012B1 00004ABC +@000012B2 00004ABC +@000012B3 00004AC4 +@000012B4 00004AC4 +@000012B5 00004ACC +@000012B6 00004ACC +@000012B7 00004AD4 +@000012B8 00004AD4 +@000012B9 00004ADC +@000012BA 00004ADC +@000012BB 00004AE4 +@000012BC 00004AE4 +@000012BD 00004AEC +@000012BE 00004AEC +@000012BF 00004AF4 +@000012C0 00004AF4 +@000012C1 00004AFC +@000012C2 00004AFC +@000012C3 00004B04 +@000012C4 00004B04 +@000012C5 00004B0C +@000012C6 00004B0C +@000012C7 00004B14 +@000012C8 00004B14 +@000012C9 00004B1C +@000012CA 00004B1C +@000012CB 00004B24 +@000012CC 00004B24 +@000012CD 00004B2C +@000012CE 00004B2C +@000012CF 00004B34 +@000012D0 00004B34 +@000012D1 00004B3C +@000012D2 00004B3C +@000012D3 00004B44 +@000012D4 00004B44 +@000012D5 00004B4C +@000012D6 00004B4C +@000012D7 00004B54 +@000012D8 00004B54 +@000012D9 00004B5C +@000012DA 00004B5C +@000012DB 00004B64 +@000012DC 00004B64 +@000012DD 00004B6C +@000012DE 00004B6C +@000012DF 00004B74 +@000012E0 00004B74 +@000012E1 00004B7C +@000012E2 00004B7C +@000012E3 00004B84 +@000012E4 00004B84 +@000012E5 00004B8C +@000012E6 00004B8C +@000012E7 00004B94 +@000012E8 00004B94 +@000012E9 00004B9C +@000012EA 00004B9C +@000012EB 00004BA4 +@000012EC 00004BA4 +@000012ED 00004BAC +@000012EE 00004BAC +@000012EF 00004BB4 +@000012F0 00004BB4 +@000012F1 00004BBC +@000012F2 00004BBC +@000012F3 00004BC4 +@000012F4 00004BC4 +@000012F5 00004BCC +@000012F6 00004BCC +@000012F7 00004BD4 +@000012F8 00004BD4 +@000012F9 00004BDC +@000012FA 00004BDC +@000012FB 00004BE4 +@000012FC 00004BE4 +@000012FD 00004BEC +@000012FE 00004BEC +@000012FF 00004BF4 +@00001300 00004BF4 +@00001301 00004BFC +@00001302 00004BFC +@00001303 00004C04 +@00001304 00004C04 +@00001305 00004C0C +@00001306 00004C0C +@00001307 00004C14 +@00001308 00004C14 +@00001309 00004C1C +@0000130A 00004C1C +@0000130B 00004C24 +@0000130C 00004C24 +@0000130D 00004C2C +@0000130E 00004C2C +@0000130F 00004C34 +@00001310 00004C34 +@00001311 00004C3C +@00001312 00004C3C +@00001313 00004C44 +@00001314 00004C44 +@00001315 00004C4C +@00001316 00004C4C +@00001317 00004C54 +@00001318 00004C54 +@00001319 00004C5C +@0000131A 00004C5C +@0000131B 00004C64 +@0000131C 00004C64 +@0000131D 00004C6C +@0000131E 00004C6C +@0000131F 00004C74 +@00001320 00004C74 +@00001321 00004C7C +@00001322 00004C7C +@00001323 00004C84 +@00001324 00004C84 +@00001325 00004C8C +@00001326 00004C8C +@00001327 00004C94 +@00001328 00004C94 +@00001329 00004C9C +@0000132A 00004C9C +@0000132B 00004CA4 +@0000132C 00004CA4 +@0000132D 00004CAC +@0000132E 00004CAC +@0000132F 00004CB4 +@00001330 00004CB4 +@00001331 00004CBC +@00001332 00004CBC +@00001333 00004CC4 +@00001334 00004CC4 +@00001335 00004CCC +@00001336 00004CCC +@00001337 00004CD4 +@00001338 00004CD4 +@00001339 00004CDC +@0000133A 00004CDC +@0000133B 00004CE4 +@0000133C 00004CE4 +@0000133D 00004CEC +@0000133E 00004CEC +@0000133F 00004CF4 +@00001340 00004CF4 +@00001341 00004CFC +@00001342 00004CFC +@00001343 00004D04 +@00001344 00004D04 +@00001345 00004D0C +@00001346 00004D0C +@00001347 00004D14 +@00001348 00004D14 +@00001349 00004D1C +@0000134A 00004D1C +@0000134B 00004D24 +@0000134C 00004D24 +@0000134D 00004D2C +@0000134E 00004D2C +@0000134F 00004D34 +@00001350 00004D34 +@00001351 00004D3C +@00001352 00004D3C +@00001353 00004D44 +@00001354 00004D44 +@00001355 00004D4C +@00001356 00004D4C +@00001357 00004D54 +@00001358 00004D54 +@00001359 00004D5C +@0000135A 00004D5C +@0000135B 00004D64 +@0000135C 00004D64 +@0000135D 00004D6C +@0000135E 00004D6C +@0000135F 00004D74 +@00001360 00004D74 +@00001361 00004D7C +@00001362 00004D7C +@00001363 00004D84 +@00001364 00004D84 +@00001365 00004D8C +@00001366 00004D8C +@00001367 00004D94 +@00001368 00004D94 +@00001369 00004D9C +@0000136A 00004D9C +@0000136B 00004DA4 +@0000136C 00004DA4 +@0000136D 00004DAC +@0000136E 00004DAC +@0000136F 00004DB4 +@00001370 00004DB4 +@00001371 00004DBC +@00001372 00004DBC +@00001373 00004DC4 +@00001374 00004DC4 +@00001375 00004DCC +@00001376 00004DCC +@00001377 00004DD4 +@00001378 00004DD4 +@00001379 00004DDC +@0000137A 00004DDC +@0000137B 00004DE4 +@0000137C 00004DE4 +@0000137D 00004DEC +@0000137E 00004DEC +@0000137F 00004DF4 +@00001380 00004DF4 +@00001381 00004DFC +@00001382 00004DFC +@00001383 00004E04 +@00001384 00004E04 +@00001385 00004E0C +@00001386 00004E0C +@00001387 00004E14 +@00001388 00004E14 +@00001389 00004E1C +@0000138A 00004E1C +@0000138B 000037A0 +@0000138C 00000000 +@0000138D 00000000 +@0000138E 00000000 +@0000138F 00004E3C +@00001390 00004E3C +@00001391 00004854 +@00001392 00004854 +@00001393 FFFFFFFF +@00001394 00000000 +@00001395 00000000 +@00001396 FFFFFFFF +@00001397 00000000 +@00001398 00000000 +@00001399 00004E64 +@0000139A 00004E64 +@0000139B 00000000 +@0000139C 00000000 +@0000139D FFFFFFFF +@0000139E 00000000 +@0000139F 00020000 +@000013A0 000050A0 Index: sdram_ctrl/tags =================================================================== --- sdram_ctrl/tags (nonexistent) +++ sdram_ctrl/tags (revision 8)
sdram_ctrl/tags Property changes : Added: svn:mergeinfo ## -0,0 +0,0 ##

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.