-- -- -- DISCLAIMER -- -- This code is the sole property of the Institute for Technology -- Development (ITD), Jackson, Mississippi, and is distributed for -- the purpose of providing examples of VHDL models written to -- modeling standards. This code may not be used for commercial -- purposes, and may not be redistributed without permission from -- the Institute for Technology Development. ITD assumes no -- responsibility for errors, omissions, uses made, or decisions -- based on its use. No warranties, expressed or implied, are given. -- -- ------------------------------------------------------------------ -- FILENAME: SN54S251.tim.vhd -- Description: timing module -- Created by Steve Turner 6/1/90 use WORK.SIMFLAG.all; package SN54S251_TIMING is type eflags is record x_out : boolean; no_time : boolean; end record; type messages is record tl : sim_options; option : time_options; mode : time_modes; end record; type times is record tplh_bs_y : time ; -- binary select to Y tplh_bs_w : time ; -- binary select to W tplh_d_y : time ; -- data to Y tplh_d_w : time ; -- data to W tphl_bs_y : time ; -- binary select to Y tphl_bs_w : time ; -- binary select to W tphl_d_y : time ; -- data to Y tphl_d_w : time ; -- data to W tpzh_g_y : time ; -- enable to high Y tpzh_g_w : time ; -- enable to high W tpzl_g_y : time ; -- enable to low Y tpzl_g_w : time ; -- enable to low W tphz_g_y : time ; -- high to disable Y tphz_g_w : time ; -- high to disable W tplz_g_y : time ; -- low to disable Y tplz_g_w : time ; -- low to disable W end record; type sim_timing is record error_flags : eflags; prop_delays : times; sim_messages : messages; end record; type loads is record tld_y1 : real; tld_w1 : real; end record; FUNCTION get_timing (gen_loads : IN loads; gen_times : IN times) RETURN sim_timing; FUNCTION calc_curve ( X,C3,C2,C1,C0 : IN real ) RETURN real; end SN54S251_TIMING; ---------------------------------------------------------------------- package body SN54S251_TIMING is FUNCTION calc_curve ( X,C3,C2,C1,C0 : IN real ) RETURN real IS VARIABLE o : REAL; BEGIN o := C3*(X)**3 + C2*(X)**2 + C1*(X) + C0; RETURN o; END calc_curve; FUNCTION get_timing (gen_loads : IN loads; gen_times : IN times) RETURN sim_timing IS variable KU : real; variable KVLH,KTLH,deratingLH : real; variable KVHL,KTHL,deratingHL : real; variable mtime : sim_timing; begin -- Check for SIMFLAG options out-of-range if ( Ta < -55.0 or Ta > 125.0 ) then assert FALSE report "Temperature out of range" severity note; assert FALSE report "Check SIMFLAG.vhd file" severity error; elsif ( Vcc < 4.5 or Vcc > 5.5 ) then assert FALSE report "Voltage out of range" severity note; assert FALSE report "Check SIMFLAG.vhd file" severity error; elsif ( DERATE_FACTOR < 0.0 ) then assert FALSE report "Negative DERATE_FACTOR not allowed" severity note; assert FALSE report "Check SIMFLAG.vhd file" severity error; end if; if (FLAG_TYPE = GLOBAL) then -- Calculate derating factors KU := DERATE_FACTOR/100.0; KTLH := calc_curve(Ta,4.739047e-08,3.851426e-06,-1.259047e-04,1.000000e+00); KVLH := calc_curve(Vcc,0.000000,-1.999974e-03,-4.700023e-02,1.285001e+00); KTHL := calc_curve(Ta,-9.020953e-08,2.029714e-05,-1.496762e-03,1.026143e+00); KVHL := calc_curve(Vcc,0.000000,-1.999974e-03,-4.700023e-02,1.285001e+00); deratingLH := KVLH * KTLH * KU; deratingHL := KVHL * KTHL * KU; -- Select flags mtime.sim_messages.tl := SIM_OPTION; mtime.sim_messages.option := TIME_OPTION; mtime.sim_messages.mode := TIME_MODE; else -- Local Flags selected; use "normal" options mtime.sim_messages.tl := FULL_TIM; mtime.sim_messages.option := TYPICAL; mtime.sim_messages.mode := GENERIC_VALUES; end if; -- Set error flags if (mtime.sim_messages.tl = NO_TIM) then mtime.error_flags.x_out := FALSE; mtime.error_flags.no_time := TRUE; elsif (mtime.sim_messages.tl = ONLY_X) then mtime.error_flags.x_out := TRUE; mtime.error_flags.no_time := TRUE; elsif (mtime.sim_messages.tl = ONLY_DISPLAY) then mtime.error_flags.x_out := FALSE; mtime.error_flags.no_time := FALSE; elsif (mtime.sim_messages.tl = FULL_TIM) then mtime.error_flags.x_out := TRUE; mtime.error_flags.no_time := FALSE; end if; -- Select simulation timing delay values case mtime.sim_messages.mode is when GENERIC_VALUES => assert FALSE report "Using generic delay values" severity note ; mtime.prop_delays := gen_times; when TIMING => case mtime.sim_messages.option is when MINIMUM => mtime.prop_delays.tplh_bs_y := 26.100 ns * deratingLH; mtime.prop_delays.tplh_bs_w := 18.000 ns * deratingLH; mtime.prop_delays.tplh_d_y := 15.300 ns * deratingLH; mtime.prop_delays.tplh_d_w := 9.000 ns * deratingLH; mtime.prop_delays.tphl_bs_y := 25.200 ns * deratingHL; mtime.prop_delays.tphl_bs_w := 18.900 ns * deratingHL; mtime.prop_delays.tphl_d_y := 16.200 ns * deratingHL; mtime.prop_delays.tphl_d_w := 8.100 ns * deratingHL; mtime.prop_delays.tpzh_g_y := 15.300 ns * deratingLH; mtime.prop_delays.tpzh_g_w := 15.300 ns * deratingLH; mtime.prop_delays.tpzl_g_y := 23.400 ns * deratingHL; mtime.prop_delays.tpzl_g_w := 21.600 ns * deratingHL; mtime.prop_delays.tphz_g_y := 5.000 ns * deratingHL; mtime.prop_delays.tphz_g_w := 5.000 ns * deratingHL; mtime.prop_delays.tplz_g_y := 8.100 ns * deratingLH; mtime.prop_delays.tplz_g_w := 8.100 ns * deratingLH; when TYPICAL => mtime.prop_delays.tplh_bs_y := 29.000 ns * deratingLH; mtime.prop_delays.tplh_bs_w := 20.000 ns * deratingLH; mtime.prop_delays.tplh_d_y := 17.000 ns * deratingLH; mtime.prop_delays.tplh_d_w := 10.000 ns * deratingLH; mtime.prop_delays.tphl_bs_y := 28.000 ns * deratingHL; mtime.prop_delays.tphl_bs_w := 21.000 ns * deratingHL; mtime.prop_delays.tphl_d_y := 18.000 ns * deratingHL; mtime.prop_delays.tphl_d_w := 9.000 ns * deratingHL; mtime.prop_delays.tpzh_g_y := 17.000 ns * deratingLH; mtime.prop_delays.tpzh_g_w := 17.000 ns * deratingLH; mtime.prop_delays.tpzl_g_y := 26.000 ns * deratingHL; mtime.prop_delays.tpzl_g_w := 24.000 ns * deratingHL; mtime.prop_delays.tphz_g_y := 5.500 ns * deratingHL; mtime.prop_delays.tphz_g_w := 5.500 ns * deratingHL; mtime.prop_delays.tplz_g_y := 9.000 ns * deratingLH; mtime.prop_delays.tplz_g_w := 9.000 ns * deratingLH; when MAXIMUM => mtime.prop_delays.tplh_bs_y := 45.000 ns * deratingLH; mtime.prop_delays.tplh_bs_w := 33.000 ns * deratingLH; mtime.prop_delays.tplh_d_y := 28.000 ns * deratingLH; mtime.prop_delays.tplh_d_w := 15.000 ns * deratingLH; mtime.prop_delays.tphl_bs_y := 45.000 ns * deratingHL; mtime.prop_delays.tphl_bs_w := 33.000 ns * deratingHL; mtime.prop_delays.tphl_d_y := 28.000 ns * deratingHL; mtime.prop_delays.tphl_d_w := 15.000 ns * deratingHL; mtime.prop_delays.tpzh_g_y := 27.000 ns * deratingLH; mtime.prop_delays.tpzh_g_w := 27.000 ns * deratingLH; mtime.prop_delays.tpzl_g_y := 40.000 ns * deratingHL; mtime.prop_delays.tpzl_g_w := 40.000 ns * deratingHL; mtime.prop_delays.tphz_g_y := 8.500 ns * deratingHL; mtime.prop_delays.tphz_g_w := 8.500 ns * deratingHL; mtime.prop_delays.tplz_g_y := 14.000 ns * deratingLH; mtime.prop_delays.tplz_g_w := 14.000 ns * deratingLH; end case; -- TIME_OPTION when ANNOTATED => assert FALSE report "Back annotation not available" severity warning ; assert FALSE report "Using generic delay values" severity note ; mtime.prop_delays := gen_times; end case; -- TIME_MODE RETURN(mtime); end get_timing; end SN54S251_TIMING;