Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цифровая линия задержки
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
_Anatoliy
Вот возникла необходимость реализовать цифровую линию задержки данных АЦП с высоким разрешением. Тактовая частота 300МГц, максимальная задержка 200мкс, данные представляют собой четыре фазы потока от АЦП, чип Arria V. На каждую фазу ставлю двухпортовку на M10K,адреса wr/rd по 16 бит.
Код
DelayLine: process (iclk,iReset)
begin
    if (iReset = '1') then
                address_rd <= (others => '0');
        wren <= '0';
    elsif (RISING_EDGE(iclk)) then
        wren <= '1';
        address_rd <= address_rd+1;
        address_wr <= address_rd + idata_delay;
        data_wr1 <= idata_sdr_a(11 downto 0);
        data_wr2 <= idata_sdr_a(23 downto 12);
        data_wr3 <= idata_sdr_b(11 downto 0);
        data_wr4 <= idata_sdr_b(23 downto 12);
        odata_sdr_a(11 downto 0) <= data_rd1;
        odata_sdr_a(23 downto 12) <= data_rd2;
        odata_sdr_b(11 downto 0) <= data_rd3;
        odata_sdr_b(23 downto 12) <= data_rd4;
    end if;
end process;

Проблема в том что не удаётся убрать минусовые слэки между регистрами address_rd,address_wr и входными регистрами адреса памяти. Колдовство с настройками фиттера ощутимого результата не дало. Может подскажете чего,коллеги? Не хватает всего 200ps...
Timmy
Цитата(_Anatoliy @ Jul 21 2016, 10:33) *
Проблема в том что не удаётся убрать минусовые слэки между регистрами address_rd,address_wr и входными регистрами адреса памяти. Колдовство с настройками фиттера ощутимого результата не дало. Может подскажете чего,коллеги? Не хватает всего 200ps...

Очевидно, памяти используется много, отсюда большое ветвление шины адреса. Можно добавить ещё один конвейерный регистр в шину адреса, если Квартус сумеет его правильно размножить, или вручную размножить. Ещё можно тактировать память дополнительным клоком, смещённым по фазе на +200ps или побольше, при этом может не хватить запаса по выходам, тогда на выходы добавить ещё регистр.
_Anatoliy
Цитата(Timmy @ Jul 21 2016, 11:05) *
Очевидно, памяти используется много, отсюда большое ветвление шины адреса. Можно добавить ещё один конвейерный регистр в шину адреса, если Квартус сумеет его правильно размножить, или вручную размножить. Ещё можно тактировать память дополнительным клоком, смещённым по фазе на +200ps или побольше, при этом может не хватить запаса по выходам, тогда на выходы добавить ещё регистр.

Ага,спасибо! Да,памяти много - 3Mbit. Насчёт дополнительного клока уже пробую.
des00
Цитата(_Anatoliy @ Jul 21 2016, 14:33) *
На каждую фазу ставлю двухпортовку на M10K,адреса wr/rd по 16 бит.

Итого задержка 64к. Я бы раздробил на 8 каскадов 8k если у вас ария не жизель (GZ) и 4 каскада по 16к если жизель. В противном случае, на выходе есть лишние мультиплексоры. Это дополнительно ограничивает размещение на кристалле. Задержка на 8к (13 бит) для 64бит свободно разводиться на 337 на C5.
iosifk
Цитата(_Anatoliy @ Jul 21 2016, 10:33) *
Вот возникла необходимость реализовать цифровую линию задержки данных АЦП с высоким разрешением. Тактовая частота 300МГц, максимальная задержка 200мкс, данные представляют собой четыре фазы потока от АЦП, чип Arria V. На каждую фазу ставлю двухпортовку на M10K,адреса wr/rd по 16 бит.

Проблема в том что не удаётся убрать минусовые слэки между регистрами address_rd,address_wr и входными регистрами адреса памяти. Колдовство с настройками фиттера ощутимого результата не дало. Может подскажете чего,коллеги? Не хватает всего 200ps...


А если сначала данные писать в регистр двойной разрядности, сначала младшее слово, потом - старшее. А уже из этого регистра - в память... Тогда тактовая для памяти будет вдвое ниже...
Либо 2 поля памяти и писать-читать в них по-очереди...
_Anatoliy
Цитата(iosifk @ Jul 21 2016, 11:43) *
А если сначала данные писать в регистр двойной разрядности, сначала младшее слово, потом - старшее. А уже из этого регистра - в память... Тогда тактовая для памяти будет вдвое ниже...

Пока компилится с новым клоком...
Да,мысль хорошая,но тогда дискрета задержки увеличится в 2 раза,пока не готов ответить устроит или нет. Запишем резервным решением,спасибо!

Цитата(des00 @ Jul 21 2016, 11:38) *
Итого задержка 64к. Я бы раздробил на 8 каскадов 8k если у вас ария не жизель (GZ) и 4 каскада по 16к если жизель. В противном случае, на выходе есть лишние мультиплексоры. Это дополнительно ограничивает размещение на кристалле. Задержка на 8к (13 бит) для 64бит свободно разводиться на 337 на C5.

Тоже хорошая мысль и без потери дискретности,спасибо!

С дополнительным клоком сразу не получилось,сдвинул фазу на 330 градусов(-30) - слэки выросли до -6 нс но уже по данным с клока RAM на основной клок. Похоже тут нужно прописывать мультициклы...
Timmy
Цитата(_Anatoliy @ Jul 21 2016, 12:35) *
С дополнительным клоком сразу не получилось,сдвинул фазу на 330 градусов(-30) - слэки выросли до -6 нс но уже по данным с клока RAM на основной клок. Похоже тут нужно прописывать мультициклы...

Дополнительный клок нужно двигать на +30, и мультициклы действительно потребуются с основного на дополнительный.
_Anatoliy
Цитата(Timmy @ Jul 21 2016, 12:51) *
Дополнительный клок нужно двигать на +30, и мультициклы действительно потребуются с основного на дополнительный.

Не,когда сделал +30 слеки по адресу выросли, дополнительный клок сместился влево. А при -30 по адресу слеки совсем пропали.
Основной клок у меня работает в обвязке, вспомогательный - только для RAM.
_Anatoliy
Отказался от дополнительного клока, как то там всё сложно оказалось, в одном месте задавишь слэки - они вылазят в другом. Было бы больше времени может и добил бы. За полчаса переделал структуру модуля как предложил des00 - даже запас появился 900 пс. Так что можно считать что проблема решена общими усилиями. Всем спасибо! А des00 - респект!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.