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

 
 
 
Reply to this topicStart new topic
> Как работать с 4-ым циклоном на двух фронтах на высокой частоте?
iiv
сообщение Jul 16 2011, 15:27
Сообщение #1


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Всем привет,

помогите еще раз пожалуйста, не могу разобраться упираюсь ли я в теоретический пик, или есть какое-то решение...

Есть оцифровщик, который валит по 8 лвдс на ужасной скорости данные. Надо их собрать и распараллелить, послав по 56 ногам, но, уже в 3.5 раза медленнее. Хочу потренироваться на кошках, то есть, например, на одной терасиковской борде DE2.

У оцифровщика есть два клока: фрейм и дата клоки, фрейм работает на частоте Х по двум фронтам, а дата клок - на скорости Х*3.5 по двум фронтам. В пике Х=125МГц, сейчас мои кошки тренируются на Х=800/7МГц, то есть около 114МГц при датаклоке 400МГц.

Пытаюсь скомпилить функцию, и не вписываюсь по Fast 1200mV Minimum Pulse Width со слаком в -0.4нс, в Slow все в порядке.
Понимаю, что если уронить частоту до 98МГц, то все получиться, но вдруг можно работать на большей частоте? У меня и так оцифровщик на 125МГц расчитан, и для меня падение с 125 до 98 МГц уже будет существенным. Вдруг я что-то не так делаю, не так с данными по двум фронтам работаю, и что-то не понимаю, посоветуйте, пожалуйтса!

Код
module Input(ClkFrame, ClkData, In, ClkFirst, OutData);
input             ClkFrame /*800/7MHz*/, ClkData /*400MHz*/, ClkFirst /*800/7MHz output clock*/;
input      [7:0]  In /* input data on both fronts with 400MHz*/;
output reg [13:0] OutData[0:3] /* output data on both fronts with 800/7MHz */;

// Memory ////////////////////////////

reg  [2:0] ShiftInd[0:7];
reg  [2:0] OutPos;
reg  [1:0] InPos;

reg [55:0] FIFO1[0:3], FIFO2[0:3];
reg [13:0] AllIn[0:7];
reg [55:0] AllInDM[0:3];
reg        OldState0, OldState1;

// Main Activity ////////////////////


initial
begin
   ShiftInd[0]=5;
   ShiftInd[1]=4;
   ShiftInd[2]=1;
   ShiftInd[3]=1;
   ShiftInd[4]=1;
   ShiftInd[5]=1;
   ShiftInd[6]=1;
   ShiftInd[7]=6;
end


always @(posedge ClkFirst)
begin
   OutPos<=OutPos+1;
   {OutData[0], OutData[1], OutData[2], OutData[3]}<=(OutPos[0])?FIFO1[OutPos[2:1]]:FIFO2[OutPos[2:1]];
end


always @(negedge ClkData)
begin
   for(int j=0; j<8; j++)
   begin
     AllIn[j][0]<=In[j];
     for(int i=0; i<14; i+=2)
       AllIn[j][i+2]<=AllIn[j][i];
   end
   if(ClkFrame!=OldState0)
   begin
     OldState0<=ClkFrame;
     AllInDM[0]<={AllIn[0], AllIn[2], AllIn[4], AllIn[6]};
     AllInDM[2]<=AllInDM[0];
   end
end


always @(posedge ClkData)
begin
   for(int j=0; j<8; j++)
   begin
     AllIn[j][1]<=In[j];
     for(int i=1; i<14; i+=2)
       AllIn[j][i+2]<=AllIn[j][i];
   end
   if(ClkFrame!=OldState1)
   begin
     OldState1<=ClkFrame;
     AllInDM[1]<={AllIn[1], AllIn[3], AllIn[5], AllIn[7]};
     AllInDM[3]<=AllInDM[1];
   end
end


always @(negedge ClkFrame) FIFO1[InPos]<=AllInDM[2];


always @(posedge ClkFrame)
begin
   FIFO2[InPos]<=AllInDM[3];
   InPos<=(InPos)?InPos+1:ShiftInd[OutPos];
end
endmodule


Спасибо

ИИВ
Go to the top of the page
 
+Quote Post
VladimirB
сообщение Jul 17 2011, 08:50
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



Цитата(iiv @ Jul 16 2011, 19:27) *
Всем привет,
помогите еще раз пожалуйста, не могу разобраться упираюсь ли я в теоретический пик, или есть какое-то решение...

А вы смотрели, что вам Кактус нагенерил из вашего платформенно-независимого кода?
Найдите в Кактусе аналог ксилинковского FPGAEditor и посмотрите - солидные люди, помнится, мне утверждали, что оно есть в Кактусе.

Я обычно, для достижения максимальной производительности хилых спартанов, вручную вставляю IDDR, ODDR примитивы в код.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Jul 17 2011, 20:12
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



1. С какого перепугу Вы решили, что будет работать на 400 МГц по двум фронтам? Вот где об этом написано в даташите? Если быть более точным, то там совсем другие данные приводятся. Например, о том, что DDR стандарты имеют порядка 200 МГц всего, см. страницу 1-3 книжки по C4.
2. Можно просто устроить ввод данных на высокой частоте, вдвое большей, чем частота линии данных. Тогда задачка будет тривиальной. Вводится поток в регистр сдвига, который потом раз в N тактов переписывается в параллельный регистр, а из него в такой же регистр, но уже тактируемый на уменьшенной частоте. Попробуйте так сделать, результат Вас удивит. Частота IO может быть поднята до 400 МГц запросто для I/O, а для true LVDS аж до 840 МГц, но я не уверен, что на 840 может что-то внутри кристалла дергаться. Но на 400 будет шевелиться все на любом спидгрейде.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Jul 18 2011, 04:41
Сообщение #4


Знающий
****

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



Приём данных на такой частоте требует заведения клока через PLL/DLL с внутренним фидбэком в режиме компенсации задержки на clock tree.
Входные регистры обязательно надо описывать через специализированные DDR примитивы. И задать констрейны для setup/hold входных данных. Судя по тому, что Вы получили ошибку только на частоту клока, это сделано не было, иначе ошибок было бы гораздо большеsm.gif.
Кстати, если на 4 циклоне, как на третьем, нет встроенных IO DDR регистров, то с вашей задачей он не справится. Из лоукостов на 400 DDR LVDS точно специфицированы Lattice ECP2 и ECP3.
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 20 2011, 16:34
Сообщение #5


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Дорогие коллеги,

спасибо Вам большое, что отвечаете и не оставляете меня одного с этой незадачкой.

Цитата(Hoodwin @ Jul 18 2011, 01:12) *
1. С какого перепугу Вы решили, что будет работать на 400 МГц по двум фронтам? Вот где об этом написано в даташите? Если быть более точным, то там совсем другие данные приводятся. Например, о том, что DDR стандарты имеют порядка 200 МГц всего, см. страницу 1-3 книжки по C4.


Я не нашел 200МГц в главе 1-3 по С4, но на странице 359 в таблице 1-24 для моего EP4CE115 со 7-мым спидгрейтом приводится внутренняя частота в 437МГц. Далее на странице 365 в таблице 1-34 частота чесного ЛВДСа для моего кристалла приведена как 402.5МГц. Из этого я сделал вывод, что вытащить параллельно по каждому фронту данные можно хотя бы по 402.5МГц овой частоте, а, если потом демуксить, пайплайнить, то получу то, что мне надо. Действительно, у меня не наблюдается слаков в Slow 0-85С на 402МГцовой частоте по двум фронтам, но есть слак по ШИМу в Fast 0С. Вот это-то мне и кажется странным, так как, как я понимаю, это характеризует что-то, что не проходит по внутренней частоте, но недостаток в знании и пользовании квартусом не позволяет мне определить где именно происходит затык. На частоте в ДДР 344МГц слаков нет вообше, но мне очень хочется работать на большей частоте именно на этом кристале и без привлечения какой бы то ни было дополнительной промежуточной электроники.

Цитата(Hoodwin @ Jul 18 2011, 01:12) *
2. Можно просто устроить ввод данных на высокой частоте, вдвое большей, чем частота линии данных. Тогда задачка будет тривиальной. Вводится поток в регистр сдвига, который потом раз в N тактов переписывается в параллельный регистр, а из него в такой же регистр, но уже тактируемый на уменьшенной частоте. Попробуйте так сделать, результат Вас удивит. Частота IO может быть поднята до 400 МГц запросто для I/O, а для true LVDS аж до 840 МГц, но я не уверен, что на 840 может что-то внутри кристалла дергаться. Но на 400 будет шевелиться все на любом спидгрейде.

убедительно прошу Вас посмотреть внимательнее на то, что у меня в стартовом топике, там именно то, что Вы написали - демукс в 7 раз, передача на 57МГц всего в пайплайн, и вытаскивание данных из пайплайна по 114МГц по широкому каналу.

Переписал по совету VladimirB все через мегафункцию altddio_in, к сожалению, с частотой ничего не изменилось, правда уменьшилось использование лутов.

Чтоб быть не голословным, аттачу весь проект как есть, возможно, так будет проще показать мою проблему. Вдруг кто-то мне что-то сможет посоветовать, буду Вам премного благодарен!

Спасибо

ИИВ

PS: редактировал, так как забыл аттачмент
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 20 2011, 17:14
Сообщение #6


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



К вечеру честно не осилил прочитать такой объем слов...
Я так понимаю, что суть вопроса изначально в том, чтоб принять данные на 800МГц по lvds и дальше их прогнать через DDR по срезу/фронту тактовой 400, а потом каким-то образом дальше обработать? Если так, то я сейчас лопачу данные на 1000МГц и тактовой в 500Мгц правда на стратиксе 4. Для этих целей использую altlvds_in. Все работает вроде без проблем.
Единственное, для сериализации на два я не смог задать сдвиг клока относительно данных, чтоб тактовая попадала точно в окно данных (у меня там нет возможности подстройки) и пошел немного по другому пути. Советую убедиться, что Ваш клок сдвинут относительно данных на 90 градусов на gate моделировании и после компиляции в отчете фиттера не было игнорирования о сдвиге. Задайте в timequest входной клок и убедитесь, что сгенерированный клок от функции altlvds относительно исходного сдинут на 90 градусов...
PS Можно, кстати, и не заморачиваться с моделированем, а просто в timequest в report path проследить задержку от пина данных до ddio и от пина клока до pll а потом от pll до ddio. Чтоб правильно все работало требуется опять же убедиться, что тактовая сдвинута относительно данных на 90 градусов.

Сообщение отредактировал bogaev_roman - Jul 20 2011, 17:23
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 20 2011, 20:24
Сообщение #7


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Спасибо Вам, Роман,
за Ваши советы и комментарии!

Цитата(bogaev_roman @ Jul 20 2011, 23:14) *
Я так понимаю, что суть вопроса изначально в том, чтоб принять данные на 800МГц по lvds и дальше их прогнать через DDR по срезу/фронту тактовой 400, а потом каким-то образом дальше обработать?


примерно да, но с ньюансами, а именно, на 3-ем стратиксе, 3-ем циклоне с 6-ым спидгрейтом - все ок, то есть можно работать на частоте данных 437МГц по обоим фронтам (мне это и надо), а на 4-ом циклоне с 7-мым спидгрейтом квартус ругается на любые частоты выше 344МГц...

Про идею со сдвигом - очень классно, что Вы напомнили, спасибо. Так как клок задается вместе с данными, и он уже сдвинут как надо, а мой внутренний PLL клок развязан с ним по FIFO, то проблем, как я понимаю, не должно быть.

Цитата(bogaev_roman @ Jul 20 2011, 23:14) *
PS Можно, кстати, и не заморачиваться с моделированем, а просто в timequest в report path проследить задержку от пина данных до ddio и от пина клока до pll а потом от pll до ddio. Чтоб правильно все работало требуется опять же убедиться, что тактовая сдвинута относительно данных на 90 градусов.


простите, покорнейше, начинающего, вот попросил я timequest в report path показать задержку от всех пинов лвдса до выхода ddio и получил таблицу: Total, Incr, RF, Type, Fanout.... Скажите, пожалуйста, а где находится эта задержка и туда ли я смотрю?

Спасибо

ИИВ
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 21 2011, 10:43
Сообщение #8


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

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(iiv @ Jul 21 2011, 00:24) *
вот попросил я timequest в report path показать задержку от всех пинов лвдса до выхода ddio и получил таблицу: Total, Incr, RF, Type, Fanout.... Скажите, пожалуйста, а где находится эта задержка и туда ли я смотрю?

total - суммарная задержка, соответственно можно проследить весь путь сигнала хоть по элементам (location), начинается все с определенного пина, затем проход через ioibuf, затем ddioincell. Ну и цифры там показывают сколько набегает задержек на каждом элементе и их связях. Если считаете, что у Вас изначально тактовая и данные смещены как надо, то задержка до элемента ddio данных и тактовой должна быть примерно одинаковой и так для каждого DDR регистра с погрешностью.
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 21 2011, 12:20
Сообщение #9


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Добрый день, Роман,

благодарю Вас за, как всегда, исчерпывающие ответы!

Цитата(bogaev_roman @ Jul 21 2011, 16:43) *
...Если считаете, что у Вас изначально тактовая и данные смещены как надо, то задержка до элемента ddio данных и тактовой должна быть примерно одинаковой и так для каждого DDR регистра с погрешностью.


посмотрел, примерно половина (0.7нс против 1.66) и все одинаково по всем ногам. С этим вроде разобрался, огромное Вам за это спасибо!

Остается вопрос, который у меня был изначально - что я делаю не так, что абсолютно одинаковый проект на EP4CE115F29C7 показывает только 344МГц по двум фронтам, в то время как тот же проект без слаков компилится для EP3C25F324C6 на частоте 437МГц. Уж больно большая разница в 25% при переходе с 3 циклона 6-ого спидгрейда на 4-тый циклон 7-мого спидгрейда, которую я нигде не смог подтвердить по документации...

Спасибо

ИИВ
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 22 2011, 03:54
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(iiv @ Jul 21 2011, 06:20) *
Остается вопрос, который у меня был изначально - что я делаю не так, что абсолютно одинаковый проект на EP4CE115F29C7 показывает только 344МГц по двум фронтам, в то время как тот же проект без слаков компилится для EP3C25F324C6 на частоте 437МГц. Уж больно большая разница в 25% при переходе с 3 циклона 6-ого спидгрейда на 4-тый циклон 7-мого спидгрейда, которую я нигде не смог подтвердить по документации...

не пойму вашего удивления, сыклоны 3/4 сделаны на одной архитектуре (лишние 5 нан не в счет) + у с4 меньше питания ядра (помните, что при разгоне процев повышают напряжение) и у альтеры чем меньше цифра, тем быстрее чип (в порядке убывания скорости, в пределах одного семейства c5 > c6 > c7 > c8)


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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