Lattice ICE5LP4K FPGA:如何将 HFOSC 添加到用户 vhdl

Rob*_*Rob 6 synthesis fpga lattice-diamond

我在使用 Lattice ICE5LP4K 的内部振荡器时遇到问题。根据 iCE40 振荡器使用指南附录,verilog 中的代码应如下所示:

\n\n
    SB_HFOSC OSCInst0 (\n       .CLKHF_EN(ENCLKHF),\n       .CLKHF_PU(CLKHF_POWERUP),\n       .CLKHF(CLKHF)\n     ) /* synthesis ROUTE_THROUGH_FABRIC= [0|1] */;\n     Defparam OSCInst0.CLKHF_DIV = 2\xe2\x80\x99b00;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用的代码库采用 VHDL 格式,因此我已将该组件添加到我的架构中,如下所示:

\n\n
  SB_HFOSC : OscInst0\n    port map(\n        CLKHF_EN  => RST_SYS_N;\n        CLKHF_PU  => RST_SYS_N;\n        CLKHF     => HFOSC_CLK_48MHZ\n    );\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我尝试此操作时,收到与组件 SB_HFOSC 未定义相关的错误。然后我找到了这篇文章:lattice FPGA内部振荡器模拟问题,其中提到将lattice组件添加到项目文件中。

\n\n

我在项目中添加了一个新文件,其中包含 sb_ice_syn_vital.vhd 中的以下代码:

\n\n
-----------------------------------------------------\n---         SB_HFOSC        -------\n------------------------------------------------\nlibrary IEEE;\nuse ieee.std_logic_1164.all;\nuse ieee.std_logic_arith.all;\nuse ieee.std_logic_unsigned.all;\nuse IEEE.Vital_Primitives.all;\nuse IEEE.VITAL_Timing.all;\nentity  SB_HFOSC  is \n    generic( CLKHF_DIV: string:="0b00";\n                Xon   : boolean := true;\n                MsgOn : boolean := true;\n                tipd_CLKHFEN: VitalDelayType01 := (0.000 ns, 0.000 ns);\n                tipd_CLKHFPU: VitalDelayType01 := (0.000 ns, 0.000 ns);\n                tpd_CLKHFEN_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns);\n                tpd_CLKHFPU_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns)\n); \nport(\n    CLKHF : out std_logic;\n    CLKHFEN  :in std_logic;\n    CLKHFPU : in std_logic\n    );\n        attribute VITAL_LEVEL0 of               \n    SB_HFOSC  : entity is true;\nend SB_HFOSC ;\n\narchitecture SB_HFOSC_V of SB_HFOSC is\nattribute VITAL_LEVEL0 of\n    SB_HFOSC_V : architecture is true;\n    signal CLKHFEN_ipd: std_ulogic := \'X\';\n    signal CLKHFPU_ipd: std_ulogic := \'X\';\n    signal CLKHF_sig  : std_ulogic  :=\'X\';\n\ncomponent SB_HFOSC_CORE                 \ngeneric( CLKHF_DIV: string:="0b00");    \nport ( \n    CLKHF_PU : IN std_logic;\n    CLKHF_EN : IN std_logic;\n    CLKHF : OUT std_logic\n);\n\nend component;\n\nbegin\nWireDelay : block\n  begin\n    VitalWireDelay (CLKHFEN_ipd, CLKHFEN, tipd_CLKHFEN);\n    VitalWireDelay (CLKHFPU_ipd, CLKHFPU, tipd_CLKHFPU);\n  end block;\n\nLS: SB_HFOSC_CORE                    \nGENERIC MAP (CLKHF_DIV => CLKHF_DIV)\nport map(\n    CLKHF_PU=> CLKHFPU_ipd,\n    CLKHF_EN=> CLKHFEN,\n    CLKHF=> CLKHF_sig\n        );\nVITALPathDelay :process (CLKHFEN_ipd,CLKHF_sig,CLKHFPU_ipd)\nvariable CLKHF_GlitchData : VitalGlitchDataType;  \nvariable CLKHF_zd  : std_ulogic :=\'X\';\nbegin  \n    CLKHF_zd:=CLKHF_sig;\nVitalPathDelay01 (\n      OutSignal                 => CLKHF,\n      GlitchData                => CLKHF_GlitchData,\n      OutSignalName             => "CLKHF",\n      OutTemp                   => CLKHF_zd,\n      Paths                     => (--0 =>(CLKHFEN_ipd\'last_event, tpd_CLKHFEN_CLKHF, true),\n                                    0 =>(CLKHFPU_ipd\'last_event, tpd_CLKHFPU_CLKHF, true)),\n      Mode                      => VitalTransport,\n      Xon                       => Xon,\n      MsgOn                     => MsgOn,\n      MsgSeverity               => warning);\nend process;\n\nend     SB_HFOSC_V; \n
Run Code Online (Sandbox Code Playgroud)\n\n

