📄 hy5ps121621f.vhd
字号:
-------------------------------------------------------- Hynix 4BANKS X 8M X 16bits DDR2 SDRAM ---- ---- VHDL Modeling ---- ---- PART : HY5PS121621F-B400/B533/B667/B800 ---- ---- HHHH HHHH ---- HHHH HHHH ---- ,O0O. ,O0 .HH ,O0 .HH ---- (O000O)(O00 )H(O00 )H ---- `O0O' `O0 'HH `O0 'HH -- -- HHHH HHHH Hynix ---- HHHH HHHH Semiconductor -----------------------------------------------------------------------------------------------------------------------------------------------------------LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.all;library grlib;use grlib.stdlib.all;--USE IEEE.STD_LOGIC_ARITH.all;--USE IEEE.STD_LOGIC_UNSIGNED.all;USE work.HY5PS121621F_PACK.all;---------------------------------------------------------------------------------------------------Entity HY5PS121621F Is generic ( TimingCheckFlag : boolean := TRUE; PUSCheckFlag : boolean := FALSE; Part_Number : PART_NUM_TYPE := B400); Port ( DQ : inout std_logic_vector(15 downto 0) := (others => 'Z'); LDQS : inout std_logic := 'Z'; LDQSB : inout std_logic := 'Z'; UDQS : inout std_logic := 'Z'; UDQSB : inout std_logic := 'Z'; LDM : in std_logic; WEB : in std_logic; CASB : in std_logic; RASB : in std_logic; CSB : in std_logic; BA : in std_logic_vector(1 downto 0); ADDR : in std_logic_vector(12 downto 0); CKE : in std_logic; CLK : in std_logic; CLKB : in std_logic; UDM : in std_logic );End HY5PS121621F;-----------------------------------------------------------------------------------------------------Architecture Behavioral_Model_HY5PS121621F Of HY5PS121621F Issignal RD_PIPE_REG : std_logic_vector(6 downto 0) := "0000000";signal WT_PIPE_REG : std_logic_vector(12 downto 0) := "0000000000000";signal ADD_PIPE_REG : ADD_PIPE_TYPE;signal DLL_reset, DLL_lock_enable : std_logic := '0';signal yburst, RD_WR_ST, caspwt, casp6_rd, casp6_wt : std_logic := '0';signal casp_wtI, casp_wtII, wt_stdby : std_logic := '0';signal udspre_enable, ldspre_enable, udsh_dsl_enable, ldsh_dsl_enable : std_logic := '0';signal dq_bufferH, dq_bufferL : DATA_BUFFER_TYPE := ("0ZZZZZZZZ", "0ZZZZZZZZ", "0ZZZZZZZZ", "0ZZZZZZZZ", "0ZZZZZZZZ", "0ZZZZZZZZ", "0ZZZZZZZZ");signal DQS_S : std_logic := 'Z';signal dqs_count : integer := 0;signal dqs_pulse1, dqs_pulse2, dqs_pulse3, dqs_pulse4, dqs_pulse5, dqs_pulse6 : std_logic := '0';signal cur_time : time := 0 ns;signal Ref_time, clk_cycle_rising : time := 0 ns;signal tmp_act_trans0, tmp_act_trans1, tmp_act_trans2, tmp_act_trans3 : std_logic := '0';signal mrs_cmd_in : std_logic := '0';signal CKEN : CKE_TYPE := (others => '0');signal CLK_DLY2, CLK_DLY1, CLK_DLY15 : std_logic := '0';signal tmp_ref_addr1 : std_logic_vector((NUM_OF_ROW_ADD - 1) downto 0) := (others => '0');signal tmp_ref_addr2 : std_logic_vector((NUM_OF_ROW_ADD + 1) downto 0) := (others => '0');signal tmp_ref_addr3_B0 : std_logic_vector((NUM_OF_ROW_ADD - 1) downto 0) := (others => '0');signal tmp_ref_addr3_B1 : std_logic_vector((NUM_OF_ROW_ADD - 1) downto 0) := (others => '0');signal tmp_ref_addr3_B2 : std_logic_vector((NUM_OF_ROW_ADD - 1) downto 0) := (others => '0');signal tmp_ref_addr3_B3 : std_logic_vector((NUM_OF_ROW_ADD - 1) downto 0) := (others => '0');signal tmp_ref_addr3_0, tmp_ref_addr3_1, tmp_ref_addr3_2, tmp_ref_addr3_3 : std_logic := '0';signal tmp_ref_addr1_trans, tmp_ref_addr2_trans, tmp_ref_addr3_trans : std_logic := '0';signal RefChkTimeInit : boolean := FALSE;signal refresh_check : REF_CHECK;signal real_col_addr : COL_ADDR_TYPE ;signal Read_CA, Write_CA : std_logic := '0';signal tmp_w_trans0, tmp_w_trans1, tmp_w_trans2, tmp_w_trans3 : std_logic := '0';signal RA_Activated_B0 : std_logic_vector ((NUM_OF_ROW_ADD - 1) downto 0) := (others => 'U');signal RA_Activated_B1 : std_logic_vector ((NUM_OF_ROW_ADD - 1) downto 0) := (others => 'U');signal RA_Activated_B2 : std_logic_vector ((NUM_OF_ROW_ADD - 1) downto 0) := (others => 'U');signal RA_Activated_B3 : std_logic_vector ((NUM_OF_ROW_ADD - 1) downto 0) := (others => 'U');signal SA_ARRAY : SA_ARRAY_TYPE;signal SA_ARRAY_A0 : SA_TYPE;signal SA_ARRAY_A1 : SA_TYPE;signal SA_ARRAY_A2 : SA_TYPE;signal SA_ARRAY_A3 : SA_TYPE;signal SA_ARRAY_W0 : SA_TYPE;signal SA_ARRAY_W1 : SA_TYPE;signal SA_ARRAY_W2 : SA_TYPE;signal SA_ARRAY_W3 : SA_TYPE;signal PcgPdExtFlag, ActPdExtFlag, SlowActPdExtFlag : boolean := FALSE;signal PUSPCGAFlag1, PUSPCGAFlag2 : boolean := FALSE;signal PUS_DLL_RESET : boolean := FALSE;signal ModeRegisterSetFlag : boolean := FALSE;signal ModeRegisterFlag : boolean := FALSE;signal BankActivateFlag : boolean := FALSE;signal BankActivateFinFlag : boolean := FALSE;signal BankActivatedFlag : std_logic_vector ((NUM_OF_BANKS - 1) downto 0) := (others => '0');signal PcgPdFlag, ReadFlag : boolean := FALSE;signal WriteFlag : boolean := FALSE;signal DataBuffer : BUFFER_TYPE;signal PrechargeFlag : boolean := FALSE;signal AutoPrechargeFlag : std_logic_vector ((NUM_OF_BANKS - 1) downto 0) := (others => '0');signal PrechargeFinFlag : boolean := FALSE;signal PrechargeAllFlag : boolean := FALSE;signal PrechargeAllFinFlag : boolean := FALSE;signal ReadFinFlag : boolean := FALSE;signal WriteFinFlag : boolean := FALSE;signal AutoRefFlag : boolean := FALSE;signal SelfRefFlag : boolean := FALSE;signal SelfRefExt2NRFlag, SelfRefExt2RDFlag : boolean := FALSE;signal PUSCheckFinFlag : boolean := FALSE;signal CurrentState : STATE_TYPE := PWRUP;signal ModeRegister : MODE_REGISTER := ( CAS_LATENCY => 2, BURST_MODE => SEQUENTIAL, BURST_LENGTH => 4, DLL_STATE => NORST, SAPD => '0', TWR => 2 );signal ExtModeRegister : EMR_TYPE := ( DLL_EN => '0', AL => 0, QOFF => '0', DQSB_ENB => '0', RDQS_EN => '0', OCD_PGM => CAL_EXIT );signal ExtModeRegister2 : EMR2_TYPE := ( SREF_HOT => '0' );signal last_ocd_adjust_cmd, clk_cycle : time := 0 ns;signal clk_last_rising : time := 0 ns;signal cke_last_rising : time := 0 ns;signal clk_last_falling : time := 0 ns;signal udqs_last_rising : time := 0 ns;signal udqs_last_falling : time := 0 ns;signal ldqs_last_rising : time := 0 ns;signal ldqs_last_falling : time := 0 ns;signal wr_cmd_time : time := 0 ns;signal ldm_last_rising : time := 0 ns;signal udm_last_rising : time := 0 ns;signal b0_last_activate : time := 0 ns;signal b1_last_activate : time := 0 ns;signal b2_last_activate : time := 0 ns;signal b3_last_activate : time := 0 ns;signal b0_last_precharge : time := 0 ns;signal b1_last_precharge : time := 0 ns;signal b2_last_precharge : time := 0 ns;signal b3_last_precharge : time := 0 ns;signal b0_last_column_access : time := 0 ns;signal b1_last_column_access : time := 0 ns;signal b2_last_column_access : time := 0 ns;signal b3_last_column_access : time := 0 ns;signal b0_last_data_in : time := 0 ns;signal b1_last_data_in : time := 0 ns;signal b2_last_data_in : time := 0 ns;signal b3_last_data_in : time := 0 ns;signal last_mrs_set : time := 0 ns;signal last_aref : time := 0 ns;signal tCH : time := 0 ns;signal tCL : time := 0 ns;signal tWPRE : time := 0 ns;signal tRAS, tRCD, tRP, tRC, tCCD : time := 0 ns;signal tWTR : time := 0 ns;signal tDQSH : time := 0 ns;signal tDQSL : time := 0 ns;signal tWPSTmin : time := 0 ns;signal tWPSTmax : time := 0 ns;signal tDQSSmin : time := 0 ns;signal tDQSSmax : time := 0 ns;signal tMRD : time := 0 ns;signal cke_ch : time := 0 ns;signal rasb_ch : time := 0 ns;signal casb_ch : time := 0 ns;signal web_ch : time := 0 ns;signal csb_ch : time := 0 ns;signal udm_ch : time := 0 ns;signal ldm_ch : time := 0 ns;signal a0_ch : time := 0 ns;signal a1_ch : time := 0 ns;signal a2_ch : time := 0 ns;signal a3_ch : time := 0 ns;signal a4_ch : time := 0 ns;signal a5_ch : time := 0 ns;signal a6_ch : time := 0 ns;signal a7_ch : time := 0 ns;signal a8_ch : time := 0 ns;signal a9_ch : time := 0 ns;signal a10_ch : time := 0 ns;signal a11_ch : time := 0 ns;signal a12_ch : time := 0 ns;signal ba0_ch : time := 0 ns;signal ba1_ch : time := 0 ns;signal dq0_ch : time := 0 ns;signal dq1_ch : time := 0 ns;signal dq2_ch : time := 0 ns;signal dq3_ch : time := 0 ns;signal dq4_ch : time := 0 ns;signal dq5_ch : time := 0 ns;signal dq6_ch : time := 0 ns;signal dq7_ch : time := 0 ns;signal dq8_ch : time := 0 ns;signal dq9_ch : time := 0 ns;signal dq10_ch : time := 0 ns;signal dq11_ch : time := 0 ns;signal dq12_ch : time := 0 ns;signal dq13_ch : time := 0 ns;signal dq14_ch : time := 0 ns;signal dq15_ch : time := 0 ns;begin-----------------------------------------------------------------------------------------------------CLK_CYCLE_CHECK : process(CLK)begin CLK_DLY15 <= transport CLK after 1.5 ns; CLK_DLY1 <= transport CLK after 1 ns; CLK_DLY2 <= transport CLK after 2 ns; if (rising_edge(CLK)) then clk_cycle <= transport now - clk_cycle_rising; clk_cycle_rising <= transport now; end if;end Process;-----------------------------------------------------------------------------------------------------REFRESH_TIME_CHECK : process(tmp_ref_addr1_trans, tmp_ref_addr2_trans, tmp_ref_addr3_trans)variable i, j : integer := 0;begin i := 0; j := 0; if (RefChkTimeInit = FALSE) then loop exit when (i > NUM_OF_BANKS - 1); j := 0; loop exit when (j >= NUM_OF_ROWS); refresh_check (i, j) <= 0 ns; j := j + 1; end loop; i := i + 1; end loop; RefChkTimeInit <= TRUE; end if; if (tmp_ref_addr1_trans'event and tmp_ref_addr1_trans = '1') then refresh_check (0, conv_integer(tmp_ref_addr1)) <= transport now; refresh_check (1, conv_integer(tmp_ref_addr1)) <= transport now; refresh_check (2, conv_integer(tmp_ref_addr1)) <= transport now; refresh_check (3, conv_integer(tmp_ref_addr1)) <= transport now; end if; if (tmp_ref_addr2_trans'event and tmp_ref_addr2_trans = '1') then refresh_check (conv_integer(tmp_ref_addr2(1 downto 0)), conv_integer(tmp_ref_addr2((NUM_OF_ROW_ADD + 1) downto 2))) <= transport now; end if; if (tmp_ref_addr3_trans'event and tmp_ref_addr3_trans = '1') then if (tmp_ref_addr3_0 = '1') then refresh_check (0, conv_integer(tmp_ref_addr3_B0)) <= transport now; end if; if (tmp_ref_addr3_1 = '1') then refresh_check (1, conv_integer(tmp_ref_addr3_B1)) <= transport now; end if; if (tmp_ref_addr3_2 = '1') then refresh_check (2, conv_integer(tmp_ref_addr3_B2)) <= transport now; end if; if (tmp_ref_addr3_3 = '1') then refresh_check (3, conv_integer(tmp_ref_addr3_B3)) <= transport now; end if; end if;end process;-----------------------------------------------------------------------------------------------------CKE_EVAL : process (CLK, CKE) begin if (CKE'EVENT and CKE = '1' and CKE'LAST_VALUE = '0') then cke_last_rising <= transport now; end if; if (CLK'EVENT and CLK = '0' and CLK'LAST_VALUE = '1') then CKEN(-1) <= CKEN(0); elsif (CLK'EVENT and CLK = '1' and CLK'LAST_VALUE = '0') then CKEN(0) <= CKE; end if;end process;-----------------------------------------------------------------------------------------------------STATE_MACHINE : process (CLK, CKE, BankActivateFinFlag, PrechargeFinFlag, PrechargeAllFinFlag, BankActivatedFlag, PUSCheckFinFlag) variable ChipSelectBar : std_logic := '0';variable RowAddrStrobeBar : std_logic := '0';variable ColAddrStrobeBar : std_logic := '0';variable WriteEnableBar : std_logic := '0';variable Address10 : std_logic := '0';variable ClockEnable : CKE_TYPE := (others => '0');variable NextState, Cur_State : STATE_TYPE := PWRUP;variable CurrentCommand : COMMAND_TYPE := NOP;variable OpCode : MROPCODE_TYPE := (others => 'X');variable MR : MODE_REGISTER;variable EMR : EMR_TYPE;variable EMR2 : EMR2_TYPE;variable BkAdd : std_logic_vector((NUM_OF_BANK_ADD - 1) downto 0) := (others => 'X');variable BankActFlag : std_logic_vector((NUM_OF_BANKS - 1) downto 0) := (others => '0'); begin if (CLK'EVENT and CLK = '1' and CLK'LAST_VALUE = '0') then ClockEnable(-1) := CKEN(-1); ClockEnable(0) := CKE; ChipSelectBar := CSB; RowAddrStrobeBar := RASB; ColAddrStrobeBar := CASB; WriteEnableBar := WEB; Address10 := ADDR(10); BkAdd := BA; BankActFlag := BankActivatedFlag; Cur_State := CurrentState; COMMAND_DECODE (ChipSelectBar, RowAddrStrobeBar, ColAddrStrobeBar, WriteEnableBar, Address10, BkAdd, ClockEnable, CurrentCommand, BankActFlag, Cur_State); if (DLL_reset = '1' and (CurrentCommand = RD or CurrentCommand = RDAP)) then if (TimingCheckFlag = TRUE) then assert false report "ERROR : (DLL Locking) : 200 clock cycles are needed after DLL reset." severity ERROR; end if; end if; Case CurrentState Is When IDLE => Case CurrentCommand Is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -