📄 k7r323682m.vhd
字号:
SIGNAL Ktemp : std_ulogic := '0'; SIGNAL Ctemp : std_ulogic := '0'; SIGNAL KInt : std_ulogic := '0'; SIGNAL KNegInt : std_ulogic := '0'; SIGNAL CHalfPer : time := 5 ns; SIGNAL Cdlldelay: time := 0 ns; SIGNAL KHalfPer : time := 5 ns; SIGNAL Kdlldelay: time := 0 ns; TYPE cmode IS (c, k); SIGNAL mode : cmode := c; BEGIN ---------------------------------------------- -- DLL model functional section --- ---------------------------------------------- C_DLL: PROCESS(CIn, Ctemp) VARIABLE CIn_period : Time := 1 ms; VARIABLE prev_CIn : Time := 1 ns; VARIABLE Ctemp_period : Time := 1 ns; VARIABLE Ctemp_period1 : Time := 1 ns; VARIABLE Ctemp_period2 : Time := 1 ns; VARIABLE prev_Ctemp : Time := 1 ns; VARIABLE dll_lock : BOOLEAN := false; VARIABLE toggle1 : boolean; VARIABLE toggle2 : boolean; VARIABLE DllDisable : BOOLEAN := false; -- Disable dll mode BEGIN DllDisable := (DLLNeg_ipd = '0'); IF mode = c THEN IF rising_edge(CIn) THEN CIn_period := NOW - prev_CIn; prev_CIn := NOW; IF CIn_period > 30 ns THEN dll_lock := false; ASSERT false REPORT "C mode DLL reseting" SEVERITY note; END IF; END IF; IF rising_edge(Ctemp) THEN Ctemp_period := NOW - prev_Ctemp; prev_Ctemp := NOW; IF toggle1 AND toggle2 AND not(dll_lock)AND not DllDisable THEN IF Ctemp_period > CIn_period THEN Chalfper <= Chalfper - 51 ps; dll_lock := false; ELSIF Ctemp_period < CIn_period THEN Chalfper <= Chalfper + 7 ps; dll_lock := false; ELSIF Ctemp_period = Ctemp_period2 THEN -- stable? dll_lock := true; ASSERT false REPORT "C mode DLL lock achieved" SEVERITY note; ELSE Ctemp_period2 := Ctemp_period1; Ctemp_period1 := Ctemp_period; END IF; END IF; toggle1 := not toggle1; IF toggle1 THEN toggle2 := not toggle2; ELSE Cdlldelay <= 0 ps; END IF; END IF; IF rising_edge(Ctemp) AND dll_lock AND toggle1 AND toggle2 THEN IF (prev_CIn + tpd_C_Q1) < NOW THEN IF Cdlldelay < CIn_period THEN Cdlldelay <= Cdlldelay - 60 ps; END IF; END IF; END IF; END IF; END PROCESS C_DLL; C_temp : PROCESS(Ctemp,DLLNeg_ipd) -- generating internal clock from DLL BEGIN IF NOT DLLNeg_ipd = '0' THEN Ctemp <= not(Ctemp) AFTER CHalfPer + Cdlldelay; END IF; END PROCESS C_temp; K_DLL: PROCESS(KIn, Ktemp) VARIABLE KIn_period : Time := 1 ms; VARIABLE prev_KIn : Time := 1 ns; VARIABLE Ktemp_period : Time := 1 ns; VARIABLE Ktemp_period1 : Time := 1 ns; VARIABLE Ktemp_period2 : Time := 1 ns; VARIABLE prev_Ktemp : Time := 1 ns; VARIABLE dll_lock : BOOLEAN := false; VARIABLE toggle1 : boolean; VARIABLE toggle2 : boolean; VARIABLE DllDisable : BOOLEAN := false; -- Disable dll mode BEGIN DllDisable := (DLLNeg_ipd = '0'); IF mode = k THEN IF rising_edge(KIn) THEN KIn_period := NOW - prev_KIn; prev_KIn := NOW; IF KIn_period > 30 ns THEN dll_lock := false; ASSERT false REPORT "K mode DLL reseting" SEVERITY note; END IF; END IF; IF rising_edge(Ktemp) THEN Ktemp_period := NOW - prev_Ktemp; prev_Ktemp := NOW; IF toggle1 AND toggle2 AND not(dll_lock) AND not DllDisable THEN IF Ktemp_period > KIn_period THEN Khalfper <= Khalfper - 51 ps; dll_lock := false; ELSIF Ktemp_period < KIn_period THEN Khalfper <= Khalfper + 7 ps; dll_lock := false; ELSIF Ktemp_period = Ktemp_period2 THEN -- stable? dll_lock := true; ASSERT false REPORT "K mode DLL lock achieved" SEVERITY note; ELSE Ktemp_period2 := Ktemp_period1; Ktemp_period1 := Ktemp_period; END IF; END IF; toggle1 := not toggle1; IF toggle1 THEN toggle2 := not toggle2; ELSE Kdlldelay <= 0 ps; END IF; END IF; IF rising_edge(Ktemp) AND dll_lock AND toggle1 AND toggle2 THEN IF (prev_KIn + tpd_C_Q1) < NOW THEN IF Kdlldelay < KIn_period THEN Kdlldelay <= Kdlldelay - 60 ps; END IF; END IF; END IF; END IF; END PROCESS K_DLL; K_temp : PROCESS(Ktemp, DLLNeg_ipd) -- generating internal clock -- from DLL BEGIN IF NOT DLLNeg_ipd = '0' THEN Ktemp <= not(Ktemp) AFTER KHalfPer + Kdlldelay; END IF; END PROCESS K_temp; C_int : PROCESS (CIn, Ctemp, KIn, Ktemp)-- Passing clock based on DLL_EN BEGIN IF (not DLLNegIn= '0') THEN IF mode = c THEN CInt <= TRANSPORT Ctemp; CNegInt <= TRANSPORT not Ctemp; ELSIF mode = k THEN CInt <= TRANSPORT Ktemp; CNegInt <= TRANSPORT not Ktemp; END IF; ELSE IF mode = c THEN CInt <= CIn ; CNegInt <= CNegIn ; ELSIF mode = k THEN CInt <= KIn ; CNegInt <= KNegIn ; END IF; END IF; END PROCESS C_int; ------------------------------------------------------------------------ -- Behavior Process ------------------------------------------------------------------------ Behavior : PROCESS (BW0NIn, BW1NIn, BW2NIn, BW3NIn, CInt, CNegInt, KIn, KNegIn, RInt, WInt, AddressIn, Dat0In, Dat1In, Dat2In, Dat3In, KTRIG, CTRIG, KCTRIG, KCTRIGN) -- Timing Check Variables VARIABLE Tviol_A0_K : X01 := '0'; VARIABLE TD_A0_K : VitalTimingDataType; VARIABLE Tviol_A0_KNeg : X01 := '0'; VARIABLE TD_A0_KNeg : VitalTimingDataType; VARIABLE Tviol_D0_K : X01 := '0'; VARIABLE TD_D0_K : VitalTimingDataType; VARIABLE Tviol_D1_K : X01 := '0'; VARIABLE TD_D1_K : VitalTimingDataType; VARIABLE Tviol_D2_K : X01 := '0'; VARIABLE TD_D2_K : VitalTimingDataType; VARIABLE Tviol_D3_K : X01 := '0'; VARIABLE TD_D3_K : VitalTimingDataType; VARIABLE Tviol_D0_KNeg : X01 := '0'; VARIABLE TD_D0_KNeg : VitalTimingDataType; VARIABLE Tviol_D1_KNeg : X01 := '0'; VARIABLE TD_D1_KNeg : VitalTimingDataType; VARIABLE Tviol_D2_KNeg : X01 := '0'; VARIABLE TD_D2_KNeg : VitalTimingDataType; VARIABLE Tviol_D3_KNeg : X01 := '0'; VARIABLE TD_D3_KNeg : VitalTimingDataType; VARIABLE Tviol_RNeg_K : X01 := '0'; VARIABLE TD_RNeg_K : VitalTimingDataType; VARIABLE Tviol_WNeg_K : X01 := '0'; VARIABLE TD_WNeg_K : VitalTimingDataType; VARIABLE Tviol_BW0Neg_K : X01 := '0'; VARIABLE TD_BW0Neg_K : VitalTimingDataType; VARIABLE Tviol_BW1Neg_K : X01 := '0'; VARIABLE TD_BW1Neg_K : VitalTimingDataType; VARIABLE Tviol_BW2Neg_K : X01 := '0'; VARIABLE TD_BW2Neg_K : VitalTimingDataType; VARIABLE Tviol_BW3Neg_K : X01 := '0'; VARIABLE TD_BW3Neg_K : VitalTimingDataType; VARIABLE Tviol_BW0Neg_KNeg : X01 := '0'; VARIABLE TD_BW0Neg_KNeg : VitalTimingDataType; VARIABLE Tviol_BW1Neg_KNeg : X01 := '0'; VARIABLE TD_BW1Neg_KNeg : VitalTimingDataType; VARIABLE Tviol_BW2Neg_KNeg : X01 := '0'; VARIABLE TD_BW2Neg_KNeg : VitalTimingDataType; VARIABLE Tviol_BW3Neg_KNeg : X01 := '0'; VARIABLE TD_BW3Neg_KNeg : VitalTimingDataType; VARIABLE Pviol_C : X01 := '0'; VARIABLE TD_C : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_CNeg : X01 := '0'; VARIABLE TD_CNeg : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_K : X01 := '0'; VARIABLE TD_K : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_KNeg : X01 := '0'; VARIABLE TD_KNeg : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Sviol_KNeg_CNeg : X01 := '0'; VARIABLE SD_KNeg_CNeg : VitalSkewDataType := VitalSkewDataInit; VARIABLE Sviol_K_C : X01 := '0'; VARIABLE SD_K_C : VitalSkewDataType := VitalSkewDataInit; VARIABLE Sviol_K_KNeg : X01 := '0'; VARIABLE SD_K_KNeg : VitalSkewDataType := VitalSkewDataInit; VARIABLE Sviol_C_CNeg : X01 := '0'; VARIABLE SD_C_CNeg : VitalSkewDataType := VitalSkewDataInit; -- Functionality Results Variables VARIABLE Violation : X01 := '0'; VARIABLE CQ_zd : std_ulogic := 'U'; VARIABLE CQNeg_zd : std_ulogic := 'U'; VARIABLE CQ_GlitchData : VitalGlitchDataType; VARIABLE CQNeg_GlitchData : VitalGlitchDataType; -- Memory array declaration TYPE MemStore IS ARRAY (0 to TotalLOC) OF INTEGER RANGE -2 TO MaxData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -