реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Quartus 13.1 и Fast Output Register, Отказывается размещать сигналы в эти регистры.
Flip-fl0p
сообщение Jun 13 2018, 07:51
Сообщение #1


В поисках себя...
****

Группа: Свой
Сообщений: 691
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Добрый день Уважаемые посетители форума.
Столкнулся с тем, что Quartus отказывается размещать выходные сигналы в Fast Output Register.
Ситуация в следующем:
Есть адресная линия SDR SDRAM. Для выполнения времянок, пришлось все выходные сигналы размещать в Fast Output Register, для того чтобы был задействован dealy_chain (специальный блок, позволяющий управлять задержкой сигнала. Активируется только в том случае, если выходной сигнал проходит через Fast Output Register).
Адресная линия описывается следующим образом:
CODE
--======================================================
-- Мультиплексор адресов 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.
CODE
--================================================================================
==============
-- Если у нас включены входные\выходные 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 выдает сообщение:
CODE
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.gif
Вот как с ним бороться ? Ибо времянка как раз не сходится на одном из адресных выходов, который не размещён в Fast Input\Output Register.
Я пытался принудительно атрибутами синтеза заставить его разместить сигналы в Fast Input\Output Register. Не хочет crying.gif

UPD

Нашел решение, не очень красивое, но работает.
Суть проблемы в том, что у меня есть назначение:
Код
A_mux <= A_init;

Где A_init - это некая константа, которая формируется в зависимости от настроек контроллера SDRAM, и нужна только один раз во время его инициализации;
Оказалось, что данную константу Quartus пытался получить задав начальную инициализацию триггерам, которые я хотел разместить в Fast I\O. Для инициализации этой константы Quartus как раз и задействовал управляющие входы, которые отсутствуют в Fast I\O.
Для решения этой проблемы я в модуле, формирующем эту константу, принудительно записал её в регистр, который назвал iA.
Для, того, чтобы Quartus в процессе оптимизации не удалил этот регистр, хранящий константу, я задал атрибуты синтеза:
CODE
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, времянка сходится.
Было бы интересно услышать альтернативное решение проблемы.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Jun 18 2018, 08:06
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 832
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Можно попробовать атрибут KEEP поставить на A_Mux.
Go to the top of the page
 
+Quote Post
Flip-fl0p
сообщение Jun 18 2018, 08:31
Сообщение #3


В поисках себя...
****

Группа: Свой
Сообщений: 691
Регистрация: 11-06-13
Из: Санкт-Петербург
Пользователь №: 77 140



Цитата(Timmy @ Jun 18 2018, 11:06) *
Можно попробовать атрибут KEEP поставить на A_Mux.

Да действительно, данный атрибут тоже помогает.
Данный атрибут можно наложить на сигнал - константу - в моем случае это A_init.
Спасибо за совет !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th August 2018 - 06:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01017 секунд с 7
ELECTRONIX ©2004-2016