📄 hy5ps121621f.vhd
字号:
When DSEL => NextState := IDLE; When NOP => NextState := IDLE; When ACT => if (TimingCheckFlag = TRUE) then assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; assert (now - last_aref >= tRFC) report "WARNING : (tRFC_CHECK) : tRFC timing error!" severity WARNING; assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; end if; BankActivateFlag <= TRUE; NextState := RACT; When PCG => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; end if; NextState := IDLE; When PCGA => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; end if; NextState := IDLE; When AREF => if (TimingCheckFlag = TRUE) then assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; assert (now - last_aref >= tRFC) report "WARNING : (tRFC_CHECK) : tRFC timing error!" severity WARNING; end if; last_aref <= transport now after 1 ns; AutoRefFlag <= TRUE, FALSE after 2 ns; NextState := IDLE; When SREF => if (TimingCheckFlag = TRUE) then assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; end if; SelfRefFlag <= TRUE; NextState := SLFREF; When PDEN => if (TimingCheckFlag = TRUE) then assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; end if; PcgPdFlag <= TRUE; NextState := PWRDN; When EMRS3 => NextState := IDLE; mrs_cmd_in <= transport '1', '0' after 2 ns; When EMRS1 => OpCode := ADDR(12 downto 0); EXT_MODE_REGISTER_SET (OpCode, EMR); ExtModeRegister <= EMR; NextState := IDLE; if (ADDR(0) = '0') then DLL_lock_enable <= '1'; end if; mrs_cmd_in <= transport '1', '0' after 2 ns; When EMRS2 => OpCode := ADDR(12 downto 0); EXT_MODE_REGISTER_SET2 (OpCode, EMR2); ExtModeRegister2 <= EMR2; NextState := IDLE; mrs_cmd_in <= transport '1', '0' after 2 ns; When MRS => if (TimingCheckFlag = TRUE) then assert (PcgPdExtFlag = FALSE) report "WARNING : (tXP_CHECK) : tXP timing error!" severity WARNING; assert (SelfRefExt2NRFlag /= TRUE) report "ERROR : (tXSNR_CHECK) : Needs tXSNR Timing after Self Refresh." severity error; end if; OpCode := ADDR(12 downto 0); MODE_REGISTER_SET (OpCode, MR); ModeRegister <= MR; ModeRegisterSetFlag <= TRUE; if (ADDR(8) = '1') then DLL_reset <= transport '1', '0' after 200 * clk_cycle; end if; NextState := IDLE; mrs_cmd_in <= transport '1', '0' after 2 ns; When others => assert false report "WARNING : (STATE_MACHINE) : Illegal Command Issued. Command Ignored." severity warning; NextState := IDLE; End Case; When PWRUP => Case CurrentCommand Is When DSEL => if (PUSCheckFlag = TRUE) then NextState := PWRUP; else NextState := IDLE; end if; When NOP => if (PUSCheckFlag = TRUE) then NextState := PWRUP; else NextState := IDLE; end if; When EMRS3 => NextState := PWRUP; mrs_cmd_in <= transport '1', '0' after 2 ns; When EMRS1 => if (TimingCheckFlag = TRUE and PUSCheckFlag = TRUE) then assert (PUSPCGAFlag1 = TRUE) report "ERROR : (Power Up Sequence) : PCGA Command must be issued before EMRS setting!" severity error; end if; OpCode := ADDR(12 downto 0); EXT_MODE_REGISTER_SET (OpCode, EMR); ExtModeRegister <= EMR; NextState := PWRUP; if (ADDR(0) = '0') then DLL_lock_enable <= '1'; end if; mrs_cmd_in <= transport '1', '0' after 2 ns; When EMRS2 => OpCode := ADDR(12 downto 0); EXT_MODE_REGISTER_SET2 (OpCode, EMR2); ExtModeRegister2 <= EMR2; NextState := PWRUP; mrs_cmd_in <= transport '1', '0' after 2 ns; When MRS => if (TimingCheckFlag = TRUE) then assert (DLL_lock_enable = '1') report "WARNING : (STATE_MACHINE) : EMRS Command (with DLL enable flag) Must be Issued before MRS Command !" severity warning; end if; OpCode := ADDR(12 downto 0); MODE_REGISTER_SET (OpCode, MR); ModeRegister <= MR; ModeRegisterSetFlag <= TRUE; NextState := PWRUP; if (ADDR(8) = '1') then DLL_reset <= transport '1', '0' after 200 * clk_cycle; end if; mrs_cmd_in <= transport '1', '0' after 2 ns; When PCGA => PrechargeAllFlag <= TRUE; NextState := PWRUP; When AREF => AutoRefFlag <= TRUE, FALSE after 2 ns; if (PUSCheckFinFlag = TRUE) then NextState := IDLE; else NextState := PWRUP; end if; last_aref <= transport now after 1 ns; When others => assert false report "ERROR : (STATE_MACHINE) : Invalid Command Issued during Power Up Sequence." severity error; End Case; When PWRDN => Case CurrentCommand Is When NOP => NextState := PWRDN; When PDEX => if (PcgPdFlag = TRUE) then PcgPdExtFlag <= transport TRUE, FALSE after tXP * clk_cycle; PcgPdFlag <= FALSE; NextState := IDLE; elsif (ModeRegister.SAPD = '0') then ActPdExtFlag <= transport TRUE, FALSE after tXARD * clk_cycle; NextState := RACT; elsif (ModeRegister.SAPD = '1') then SlowActPdExtFlag <= transport TRUE, FALSE after (6 - ExtModeRegister.AL) * clk_cycle; NextState := RACT; end if; When others => assert false report "WARNING : (STATE_MACHINE) : Illegal Command Issued. Command Ignored." severity warning; NextState := PWRDN; End Case; When SLFREF => Case CurrentCommand Is When NOP => NextState := SLFREF; When SREX => SelfRefExt2NRFlag <= transport TRUE, FALSE after tXSNR; SelfRefExt2RDFlag <= transport TRUE, FALSE after tXSRD * clk_cycle; SelfRefFlag <= FALSE; NextState := IDLE; When others => assert false report "WARNING : (STATE_MACHINE) : Illegal Command Issued. Command Ignored." severity warning; NextState := SLFREF; End Case; When RACT => Case CurrentCommand Is When DSEL => NextState := RACT; When NOP => NextState := RACT; When RD => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2RDFlag /= TRUE) report "ERROR : (tXSRD_CHECK) : Needs tXSRD Timing after Self Refresh." severity error; assert (ActPdExtFlag = FALSE) report "WARNING : (tXARD_CHECK) : tXARD timing error!" severity WARNING; assert (SlowActPdExtFlag = FALSE) report "WARNING : (tXARDS_CHECK) : tXARDS timing error!" severity WARNING; end if; Read_CA <= '1', '0' after 2 ns; NextState := READ; When RDAP => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2RDFlag /= TRUE) report "ERROR : (tXSRD_CHECK) : Needs tXSRD Timing after Self Refresh." severity error; assert (ActPdExtFlag = FALSE) report "WARNING : (tXARD_CHECK) : tXARD timing error!" severity WARNING; assert (SlowActPdExtFlag = FALSE) report "WARNING : (tXARDS_CHECK) : tXARDS timing error!" severity WARNING; end if; AutoPrechargeFlag(conv_integer(BkAdd)) <= transport '1' after (ExtModeRegister.AL + ModeRegister.BURST_LENGTH/2 - 2) * clk_cycle + tRTP, '0' after (ExtModeRegister.AL + ModeRegister.BURST_LENGTH/2 - 2) * clk_cycle + tRTP + 2 ns; Read_CA <= '1', '0' after 2 ns; NextState := READ; When WR => Write_CA <= '1', '0' after 2 ns; NextState := WRITE; When WRAP => AutoPrechargeFlag(conv_integer(BkAdd)) <= transport '1' after (ExtModeRegister.AL + ModeRegister.CAS_LATENCY - 1 + ModeRegister.BURST_LENGTH/2 + ModeRegister.TWR) * clk_cycle, '0' after (ExtModeRegister.AL + ModeRegister.CAS_LATENCY - 1 + ModeRegister.BURST_LENGTH/2 + ModeRegister.TWR) * clk_cycle + 2 ns; Write_CA <= '1', '0' after 2 ns; NextState := WRITE; When ACT => BankActivateFlag <= TRUE; NextState := RACT; When PCG => PrechargeFlag <= TRUE; if ((BankActivatedFlag = "0001") or (BankActivatedFlag = "0010") or (BankActivatedFlag = "0100") or (BankActivatedFlag = "1000")) then NextState := IDLE; else NextState := RACT; end if; When PCGA => PrechargeAllFlag <= TRUE; NextState := IDLE; When PDEN => NextState := PWRDN; When others => assert false report "WARNING : (STATE_MACHINE) : Illegal Command Issued. Command Ignored." severity warning; NextState := RACT; End Case; When READ => Case CurrentCommand Is When DSEL => NextState := READ; When NOP => NextState := READ; When RD => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2RDFlag /= TRUE) report "ERROR : (tXSRD_CHECK) : Needs tXSRD Timing after Self Refresh." severity error; end if; Read_CA <= '1', '0' after 2 ns; NextState := READ; When RDAP => if (TimingCheckFlag = TRUE) then assert (SelfRefExt2RDFlag /= TRUE) report "ERROR : (tXSRD_CHECK) : Needs tXSRD Timing after Self Refresh." severity error; end if; AutoPrechargeFlag(conv_integer(BkAdd)) <= transport '1' after (ExtModeRegister.AL + ModeRegister.BURST_LENGTH/2 - 2) * clk_cycle + tRTP, '0' after (ExtModeRegister.AL + ModeRegister.BURST_LENGTH/2 - 2) * clk_cycle + tRTP + 2 ns; Read_CA <= '1', '0' after 2 ns; NextState := READ; When WR => Write_CA <= '1', '0' after 2 ns; NextState := WRITE; When WRAP => AutoPrechargeFlag(conv_integer(BkAdd)) <= transport '1' after (ExtModeRegister.AL + ModeRegister.CAS_LATENCY - 1 + ModeRegister.BURST_LENGTH/2 + ModeRegister.TWR) * clk_cycle, '0' after (ExtModeRegister.AL + ModeRegister.CAS_LATENCY - 1 + ModeRegister.BURST_LENGTH/2 + ModeRegister.TWR) * clk_cycle + 2 ns; Write_CA <= '1', '0' after 2 ns; NextState := WRITE; When ACT => BankActivateFlag <= TRUE; NextState := READ; When PCG => PrechargeFlag <= TRUE; NextState := READ; When PCGA => PrechargeAllFlag <= TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -