Решетка ICE5LP4K FPGA: как добавить HFOSC в пользовательский vhdl

У меня проблемы с использованием внутреннего генератора для Lattice 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 не был определен. Затем я нашел эту статью: Проблемы моделирования внутреннего генератора решетчатой ​​ПЛИС в котором упоминается добавление компонентов решетки в файл вашего проекта.

Я добавил в свой проект новый файл, который содержит следующий код из 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?


person Rob    schedule 07.06.2018    source источник
comment
Я поискал в каталоге iCEcube2.2017.08 / LSE и нашел time_p.vhd, который определяет пакет VITAL_Timing, а также необходимый VitalDelayType01. Почему инструмент не обнаруживает этого при синтезе кода? Возможно ли, что инструмент использует скомпилированную версию библиотеки, которая исключила пакет Vital_timing из сборки?   -  person Rob    schedule 08.06.2018
comment
Удалось ли вам когда-нибудь в этом? Я не нашел проектов VHDL в iCECube2, которые используют жесткий IP.   -  person DMPalmer    schedule 24.09.2018
comment
Я успешно создал экземпляр SB_HFOSC, добавив определение компонента в мою библиотеку, но с закомментированными строками VITAL. Синтез предупреждает, что ROUTE_THROUGH_FABRIC не существует и по умолчанию устанавливается значение 0, но для моих целей это нормально. У меня есть запрос в службу поддержки Lattice с вопросом, почему библиотеки VITAL не читаются. (Это на iCE40UL)   -  person DMPalmer    schedule 29.09.2018
comment
Смотрите мой ответ на этот вопрос. Можно добавить это в свой проект, но я не думаю, что это правильное решение. Сообщите мне, подходят ли вам шаги, перечисленные в моем ответе!   -  person Rob    schedule 02.10.2018


Ответы (2)


Мне удалось решить эту проблему через портал поддержки клиентов 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
   );

Обратите внимание на имена выводов - они отличаются от направляющих Lattice, поэтому у меня возникли проблемы с созданием экземпляра компонента.

Еще одна интересная вещь, которую я узнал в процессе, заключалась в том, что блок HFOSC использует глобальный буфер, но инструмент Lattice не распознает это заранее, поэтому он может столкнуться с проблемами во время P&R после синтеза. Чтобы зарезервировать один из 8 буферов для компонента HFOSC, ограничьте общее количество глобальных буферов до 7 следующим образом (вставьте в определение архитектуры верхнего уровня):

attribute syn_global_buffers : integer;
attribute syn_global_buffers of struct : architecture is 7;

Надеюсь, это поможет другим!

Роб

person Rob    schedule 02.10.2018

iCEcube2 (2017.08.27940) явно не готов к VHDL вне пакета с инструментом "Lattice LSE Synthesis".

Это связано с тем, что компоненты, определенные в 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.

person MortenL    schedule 22.02.2019