我还从 vcomponent_vital.vhd 添加了组件定义(到我的顶层架构):

\n\n
component SB_HFOSC  is \n    generic( \n        CLKHF_DIV: string:="0b00";\n        Xon   : boolean := true;\n        MsgOn : boolean := true;\n        tipd_CLKHFEN: VitalDelayType01 := (0.000 ns, 0.000 ns);\n        tipd_CLKHFPU: VitalDelayType01 := (0.000 ns, 0.000 ns);\n        tpd_CLKHFEN_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns);\n        tpd_CLKHFPU_CLKHF : VitalDelayType01 := (0.000 ns, 0.000 ns)\n        ); \n    port(\n        CLKHF : out std_logic;\n        CLKHFEN  :in std_logic;\n            CLKHFPU : in std_logic\n        );\nend  component;\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我尝试合成代码时,我收到了大量错误,所有这些错误似乎都与未定义“vitaldelaytype01”和“vital_level0”有关。正如您在上面的代码中看到的,我已经包含了 IEEE Vital 库。我尝试使用内置的 ICECube2 编译器以及 Synplify Pro 进行编译,但在每种情况下都会收到类似的错误。

\n\n

我是否遵循正确的流程在代码中实施 HFOSC?我是否需要下载 ICECube2 套件中未自动提供的其他库?

\n

Rob*_*Rob 6

我能够通过莱迪思的客户支持门户解决这个问题。实例化lattice HFOSC IP块的正确过程如下:

您的图书馆中包括:

library ice;
Run Code Online (Sandbox Code Playgroud)

在您的组件定义中:

component SB_HFOSC  
GENERIC( CLKHF_DIV :string :="0b00");
PORT(
        CLKHFEN: IN STD_LOGIC ;
        CLKHFPU: IN STD_LOGIC;
        CLKHF:OUT STD_LOGIC
        );
END COMPONENT;
Run Code Online (Sandbox Code Playgroud)

在您的实例实例化中:

   u_osc : SB_HFOSC
    GENERIC MAP(CLKHF_DIV =>"0b00")
    port map(
        CLKHFEN  => RST_SYS_N,
        CLKHFPU  => RST_SYS_N,
       CLKHF     => HFOSC_CLK_48MHZ
   );
Run Code Online (Sandbox Code Playgroud)

记下引脚名称 - 它们与莱迪思指南不同,这就是我在实例化组件时遇到问题的原因。

我在此过程中了解到的另一件有趣的事情是,HFOSC 块使用全局缓冲区,但 Lattice 工具无法预先识别这一点,因此它可能会在综合后 P&R 期间遇到问题。要为 HFOSC 组件保留 8 个缓冲区之一,请将全局缓冲区总数限制为 7 个,如下所示(插入顶级架构定义中):

attribute syn_global_buffers : integer;
attribute syn_global_buffers of struct : architecture is 7;
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助!