Flip-fl0p 4 13 июня, 2018 Опубликовано 13 июня, 2018 · Жалоба Добрый день Уважаемые посетители форума. Столкнулся с тем, что 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, времянка сходится. Было бы интересно услышать альтернативное решение проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 18 июня, 2018 Опубликовано 18 июня, 2018 · Жалоба Можно попробовать атрибут KEEP поставить на A_Mux. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 18 июня, 2018 Опубликовано 18 июня, 2018 · Жалоба Можно попробовать атрибут KEEP поставить на A_Mux. Да действительно, данный атрибут тоже помогает. Данный атрибут можно наложить на сигнал - константу - в моем случае это A_init. Спасибо за совет ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться