-------------------------------------------------------------------------------- -- File Name: fifo7881.vhd -------------------------------------------------------------------------------- -- Copyright (C) 1998 Free Model Foundation -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License version 2 as -- published by the Free Software Foundation. -- -- MODIFICATION HISTORY: -- -- version: | author: | mod date: | changes made: -- V1.0 R. Munden 98 JUN 11 initial release -- -------------------------------------------------------------------------------- -- PART DESCRIPTION: -- -- Library: FIFO -- Technology: TTL -- Part: ACT7881 -- -- Desciption: 1K x 18 FIFO -------------------------------------------------------------------------------- LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.VITAL_timing.ALL; USE IEEE.VITAL_primitives.ALL; LIBRARY FMF; USE FMF.gen_utils.ALL; USE FMF.conversions.ALL; -------------------------------------------------------------------------------- -- ENTITY DECLARATION -------------------------------------------------------------------------------- ENTITY fifo7881 IS GENERIC ( -- tipd delays: interconnect path delays tipd_D0 : VitalDelayType01 := VitalZeroDelay01; tipd_D1 : VitalDelayType01 := VitalZeroDelay01; tipd_D2 : VitalDelayType01 := VitalZeroDelay01; tipd_D3 : VitalDelayType01 := VitalZeroDelay01; tipd_D4 : VitalDelayType01 := VitalZeroDelay01; tipd_D5 : VitalDelayType01 := VitalZeroDelay01; tipd_D6 : VitalDelayType01 := VitalZeroDelay01; tipd_D7 : VitalDelayType01 := VitalZeroDelay01; tipd_D8 : VitalDelayType01 := VitalZeroDelay01; tipd_D9 : VitalDelayType01 := VitalZeroDelay01; tipd_D10 : VitalDelayType01 := VitalZeroDelay01; tipd_D11 : VitalDelayType01 := VitalZeroDelay01; tipd_D12 : VitalDelayType01 := VitalZeroDelay01; tipd_D13 : VitalDelayType01 := VitalZeroDelay01; tipd_D14 : VitalDelayType01 := VitalZeroDelay01; tipd_D15 : VitalDelayType01 := VitalZeroDelay01; tipd_D16 : VitalDelayType01 := VitalZeroDelay01; tipd_D17 : VitalDelayType01 := VitalZeroDelay01; tipd_RSNeg : VitalDelayType01 := VitalZeroDelay01; tipd_WCLK : VitalDelayType01 := VitalZeroDelay01; tipd_WEN1 : VitalDelayType01 := VitalZeroDelay01; tipd_WEN2 : VitalDelayType01 := VitalZeroDelay01; tipd_RCLK : VitalDelayType01 := VitalZeroDelay01; tipd_REN1 : VitalDelayType01 := VitalZeroDelay01; tipd_REN2 : VitalDelayType01 := VitalZeroDelay01; tipd_OE : VitalDelayType01 := VitalZeroDelay01; tipd_DAFNeg : VitalDelayType01 := VitalZeroDelay01; -- tpd delays: propagation delays tpd_RSNeg_AF : VitalDelayType01:= UnitDelay01; tpd_RSNeg_HF : VitalDelayType01:= UnitDelay01; tpd_RSNeg_Q0 : VitalDelayType01Z:= UnitDelay01Z; tpd_RCLK_Q0 : VitalDelayType01Z:= UnitDelay01Z; tpd_OE_Q0 : VitalDelayType01Z:= UnitDelay01Z; tpd_WCLK_IRF : VitalDelayType01 := UnitDelay01; tpd_RCLK_ORF : VitalDelayType01 := UnitDelay01; tpd_RCLK_AF : VitalDelayType01 := UnitDelay01; tpd_RCLK_HF : VitalDelayType01 := UnitDelay01; -- tpw values: pulse widths tpw_RCLK_posedge : VitalDelayType := UnitDelay; tpw_RCLK_negedge : VitalDelayType := UnitDelay; tpw_WCLK_posedge : VitalDelayType := UnitDelay; tpw_WCLK_negedge : VitalDelayType := UnitDelay; tpw_RSNeg_negedge : VitalDelayType := UnitDelay; tpw_DAFNeg_posedge : VitalDelayType := UnitDelay; -- tperiod min (calculated as 1/max freq) tperiod_RCLK_posedge : VitalDelayType := UnitDelay; -- tsetup values: setup times tsetup_D0_WCLK : VitalDelayType := UnitDelay; tsetup_D0_DAFNeg : VitalDelayType := UnitDelay; tsetup_WEN1_WCLK : VitalDelayType := UnitDelay; tsetup_REN1_RCLK : VitalDelayType := UnitDelay; tsetup_OE_RCLK : VitalDelayType := UnitDelay; tsetup_RSNeg_RCLK : VitalDelayType := UnitDelay; tsetup_DAFNeg_RSNeg : VitalDelayType := UnitDelay; -- thold values: hold times thold_D0_WCLK : VitalDelayType := UnitDelay; thold_D0_DAFNeg : VitalDelayType := UnitDelay; thold_WEN1_WCLK : VitalDelayType := UnitDelay; thold_REN1_RCLK : VitalDelayType := UnitDelay; thold_OE_RCLK : VitalDelayType := UnitDelay; thold_RSNeg_RCLK : VitalDelayType := UnitDelay; thold_DAFNeg_RSNeg : VitalDelayType := UnitDelay; -- generic control parameters InstancePath : STRING := DefaultInstancePath; TimingChecksOn : BOOLEAN := DefaultTimingChecks; MsgOn : BOOLEAN := DefaultMsgOn; XOn : BOOLEAN := DefaultXOn; TimingModel : STRING := DefaultTimingModel ); PORT ( D0 : IN std_logic := 'X'; -- Data Input Bus D1 : IN std_logic := 'X'; D2 : IN std_logic := 'X'; D3 : IN std_logic := 'X'; D4 : IN std_logic := 'X'; D5 : IN std_logic := 'X'; D6 : IN std_logic := 'X'; D7 : IN std_logic := 'X'; D8 : IN std_logic := 'X'; D9 : IN std_logic := 'X'; D10 : IN std_logic := 'X'; D11 : IN std_logic := 'X'; D12 : IN std_logic := 'X'; D13 : IN std_logic := 'X'; D14 : IN std_logic := 'X'; D15 : IN std_logic := 'X'; D16 : IN std_logic := 'X'; D17 : IN std_logic := 'X'; RSNeg : IN std_logic := 'X'; -- Reset WCLK : IN std_logic := 'X'; -- Write Clock WEN1 : IN std_logic := 'X'; -- Write Enable WEN2 : IN std_logic := 'X'; -- Write Enable RCLK : IN std_logic := 'X'; -- Read Clock REN1 : IN std_logic := 'X'; -- Read Enable REN2 : IN std_logic := 'X'; -- Read Enable OE : IN std_logic := 'X'; -- Output Enable DAFNeg : IN std_logic := 'X'; -- Write Expansion Input AF : OUT std_logic := 'U'; -- Programmable Almost Full/Empty Flag HF : OUT std_logic := 'U'; -- Half-Full Flag IRF : OUT std_logic := 'U'; -- Input Ready Flag ORF : OUT std_logic := 'U'; -- Output Ready Flag Q0 : OUT std_logic := 'U'; -- Data Output Bus Q1 : OUT std_logic := 'U'; Q2 : OUT std_logic := 'U'; Q3 : OUT std_logic := 'U'; Q4 : OUT std_logic := 'U'; Q5 : OUT std_logic := 'U'; Q6 : OUT std_logic := 'U'; Q7 : OUT std_logic := 'U'; Q8 : OUT std_logic := 'U'; Q9 : OUT std_logic := 'U'; Q10 : OUT std_logic := 'U'; Q11 : OUT std_logic := 'U'; Q12 : OUT std_logic := 'U'; Q13 : OUT std_logic := 'U'; Q14 : OUT std_logic := 'U'; Q15 : OUT std_logic := 'U'; Q16 : OUT std_logic := 'U'; Q17 : OUT std_logic := 'U' ); ATTRIBUTE VITAL_LEVEL0 OF fifo7881 : ENTITY IS TRUE; END fifo7881; -------------------------------------------------------------------------------- -- ARCHITECTURE DECLARATION -------------------------------------------------------------------------------- ARCHITECTURE vhdl_behavioral OF fifo7881 IS ATTRIBUTE VITAL_LEVEL0 OF vhdl_behavioral : ARCHITECTURE IS TRUE; TYPE statetype IS ARRAY (0 to 3) OF std_ulogic ; TYPE mem_type IS ARRAY (0 to 1023 ) OF std_ulogic_vector(17 downto 0) ; SIGNAL wordcount : INTEGER := 0 ; SIGNAL D0_ipd : std_ulogic := 'X'; SIGNAL D1_ipd : std_ulogic := 'X'; SIGNAL D2_ipd : std_ulogic := 'X'; SIGNAL D3_ipd : std_ulogic := 'X'; SIGNAL D4_ipd : std_ulogic := 'X'; SIGNAL D5_ipd : std_ulogic := 'X'; SIGNAL D6_ipd : std_ulogic := 'X'; SIGNAL D7_ipd : std_ulogic := 'X'; SIGNAL D8_ipd : std_ulogic := 'X'; SIGNAL D9_ipd : std_ulogic := 'X'; SIGNAL D10_ipd : std_ulogic := 'X'; SIGNAL D11_ipd : std_ulogic := 'X'; SIGNAL D12_ipd : std_ulogic := 'X'; SIGNAL D13_ipd : std_ulogic := 'X'; SIGNAL D14_ipd : std_ulogic := 'X'; SIGNAL D15_ipd : std_ulogic := 'X'; SIGNAL D16_ipd : std_ulogic := 'X'; SIGNAL D17_ipd : std_ulogic := 'X'; SIGNAL RSNeg_ipd : std_ulogic := 'X'; SIGNAL WCLK_ipd : std_ulogic := 'X'; SIGNAL WEN1_ipd : std_ulogic := 'X'; SIGNAL WEN2_ipd : std_ulogic := 'X'; SIGNAL RCLK_ipd : std_ulogic := 'X'; SIGNAL REN1_ipd : std_ulogic := 'X'; SIGNAL REN2_ipd : std_ulogic := 'X'; SIGNAL OE_ipd : std_ulogic := 'X'; SIGNAL DAFNeg_ipd : std_ulogic := 'X'; SIGNAL Qout : std_ulogic_vector(17 downto 0) := (others => 'X'); BEGIN ---------------------------------------------------------------------------- -- Wire Delays ---------------------------------------------------------------------------- WireDelay : BLOCK BEGIN w_1: VitalWireDelay (D0_ipd, D0, tipd_D0); w_2: VitalWireDelay (D1_ipd, D1, tipd_D1); w_3: VitalWireDelay (D2_ipd, D2, tipd_D2); w_4: VitalWireDelay (D3_ipd, D3, tipd_D3); w_5: VitalWireDelay (D4_ipd, D4, tipd_D4); w_6: VitalWireDelay (D5_ipd, D5, tipd_D5); w_7: VitalWireDelay (D6_ipd, D6, tipd_D6); w_8: VitalWireDelay (D7_ipd, D7, tipd_D7); w_9: VitalWireDelay (D8_ipd, D8, tipd_D8); w_10: VitalWireDelay (D9_ipd, D9, tipd_D9); w_11: VitalWireDelay (D10_ipd, D10, tipd_D10); w_12: VitalWireDelay (D11_ipd, D11, tipd_D11); w_13: VitalWireDelay (D12_ipd, D12, tipd_D12); w_14: VitalWireDelay (D13_ipd, D13, tipd_D13); w_15: VitalWireDelay (D14_ipd, D14, tipd_D14); w_16: VitalWireDelay (D15_ipd, D15, tipd_D15); w_17: VitalWireDelay (D16_ipd, D16, tipd_D16); w_18: VitalWireDelay (D17_ipd, D17, tipd_D17); w_19: VitalWireDelay (RSNeg_ipd, RSNeg, tipd_RSNeg); w_20: VitalWireDelay (WCLK_ipd, WCLK, tipd_WCLK); w_21: VitalWireDelay (WEN1_ipd, WEN1, tipd_WEN1); w_22: VitalWireDelay (WEN2_ipd, WEN2, tipd_WEN2); w_23: VitalWireDelay (RCLK_ipd, RCLK, tipd_RCLK); w_24: VitalWireDelay (REN1_ipd, REN1, tipd_REN1); w_25: VitalWireDelay (REN2_ipd, REN2, tipd_REN2); w_26: VitalWireDelay (OE_ipd, OE, tipd_OE); w_27: VitalWireDelay (DAFNeg_ipd, DAFNeg, tipd_DAFNeg); END BLOCK; ---------------------------------------------------------------------------- -- VITALBehavior Process ---------------------------------------------------------------------------- VITALBehavior1 : PROCESS(RSNeg_ipd, WCLK_ipd, RCLK_ipd, OE_ipd, REN1_ipd, REN2_ipd, WEN1_ipd, WEN2_ipd, DAFNeg_ipd) VARIABLE flagstate : statetype := "0000" ; VARIABLE wordcounter : INTEGER := 0 ; VARIABLE ae_offset : NATURAL := 0 ; VARIABLE af_offset : NATURAL := 0 ; VARIABLE d : std_logic_vector(17 downto 0) ; VARIABLE d_temp : std_logic_vector(17 downto 0) ; VARIABLE wrtclkcount : INTEGER := 0 ; VARIABLE rdclkcount : INTEGER := 0 ; VARIABLE i : INTEGER := 17 ; VARIABLE rst : INTEGER := 2 ; VARIABLE memory : mem_type ; VARIABLE waddr : INTEGER := 0 ; VARIABLE raddr : INTEGER := 0 ; VARIABLE irflag : INTEGER := 2 ; VARIABLE orflag : INTEGER := 2 ; VARIABLE hf_limit : INTEGER := 0 ; VARIABLE f_limit : INTEGER := 0 ; VARIABLE ae_limit : INTEGER := 0 ; VARIABLE af_limit : INTEGER := 0 ; -- Timing Check Variables VARIABLE Tviol_D0_WCLK : X01 := '0'; VARIABLE TD_D0_WCLK : VitalTimingDataType; VARIABLE Tviol_D1_WCLK : X01 := '0'; VARIABLE TD_D1_WCLK : VitalTimingDataType; VARIABLE Tviol_D2_WCLK : X01 := '0'; VARIABLE TD_D2_WCLK : VitalTimingDataType; VARIABLE Tviol_D3_WCLK : X01 := '0'; VARIABLE TD_D3_WCLK : VitalTimingDataType; VARIABLE Tviol_D4_WCLK : X01 := '0'; VARIABLE TD_D4_WCLK : VitalTimingDataType; VARIABLE Tviol_D5_WCLK : X01 := '0'; VARIABLE TD_D5_WCLK : VitalTimingDataType; VARIABLE Tviol_D6_WCLK : X01 := '0'; VARIABLE TD_D6_WCLK : VitalTimingDataType; VARIABLE Tviol_D7_WCLK : X01 := '0'; VARIABLE TD_D7_WCLK : VitalTimingDataType; VARIABLE Tviol_D8_WCLK : X01 := '0'; VARIABLE TD_D8_WCLK : VitalTimingDataType; VARIABLE Tviol_D9_WCLK : X01 := '0'; VARIABLE TD_D9_WCLK : VitalTimingDataType; VARIABLE Tviol_D10_WCLK : X01 := '0'; VARIABLE TD_D10_WCLK : VitalTimingDataType; VARIABLE Tviol_D11_WCLK : X01 := '0'; VARIABLE TD_D11_WCLK : VitalTimingDataType; VARIABLE Tviol_D12_WCLK : X01 := '0'; VARIABLE TD_D12_WCLK : VitalTimingDataType; VARIABLE Tviol_D13_WCLK : X01 := '0'; VARIABLE TD_D13_WCLK : VitalTimingDataType; VARIABLE Tviol_D14_WCLK : X01 := '0'; VARIABLE TD_D14_WCLK : VitalTimingDataType; VARIABLE Tviol_D15_WCLK : X01 := '0'; VARIABLE TD_D15_WCLK : VitalTimingDataType; VARIABLE Tviol_D16_WCLK : X01 := '0'; VARIABLE TD_D16_WCLK : VitalTimingDataType; VARIABLE Tviol_D17_WCLK : X01 := '0'; VARIABLE TD_D17_WCLK : VitalTimingDataType; VARIABLE Tviol_D0_DAFNeg: X01 := '0'; VARIABLE TD_D0_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D1_DAFNeg: X01 := '0'; VARIABLE TD_D1_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D2_DAFNeg: X01 := '0'; VARIABLE TD_D2_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D3_DAFNeg: X01 := '0'; VARIABLE TD_D3_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D4_DAFNeg: X01 := '0'; VARIABLE TD_D4_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D5_DAFNeg: X01 := '0'; VARIABLE TD_D5_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D6_DAFNeg: X01 := '0'; VARIABLE TD_D6_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D7_DAFNeg: X01 := '0'; VARIABLE TD_D7_DAFNeg : VitalTimingDataType; VARIABLE Tviol_D8_DAFNeg: X01 := '0'; VARIABLE TD_D8_DAFNeg : VitalTimingDataType; VARIABLE Tviol_WEN1_WCLK : X01 := '0'; VARIABLE TD_WEN1_WCLK : VitalTimingDataType; VARIABLE Tviol_WEN2_WCLK : X01 := '0'; VARIABLE TD_WEN2_WCLK : VitalTimingDataType; VARIABLE Tviol_REN1_RCLK : X01 := '0'; VARIABLE TD_REN1_RCLK : VitalTimingDataType; VARIABLE Tviol_REN2_RCLK : X01 := '0'; VARIABLE TD_REN2_RCLK : VitalTimingDataType; VARIABLE Tviol_OE_RCLK : X01 := '0'; VARIABLE TD_OE_RCLK : VitalTimingDataType; VARIABLE Tviol_RSNeg_RCLK : X01 := '0'; VARIABLE TD_RSNeg_RCLK : VitalTimingDataType; VARIABLE Tviol_RSNeg_WCLK : X01 := '0'; VARIABLE TD_RSNeg_WCLK : VitalTimingDataType; VARIABLE Tviol_DAFNeg_RSNeg: X01 := '0'; VARIABLE TD_DAFNeg_RSNeg : VitalTimingDataType; VARIABLE PD_RCLK : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_RCLK : X01 := '0'; VARIABLE PD_WCLK : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_WCLK : X01 := '0'; VARIABLE PD_DAFNeg : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol_DAFNeg : X01 := '0'; -- Functionality Results Variables VARIABLE ORF_zd : std_ulogic := 'X'; VARIABLE IRF_zd : std_ulogic := 'X'; VARIABLE AF_zd : std_ulogic := 'X'; VARIABLE HF_zd : std_ulogic := 'X'; VARIABLE Q_zd : std_ulogic_vector(17 downto 0) := (others => 'X'); -- Output Glitch Detection Variables VARIABLE ORF_GlitchData : VitalGlitchDataType; VARIABLE IRF_GlitchData : VitalGlitchDataType; VARIABLE AF_GlitchData : VitalGlitchDataType; VARIABLE HF_GlitchData : VitalGlitchDataType; VARIABLE Q_GlitchData : VitalGlitchDataType; BEGIN ------------------------------------------------------------------------ -- Timing Check Section ------------------------------------------------------------------------ IF (TimingChecksOn) THEN VitalSetupHoldCheck ( TestSignal => D0_ipd, TestSignalName => "D0_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D0_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D0_WCLK ); VitalSetupHoldCheck ( TestSignal => D1_ipd, TestSignalName => "D1_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D1_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D1_WCLK ); VitalSetupHoldCheck ( TestSignal => D2_ipd, TestSignalName => "D2_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D2_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D2_WCLK ); VitalSetupHoldCheck ( TestSignal => D3_ipd, TestSignalName => "D3_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D3_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D3_WCLK ); VitalSetupHoldCheck ( TestSignal => D4_ipd, TestSignalName => "D4_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D4_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D4_WCLK ); VitalSetupHoldCheck ( TestSignal => D5_ipd, TestSignalName => "D5_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D5_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D5_WCLK ); VitalSetupHoldCheck ( TestSignal => D6_ipd, TestSignalName => "D6_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D6_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D6_WCLK ); VitalSetupHoldCheck ( TestSignal => D7_ipd, TestSignalName => "D7_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D7_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D7_WCLK ); VitalSetupHoldCheck ( TestSignal => D8_ipd, TestSignalName => "D8_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D8_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D8_WCLK ); VitalSetupHoldCheck ( TestSignal => D9_ipd, TestSignalName => "D9_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D9_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D9_WCLK ); VitalSetupHoldCheck ( TestSignal => D10_ipd, TestSignalName => "D10_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D10_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D10_WCLK ); VitalSetupHoldCheck ( TestSignal => D11_ipd, TestSignalName => "D11_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D11_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D11_WCLK ); VitalSetupHoldCheck ( TestSignal => D12_ipd, TestSignalName => "D12_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D12_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D12_WCLK ); VitalSetupHoldCheck ( TestSignal => D13_ipd, TestSignalName => "D13_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D13_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D13_WCLK ); VitalSetupHoldCheck ( TestSignal => D14_ipd, TestSignalName => "D14_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D14_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D14_WCLK ); VitalSetupHoldCheck ( TestSignal => D15_ipd, TestSignalName => "D15_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D15_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D15_WCLK ); VitalSetupHoldCheck ( TestSignal => D16_ipd, TestSignalName => "D16_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D16_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D16_WCLK ); VitalSetupHoldCheck ( TestSignal => D17_ipd, TestSignalName => "D17_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_D0_WCLK, SetupLow => tsetup_D0_WCLK, HoldHigh => thold_D0_WCLK, HoldLow => thold_D0_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D17_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D17_WCLK ); VitalSetupHoldCheck ( TestSignal => D0_ipd, TestSignalName => "D0_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D0_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D0_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D1_ipd, TestSignalName => "D1_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D1_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D1_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D2_ipd, TestSignalName => "D2_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D2_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D2_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D3_ipd, TestSignalName => "D3_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D3_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D3_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D4_ipd, TestSignalName => "D4_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D4_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D4_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D5_ipd, TestSignalName => "D5_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D5_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D5_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D6_ipd, TestSignalName => "D6_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D6_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D6_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D7_ipd, TestSignalName => "D7_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D7_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D7_DAFNeg ); VitalSetupHoldCheck ( TestSignal => D8_ipd, TestSignalName => "D8_ipd", RefSignal => DAFNeg_ipd, RefSignalName => "DAFNeg_ipd", SetupHigh => tsetup_D0_DAFNeg, SetupLow => tsetup_D0_DAFNeg, HoldHigh => thold_D0_DAFNeg, HoldLow => thold_D0_DAFNeg, CheckEnabled => TRUE, RefTransition => '\', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_D8_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D8_DAFNeg ); VitalSetupHoldCheck ( TestSignal => WEN1_ipd, TestSignalName => "WEN1_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_WEN1_WCLK, HoldHigh => thold_WEN1_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_WEN1_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_WEN1_WCLK ); VitalSetupHoldCheck ( TestSignal => WEN2_ipd, TestSignalName => "WEN2_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK_ipd", SetupHigh => tsetup_WEN1_WCLK, HoldHigh => thold_WEN1_WCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_WEN2_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_WEN2_WCLK ); VitalSetupHoldCheck ( TestSignal => REN1_ipd, TestSignalName => "REN1_ipd", RefSignal => RCLK_ipd, RefSignalName => "RCLK", SetupHigh => tsetup_REN1_RCLK, HoldHigh => thold_REN1_RCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_REN1_RCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_REN1_RCLK ); VitalSetupHoldCheck ( TestSignal => REN2_ipd, TestSignalName => "REN2_ipd", RefSignal => RCLK_ipd, RefSignalName => "RCLK", SetupHigh => tsetup_REN1_RCLK, HoldHigh => thold_REN1_RCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_REN2_RCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_REN2_RCLK ); VitalSetupHoldCheck ( TestSignal => OE_ipd, TestSignalName => "OE_ipd", RefSignal => RCLK_ipd, RefSignalName => "RCLK", SetupHigh => tsetup_OE_RCLK, HoldHigh => thold_OE_RCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_OE_RCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_OE_RCLK ); VitalSetupHoldCheck ( TestSignal => RSNeg_ipd, TestSignalName => "RSNeg_ipd", RefSignal => RCLK_ipd, RefSignalName => "RCLK", SetupLow => tsetup_RSNeg_RCLK, HoldLow => thold_RSNeg_RCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_RSNeg_RCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_RSNeg_RCLK ); VitalSetupHoldCheck ( TestSignal => RSNeg_ipd, TestSignalName => "RSNeg_ipd", RefSignal => WCLK_ipd, RefSignalName => "WCLK", SetupLow => tsetup_RSNeg_RCLK, HoldLow => thold_RSNeg_RCLK, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_RSNeg_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_RSNeg_WCLK ); VitalSetupHoldCheck ( TestSignal => DAFNeg_ipd, TestSignalName => "DAFNeg_ipd", RefSignal => RSNeg_ipd, RefSignalName => "RSNeg", SetupLow => tsetup_DAFNeg_RSNeg, SetupHigh => tsetup_DAFNeg_RSNeg, HoldLow => thold_DAFNeg_RSNeg, HoldHigh => thold_DAFNeg_RSNeg, CheckEnabled => TRUE, RefTransition => '/', HeaderMsg => InstancePath & "/fifo7881", TimingData => TD_DAFNeg_RSNeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_DAFNeg_RSNeg ); VitalPeriodPulseCheck ( TestSignal => WCLK_ipd, TestSignalName => "WCLK_ipd", Period => tperiod_RCLK_posedge, PulseWidthHigh => tpw_WCLK_posedge, PulseWidthLow => tpw_WCLK_negedge, PeriodData => PD_WCLK, XOn => XOn, MsgOn => MsgOn, Violation => Pviol_WCLK, HeaderMsg => InstancePath & "/fifo7881", CheckEnabled => TRUE ); VitalPeriodPulseCheck ( TestSignal => RCLK_ipd, TestSignalName => "RCLK_ipd", Period => tperiod_RCLK_posedge, PulseWidthHigh => tpw_RCLK_posedge, PulseWidthLow => tpw_RCLK_negedge, PeriodData => PD_RCLK, XOn => XOn, MsgOn => MsgOn, Violation => Pviol_RCLK, HeaderMsg => InstancePath & "/fifo7881", CheckEnabled => TRUE ); VitalPeriodPulseCheck ( TestSignal => DAFNeg_ipd, TestSignalName => "DAFNeg_ipd", PulseWidthHigh => tpw_DAFNeg_posedge, PeriodData => PD_DAFNeg, XOn => XOn, MsgOn => MsgOn, Violation => Pviol_DAFNeg, HeaderMsg => InstancePath & "/fifo7881", CheckEnabled => TRUE ); END IF; -- Timing Check Section d := (D17_ipd, D16_ipd, D15_ipd, D14_ipd, D13_ipd, D12_ipd, D11_ipd, D10_ipd, D9_ipd, D8_ipd, D7_ipd, D6_ipd, D5_ipd, D4_ipd, D3_ipd, D2_ipd, D1_ipd, D0_ipd); d := To_X01(d); ---------------------------------------------------------------------------- -- Define the AE and AF offset values ---------------------------------------------------------------------------- IF ((DAFNeg_ipd'EVENT) AND (To_X01(DAFNeg_ipd) = '0')) THEN FOR i IN 17 DOWNTO 9 LOOP d_temp(i) := '0' ; END LOOP ; ae_offset := to_nat(d_temp) ; af_offset := to_nat(d_temp) ; END IF ; ---------------------------------------------------------------------------- -- Program the AE and AF offsets to the default value of X = 256 ---------------------------------------------------------------------------- IF ((RSNeg_ipd'EVENT) AND (To_X01(RSNeg_ipd) = '1') AND (To_X01(DAFNeg_ipd) = '1') AND (rst = 1)) THEN ae_offset := 256 ; af_offset := 256 ; END IF ; ---------------------------------------------------------------------------- -- Reset FIFO ---------------------------------------------------------------------------- IF ((RSNeg_ipd'EVENT) AND (To_X01(RSNeg_ipd) = '0')) THEN flagstate := "X10X" ; wordcounter := 0 ; waddr := 0 ; raddr := 0 ; rst := 1 ; rdclkcount := 0 ; wrtclkcount := 0 ; orflag := 0 ; irflag := 0 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; wordcount <= wordcounter ; END IF ; IF ((To_X01(RSNeg_ipd) = '0') AND (RCLK_ipd'EVENT) AND (To_X01(RCLK_ipd) = '1') AND (rst = 1)) THEN rdclkcount := rdclkcount + 1 ; d_temp := TO_X01(d) ; CASE rdclkcount IS WHEN 1 => NULL ; WHEN 2 => NULL ; WHEN 3 => flagstate := "0100" ; ORF_zd := flagstate(0) ; WHEN 4 => NULL ; WHEN OTHERS => NULL ; END CASE ; END IF ; IF ((To_X01(RSNeg_ipd) = '0') AND (WCLK_ipd'EVENT) AND (To_X01(WCLK_ipd) = '1') AND (rst = 1)) THEN wrtclkcount := wrtclkcount + 1 ; d_temp := TO_X01(d) ; CASE wrtclkcount IS WHEN 1 => NULL ; WHEN 2 => flagstate := "X100" ; IRF_zd := flagstate(3) ; WHEN 3 => NULL ; WHEN 4 => NULL ; WHEN OTHERS => NULL ; END CASE ; END IF ; ------------------------------------------------------------------------ -- Program the values for the AE and AF flags ------------------------------------------------------------------------ IF ((RSNeg_ipd'EVENT) AND (To_X01(RSNeg_ipd) = '1') AND (rst = 1) AND (wrtclkcount >= 4) AND (rdclkcount >= 4)) THEN ae_limit := ae_offset ; af_limit := 1024 - af_offset ; rst := 0 ; wrtclkcount := 0 ; rdclkcount := 0 ; END IF ; ------------------------------------------------------------------------ -- Set q to high impedance ------------------------------------------------------------------------ IF (To_X01(OE_ipd) = '0') THEN Q_zd := "ZZZZZZZZZZZZZZZZZZ" ; ELSIF ((OE_ipd'EVENT) AND (To_X01(OE_ipd) = '1') AND (raddr = 1)) THEN Q_zd := memory(0) ; ELSIF ((OE_ipd'EVENT) AND (To_X01(OE_ipd) = '1') AND (raddr > 1)) THEN Q_zd := memory(raddr - 1) ; END IF ; ------------------------------------------------------------------------ -- Set O_R high on third rdclk after first word has been written -- into empty memory ------------------------------------------------------------------------ IF ((RCLK_ipd'EVENT) AND (To_X01(RCLK_ipd) = '1') AND (To_X01(RSNeg_ipd) = '1') AND (orflag = 0) AND (rst = 0) AND (wordcounter >= 1)) THEN rdclkcount := rdclkcount + 1 ; d_temp := TO_X01(d) ; CASE rdclkcount IS WHEN 1 => NULL ; WHEN 2 => NULL ; WHEN 3 => IF (flagstate = "0101") THEN flagstate := "1101" ; ORF_zd := flagstate(0) ; orflag := 1 ; rdclkcount := 0 ; IF (To_X01(OE_ipd) /= '0') THEN Q_zd := memory(0) ; END IF ; raddr := raddr + 1 ; wordcounter := wordcounter - 1 ; wordcount <= wordcounter ; ELSE flagstate(0) := '1' ; ORF_zd := flagstate(0) ; orflag := 1 ; rdclkcount := 0 ; IF (To_X01(OE_ipd) /= '0') THEN Q_zd := memory(0) ; END IF ; raddr := raddr + 1 ; wordcounter := wordcounter - 1 ; wordcount <= wordcounter ; END IF ; WHEN OTHERS => NULL ; END CASE ; END IF ; ------------------------------------------------------------------------ -- Set IR high on 2nd wrtclk after the 1st valid read when the fifo -- is full ------------------------------------------------------------------------ IF ((WCLK_ipd'EVENT) AND (To_X01(WCLK_ipd) = '1') AND (To_X01(RSNeg_ipd) = '1') AND (irflag = 0) AND (wordcounter > 2) AND (wordcounter <= 1023 ) AND (To_X01(REN1_ipd) = '1') AND ( To_X01(REN2_ipd) = '1')) THEN wrtclkcount := wrtclkcount + 1 ; d_temp := TO_X01(d) ; CASE wrtclkcount IS WHEN 1 => NULL ; WHEN 2 => flagstate := "1111" ; IRF_zd := flagstate(3) ; irflag := 1 ; wrtclkcount := 0 ; WHEN OTHERS => NULL ; END CASE ; END IF ; ------------------------------------------------------------------------ -- Data writes to the FIFO ------------------------------------------------------------------------ IF ((WCLK_ipd'EVENT) AND (To_X01(WCLK_ipd) = '1') AND (To_X01(RSNeg_ipd) = '1') AND (To_X01(WEN1_ipd) = '1') AND (To_X01(WEN2_ipd) = '1')) THEN IF (irflag = 1) THEN IF (waddr < 1024) THEN memory(waddr) := To_StdULogicVector(d) ; wordcounter := wordcounter + 1; wordcount <= wordcounter ; waddr := waddr + 1 ; ELSIF (waddr = 1024) THEN waddr := 0 ; memory(waddr) := To_StdULogicVector(d) ; wordcounter := wordcounter + 1 ; wordcount <= wordcounter ; END IF ; END IF ; END IF ; ------------------------------------------------------------------------ -- Data reads from the FIFO ------------------------------------------------------------------------ IF ((RCLK_ipd'EVENT) AND (To_X01(RCLK_ipd) = '1') AND (To_X01(RSNeg_ipd) = '1') AND (To_X01(REN1_ipd) = '1') AND (To_X01(REN2_ipd) = '1') AND (rst = 0)) THEN IF (orflag = 1) AND (wordcount = 0) THEN CASE flagstate IS WHEN "1101" => IF (wordcounter = 0) THEN flagstate := "0101" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN OTHERS => NULL ; END CASE ; ELSIF (orflag = 1) AND (wordcount /= 0) AND (raddr /= 0) THEN IF (raddr < 1024) THEN wordcounter := wordcounter - 1 ; wordcount <= wordcounter ; IF (To_X01(OE_ipd) /= '0') THEN Q_zd := memory(raddr) ; END IF ; raddr := raddr + 1 ; ELSIF (raddr = 1024) THEN raddr := 0 ; wordcounter := wordcounter - 1 ; wordcount <= wordcounter ; IF (To_X01(OE_ipd) /= '0') THEN Q_zd := memory(raddr) ; END IF ; END IF ; END IF ; END IF ; ------------------------------------------------------------------------ -- Set IR high after reset ------------------------------------------------------------------------ IF ((WCLK_ipd'EVENT) AND (To_X01(WCLK_ipd) = '1') AND (To_X01(RSNeg_ipd) = '1') AND (wordcounter = 0) AND (rst = 0) AND (irflag = 0)) THEN wrtclkcount := wrtclkcount + 1 ; d_temp := TO_X01(d) ; CASE wrtclkcount IS WHEN 1 => NULL ; WHEN 2 => flagstate := "0101" ; IRF_zd := flagstate(3) ; irflag := 1 ; wrtclkcount := 0 ; WHEN OTHERS => NULL ; END CASE ; END IF ; ------------------------------------------------------------------------ -- Determine the status of the FIFO and assign the flag pins ------------------------------------------------------------------------ ae_limit := ae_offset ; af_limit := 1024 - af_offset ; hf_limit := 512 ; f_limit := 1024 ; IF not Is_X(d) THEN CASE flagstate IS WHEN "X10X" => NULL ; WHEN "X100" => NULL ; WHEN "0100" => NULL ; WHEN "0101" => IF ((wordcounter > ae_limit) AND (wordcounter < hf_limit)) THEN flagstate := "0001" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "0001" => IF ((wordcounter > 0) AND (wordcounter <= ae_limit)) THEN flagstate := "0101" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF ((wordcounter >= hf_limit) AND (wordcounter < af_limit)) THEN flagstate := "0011" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "0011" => IF ((wordcounter > ae_limit) AND (wordcounter < hf_limit)) THEN flagstate := "0001" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF ((wordcounter >= af_limit) AND (wordcounter < f_limit )) THEN flagstate := "0111" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "0111" => IF ((wordcounter >= hf_limit) AND (wordcounter < af_limit)) THEN flagstate := "0011" ; orflag := 0 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF (wordcounter = f_limit ) THEN flagstate := "0110" ; orflag := 0 ; irflag := 0 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "0110" => NULL ; WHEN "1101" => -- IF (wordcounter = 0) THEN -- flagstate := "0101" ; -- orflag := 0 ; -- irflag := 1 ; -- ORF_zd := flagstate(0) ; -- AF_zd := flagstate(1) ; -- HF_zd := flagstate(2) ; -- IRF_zd := flagstate(3) ; -- END IF ; IF ((wordcounter > ae_limit) AND (wordcounter < hf_limit)) THEN flagstate := "1001" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "1001" => IF ((wordcounter > 0) AND (wordcounter <= ae_limit)) THEN flagstate := "1101" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF ((wordcounter >= hf_limit) AND (wordcounter < af_limit)) THEN flagstate := "1011" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "1011" => IF ((wordcounter > ae_limit) AND (wordcounter < hf_limit)) THEN flagstate := "1001" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF ((wordcounter >= af_limit) AND (wordcounter < f_limit )) THEN flagstate := "1111" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "1111" => IF ((wordcounter >= hf_limit) AND (wordcounter < af_limit)) THEN flagstate := "1011" ; orflag := 1 ; irflag := 1 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; IF (wordcounter = f_limit ) THEN flagstate := "1110" ; orflag := 1 ; irflag := 0 ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END IF ; WHEN "1110" => NULL ; WHEN OTHERS => flagstate := "XXXX" ; ORF_zd := flagstate(0) ; AF_zd := flagstate(1) ; HF_zd := flagstate(2) ; IRF_zd := flagstate(3) ; END CASE ; END IF ; ------------------------------------------------------------------------ -- Path Delay Section ------------------------------------------------------------------------ VitalPathDelay01 ( OutSignal => ORF, OutSignalName => "ORF", OutTemp => ORF_zd, XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => RSNeg_ipd'LAST_EVENT, PathDelay => (0 ns, 0 ns), PathCondition => (RSNeg_ipd = '0') ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_ORF, PathCondition => TRUE ) ), GlitchData => ORF_GlitchData ); VitalPathDelay01 ( OutSignal => IRF, OutSignalName => "IRF", OutTemp => IRF_zd, XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => RSNeg_ipd'LAST_EVENT, PathDelay => (0 ns, 0 ns), PathCondition => (RSNeg_ipd = '0') ), 1 => (InputChangeTime => WCLK_ipd'LAST_EVENT, PathDelay => tpd_WCLK_IRF, PathCondition => TRUE ) ), GlitchData => IRF_GlitchData ); VitalPathDelay01 ( OutSignal => AF, OutSignalName => "AF", OutTemp => AF_zd, XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => RSNeg_ipd'LAST_EVENT, PathDelay => tpd_RSNeg_AF, PathCondition => (RSNeg_ipd = '0') ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_AF, PathCondition => TRUE ) ), GlitchData => AF_GlitchData ); VitalPathDelay01 ( OutSignal => HF, OutSignalName => "HF", OutTemp => HF_zd, XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => RSNeg_ipd'LAST_EVENT, PathDelay => tpd_RSNeg_HF, PathCondition => (RSNeg_ipd = '0') ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_HF, PathCondition => TRUE ) ), GlitchData => HF_GlitchData ); VitalPathDelay01Z ( OutSignal => Q17, OutSignalName => "Q17", OutTemp => Q_zd(17), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q16, OutSignalName => "Q16", OutTemp => Q_zd(16), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q15, OutSignalName => "Q15", OutTemp => Q_zd(15), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q14, OutSignalName => "Q14", OutTemp => Q_zd(14), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q13, OutSignalName => "Q13", OutTemp => Q_zd(13), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q12, OutSignalName => "Q12", OutTemp => Q_zd(12), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q11, OutSignalName => "Q11", OutTemp => Q_zd(11), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q10, OutSignalName => "Q10", OutTemp => Q_zd(10), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q9, OutSignalName => "Q9", OutTemp => Q_zd(9), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q8, OutSignalName => "Q8", OutTemp => Q_zd(8), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q7, OutSignalName => "Q7", OutTemp => Q_zd(7), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q6, OutSignalName => "Q6", OutTemp => Q_zd(6), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q5, OutSignalName => "Q5", OutTemp => Q_zd(5), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q4, OutSignalName => "Q4", OutTemp => Q_zd(4), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q3, OutSignalName => "Q3", OutTemp => Q_zd(3), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q2, OutSignalName => "Q2", OutTemp => Q_zd(2), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q1, OutSignalName => "Q1", OutTemp => Q_zd(1), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); VitalPathDelay01Z ( OutSignal => Q0, OutSignalName => "Q0", OutTemp => Q_zd(0), XOn => XOn, MsgOn => MsgOn, Paths => ( 0 => (InputChangeTime => OE_ipd'LAST_EVENT, PathDelay => tpd_OE_Q0, PathCondition => TRUE ), 1 => (InputChangeTime => RCLK_ipd'LAST_EVENT, PathDelay => tpd_RCLK_Q0, PathCondition => TRUE ) ), GlitchData => Q_GlitchData ); END PROCESS; END vhdl_behavioral;