У меня проблемы с использованием внутреннего генератора для решетки ICE5LP4K.Согласно Приложению к руководству по использованию генератора iCE40, код в verilog должен выглядеть следующим образом:
SB_HFOSC OSCInst0 (
.CLKHF_EN(ENCLKHF),
.CLKHF_PU(CLKHF_POWERUP),
.CLKHF(CLKHF)
) /* synthesis ROUTE_THROUGH_FABRIC= [0|1] */;
Defparam OSCInst0.CLKHF_DIV = 2’b00;
Кодовая база, из которой я работаю, находится в VHDL, поэтому я добавил компонент в свою архитектуру следующим образом:
SB_HFOSC : OscInst0
port map(
CLKHF_EN => RST_SYS_N;
CLKHF_PU => RST_SYS_N;
CLKHF => HFOSC_CLK_48MHZ
);
Когда я попробовал это, я получил ошибки, связанные с компонентом SB_HFOSC, который не был определен.Затем я нашел эту статью: проблемы моделирования внутреннего генератора решетки FPGA , в которых упоминается добавление компонентов решетки в файл вашего проекта.
В свой проект я добавил новый файл, который содержит следующий код из sb_ice_syn_vital.vhd:
-----------------------------------------------------
--- SB_HFOSC -------
------------------------------------------------
library IEEE;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.Vital_Primitives.all;
use IEEE.VITAL_Timing.all;
entity SB_HFOSC is
generic( CLKHF_DIV: string:="0b00";
Xon : boolean := true;
MsgOn : boolean := true;
tipd_CLKHFEN: VitalDelayType01 := (0.000 ns, 0.000 ns);
tipd_CLKHFPU: VitalDelayType01 := (0.000 ns, 0.000 ns);
tpd_CLKHFEN_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns);
tpd_CLKHFPU_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns)
);
port(
CLKHF : out std_logic;
CLKHFEN :in std_logic;
CLKHFPU : in std_logic
);
attribute VITAL_LEVEL0 of
SB_HFOSC : entity is true;
end SB_HFOSC ;
architecture SB_HFOSC_V of SB_HFOSC is
attribute VITAL_LEVEL0 of
SB_HFOSC_V : architecture is true;
signal CLKHFEN_ipd: std_ulogic := 'X';
signal CLKHFPU_ipd: std_ulogic := 'X';
signal CLKHF_sig : std_ulogic :='X';
component SB_HFOSC_CORE
generic( CLKHF_DIV: string:="0b00");
port (
CLKHF_PU : IN std_logic;
CLKHF_EN : IN std_logic;
CLKHF : OUT std_logic
);
end component;
begin
WireDelay : block
begin
VitalWireDelay (CLKHFEN_ipd, CLKHFEN, tipd_CLKHFEN);
VitalWireDelay (CLKHFPU_ipd, CLKHFPU, tipd_CLKHFPU);
end block;
LS: SB_HFOSC_CORE
GENERIC MAP (CLKHF_DIV => CLKHF_DIV)
port map(
CLKHF_PU=> CLKHFPU_ipd,
CLKHF_EN=> CLKHFEN,
CLKHF=> CLKHF_sig
);
VITALPathDelay :process (CLKHFEN_ipd,CLKHF_sig,CLKHFPU_ipd)
variable CLKHF_GlitchData : VitalGlitchDataType;
variable CLKHF_zd : std_ulogic :='X';
begin
CLKHF_zd:=CLKHF_sig;
VitalPathDelay01 (
OutSignal => CLKHF,
GlitchData => CLKHF_GlitchData,
OutSignalName => "CLKHF",
OutTemp => CLKHF_zd,
Paths => (--0 =>(CLKHFEN_ipd'last_event, tpd_CLKHFEN_CLKHF, true),
0 =>(CLKHFPU_ipd'last_event, tpd_CLKHFPU_CLKHF, true)),
Mode => VitalTransport,
Xon => Xon,
MsgOn => MsgOn,
MsgSeverity => warning);
end process;
end SB_HFOSC_V;
Я также добавил определение компонента (в свою верхнюю архитектуру) из vcomponent_vital.vhd:
component SB_HFOSC is
generic(
CLKHF_DIV: string:="0b00";
Xon : boolean := true;
MsgOn : boolean := true;
tipd_CLKHFEN: VitalDelayType01 := (0.000 ns, 0.000 ns);
tipd_CLKHFPU: VitalDelayType01 := (0.000 ns, 0.000 ns);
tpd_CLKHFEN_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns);
tpd_CLKHFPU_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns)
);
port(
CLKHF : out std_logic;
CLKHFEN :in std_logic;
CLKHFPU : in std_logic
);
end component;
Когда я пытаюсь синтезировать код, я получаю множество ошибок, которые кажутся связанными с «vitaldelaytype01» и «vital_level0», которые не определены.Как видно из приведенного выше кода, я включил библиотеки IEEE Vital.Я попытался скомпилировать с использованием встроенного компилятора ICECube2, а также Synplify Pro, но в каждом случае получал похожие ошибки.
Следую ли я правильному процессу внедрения HFOSC в моем коде?Нужно ли загружать дополнительные библиотеки, которые не предоставляются автоматически в комплекте ICECube2?