|
CDMA-коррелятор, Реализация на ПЛИС |
|
|
|
Oct 19 2013, 08:32
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Доброго времени суток. По работе возникла следующая проблема. Дали реализованный на TMS алгоритм с целью переноса его на ПЛИС XILINX XC5VSX50T. Суть в следующем: обрабатываются блоки по 32768 отсчетов; каждый такой блок подвергается некому подобию циклической свертки с ПСП на такое же кол-во отсчетов. Почему подобию? Потому, что выполняется суммирование произведений не всех 32к отсчетов, а каждых 64, затем суммы складываются. Как мне объяснили, это необходимо для борьбы с набегом фазы. Реализация сдвигового регистра с отводами на такое кол-во отсчетов требует большого объема затрачиваемых ресурсов, поэтому сам циклический сдвиг реализован на блочной памяти. Частоты позволяют повторное использование одних и тех же блоков, поэтому в каждой ячейке памяти хранится одно 512-битное слово. На первой итерации последовательно считываются все 64 таких слова и затем обрабатываются по правилу описанному выше. Кроме того, в специальный регистр заносится предыдущее считанное слово. Т.о. на следующей итерации, которая подразумевает уже циклический сдвиг всей 32к-битной последовательности на 1 бит, выбираются 512-1 бит текущего слова и 1 бит хранящегося в регистре. Для получения нужного блока из 512 бит требуется разместить "крест-накрест". В итоге на эту операцию уходит такое кол-во LUTs, что их просто не хватает. Если кто-то сталкивался с чем-то подобным или знает, как этого можно избежать, пожалуйста, отпишитесь. Заранее извиняюсь за возможно сбивчивое или неточное описание.
Сообщение отредактировал des00 - Oct 20 2013, 11:44
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Oct 20 2013, 08:54
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(Timmy @ Oct 19 2013, 19:30)  Рекомендую опубликовать код, который управляет хранением, выборкой и сдвигом данных. И сообщить, какая скорость потока данных. На первый взгляд, тут требуется LUTов совсем чуть-чуть. Код, к сожалению, сейчас на только на работе. Входные данные поступают с частотой 1.23 МГц, clk = 120 МГц. Хранение и выборка данных - два массива блочной памяти (из одного считываются данные для обработки, в другую в это время пишутся отсчеты, затем они меняются местами), адресация по счетчикам. Проблемное место именно в сдвиге. -- вектор-указатель, изначально заполнен единичками, на каждой итерации сдвиг: Код pointer(521) <= '0'; pointer(520 downto 0) <= pointer(521 downto 1) -- цикл выборки for i in 0 to 511 loop if(pointer(i) = '1') then I_a(i) <= douta0_I(curr_num) xor PRS_I(i); -- douta0_I - выход памяти, PRS_I - выход ROM, где хранится PRS, curr_num = (i+it_num) mod 512; -- it_num - номер итерации сдвига, меняется от 0 до 511. else I_a(i) <= out_buff_I(curr_num) xor PRS_I(i); -- out_buff_I - тот самый регистр, хранящий предыдущее считанное значение. end if; end loop; аналогично формируются еще 3 компоненты, т.к. при перемножении 2-х квадратурных сигналов получаются 4 компоненты.
Сообщение отредактировал des00 - Oct 20 2013, 11:44
|
|
|
|
|
Oct 20 2013, 15:05
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(Timmy @ Oct 20 2013, 18:47)  Без полного кода не вполне понятно, но, похоже, сдвиг вы выполняете через мультиплексирование 512 по (512 в 1), так, конечно, никаких лутов не хватит. Возможно, это следствие прямого переноса алгоритма из Си. Да что-то такое и получается, судя по RTL-схеме. Да, алгоритм сишный, его использовали на TMS, но потребовалось уменьшить время его выполнения. Просто алгоритм обкатанный, попросили реализовать именно его, естесственно распараллеливая выполнение. А что вы можете порекомендовать исправить? Хотя бы в общих словах.
|
|
|
|
|
Oct 20 2013, 20:34
|
Знающий
   
Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515

|
Цитата(Tausinov @ Oct 20 2013, 19:05)  Да что-то такое и получается, судя по RTL-схеме. Да, алгоритм сишный, его использовали на TMS, но потребовалось уменьшить время его выполнения. Просто алгоритм обкатанный, попросили реализовать именно его, естесственно распараллеливая выполнение. А что вы можете порекомендовать исправить? Хотя бы в общих словах. Я рекомендую почитать про архитектуру разных КИХ фильтров на FPGA. На эту тему вроде есть аппноты у Альтеры и Ксайлинкса, или ещё можно нагуглить много всякой всячины, у меня в своё время не было с этим проблем. Ваш фильтр, вроде, похож на обычный КИХ фильтр, и можно использовать похожую архитектуру с некоторыми нюансами.
|
|
|
|
|
Oct 24 2013, 08:30
|
Частый гость
 
Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795

|
Цитата(Corner @ Oct 23 2013, 21:33)  Для начала нужно два блока памяти: в один по кольцу пишутся данные в другом ROM с константами. Вам придется сделать их 8-ми ассоциативными. И на второе автомат выборки и перемножения с накоплением. Вроде все. Можно чуть подробнее, не очень понятна идея.
|
|
|
|
|
Nov 1 2013, 16:21
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 23-06-05
Пользователь №: 6 251

|
Цитата(Tausinov @ Oct 24 2013, 12:30)  Можно чуть подробнее, не очень понятна идея. Corner все правильно советует  Через двух портовую память. Поток входных данных пишется циклически через один порт, а через второй порт читаете по нужным адресам и обрабатываете данные. Если в двух словах. По ресурсам займет копейки.
Сообщение отредактировал ilyge - Nov 1 2013, 16:25
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|