apexii_atoms.vhd
来自「一个非常好的dc使用书籍 一个非常好的dc使用书籍」· VHDL 代码 · 共 1,593 行 · 第 1/5 页
VHD
1,593 行
LIBRARY IEEE, apexii;
use IEEE.std_logic_1164.all;
use IEEE.VITAL_Timing.all;
use IEEE.VITAL_Primitives.all;
use apexii.atom_pack.all;
ENTITY apexii_lcell is
GENERIC (
operation_mode : string := "normal";
output_mode : string := "comb_and_reg";
packed_mode : string := "false";
lut_mask : string := "ffff";
power_up : string := "low";
cin_used : string := "false";
lpm_type : string := "apexii_lcell"
);
PORT (clk : in std_logic;
dataa : in std_logic := '1';
datab : in std_logic := '1';
datac : in std_logic := '1';
datad : in std_logic := '1';
aclr : in std_logic := '0';
sclr : in std_logic := '0';
sload : in std_logic := '0';
ena : in std_logic := '1';
cin : in std_logic := '0';
cascin : in std_logic := '1';
devclrn : in std_logic := '1';
devpor : in std_logic := '1';
combout : out std_logic;
regout : out std_logic;
cout : out std_logic;
cascout : out std_logic);
end apexii_lcell;
ARCHITECTURE vital_le_atom of apexii_lcell is
signal dffin : std_logic;
signal qfbk : std_logic;
component apexii_asynch_lcell
GENERIC (operation_mode : string := "normal";
output_mode : string := "comb_and_reg";
lut_mask : string := "ffff";
power_up : string := "low";
cin_used : string := "false";
TimingChecksOn: Boolean := True;
MsgOn: Boolean := DefGlitchMsgOn;
XOn: Boolean := DefGlitchXOn;
MsgOnChecks: Boolean := DefMsgOnChecks;
XOnChecks: Boolean := DefXOnChecks;
InstancePath: STRING := "*";
tpd_dataa_combout : VitalDelayType01 := DefPropDelay01;
tpd_datab_combout : VitalDelayType01 := DefPropDelay01;
tpd_datac_combout : VitalDelayType01 := DefPropDelay01;
tpd_datad_combout : VitalDelayType01 := DefPropDelay01;
tpd_qfbkin_combout : VitalDelayType01 := DefPropDelay01;
tpd_cin_combout : VitalDelayType01 := DefPropDelay01;
tpd_cascin_combout : VitalDelayType01 := DefPropDelay01;
tpd_dataa_regin : VitalDelayType01 := DefPropDelay01;
tpd_datab_regin : VitalDelayType01 := DefPropDelay01;
tpd_datac_regin : VitalDelayType01 := DefPropDelay01;
tpd_datad_regin : VitalDelayType01 := DefPropDelay01;
tpd_qfbkin_regin : VitalDelayType01 := DefPropDelay01;
tpd_cin_regin : VitalDelayType01 := DefPropDelay01;
tpd_cascin_regin : VitalDelayType01 := DefPropDelay01;
tpd_dataa_cout : VitalDelayType01 := DefPropDelay01;
tpd_datab_cout : VitalDelayType01 := DefPropDelay01;
tpd_datac_cout : VitalDelayType01 := DefPropDelay01;
tpd_datad_cout : VitalDelayType01 := DefPropDelay01;
tpd_qfbkin_cout : VitalDelayType01 := DefPropDelay01;
tpd_cin_cout : VitalDelayType01 := DefPropDelay01;
tpd_cascin_cascout : VitalDelayType01 := DefPropDelay01;
tpd_cin_cascout : VitalDelayType01 := DefPropDelay01;
tpd_dataa_cascout : VitalDelayType01 := DefPropDelay01;
tpd_datab_cascout : VitalDelayType01 := DefPropDelay01;
tpd_datac_cascout : VitalDelayType01 := DefPropDelay01;
tpd_datad_cascout : VitalDelayType01 := DefPropDelay01;
tpd_qfbkin_cascout : VitalDelayType01 := DefPropDelay01;
tipd_dataa : VitalDelayType01 := DefPropDelay01;
tipd_datab : VitalDelayType01 := DefPropDelay01;
tipd_datac : VitalDelayType01 := DefPropDelay01;
tipd_datad : VitalDelayType01 := DefPropDelay01;
tipd_cin : VitalDelayType01 := DefPropDelay01;
tipd_cascin : VitalDelayType01 := DefPropDelay01);
PORT (
dataa : in std_logic := '1';
datab : in std_logic := '1';
datac : in std_logic := '1';
datad : in std_logic := '1';
cin : in std_logic := '0';
cascin : in std_logic := '1';
qfbkin : in std_logic := '0';
combout : out std_logic;
cout : out std_logic;
cascout : out std_logic;
regin : out std_logic);
end component;
component apexii_lcell_register
GENERIC (
power_up : string := "low";
packed_mode : string := "false";
TimingChecksOn: Boolean := True;
MsgOn: Boolean := DefGlitchMsgOn;
XOn: Boolean := DefGlitchXOn;
MsgOnChecks: Boolean := DefMsgOnChecks;
XOnChecks: Boolean := DefXOnChecks;
InstancePath: STRING := "*";
tsetup_datain_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tsetup_datac_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tsetup_sclr_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tsetup_sload_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tsetup_ena_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_datain_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_datac_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_sclr_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_sload_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_ena_clk_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tpd_clk_regout_posedge : VitalDelayType01 := DefPropDelay01;
tpd_aclr_regout_posedge : VitalDelayType01 := DefPropDelay01;
tpd_clk_qfbko_posedge : VitalDelayType01 := DefPropDelay01;
tpd_aclr_qfbko_posedge : VitalDelayType01 := DefPropDelay01;
tperiod_clk_posedge : VitalDelayType := DefPulseWdthCnst;
tipd_datac : VitalDelayType01 := DefPropDelay01;
tipd_ena : VitalDelayType01 := DefPropDelay01;
tipd_aclr : VitalDelayType01 := DefPropDelay01;
tipd_sclr : VitalDelayType01 := DefPropDelay01;
tipd_sload : VitalDelayType01 := DefPropDelay01;
tipd_clk : VitalDelayType01 := DefPropDelay01);
PORT (clk : in std_logic;
datain : in std_logic := '1';
datac : in std_logic := '1';
aclr : in std_logic := '0';
sclr : in std_logic := '0';
sload : in std_logic := '0';
ena : in std_logic := '1';
devclrn : in std_logic := '1';
devpor : in std_logic := '1';
regout : out std_logic;
qfbko : out std_logic);
end component;
begin
lecomb: apexii_asynch_lcell
GENERIC map (operation_mode => operation_mode, output_mode => output_mode,
lut_mask => lut_mask, cin_used => cin_used)
port map (dataa => dataa, datab => datab, datac => datac, datad => datad,
cin => cin, cascin => cascin, qfbkin => qfbk,
combout => combout, cout => cout, cascout => cascout, regin => dffin);
lereg: apexii_lcell_register
GENERIC map (power_up => power_up, packed_mode => packed_mode)
port map (clk => clk, datain => dffin, datac => datac,
aclr => aclr, sclr => sclr, sload => sload, ena => ena,
devclrn => devclrn, devpor => devpor, regout => regout,
qfbko => qfbk);
end vital_le_atom;
--
-- LATCH
--
LIBRARY IEEE, apexii;
use ieee.std_logic_1164.all;
use IEEE.VITAL_Primitives.all;
use IEEE.VITAL_Timing.all;
use apexii.atom_pack.all;
ENTITY latch is
GENERIC(
TimingChecksOn: Boolean := True;
XOn: Boolean := DefGlitchXOn;
MsgOn: Boolean := DefGlitchMsgOn;
MsgOnChecks: Boolean := DefMsgOnChecks;
XOnChecks: Boolean := DefXOnChecks;
InstancePath: STRING := "*";
tpd_PRE_Q_negedge : VitalDelayType01 := DefPropDelay01;
tpd_ENA_Q_posedge : VitalDelayType01 := DefPropDelay01;
tpd_D_Q : VitalDelayType01 := DefPropDelay01;
tsetup_D_ENA_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_D_ENA_noedge_negedge : VitalDelayType := DefSetupHoldCnst;
tipd_D : VitalDelayType01 := DefPropDelay01;
tipd_PRE : VitalDelayType01 := DefPropDelay01;
tipd_ENA : VitalDelayType01 := DefPropDelay01);
PORT(
Q : out STD_LOGIC;
D : in STD_LOGIC;
PRE : in STD_LOGIC;
ENA : in STD_LOGIC);
attribute VITAL_LEVEL0 of latch : ENTITY is TRUE;
end latch;
-- ARCHITECTURE body --
ARCHITECTURE behave of latch is
attribute VITAL_LEVEL0 of behave : ARCHITECTURE is TRUE;
signal D_ipd : STD_ULOGIC := 'U';
signal PRE_ipd : std_logic;
signal ENA_ipd : std_logic;
begin
---------------------
-- INPUT PATH DELAYs
---------------------
WireDelay : block
begin
VitalWireDelay (D_ipd, D, tipd_D);
VitalWireDelay (PRE_ipd, PRE, tipd_PRE);
VitalWireDelay (ENA_ipd, ENA, tipd_ENA);
end block;
VITALtiming : process (D_ipd, PRE_ipd, ENA_ipd)
variable Tviol_D_ENA : STD_ULOGIC := '0';
variable TimingData_D_ENA : VitalTimingDataType := VitalTimingDataInit;
variable Q_VitalGlitchData : VitalGlitchDataType;
variable q_out : std_logic := '0';
begin
------------------------
-- Timing Check Section
------------------------
if (TimingChecksOn) then
VitalSetupHoldCheck (
Violation => Tviol_D_ENA,
TimingData => TimingData_D_ENA,
TestSignal => D_ipd,
TestSignalName => "D",
RefSignal => ENA_ipd,
RefSignalName => "ENA",
SetupHigh => tsetup_D_ENA_noedge_posedge,
SetupLow => tsetup_D_ENA_noedge_posedge,
HoldHigh => thold_D_ENA_noedge_negedge,
HoldLow => thold_D_ENA_noedge_negedge,
CheckEnabled => TO_X01( PRE_ipd ) /= '1',
RefTransition => '/',
HeaderMsg => InstancePath & "/LATCH",
XOn => XOnChecks,
MsgOn => MsgOnChecks );
end if;
if (pre_ipd = '0') then
-- latch is being preset, preset is active low
q_out := '1';
elsif (ena_ipd = '1') then
-- latch is transparent
q_out := D_ipd;
end if;
----------------------
-- Path Delay Section
----------------------
VitalPathDelay01 (
OutSignal => Q,
OutSignalName => "Q",
OutTemp => q_out,
Paths => (0 => (PRE_ipd'last_event, tpd_PRE_Q_negedge, TRUE),
1 => (ENA_ipd'last_event, tpd_ENA_Q_posedge, TRUE),
2 => (D_ipd'last_event, tpd_D_Q, (ENA = '1'))),
GlitchData => Q_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
end process;
end behave;
LIBRARY IEEE, apexii;
use IEEE.STD_LOGIC_1164.all;
use IEEE.VITAL_Timing.all;
use IEEE.VITAL_Primitives.all;
use apexii.atom_pack.all;
ENTITY dffe is
GENERIC(
TimingChecksOn: Boolean := True;
XOn: Boolean := DefGlitchXOn;
MsgOn: Boolean := DefGlitchMsgOn;
MsgOnChecks: Boolean := DefMsgOnChecks;
XOnChecks: Boolean := DefXOnChecks;
InstancePath: STRING := "*";
tpd_PRN_Q_negedge : VitalDelayType01 := DefPropDelay01;
tpd_CLRN_Q_negedge : VitalDelayType01 := DefPropDelay01;
tpd_CLK_Q_posedge : VitalDelayType01 := DefPropDelay01;
tpd_ENA_Q_posedge : VitalDelayType01 := DefPropDelay01;
tsetup_D_CLK_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tsetup_D_CLK_noedge_negedge : VitalDelayType := DefSetupHoldCnst;
tsetup_ENA_CLK_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_D_CLK_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
thold_D_CLK_noedge_negedge : VitalDelayType := DefSetupHoldCnst;
thold_ENA_CLK_noedge_posedge : VitalDelayType := DefSetupHoldCnst;
tipd_D : VitalDelayType01 := DefPropDelay01;
tipd_CLRN : VitalDelayType01 := DefPropDelay01;
tipd_PRN : VitalDelayType01 := DefPropDelay01;
tipd_CLK : VitalDelayType01 := DefPropDelay01;
tipd_ENA : VitalDelayType01 := DefPropDelay01);
PORT(
Q : out STD_LOGIC;
D : in STD_LOGIC;
CLRN : in STD_LOGIC;
PRN : in STD_LOGIC;
CLK : in STD_LOGIC;
ENA : in STD_LOGIC);
attribute VITAL_LEVEL0 of dffe : ENTITY is TRUE;
end dffe;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?