Перейти к содержанию
    

Quartus 13.1 и Fast Output Register

Добрый день Уважаемые посетители форума.

Столкнулся с тем, что Quartus отказывается размещать выходные сигналы в Fast Output Register.

Ситуация в следующем:

Есть адресная линия SDR SDRAM. Для выполнения времянок, пришлось все выходные сигналы размещать в Fast Output Register, для того чтобы был задействован dealy_chain (специальный блок, позволяющий управлять задержкой сигнала. Активируется только в том случае, если выходной сигнал проходит через Fast Output Register).

Адресная линия описывается следующим образом:

    --======================================================
   -- Мультиплексор адресов SDRAM
   --======================================================
   addres_mux_proc : process(all)
   begin
       A_mux <= (others => '-');                                                          -- По умолчанию адрес безразличен (оставим на откуп синтезатору)
       if (SDRAM_init_status = '1') then                                                  -- Если память в состоянии инициализациии
           A_mux <= A_init;                                                               -- Адрес берём от контроллера инициализации  
       else
           case cmd_mux is                                                                -- Анализируем команды памяти от контроллера команд
               when activate   =>                                                         -- Если у нас подается команда активации строки
                                   A_mux <= addr_row_capture;                             -- Значит берем адрес с регистра-защелки адреса строки
               --================================================================================
======================================================
               when write_cmd  =>                                                         -- Если у нас подается команда записи в память
                                   A_mux(colums_width - 1 downto 0) <= addr_col_capture;  -- То берём адрес столбца с регистра-защелки адреса столбца
                                   A_mux(10)                        <= A10_bank_conrol;   -- Бит А(10) берём от контроллера комманд
               --================================================================================
======================================================
               when read_cmd   =>                                                         -- Если  у нас подается  команда чтения из памяти
                                   A_mux(colums_width - 1 downto 0) <= addr_col_capture;  -- То берём адрес столбца с регистра-защелки адреса столбца
                                   A_mux(10)                        <= A10_bank_conrol;   -- Бит А(10) берём от контроллера  комманд
               --================================================================================
======================================================
               when others     =>  A_mux <= (others => '-');                              -- В остальных случаях нам безразличто состояние адреса (оставим на откуп синтезатору)
           end case;
       end if;
   end process;

 

Затем у меня в контроллере SDRAM есть настройка, что если мне необходимо задействовать Fast Input\Output Register то все выходные сигналы проходят через регистр. И затем я в Quartus уже назначаю, что эти регистры это Fast Input\Output Register.

    --================================================================================
==============
   -- Если у нас включены входные\выходные fast input\output регистры
   -- Пропускаем выходные сигналлы через дополнительные регистры.
   -- Данным регистрам в Assigment editor (Quartus) назнчаем тип fast input или fast output
   --================================================================================
==============
   FAST_INOIT_ENABLE : if (fast_input_output_reg = "Enable") generate 
       process(sdram_clk) 
       begin
           if (rising_edge(sdram_clk)) then
               sdram_ras_n      <= cmd_mux(2);                       
               sdram_cas_n      <= cmd_mux(1);
               sdram_wren_n     <= cmd_mux(0);
               BA               <= addr_bank_capture;                
               A                <= A_mux; 
               DQML             <= DQM(0);
               DQMH             <= DQM(1);
               cas_lat_done_reg <= cas_lat_done;
               DQ_buff          <= wr_data_capture; 
           end if;
       end process;
       DQ     <= DQ_buff when (sdram_ras_n & sdram_cas_n & sdram_wren_n  = write_cmd)  else (others => 'Z'); -- В зависимости от подаваемой команды переключаем Z буффер
   end generate;

Однако при синтезе Quartus выдает сообщение:

Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[0] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[0]" into I/O pin "sdram_addr[0]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[0]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[1] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[1]" into I/O pin "sdram_addr[1]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[1]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[2] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[2]" into I/O pin "sdram_addr[2]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[2]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[3] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[3]" into I/O pin "sdram_addr[3]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[3]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[4] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[4]" into I/O pin "sdram_addr[4]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[4]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[6] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[6]" into I/O pin "sdram_addr[6]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[6]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[7] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[7]" into I/O pin "sdram_addr[7]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[7]" cannot simultaneously use clear and load signals.
Warning (176225): Can't pack node PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_controller
_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTPUT_BU
F
FER_comp|A[8] to I/O pin
Warning (176279): Can't pack register node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[8]" into I/O pin "sdram_addr[8]". The node "PIP_controller_TOP_PLL:PIP_controller_TOP_PLL_comp|PIP_controller:PIP_contr
oller_comp|sdram_controller:sdram_controller_comp|INPUT_OUTPUT_BUFFER:INPUT_OUTP
U
T_BUFFER_comp|A[8]" cannot simultaneously use clear and load signals.

Иными словами: Quartus перелопатил всю логику, и по-своему развел триггеры, защелкивающие адрес. При этом он задействовал входы триггера синхронной загрузки, и синхронного сброса, которые физически отсутствуют в Fast Input\Output Register, из-за чего не может выходы адреса разместить в Fast Input\Output Register. :wacko:

Вот как с ним бороться ? Ибо времянка как раз не сходится на одном из адресных выходов, который не размещён в Fast Input\Output Register.

Я пытался принудительно атрибутами синтеза заставить его разместить сигналы в Fast Input\Output Register. Не хочет :crying:

 

UPD

 

Нашел решение, не очень красивое, но работает.

Суть проблемы в том, что у меня есть назначение:

A_mux <= A_init;

Где A_init - это некая константа, которая формируется в зависимости от настроек контроллера SDRAM, и нужна только один раз во время его инициализации;

Оказалось, что данную константу Quartus пытался получить задав начальную инициализацию триггерам, которые я хотел разместить в Fast I\O. Для инициализации этой константы Quartus как раз и задействовал управляющие входы, которые отсутствуют в Fast I\O.

Для решения этой проблемы я в модуле, формирующем эту константу, принудительно записал её в регистр, который назвал iA.

Для, того, чтобы Quartus в процессе оптимизации не удалил этот регистр, хранящий константу, я задал атрибуты синтеза:

    attribute PRESERVE		     : boolean;
   attribute ALTERA_ATTRIBUTE	 : string;
   signal iA : std_logic_vector(row_width - 1 downto 0);                   -- Шина адреса, через которую программируется SDRAM       
   attribute PRESERVE of iA	 : signal is TRUE;

И теперь проблема решена, вся шина адреса размещается в Fast I\O, времянка сходится.

Было бы интересно услышать альтернативное решение проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попробовать атрибут KEEP поставить на A_Mux.

Да действительно, данный атрибут тоже помогает.

Данный атрибут можно наложить на сигнал - константу - в моем случае это A_init.

Спасибо за совет !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...