Lattice ICE5LP4K FPGA: как добавить HFOSC для пользователя vhdl
У меня проблемы с использованием внутреннего генератора для решетки 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?
1 ответ
Мне удалось решить эту проблему через портал поддержки клиентов Lattice. Надлежащий процесс создания экземпляра решеточного IP-блока HFOSC выглядит следующим образом:
В вашу библиотеку входят:
library ice;
В ваших определениях компонентов:
component SB_HFOSC
GENERIC( CLKHF_DIV :string :="0b00");
PORT(
CLKHFEN: IN STD_LOGIC ;
CLKHFPU: IN STD_LOGIC;
CLKHF:OUT STD_LOGIC
);
END COMPONENT;
В вашем случае:
u_osc : SB_HFOSC
GENERIC MAP(CLKHF_DIV =>"0b00")
port map(
CLKHFEN => RST_SYS_N,
CLKHFPU => RST_SYS_N,
CLKHF => HFOSC_CLK_48MHZ
);
Обратите внимание на названия выводов - они отличаются от направляющих решетки, поэтому у меня возникли проблемы при создании экземпляра компонента.
Еще одна интересная вещь, которую я узнал в процессе, состояла в том, что блок HFOSC использует глобальный буфер, но инструмент Lattice не распознает это заранее, поэтому он может столкнуться с проблемами во время P&R после синтеза. Чтобы зарезервировать один из 8 буферов для компонента HFOSC, ограничьте общее количество глобальных буферов до 7 следующим образом (вставьте в определение архитектуры верхнего уровня):
attribute syn_global_buffers : integer;
attribute syn_global_buffers of struct : architecture is 7;
Надеюсь, что это помогает другим!
обкрадывать
iCEcube2 (2017.08.27940), очевидно, не готов к VHDL из пакета с помощью инструмента "Синтез LSE".
Это происходит из-за компонентов, определенных в VERILOG, и VHDL не видит их на этапе синтеза, если вы не переопределите компоненты вручную в VHDL. Есть файл пакета VHDL, содержащий их, но я нахожу в нем ошибки.
Вот что я делаю:
-Добавьте этот файл в ваш проект:
<"icecube_installation_path">\LSE\userware\NT\SYNTHESIS_HEADERS\sb_ice40_components_syn.vhd
- исправить ошибку в нем; измените атрибут ROUTE_THROUGH_FABRIC, чтобы использовать строковый тип вместо логического, и "1"/"0" вместо true/false, где он используется. Если этого не сделать, P&R потерпит неудачу, но пройдет синтез.
-Теперь вы можете добавить рабочую библиотеку в начало вашего кода и создать экземпляр как обычно:
library work;
use work.components.all;
--your code here--
osc:SB_HFOSC
generic map
(
CLKHF_DIV =>"0b10" --12Mhz
)
port map
(
CLKHFEN =>'1',
CLKHFPU =>'1',
CLKHF =>clk
);
Кажется, это работает с моими вещами.
Кроме того, используя встроенный инструмент синтеза "Synplify Pro", я добился определенного успеха, если бы добавил
library sb_ice40_components_syn;
use sb_ice40_components_syn.components.all;
наверх, но у меня были серьезные проблемы с перезагрузкой конечных автоматов, поэтому я отказался от этого. Я просто не понимаю, как сбросить конечные автоматы с горячим кодом без внутренней настройки / сброса внутреннего уровня системы. Документы требуют его там, но я не могу найти никаких четких документов, как его использовать, по крайней мере, не для iCE40UL.