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

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.

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


Ссылка на сообщение
Поделиться на другие сайты
Можно попробовать атрибут KEEP поставить на A_Mux.

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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация