DDR3 MIG Vivado IP

Я пытаюсь использовать MIG 7 для подключения оперативной памяти DDR3 к FPGA Artix 7. Я новичок в использовании IP и знаю только VHDL (не Verilog). Я загрузил свой код. В моем коде init_calib_complete никогда не становится высоким!

Кто-нибудь может найти, что не так с моим кодом, или дать мне пример кода, пожалуйста.

-Я использую только последние несколько строк для своих кодов, остальное просто декларация.

-Я подключил LEDV7 и LEDV6 к светодиодам.

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);

 -- Inputs
 -- Differential system clocks
 sys_clk_p                      : in    std_logic;
 sys_clk_n                      : in    std_logic;
 -- Single-ended iodelayctrl clk (reference clock)
 clk_ref_i                                : in    std_logic;

        LEDV6 : out STD_LOGIC ;
        LEDV7 : out STD_LOGIC
        );
end Main_PRG;
architecture Behavioral of Main_PRG is
signal app_addr                    : std_logic_vector(27 downto 0);

signal app_addr                    : std_logic_vector(27 downto 0);
signal app_addr_i                  : std_logic_vector(31 downto 0);
      signal app_cmd                     : std_logic_vector(2 downto 0);
      signal app_en                      : std_logic;
      signal app_rdy                     : std_logic;
      signal app_rdy_i                   : std_logic;
  signal app_rd_data                 : std_logic_vector(63 downto 0);
  signal app_rd_data_end             : std_logic;
  signal app_rd_data_valid           : std_logic;
  signal app_rd_data_valid_i         : std_logic;
  signal app_wdf_data                : std_logic_vector(63 downto 0);
  signal app_wdf_end                 : std_logic;
  signal app_wdf_rdy                 : std_logic;
  signal app_wdf_rdy_i               : std_logic;
  signal app_sr_active               : std_logic;
  signal app_ref_ack                 : std_logic;
  signal app_zq_ack                  : std_logic;
  signal app_wdf_wren                : std_logic;
  signal mem_pattern_init_done       : std_logic_vector(0 downto 0);
  signal modify_enable_sel           : std_logic;
  signal data_mode_manual_sel        : std_logic_vector(2 downto 0);
  signal addr_mode_manual_sel        : std_logic_vector(2 downto 0);
  signal cmp_error                   : std_logic;
  signal tg_wr_data_counts           : std_logic_vector(47 downto 0);
  signal tg_rd_data_counts           : std_logic_vector(47 downto 0);
  signal init_calib_complete_i       : std_logic;
  signal tg_compare_error_i          : std_logic;
  signal tg_rst                      : std_logic;
  signal po_win_tg_rst               : std_logic;
  signal manual_clear_error          : std_logic_vector(0 downto 0);

  signal clk                         : std_logic;
  signal rst                         : std_logic;

  signal vio_modify_enable           : std_logic_vector(0 downto 0);
  signal vio_data_mode_value         : std_logic_vector(3 downto 0);
  signal vio_pause_traffic           : std_logic_vector(0 downto 0);
  signal vio_addr_mode_value         : std_logic_vector(2 downto 0);
  signal vio_instr_mode_value        : std_logic_vector(3 downto 0);
  signal vio_bl_mode_value           : std_logic_vector(1 downto 0);
  signal vio_fixed_instr_value       : std_logic_vector(2 downto 0);
  signal vio_data_mask_gen           : std_logic_vector(0 downto 0);
  signal dbg_clear_error             : std_logic_vector(0 downto 0);
  signal vio_tg_rst                  : std_logic_vector(0 downto 0);
  signal dbg_sel_pi_incdec           : std_logic_vector(0 downto 0);
  signal dbg_pi_f_inc                : std_logic_vector(0 downto 0);
  signal dbg_pi_f_dec                : std_logic_vector(0 downto 0);
  signal dbg_sel_po_incdec           : std_logic_vector(0 downto 0);
  signal dbg_po_f_inc                : std_logic_vector(0 downto 0);
  signal dbg_po_f_stg23_sel          : std_logic_vector(0 downto 0);
  signal dbg_po_f_dec                : std_logic_vector(0 downto 0);
  signal vio_dbg_sel_pi_incdec           : std_logic_vector(0 downto 0);
  signal vio_dbg_pi_f_inc                : std_logic_vector(0 downto 0);
  signal vio_dbg_pi_f_dec                : std_logic_vector(0 downto 0);
  signal vio_dbg_sel_po_incdec           : std_logic_vector(0 downto 0);
  signal vio_dbg_po_f_inc                : std_logic_vector(0 downto 0);
  signal vio_dbg_po_f_stg23_sel          : std_logic_vector(0 downto 0);
  signal vio_dbg_po_f_dec                : std_logic_vector(0 downto 0);
  signal all_zeros1                  : std_logic_vector(31 downto 0):= (others => '0');
  signal all_zeros2                  : std_logic_vector(38 downto 0):= (others => '0');
  signal wdt_en_w                    : std_logic_vector(0 downto 0);
  signal cmd_wdt_err_w               : std_logic;
  signal wr_wdt_err_w                : std_logic;
  signal rd_wdt_err_w                : std_logic;
signal cntr2                  : std_logic_vector(31 downto 0):= (others => '0');
signal cntr1                  : std_logic_vector(31 downto 0):= (others => '0');


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_p                      : in    std_logic;
  sys_clk_n                      : in    std_logic;
  -- Reference Clock Ports
  clk_ref_i                                : in    std_logic;
  sys_rst             : in std_logic
  );
end component DDR3_RAM;

----------------------------------------------------------
---DDR RAM Interface signals
----------------------------------------------------------
CONSTANT READ_CMD   : STD_LOGIC_VECTOR (2 downto 0) := "001";
CONSTANT WRITE_CMD  : STD_LOGIC_VECTOR (2 downto 0) := "000";

signal data_1 : std_logic_vector (63 downto 0); 
signal data_2 : std_logic_vector (63 downto 0);

    type state_machine is (Init, Write_1, Set_Data_1, Write_2, Set_Data_2,
  Read_Prep_1, Read_1, Read_Wait_1, Read_Prep_2, Read_2, Read_Wait_2, 
 Done);
 signal state        : state_machine := Init;
 signal next_state   : state_machine;

 signal Curr_State   : std_logic_vector(2 downto 0):="000";  
 signal Reset        : std_logic := '0' ;  
 begin 
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_i,
   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_p                       => sys_clk_p,
   sys_clk_n                       => sys_clk_n,
-- Reference Clock Ports
   clk_ref_i                      => clk_ref_i,
    sys_rst                        => '1'
    );
-- End of User Design top instance





process(clk)
begin
    if  rising_edge(clk) then
       if cntr1(27) = '0' then
         cntr1 <= cntr1 + 1 ;
       end if;    
    end if ;
end process ;      


Reset <= cntr1(28) ;

process (clk)
begin
    if rising_edge(clk) then
    if init_calib_complete_i = '1' then
        LEDV6 <= '1' ;
        LEDV7 <= '0' ;
    else
        LEDV6 <= '1' ;
        LEDV7 <= '1' ;
    end if;    
        if Reset = '0' then
            app_en       <= '0';
            app_wdf_wren <= '0';
            app_wdf_end  <= '0';
            app_cmd      <= (others => '0');
            app_addr     <= (others => '0');
            app_wdf_data <= (others => '0');
            state <= Init;
        else
            app_en       <= '0';
            app_wdf_wren <= '0';
            app_wdf_end  <= '0';

            app_cmd      <= (others => '0');
            app_addr     <= (others => '0');
            app_wdf_data <= (others => '0');


            --LEDV6 <= '1' ;
            --LEDV7 <= '1' ;


            case state is
                when Init =>
                    Curr_State <= "001";
                    data_1 <= (others => '0');
                    data_2 <= (others => '0');

                    --LEDV6 <= '1' ;
                    --LEDV7 <= '0' ;


                    if app_rdy = '1' then
                        state <= Write_1;
                    else 
                        state <= Init;
                    end if;
                when Write_1 =>

                    --LEDV6 <= '0' ;
                    --LEDV7 <= '0' ;

                when others =>
                    --LEDV6 <= '0' ;
                    --LEDV6 <= '0' ;


                end case;

        end if ;                
    end if;
end process;                        

end Behavioral;

person Amir    schedule 30.07.2015    source источник
comment
init_calib_complete — это результат создания экземпляра внешнего блока DDR3_RAM, которого нет в вашем коде. Ваш вопрос не является минимальным, полным и проверяемым примером и О каких темах я могу здесь спросить? говорит нам, что просить примеры тоже не по теме. Согласно UG586, приложению не нужно ждать init_calib_complete перед отправкой команд контроллеру памяти. Мы также не видим тестового стенда с моделью оперативной памяти. Происходит калибровка любого знака?   -  person    schedule 30.07.2015
comment
сигнал app_addr объявляется дважды, что должно привести к ошибке. Насколько близко это представляет ваш код?   -  person    schedule 30.07.2015
comment
Когда вы говорите, что она никогда не поднимается, как долго длится ваша симуляция? Я не пробовал MIG с DDR3, но он не так уж отличается от DDR2. А с DDR2 фаза калибровки заняла от 50 до 100 мкс — довольно долгий симуляционный запуск — с моделью компонента памяти DDR2 в тестовом стенде. Он вообще не завершится, если нет модели памяти для калибровки. И вы нигде не найдете модель VHDL для DDR2 или 3 (хотел бы я оказаться неправым!), поэтому вам придется использовать модель Verilog. И старая версия ISIM, которую я использовал, допускала только один компонент Verilog в тестовом стенде VHDL. (Возможно, исправлено сейчас)   -  person user_1818839    schedule 30.07.2015
comment
Код выполнился без ошибок. когда я реализую его непосредственно на FPGA. не имеет значения, как долго проходит, это никогда не идет высоко. Я ждал более 30 секунд.   -  person Amir    schedule 30.07.2015


Ответы (2)


Несколько предложений:

  1. Проверьте, является ли вход sys_rst для MIG активным HI (его можно настроить как активный LO или HI при настройке IP-ядра). Если это правда, привязка его к '1' будет держать MIG в состоянии сброса, а init_calib_complete никогда не станет высоким.
  2. Создайте ILA (интегрированный логический анализатор) и добавьте в него ui_clk_sync_rst. Проверьте, не исчезнет ли это когда-либо
  3. Если у вас есть комплект разработчика AC701, вы можете ознакомиться с учебным пособием MIG по адресу:

http://www.xilinx.com/support/documentation/boards_and_kits/ac701/2015_1/xtp225-ac701-mig-c-2015-1.pdf

Это известный рабочий дизайн, предоставленный Xilinx. Хотя я не работал с Artix7, я смог без проблем заставить образец Xilinx работать на VC707 с Virtex7.

  1. Если у вас есть нестандартная плата, обратитесь к разделу «Отладка схемы DDR3/DDR2 в главе 1:

http://www.xilinx.com/support/documentation/ip_documentation/mig_7series/v2_0/ug586_7Series_MIS.pdf

Я полагаю, что вы можете портировать образец дизайна Xilinx на любую пользовательскую плату, если вы следуете их рекомендациям, таким как распиновка, часы и т. д.

person David K    schedule 23.08.2015

Спасибо каждому телу, которое я нашел, у меня проблема с часами. Поскольку сигнал ui_clk_sync_rst всегда был низким, я предположил, что это проблема с часами. В моем дизайне у меня есть входные часы 27 МГц и 25 МГц. MIG-7, не позволяет пользователю назначать сгенерированные часы с внутренней PLL в качестве опорных и системных часов из-за проблемы с дрожанием. Для внешних часов минимальная входная частота должна быть 50 МГц. Но есть решение. Решение состоит в том, чтобы изменить сгенерированный IP. Спасибо всем.

person Amir    schedule 24.08.2015
comment
Я также только что наткнулся на ограничение, также упомянутое в UG586, что никакие внутренние часы не могут использоваться для MIG. Что вы подразумеваете под решением, чтобы изменить сгенерированный IP? Вам все-таки удалось заставить MIG работать с синтезированными часами или вы написали свой собственный контроллер? - person pwuertz; 04.06.2016
comment
@Amir Наконец, как вы, ребята, заставили MIG работать с синтезированными часами? - person vineeshvs; 23.12.2018