📄 k7r321882m.vhd
字号:
w_62 : VitalWireDelay (WNeg_ipd, WNeg, tipd_WNeg); w_63 : VitalWireDelay (BW0Neg_ipd, BW0Neg, tipd_BW0Neg); w_64 : VitalWireDelay (BW1Neg_ipd, BW1Neg, tipd_BW1Neg); w_67 : VitalWireDelay (K_ipd, K, tipd_K); w_68 : VitalWireDelay (KNeg_ipd, KNeg, tipd_KNeg); w_69 : VitalWireDelay (C_ipd, C, tipd_C); w_70 : VitalWireDelay (CNeg_ipd, CNeg, tipd_CNeg); w_71 : VitalWireDelay (TMS_ipd, TMS, tipd_TMS); w_72 : VitalWireDelay (TDI_ipd, TDI, tipd_TDI); w_73 : VitalWireDelay (TCK_ipd, TCK, tipd_TCK); END BLOCK; ---------------------------------------------------------------------------- -- Main Behavior Block ---------------------------------------------------------------------------- Behavior: BLOCK PORT ( DLLNegIn : IN std_logic := 'U'; BW0NIn : IN std_ulogic := 'U'; BW1NIn : IN std_ulogic := 'U'; Dat0In : IN std_logic_vector(HiDbit downto 0); Dat1In : IN std_logic_vector(HiDbit downto 0); DataOut : OUT std_logic_vector(17 downto 0) := (others => 'Z'); CIn : IN std_ulogic := 'U'; CNegIn : IN std_ulogic := 'U'; KIn : IN std_ulogic := 'U'; KNegIn : IN std_ulogic := 'U'; AddressIn : IN std_logic_vector(HiAbit downto 0); RInt : IN std_ulogic := 'U'; WInt : IN std_ulogic := 'U'; CQOut : OUT std_ulogic := 'U'; CQNegOut : OUT std_ulogic := 'U' ); PORT MAP ( Dat0In(0) => D0_ipd, Dat0In(1) => D1_ipd, Dat0In(2) => D2_ipd, Dat0In(3) => D3_ipd, Dat0In(4) => D4_ipd, Dat0In(5) => D5_ipd, Dat0In(6) => D6_ipd, Dat0In(7) => D7_ipd, Dat0In(8) => D8_ipd, Dat1In(0) => D9_ipd, Dat1In(1) => D10_ipd, Dat1In(2) => D11_ipd, Dat1In(3) => D12_ipd, Dat1In(4) => D13_ipd, Dat1In(5) => D14_ipd, Dat1In(6) => D15_ipd, Dat1In(7) => D16_ipd, Dat1In(8) => D17_ipd, DataOut(0) => Q0, DataOut(1) => Q1, DataOut(2) => Q2, DataOut(3) => Q3, DataOut(4) => Q4, DataOut(5) => Q5, DataOut(6) => Q6, DataOut(7) => Q7, DataOut(8) => Q8, DataOut(9) => Q9, DataOut(10) => Q10, DataOut(11) => Q11, DataOut(12) => Q12, DataOut(13) => Q13, DataOut(14) => Q14, DataOut(15) => Q15, DataOut(16) => Q16, DataOut(17) => Q17, AddressIn(0) => A0_ipd, AddressIn(1) => A1_ipd, AddressIn(2) => A2_ipd, AddressIn(3) => A3_ipd, AddressIn(4) => A4_ipd, AddressIn(5) => A5_ipd, AddressIn(6) => A6_ipd, AddressIn(7) => A7_ipd, AddressIn(8) => A8_ipd, AddressIn(9) => A9_ipd, AddressIn(10) => A10_ipd, AddressIn(11) => A11_ipd, AddressIn(12) => A12_ipd, AddressIn(13) => A13_ipd, AddressIn(14) => A14_ipd, AddressIn(15) => A15_ipd, AddressIn(16) => A16_ipd, AddressIn(17) => A17_ipd, AddressIn(18) => A18_ipd, AddressIn(19) => A19_ipd, BW0NIn => BW0Neg_ipd, BW1NIn => BW1Neg_ipd, CIn => C_ipd, CNegIn => CNeg_ipd, KIn => K_ipd, KNegIn => KNeg_ipd, RInt => RNeg_ipd, WInt => WNeg_ipd, CQOut => CQ, CQNegOut => CQNeg, DLLNegIn => DLLNeg_ipd ); SIGNAL Q_zd : std_logic_vector(17 DOWNTO 0); SIGNAL KTRIG : std_ulogic; SIGNAL CTRIG : std_ulogic; SIGNAL KCTRIG : std_ulogic; SIGNAL KCTRIGN : std_ulogic; SIGNAL CPERIOD : time := 4 ns; -- C period SIGNAL KPERIOD : time := 4 ns; SIGNAL CInt : std_ulogic := '0'; SIGNAL CNegInt : std_ulogic := '0'; SIGNAL Ktemp : std_ulogic := '0'; SIGNAL Ctemp : std_ulogic := '0'; SIGNAL KInt : std_ulogic := '0'; SIGNAL KNegInt : std_ulogic := '0'; SIGNAL CHalfPer : time := 4 ps; SIGNAL Cdlldelay: time := 0 ns; SIGNAL KHalfPer : time := 4 ps; 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 := 0 ns; VARIABLE Ctemp_period : Time := 0 ns; VARIABLE Ctemp_period1 : Time := 0 ns; VARIABLE Ctemp_period2 : Time := 0 ns; VARIABLE prev_Ctemp : Time := 0 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 + 4 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 := 0 ns; VARIABLE Ktemp_period : Time := 0 ns; VARIABLE Ktemp_period1 : Time := 0 ns; VARIABLE Ktemp_period2 : Time := 0 ns; VARIABLE prev_Ktemp : Time := 0 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 + 4 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, CInt, CNegInt, KIn, KNegIn, RInt, WInt, AddressIn, Dat0In, Dat1In, KTRIG, CTRIG, KCTRIG, KCTRIGN) -- Timing Check Variables VARIABLE Tviol_A0_K : X01 := '0'; VARIABLE TD_A0_K : VitalTimingDataType; VARIABLE Tviol_A0_KNeg : X01 := '0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -