Имеется АЦП LTC2195. Данные Serial LVDS. Выбран режим 4-lane out. АЦП тактируется 100 Мгц. Соотвественно, клоковый сигнал DCO из неё выходит 200 Мгц, и приём должен осуществляться по 2 фронтам. ПЛИС – SPARTAN-6- 100 -3fgg484. Нужно сделать десереализацию всего этого и в итоге получить чистый 16-битный поток из параллельных данных в формате 2s.
Итак, с АЦП приходят:
DCO
DATA_A
DATA_B
DATA_C
DATA_D
FRAME
Было много метаний, а именно: попытки прянять сигнал «в лоб», по разным фронтам, попытки умножить частоту DCO и дальнейшая работа по ней и несколько ещё не очень грамотных способов приёма. Видели «плывущие» данные относительно друг друга и прочую фигню. В итоге остановились на необходимости использования связки IODELAY2 и ISERDES2. За основу был взят документ XAPP1064 (приём таких данных Спартаном 6), вариант с PLL. (Рис 1)
Рис. 1
Принимать с АЦП нужно следующее:
Рис.2
Также за основу кода были приняты примеры, которые укзаны в данном ксапе. (https://secure.xilinx.com/webreg/clickthrough.do?cid=140956).
В нём 2 основных блока – первый занимается клоком, подстройкой и контролем сдвига, второй непосредственным приёмом данных. Параметры блоков удобно настраевыемы через переменные.
Итак, на первый (клоковый) блок я подаю:
DCO (p и n)
На порт pattern – значение 1100 – (значение фрейма, когда данные с АЦП актуальны)
Сигнал bitslip для этого блока является выходным, и, согласно , документу идёт на блок приёма данных
Есть внутренние настройки – PLLX (установил 2), PLLD(установил 1), CLKIN_PERIOD = 5.000
Из данного блока выходят
RXIOCLK - основная частота (удвоена, т.к. режим, в котором работает принимающий данные ISERDES -SDR)
RX-SERDESSTROBE - строб для приёма данных
DATAIN –выходной порт, не понятно куда его девать (4 бита)
BUFFG_PLL_X1 – глобальный клок
BITSLIP- бит сдвига, выходной
Все эти сигналы являются входными для блока приёма данных (нижний блок на картинке 1)
Тут я задал основные параметры как количество входных бит данных (указал 5 – 4 данные и 1 фрейм, который я также пустил на десереализатор) и глубину десереализации – 4.
Данный блок формирует вектор data_out (20 бит) по своему алгоритму (он понятен) , в последствии я его разбираю (убираю фрейм и переставляю некоторые биты данных АЦП – они пакуются хитрым образом самой микросхемой, поэтому приходится переставлять). После этого сигнал пропускается на выход.
Не работает.
На что я сразу хотел обратить внимание – в данной реализации у меня никуда не идёт frame (т.е. в других версиях она шла на отдельный блок ISERDES+IODELAY, результатом работы этого блока был 4 битный вектор, который анализировался и использовался для формирования bitslip в блоке с данными) в данной реализации блок формирования bitslip находится в «верхнем, тактовом» блоке и как этот bitslip (а точнее, на основании чего формируется) я так и не понял. Единственное, что я ему указал в поле Pattern – это то, что данные надо подстраивать под 1100.
Собственно, вопросы:
1) Что в данной реализации я делаю неправильно?
2) Какие ещё есть варианты приёма подобных данных?
Ниже прилагаю ссылку на код основного блока.
http://files.mail.ru/7727AD63C6604CBD906067D5CD07969C
Сообщение отредактировал Art55555 - Feb 12 2013, 12:13