mercury_atoms.vhd
来自「一个非常好的dc使用书籍 一个非常好的dc使用书籍」· VHDL 代码 · 共 1,341 行 · 第 1/5 页
VHD
1,341 行
VitalWireDelay (datad_ipd, datad, tipd_datad);
VitalWireDelay (cin_ipd, cin, tipd_cin);
VitalWireDelay (cin0_ipd, cin0, tipd_cin);
VitalWireDelay (cin1_ipd, cin1, tipd_cin);
VitalWireDelay (multsela_ipd, multsela, tipd_multsela);
VitalWireDelay (multselb_ipd, multselb, tipd_multselb);
VitalWireDelay (multdataa_ipd, multdataa, tipd_multdataa);
VitalWireDelay (multdatab_ipd, multdatab, tipd_multdatab);
end block;
VITALtiming : process(dataa_ipd, datab_ipd, datac_ipd, datad_ipd, cin_ipd, cin0_ipd, cin1_ipd, multsela_ipd, multselb_ipd, multdataa_ipd, multdatab_ipd)
variable combout_VitalGlitchData : VitalGlitchDataType;
variable multout_VitalGlitchData : VitalGlitchDataType;
variable cout_VitalGlitchData : VitalGlitchDataType;
variable cout0_VitalGlitchData : VitalGlitchDataType;
variable cout1_VitalGlitchData : VitalGlitchDataType;
variable regin_VitalGlitchData : VitalGlitchDataType;
variable icomb, icout, icout0, icout1, ilutout: std_logic;
variable idata, setbit : std_logic := '0';
variable tmp_combout, tmp_cout, tmp_cout0, tmp_cout1, tmp_regin, tmp_multout : std_logic;
variable lut_mask_std : std_logic_vector (15 downto 0) := str_to_bin(lut_mask);
begin
if operation_mode = "normal" then
if cin_used = "true" then
if ((cin0_used = "true") or (cin1_used = "true")) then
if (cin_ipd = '0') then
icomb := VitalMUX(data => lut_mask_std,
dselect => (datad_ipd, cin0_ipd, datab_ipd, dataa_ipd));
else
icomb := VitalMUX(data => lut_mask_std,
dselect => (datad_ipd, cin1_ipd, datab_ipd, dataa_ipd));
end if;
else
icomb := VitalMUX(data => lut_mask_std,
dselect => (datad_ipd, cin_ipd, datab_ipd, dataa_ipd));
end if;
elsif (cin0_used = "true") then
icomb := VitalMUX(data => lut_mask_std,
dselect => (datad_ipd, cin0_ipd, datab_ipd, dataa_ipd));
else
icomb := VitalMUX(data => lut_mask_std,
dselect => (datad_ipd, datac_ipd, datab_ipd, dataa_ipd));
end if;
end if;
if operation_mode = "arithmetic" then
icout0 := VitalMUX(data => lut_mask_std,
dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
icout1 := VitalMUX(data => lut_mask_std,
dselect => ('0', cin1_ipd, datab_ipd, dataa_ipd));
if cin_used = "true" then
if ((cin0_used = "true") or (cin1_used = "true")) then
if (cin_ipd = '0') then
icomb := VitalMUX(data => lut_mask_std,
dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd));
icout := icout0;
else
icomb := VitalMUX(data => lut_mask_std,
dselect => ('1', cin1_ipd, datab_ipd, dataa_ipd));
icout := icout1;
end if;
else
icomb := VitalMUX(data => lut_mask_std,
dselect => ('1', cin_ipd, datab_ipd, dataa_ipd));
icout := VitalMUX(data => lut_mask_std,
dselect => ('0', cin_ipd, datab_ipd, dataa_ipd));
end if;
elsif (cin0_used = "true") then
icomb := VitalMUX(data => lut_mask_std,
dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd));
icout := VitalMUX(data => lut_mask_std,
dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
else
icomb := VitalMUX(data => lut_mask_std,
dselect => ('1', datac_ipd, datab_ipd, dataa_ipd));
icout := VitalMUX(data => lut_mask_std,
dselect => ('0', datac_ipd, datab_ipd, dataa_ipd));
end if;
end if;
if operation_mode = "multiplier" then
icout0 := VitalMUX(data => lut_mask_std,
dselect => ('0', cin0_ipd, datab_ipd, dataa_ipd));
icout1 := VitalMUX(data => lut_mask_std,
dselect => ('0', cin1_ipd, datab_ipd, dataa_ipd));
if (cin_ipd = '0') then
ilutout := VitalMUX(data => lut_mask_std,
dselect => ('1', cin0_ipd, datab_ipd, dataa_ipd));
icout := icout0;
else
ilutout := VitalMUX(data => lut_mask_std,
dselect => ('1', cin1_ipd, datab_ipd, dataa_ipd));
icout := icout1;
end if;
if (multsela_ipd = '0') then
if (multselb_ipd = '0') then
if (multiplier_mux_source = "vcc") then
icomb := '1';
else
icomb := '0';
end if;
else
icomb := multdatab_ipd;
end if;
else
if (multselb_ipd = '0') then
icomb := multdataa_ipd;
else
icomb := ilutout;
end if;
end if;
end if;
tmp_combout := icomb;
tmp_cout := icout;
tmp_cout0 := icout0;
tmp_cout1 := icout1;
tmp_regin := icomb;
tmp_multout := icomb;
----------------------
-- Path Delay Section
----------------------
VitalPathDelay01 (
OutSignal => combout,
OutSignalName => "COMBOUT",
OutTemp => tmp_combout,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_combout, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
1 => (datab_ipd'last_event, tpd_datab_combout, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
2 => (datac_ipd'last_event, tpd_datac_combout, TRUE),
3 => (datad_ipd'last_event, tpd_datad_combout, TRUE),
4 => (cin_ipd'last_event, tpd_cin_combout, TRUE),
5 => (cin0_ipd'last_event, tpd_cin0_combout, TRUE),
6 => (cin1_ipd'last_event, tpd_cin1_combout, TRUE),
7 => (multsela_ipd'last_event, tpd_multsela_combout, TRUE),
8 => (multselb_ipd'last_event, tpd_multselb_combout, TRUE),
9 => (multdataa_ipd'last_event, tpd_multdataa_combout, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
10 => (multdatab_ipd'last_event, tpd_multdatab_combout, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
GlitchData => combout_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
VitalPathDelay01 (
OutSignal => regin,
OutSignalName => "REGIN",
OutTemp => tmp_regin,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_regin, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
1 => (datab_ipd'last_event, tpd_datab_regin, (operation_mode /= "multiplier" OR (multsela_ipd = '0' AND multselb_ipd = '0') OR (multsela_ipd = '1' AND multselb_ipd = '1'))),
2 => (datac_ipd'last_event, tpd_datac_regin, TRUE),
3 => (datad_ipd'last_event, tpd_datad_regin, TRUE),
4 => (cin_ipd'last_event, tpd_cin_regin, TRUE),
5 => (cin0_ipd'last_event, tpd_cin0_regin, TRUE),
6 => (cin1_ipd'last_event, tpd_cin1_regin, TRUE),
7 => (multsela_ipd'last_event, tpd_multsela_regin, TRUE),
8 => (multselb_ipd'last_event, tpd_multselb_regin, TRUE),
9 => (multdataa_ipd'last_event, tpd_multdataa_regin, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
10 => (multdatab_ipd'last_event, tpd_multdatab_regin, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
GlitchData => regin_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
VitalPathDelay01 (
OutSignal => cout,
OutSignalName => "COUT",
OutTemp => tmp_cout,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout, TRUE),
1 => (datab_ipd'last_event, tpd_datab_cout, TRUE),
2 => (datac_ipd'last_event, tpd_datac_cout, TRUE),
3 => (datad_ipd'last_event, tpd_datad_cout, TRUE),
4 => (cin_ipd'last_event, tpd_cin_cout, TRUE),
5 => (cin0_ipd'last_event, tpd_cin0_cout, TRUE),
6 => (cin1_ipd'last_event, tpd_cin1_cout, TRUE)),
GlitchData => cout_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
VitalPathDelay01 (
OutSignal => cout0,
OutSignalName => "COUT0",
OutTemp => tmp_cout0,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout0, TRUE),
1 => (datab_ipd'last_event, tpd_datab_cout0, TRUE),
2 => (cin0_ipd'last_event, tpd_cin0_cout0, TRUE)),
GlitchData => cout0_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
VitalPathDelay01 (
OutSignal => cout1,
OutSignalName => "COUT1",
OutTemp => tmp_cout1,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_cout1, TRUE),
1 => (datab_ipd'last_event, tpd_datab_cout1, TRUE),
2 => (cin1_ipd'last_event, tpd_cin1_cout1, TRUE)),
GlitchData => cout1_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
VitalPathDelay01 (
OutSignal => multout,
OutSignalName => "MULTOUT",
OutTemp => tmp_multout,
Paths => (0 => (dataa_ipd'last_event, tpd_dataa_multout, TRUE),
1 => (datab_ipd'last_event, tpd_datab_multout, TRUE),
2 => (multsela_ipd'last_event, tpd_multsela_multout, TRUE),
3 => (multselb_ipd'last_event, tpd_multselb_multout, TRUE),
4 => (cin_ipd'last_event, tpd_cin_multout, TRUE),
5 => (cin0_ipd'last_event, tpd_cin0_multout, TRUE),
6 => (cin1_ipd'last_event, tpd_cin1_multout, TRUE),
7 => (multdataa_ipd'last_event, tpd_multdataa_multout, (operation_mode= "multiplier" and multsela_ipd = '1' and multselb_ipd = '0')),
8 => (multdatab_ipd'last_event, tpd_multdatab_multout, (operation_mode= "multiplier" and multsela_ipd = '0' and multselb_ipd = '1'))),
GlitchData => multout_VitalGlitchData,
Mode => DefGlitchMode,
XOn => XOn,
MsgOn => MsgOn );
end process;
end vital_le;
LIBRARY IEEE, mercury;
USE IEEE.std_logic_1164.all;
USE IEEE.VITAL_Timing.all;
USE IEEE.VITAL_Primitives.all;
USE mercury.atom_pack.all;
ENTITY mercury_lcell_register is
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_apre_regout_posedge : VitalDelayType01 := DefPropDelay01;
tpd_aclr_regout_posedge : VitalDelayType01 := DefPropDelay01;
tpd_aload_regout_posedge : VitalDelayType01 := DefPropDelay01;
tpd_datac_regout : VitalDelayType01 := DefPropDelay01;
tperiod_clk_posedge : VitalDelayType := DefPulseWdthCnst;
tipd_datac : VitalDelayType01 := DefPropDelay01;
tipd_ena : VitalDelayType01 := DefPropDelay01;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?