Трабл Инстантирующая PLL Решетки iCE40 - PullRequest
0 голосов
/ 01 июня 2019

У меня Lattice iCE40 HX8K FPGA в 256 BGA корпусах.Я хочу использовать один из доступных модулей PLL для преобразования внешней тактовой частоты 37 МГц во внутреннюю тактовую частоту для использования внутри ПЛИС 74 МГц.

Я использовал «Настроить модуль ФАПЧ» в IceCube2 и использовал следующую конфигурацию: - Раздел «Тип ФАПЧ»: - Глобальные сети, управляемые выходом ФАПЧ: 1;- Выделенная панель с часами;- Режимы работы ФАПЧ: - Режим без компенсации;- Дополнительные настройки задержки: нет;- частота: - вход - 37 МГц;- Выход - 74 МГц;- Другие - ничего не выбрано;

Затем я получаю два файла VHDL - SO_pll.vhd и SO_pll_inst.vhd.У меня есть файл Design.vhd, куда должен идти мой код.Если я правильно понимаю документацию Lattice, мне нужно указать, что мой Design.vhd (его сущность) является модулем верхнего уровня, что я и сделал.Мне нужно включить SO_pll.vhd в список файлов дизайна в IceCube2, что я и сделал.И последнее - мне нужно использовать шаблон, предоставленный в SO_pll_inst.vhd, для создания экземпляра в моем основном коде PLL с помощью порта, отображающего сигналы PLL в сигналы в моем Design.vhd.Тут возникает проблема - как это сделать?

---Design.vhd---

library IEEE;
use IEEE.std_logic_1164.all;

entity Design is
port(
      I_CLK: in std_logic
    );
end entity Design;


    architecture RTL of Design is

signal S_CLK : std_logic;
signal S_RESET : std_logic;

begin

SO_pll_inst: SO_pll
port map(
          REFERENCECLK => I_CLK,
          PLLOUTCORE => open,
          PLLOUTGLOBAL => S_CLK,
          RESET => S_RESET
        );

end RTL;


    ---SO_pll_inst.vhd---Generated by IceCube2

    SO_pll_inst: SO_pll
    port map(
          REFERENCECLK => ,
          PLLOUTCORE => ,
          PLLOUTGLOBAL => ,
          RESET => 
            );



---SO_pll.vhd---Generated by IceCube2
library IEEE;
use IEEE.std_logic_1164.all;

entity SO_pll is
port(
      REFERENCECLK: in std_logic;
      RESET: in std_logic;
      PLLOUTCORE: out std_logic;
      PLLOUTGLOBAL: out std_logic
    );
end entity SO_pll;

architecture BEHAVIOR of SO_pll is
signal openwire : std_logic;
signal openwirebus : std_logic_vector (7 downto 0);
component SB_PLL40_CORE
  generic (
        --- Feedback
FEEDBACK_PATH : string := "SIMPLE"; -- String (simple, delay, 
phase_and_delay, external)
DELAY_ADJUSTMENT_MODE_FEEDBACK   : string := "FIXED"; 
DELAY_ADJUSTMENT_MODE_RELATIVE   : string := "FIXED"; 
SHIFTREG_DIV_MODE : bit_vector(1 downto 0)  := "00"; 
--  0-->Divide by 4, 1-->Divide by 7, 3 -->Divide by 5  
FDA_FEEDBACK    : bit_vector(3 downto 0)    := "0000"; 
--  Integer (0-15). 
FDA_RELATIVE    : bit_vector(3 downto 0)    := "0000";  
--  Integer (0-15).
PLLOUT_SELECT   : string := "GENCLK";

--- Use the spread sheet to populate the values below
DIVF    : bit_vector(6 downto 0); 
-- Determine a good default value
DIVR    : bit_vector(3 downto 0);
-- Determine a good default value
DIVQ    : bit_vector(2 downto 0);
-- Determine a good default value
FILTER_RANGE    : bit_vector(2 downto 0);
-- Determine a good default value

--- Additional C-Bits
ENABLE_ICEGATE  : bit := '0';

--- Test Mode Parameter 
TEST_MODE   : bit := '0';
EXTERNAL_DIVIDE_FACTOR  : integer := 1
-- Not Used by model, Added for PLL config GUI
   );
