📄 mt47h256m4.vhd
字号:
PROCEDURE insert_list( key_address : IN integer; val_data : IN integer; root : INOUT mem_data_pointer_t) IS VARIABLE new_element : mem_data_pointer_t; VARIABLE found : mem_data_pointer_t; VARIABLE prev : mem_data_pointer_t; BEGIN position_list(key_address, root, found, prev); -- Insert at list tail IF (found = NULL) THEN prev.successor := NEW mem_data_t; prev.successor.key_address := key_address; prev.successor.val_data := val_data; prev.successor.successor := NULL; ELSE -- Element exists, update memory data value IF (found.key_address = key_address) THEN found.val_data := val_data; ELSE -- No element found, allocate and link new_element := NEW mem_data_t; new_element.key_address := key_address; new_element.val_data := val_data; new_element.successor := found; -- Possible root position IF (prev /= NULL) THEN prev.successor := new_element; ELSE root := new_element; END IF; END IF; END IF; END PROCEDURE insert_list; ----------------------------------------------------------------------- -- Memory READ operation performed above dynamically allocated space ----------------------------------------------------------------------- PROCEDURE read_mem( linked_list : INOUT mem_data_pointer_t; data : INOUT integer; address : IN integer) IS VARIABLE found : mem_data_pointer_t; VARIABLE prev : mem_data_pointer_t; VARIABLE m_data : integer RANGE -2 TO MaxData; BEGIN IF (linked_list = NULL) THEN -- Not allocated, not written, initial value m_data := -2; ELSE position_list(address, linked_list, found, prev); IF (found /= NULL) THEN IF found.key_address = address THEN -- Allocated, val_data stored m_data := found.val_data; ELSE -- Not allocated, not written, initial value m_data := -2; END IF; ELSE -- Not allocated, not written, initial value m_data := -2; END IF; END IF; data := m_data; END PROCEDURE read_mem; --------------------------------------------------------------------- -- Memory WRITE operation performed above dynamically allocated space --------------------------------------------------------------------- PROCEDURE write_mem( linked_list : INOUT mem_data_pointer_t; address : IN integer; data : IN integer) IS BEGIN -- Handle possible root value update IF (linked_list /= NULL) THEN insert_list(address, data, linked_list); ELSE create_list(address, data, linked_list); END IF; END PROCEDURE write_mem; ------------------------------------------------------------------------ -- Handle dynamic memory allocation ------------------------------------------------------------------------ -- Partition dynamically allocated space for performance CONSTANT list_num : integer := BankNum; -- Access dynamically allocated space SHARED VARIABLE linked_list : mem_data_pointer_array_t(0 TO list_num); -- Asure proper initialization PROCEDURE initialize_list IS BEGIN FOR I IN 0 TO list_num LOOP linked_list(I) := NULL; END LOOP; END PROCEDURE initialize_list; BEGIN CK_DLL: PROCESS(CKDiff) VARIABLE Previous : time := 0 ns; VARIABLE TmpPer : time := 0 ns; BEGIN IF rising_edge(CKDiff) THEN TmpPer := NOW - Previous; IF TmpPer > 0 ns THEN CKPeriod <= TmpPer; END IF; Previous := NOW; CKHalfPer <= CKPeriod / 2; CKDLLDelay <= CKPeriod - tpd_CK_DQ1; END IF; END PROCESS CK_DLL; CK_temp: PROCESS(CKDiff) -- generating internal clock from DLL BEGIN CKtemp <= NOT CKtemp AFTER CKHalfPer; END PROCESS CK_temp; CKInt <= TRANSPORT CKtemp AFTER CKDLLDelay; Power_up: PROCESS(CK_stable) BEGIN IF CK_stable THEN PoweredUp <= TRUE AFTER 200 us; END IF; END PROCESS Power_up; Init_d: PROCESS(In_d) BEGIN IF In_d THEN Init_delay <= TRUE AFTER 400 ns; ELSE Init_delay <= FALSE; END IF; END PROCESS Init_d; DLLdelay: PROCESS(DLL_delay, CKDiff) VARIABLE cnt : natural; BEGIN IF rising_edge(DLL_delay) THEN cnt := 0; DLL_delay_elapsed <= FALSE; ELSIF rising_edge(CKDiff) AND NOT DLL_delay_elapsed THEN cnt := cnt + 1; IF cnt = 199 THEN DLL_delay_elapsed <= TRUE; END IF; END IF; END PROCESS DLLdelay; ---------------------------------------------------------------------------- -- Main Behavior Process ---------------------------------------------------------------------------- VITALBehaviour: PROCESS(CKDiff, DQSDiff, DQSIn, DQIn, DM, ODT, CKE, CSNeg, RASNeg, CASNeg, WENeg, BAIn, AIn) -- Timing Check Variables VARIABLE Tviol_DQ0_DQS : X01 := '0'; VARIABLE TD_DQ0_DQS : VitalTimingDataType; VARIABLE Tviol_DQ0_DQS1 : X01 := '0'; VARIABLE TD_DQ0_DQS1 : VitalTimingDataType; VARIABLE Tviol_DQ1_DQS : X01 := '0'; VARIABLE TD_DQ1_DQS : VitalTimingDataType; VARIABLE Tviol_DQ1_DQS1 : X01 := '0'; VARIABLE TD_DQ1_DQS1 : VitalTimingDataType; VARIABLE Tviol_DM0_DQS : X01 := '0'; VARIABLE TD_DM0_DQS : VitalTimingDataType; VARIABLE Tviol_DM0_DQS1 : X01 := '0'; VARIABLE TD_DM0_DQS1 : VitalTimingDataType; VARIABLE Tviol_DM1_DQS : X01 := '0'; VARIABLE TD_DM1_DQS : VitalTimingDataType; VARIABLE Tviol_DM1_DQS1 : X01 := '0'; VARIABLE TD_DM1_DQS1 : VitalTimingDataType; VARIABLE Tviol_ODT_CK : X01 := '0'; VARIABLE TD_ODT_CK : VitalTimingDataType; VARIABLE Tviol_CKE_CK : X01 := '0'; VARIABLE TD_CKE_CK : VitalTimingDataType; VARIABLE Tviol_CSNeg_CK : X01 := '0'; VARIABLE TD_CSNeg_CK : VitalTimingDataType; VARIABLE Tviol_RASNeg_CK : X01 := '0'; VARIABLE TD_RASNeg_CK : VitalTimingDataType; VARIABLE Tviol_CASNeg_CK : X01 := '0'; VARIABLE TD_CASNeg_CK : VitalTimingDataType; VARIABLE Tviol_WENeg_CK : X01 := '0'; VARIABLE TD_WENeg_CK : VitalTimingDataType; VARIABLE Tviol_BA0_CK : X01 := '0'; VARIABLE TD_BA0_CK : VitalTimingDataType; VARIABLE Tviol_A0_CK : X01 := '0'; VARIABLE TD_A0_CK : VitalTimingDataType; VARIABLE Tviol_DQS_CK3 : X01 := '0'; VARIABLE TD_DQS_CK3 : VitalTimingDataType; VARIABLE Tviol_DQS_CK4 : X01 := '0'; VARIABLE TD_DQS_CK4 : VitalTimingDataType; VARIABLE Tviol_DQS_CK5 : X01 := '0'; VARIABLE TD_DQS_CK5 : VitalTimingDataType; VARIABLE Tviol_DQS_CK6 : X01 := '0'; VARIABLE TD_DQS_CK6 : VitalTimingDataType; VARIABLE Tviol_DQS1_CK3 : X01 := '0'; VARIABLE TD_DQS1_CK3 : VitalTimingDataType; VARIABLE Tviol_DQS1_CK4 : X01 := '0'; VARIABLE TD_DQS1_CK4 : VitalTimingDataType; VARIABLE Tviol_DQS1_CK5 : X01 := '0'; VARIABLE TD_DQS1_CK5 : VitalTimingDataType; VARIABLE Tviol_DQS1_CK6 : X01 := '0'; VARIABLE TD_DQS1_CK6 : VitalTimingDataType; VARIABLE Pviol_A03 : X01 := '0'; VARIABLE PD_A03 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_A04 : X01 := '0'; VARIABLE PD_A04 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_A05 : X01 := '0'; VARIABLE PD_A05 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_A06 : X01 := '0'; VARIABLE PD_A06 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_ODT3 : X01 := '0'; VARIABLE PD_ODT3 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_ODT4 : X01 := '0'; VARIABLE PD_ODT4 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_ODT5 : X01 := '0'; VARIABLE PD_ODT5 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_ODT6 : X01 := '0'; VARIABLE PD_ODT6 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_CSNeg3 : X01 := '0'; VARIABLE PD_CSNeg3 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_CSNeg4 : X01 := '0'; VARIABLE PD_CSNeg4 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_CSNeg5 : X01 := '0'; VARIABLE PD_CSNeg5 : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_CSNeg6 : X01 := '0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -