Часы DDR3 xilinx MIG

Я пытаюсь читать и писать из оперативной памяти DDR3, подключенной к моей FPGA Artix-7. Я использую MIG-7 для создания своего IP в Vivado 2015.1.

IP нуждается в двух входных часах, эталонных часах и системных часах. Я использую внутренний IP (внутренний PLL FPGA), чтобы сделать часы с частотой 400 МГц, и я подключил к ним часы.

Схема не работает, и ui_clk_sync_rst равен '0', а init_calib_complete никогда не достигает высокого уровня!

Как мне назначить эти тактовые сигналы?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;


entity Main_Prg is
    Port ( 

               -- Inouts
    ddr3_dq                        : inout std_logic_vector(7 downto 0);
    ddr3_dqs_p                     : inout std_logic_vector(0 downto 0);
    ddr3_dqs_n                     : inout std_logic_vector(0 downto 0);

    -- Outputs
    ddr3_addr                      : out   std_logic_vector(13 downto 0);
    ddr3_ba                        : out   std_logic_vector(2 downto 0);
    ddr3_ras_n                     : out   std_logic;
    ddr3_cas_n                     : out   std_logic;
    ddr3_we_n                      : out   std_logic;
    ddr3_reset_n                   : out   std_logic;
    ddr3_ck_p                      : out   std_logic_vector(0 downto 0);
    ddr3_ck_n                      : out   std_logic_vector(0 downto 0);
    ddr3_cke                       : out   std_logic_vector(0 downto 0);
    ddr3_cs_n                      : out   std_logic_vector(0 downto 0);
    ddr3_odt                       : out   std_logic_vector(0 downto 0);


           LEDV6 : out STD_LOGIC;
           LEDV7 : out STD_LOGIC;
           clk25 : in STD_LOGIC);
end Main_Prg;

architecture Behavioral of Main_Prg is


component Clock_IP
port
 (
  clk_in           : in     std_logic;
  clk_out          : out    std_logic
 );
end component Clock_IP;


  component DDR3_RAM
    port(
      ddr3_dq       : inout std_logic_vector(7 downto 0);
      ddr3_dqs_p    : inout std_logic_vector(0 downto 0);
      ddr3_dqs_n    : inout std_logic_vector(0 downto 0);

      ddr3_addr     : out   std_logic_vector(13 downto 0);
      ddr3_ba       : out   std_logic_vector(2 downto 0);
      ddr3_ras_n    : out   std_logic;
      ddr3_cas_n    : out   std_logic;
      ddr3_we_n     : out   std_logic;
      ddr3_reset_n  : out   std_logic;
      ddr3_ck_p     : out   std_logic_vector(0 downto 0);
      ddr3_ck_n     : out   std_logic_vector(0 downto 0);
      ddr3_cke      : out   std_logic_vector(0 downto 0);
      ddr3_cs_n     : out   std_logic_vector(0 downto 0);
      ddr3_odt      : out   std_logic_vector(0 downto 0);
      app_addr                  : in    std_logic_vector(27 downto 0);
      app_cmd                   : in    std_logic_vector(2 downto 0);
      app_en                    : in    std_logic;
      app_wdf_data              : in    std_logic_vector(63 downto 0);
      app_wdf_end               : in    std_logic;
      app_wdf_wren              : in    std_logic;
      app_rd_data               : out   std_logic_vector(63 downto 0);
      app_rd_data_end           : out   std_logic;
      app_rd_data_valid         : out   std_logic;
      app_rdy                   : out   std_logic;
      app_wdf_rdy               : out   std_logic;
      app_sr_req                : in    std_logic;
      app_ref_req               : in    std_logic;
      app_zq_req                : in    std_logic;
      app_sr_active             : out   std_logic;
      app_ref_ack               : out   std_logic;
      app_zq_ack                : out   std_logic;
      ui_clk                    : out   std_logic;
      ui_clk_sync_rst           : out   std_logic;
      init_calib_complete       : out   std_logic;
      -- System Clock Ports
      sys_clk_i                      : in    std_logic;
      -- Reference Clock Ports
      clk_ref_i                                : in    std_logic;
      sys_rst             : in std_logic
      );
  end component DDR3_RAM;


    signal  cntr01  :   std_logic_vector(50 downto 0) := (others=>'0');
    signal  cntr02  :   std_logic_vector(50 downto 0) := (others=>'0');
    signal  ck25    :   std_logic ;
    signal  ck400   :   std_logic ;

  signal app_addr                    : std_logic_vector(27 downto 0) := (others=>'0') ;
  signal app_cmd                     : std_logic_vector(2 downto 0)  := (others=>'0') ;
  signal app_en                      : std_logic := '0';
  signal app_wdf_data                : std_logic_vector(63 downto 0) := (others=>'0') ;
  signal app_wdf_end                 : std_logic := '0';
  signal app_wdf_wren                : std_logic := '0';
  signal app_rd_data                 : std_logic_vector(63 downto 0) := (others=>'0') ;
  signal app_rd_data_end             : std_logic;
  signal app_rd_data_valid           : std_logic;
  signal app_rdy                     : std_logic;
  signal app_wdf_rdy                 : std_logic;
  signal app_sr_active               : std_logic;
  signal app_ref_ack                 : std_logic;
  signal app_zq_ack                  : std_logic;
  signal clk                         : std_logic;
  signal rst                         : std_logic;
  signal init_calib_complete_s       : std_logic;
  signal app_rdy_i                   : std_logic;
  signal app_wdf_rdy_i               : std_logic;
  signal app_rd_data_valid_i         : std_logic;
  signal init_calib_complete_i       : std_logic;
  signal app_addr_i                  : std_logic_vector(27 downto 0) := (others=>'0') ;



begin


ck25 <= clk25 ;

U1: process(clk)
begin
    if rising_edge(clk) then
         cntr01 <= cntr01 + 1 ;
    end if;
end process;

--U2: process(ck400)
--begin
--    if rising_edge(ck400) then
--        if cntr02(28) = '0' then
--            cntr02 <= cntr02 + 1 ;
--        end if;    
--    end if;
--end process;

Uclk:   Clock_IP    port map
(      clk_in => ck25,
       clk_out=> ck400); 

LEDV6 <= init_calib_complete_i ; -- cntr01(25); 
LEDV7 <= cntr01(25);






  u_DDR3_RAM : DDR3_RAM
      port map (
       -- Memory interface ports
       ddr3_addr                      => ddr3_addr,
       ddr3_ba                        => ddr3_ba,
       ddr3_cas_n                     => ddr3_cas_n,
       ddr3_ck_n                      => ddr3_ck_n,
       ddr3_ck_p                      => ddr3_ck_p,
       ddr3_cke                       => ddr3_cke,
       ddr3_ras_n                     => ddr3_ras_n,
       ddr3_reset_n                   => ddr3_reset_n,
       ddr3_we_n                      => ddr3_we_n,
       ddr3_dq                        => ddr3_dq,
       ddr3_dqs_n                     => ddr3_dqs_n,
       ddr3_dqs_p                     => ddr3_dqs_p,
       init_calib_complete            => init_calib_complete_s,
       ddr3_cs_n                      => ddr3_cs_n,
       ddr3_odt                       => ddr3_odt,
-- Application interface ports
       app_addr                       => app_addr,
       app_cmd                        => app_cmd,
       app_en                         => app_en,
       app_wdf_data                   => app_wdf_data,
       app_wdf_end                    => app_wdf_end,
       app_wdf_wren                   => app_wdf_wren,
       app_rd_data                    => app_rd_data,
       app_rd_data_end                => app_rd_data_end,
       app_rd_data_valid              => app_rd_data_valid,
       app_rdy                        => app_rdy,
       app_wdf_rdy                    => app_wdf_rdy,
       app_sr_req                     => '0',
       app_ref_req                    => '0',
       app_zq_req                     => '0',
       app_sr_active                  => app_sr_active,
       app_ref_ack                    => app_ref_ack,
       app_zq_ack                     => app_zq_ack,
       ui_clk                         => clk,
       ui_clk_sync_rst                => rst,
-- System Clock Ports
       sys_clk_i                       => ck400,
-- Reference Clock Ports
       clk_ref_i                      =>  ck400,
        sys_rst                        => cntr02(28)
        );
-- End of User Design top instance


end Behavioral;

person Amir    schedule 05.08.2015    source источник
comment
Давайте посмотрим на Верилог!   -  person The Brofessor    schedule 05.08.2015
comment
Я загрузил код здесь: textuploader.com/arkhp   -  person Amir    schedule 05.08.2015


Ответы (2)


sys_clk не может быть сгенерирован под FPGA. Вы должны обеспечить его от внешнего генератора. Следуйте примеру комплекта AC701 Artix7, он использует дифференциальные часы на частоте 200 МГц.

person FabienM    schedule 16.11.2016

Если у вас есть осциллятор, который не подходит для вашего MIG, вы можете создать тактовый генератор с двумя выходами (из Clocking Wizard), а затем подключить 1-й тактовый генератор к системным тактовым генераторам MIG, а 2-й тактовый генератор к эталонному тактовому генератору.

В настройках MIG эталонные и системные часы должны быть установлены на тип "Без буфера".

Опорная частота должна быть 200 МГц. Если системные часы 200 МГц, вы можете выбрать «Использовать системные часы».

person kilometrix    schedule 06.09.2018