port (
    REFERENCECLK    : in std_logic;    -- Driven by core logic
    PLLOUTCORE  : out std_logic;   -- PLL output to core logic
    PLLOUTGLOBAL    : out std_logic;   -- PLL output to global network
    EXTFEEDBACK : in std_logic;    -- Driven by core logic
    DYNAMICDELAY    : in std_logic_vector (7 downto 0); -- Driven by core 
logic
    LOCK        : out std_logic;    -- Output of PLL
    BYPASS      : in std_logic;     -- Driven by core logic
    RESETB      : in std_logic;     -- Driven by core logic
    LATCHINPUTVALUE : in std_logic;     -- iCEGate Signal
    -- Test Pins
    SDO     : out std_logic;    -- Output of PLL
    SDI     : in std_logic;     -- Driven by core logic
    SCLK        : in std_logic      -- Driven by core logic
   );
end component;
begin
SO_pll_inst: SB_PLL40_CORE
-- Fin=37, Fout=74
generic map(
         DIVR => "0000",
         DIVF => "0001111",
         DIVQ => "011",
         FILTER_RANGE => "011",
         FEEDBACK_PATH => "SIMPLE",
         DELAY_ADJUSTMENT_MODE_FEEDBACK => "FIXED",
         FDA_FEEDBACK => "0000",
         DELAY_ADJUSTMENT_MODE_RELATIVE => "FIXED",
         FDA_RELATIVE => "0000",
         SHIFTREG_DIV_MODE => "00",
         PLLOUT_SELECT => "GENCLK",
         ENABLE_ICEGATE => '0'
       )
port map(
      REFERENCECLK => REFERENCECLK,
      PLLOUTCORE => PLLOUTCORE,
      PLLOUTGLOBAL => PLLOUTGLOBAL,
      EXTFEEDBACK => openwire,
      DYNAMICDELAY => openwirebus,
      RESETB => RESET,
      BYPASS => '0',
      LATCHINPUTVALUE => openwire,
      LOCK => open,
      SDI => openwire,
      SDO => open,
      SCLK => openwire
    );

end BEHAVIOR;

Я только что добавил Design.vhd и SO_pll.vhd в список файлов дизайна.Если я запускаю синтез с использованием Lattice LSE, то синтез завершается успешно, но в отчете о размещении говорится, что используются 0/2 ФАПЧ.Если я запускаю Synthesys с Synplify Pro, в отчете говорится, что используется 1/2 PLL, но я действительно не могу его использовать, поскольку не сопоставил сигналы.

Когда я получаю шаблон из SO_pll_inst.vhd и помещаю его вВ архитектуре Design.vhd я получаю сообщение об ошибке: «ОШИБКА - синтез: design.vhd (19): so_pll не объявлено. VHDL-1241» Ну, видимо, я что-то упустил.Если это шаблон, я ожидал бы просто отобразить свой сигнал и запустить его.Но нет.Либо я делаю что-то не так, либо ... Я делаю что-то не так :) Пожалуйста, помогите.

1 Ответ

0 голосов
/ 05 июня 2019

Забавно - я разместил вопрос и выкладываю ответ!:) вот оно:

---Design.vhd---

library IEEE;
use IEEE.std_logic_1164.all;

entity Design is
port(
      I_CLK: in std_logic;
      I_RESET: in std_logic;
      O_PLLOUTGLOBAL : out std_logic
    );
end entity Design;

architecture RTL of Design is

begin

SO_pll_inst: entity SO_pll
port map(
          REFERENCECLK => I_CLK,
          PLLOUTCORE => open,
          PLLOUTGLOBAL => O_PLLOUTGLOBAL,
          RESET => I_RESET
        );

end RTL;

Итак, как видно из файла выше, ключ заключается в создании сущности файла PLL.Мне не хватало ключевого слова «сущность» перед именем сущности, указанной в файле PLL.Как и следовало ожидать, я делал что-то не так.

...