⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hy5ps121621f.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 5 页
字号:
--------------------------------------------------------      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 + -