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

 
 
> CDMA-коррелятор, Реализация на ПЛИС
Tausinov
сообщение Oct 19 2013, 08:32
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
Timmy
сообщение Oct 19 2013, 15:30
Сообщение #2


Знающий
****

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



Рекомендую опубликовать код, который управляет хранением, выборкой и сдвигом данных. И сообщить, какая скорость потока данных. На первый взгляд, тут требуется LUTов совсем чуть-чуть.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Oct 20 2013, 08:54
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Timmy
сообщение Oct 20 2013, 14:47
Сообщение #4


Знающий
****

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



Без полного кода не вполне понятно, но, похоже, сдвиг вы выполняете через мультиплексирование 512 по (512 в 1), так, конечно, никаких лутов не хватит. Возможно, это следствие прямого переноса алгоритма из Си.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Oct 20 2013, 15:05
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795



Цитата(Timmy @ Oct 20 2013, 18:47) *
Без полного кода не вполне понятно, но, похоже, сдвиг вы выполняете через мультиплексирование 512 по (512 в 1), так, конечно, никаких лутов не хватит. Возможно, это следствие прямого переноса алгоритма из Си.

Да что-то такое и получается, судя по RTL-схеме. Да, алгоритм сишный, его использовали на TMS, но потребовалось уменьшить время его выполнения. Просто алгоритм обкатанный, попросили реализовать именно его, естесственно распараллеливая выполнение.
А что вы можете порекомендовать исправить? Хотя бы в общих словах.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Oct 20 2013, 20:34
Сообщение #6


Знающий
****

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



Цитата(Tausinov @ Oct 20 2013, 19:05) *
Да что-то такое и получается, судя по RTL-схеме. Да, алгоритм сишный, его использовали на TMS, но потребовалось уменьшить время его выполнения. Просто алгоритм обкатанный, попросили реализовать именно его, естесственно распараллеливая выполнение.
А что вы можете порекомендовать исправить? Хотя бы в общих словах.
Я рекомендую почитать про архитектуру разных КИХ фильтров на FPGA. На эту тему вроде есть аппноты у Альтеры и Ксайлинкса, или ещё можно нагуглить много всякой всячины, у меня в своё время не было с этим проблем. Ваш фильтр, вроде, похож на обычный КИХ фильтр, и можно использовать похожую архитектуру с некоторыми нюансами.
Go to the top of the page
 
+Quote Post
Corner
сообщение Oct 23 2013, 17:33
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Для начала нужно два блока памяти: в один по кольцу пишутся данные в другом ROM с константами. Вам придется сделать их 8-ми ассоциативными. И на второе автомат выборки и перемножения с накоплением. Вроде все.
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Oct 24 2013, 08:30
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 135
Регистрация: 19-10-13
Пользователь №: 78 795



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

Можно чуть подробнее, не очень понятна идея.
Go to the top of the page
 
+Quote Post
ilyge
сообщение Nov 1 2013, 16:21
Сообщение #9


Участник
*

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



Цитата(Tausinov @ Oct 24 2013, 12:30) *
Можно чуть подробнее, не очень понятна идея.


Corner все правильно советует sm.gif
Через двух портовую память. Поток входных данных пишется циклически через один порт, а через второй порт читаете по нужным адресам и обрабатываете данные. Если в двух словах. По ресурсам займет копейки.

Сообщение отредактировал ilyge - Nov 1 2013, 16:25
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:27
Рейтинг@Mail.ru


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