Jump to content

    

Слаки при чтении из FIFO.

Форумчане, вечер добрый.

1) Имею на альтере асинхронный FIFO. Скорость записи ниже скорости чтения. Шина достаточно широкая = 72 бита.
2) Обратил внимание, что в зависимости от его размера (размер FIFO), получаю слаки при чтении дальше для обработки. Много потестировал, самое оптимальное, это конечно использовать всего 4 слова в FIFO. Связываю это с памятью M20K
3) Не долго думая, приходит идея, сделать некий конвеер из последовательных FIFO. Один большой, для накопления. А один маленький на 4, как раз чтобы считывать без слаков.
Соединил их, играюсь разной частотой между ними для обмена данными, а слаки как были, так и остались.

Может будет у кого какая идея, как бы это разрулить?

Пока писал, подумал, может посмотреть, где квартус размещает этот маленький буфер без слаков и назначить его потом уже руками. А дальше если появятся слаки между FIFO, дотянуть их частотой.

 

Заранее спасибо за любые мысли

Edited by new123

Share this post


Link to post
Share on other sites

Если скорость записи меньше скорости чтения то FIFO постоянно пустое. И логично что часть запросов на чтение не выполняются сразу же ибо данных нет. А часть выполняется сразу как только появились данные.
Или что именно вы называете слаками?

 

Share this post


Link to post
Share on other sites
5 minutes ago, MegaVolt said:

Если скорость записи меньше скорости чтения то FIFO постоянно пустое. И логично что часть запросов на чтение не выполняются сразу же ибо данных нет. А часть выполняется сразу как только появились данные.
Или что именно вы называете слаками?

 

В квартусе есть time analyzer. Он там рассчитывает сигналы и выдает отчеты. На определенных температурах он мне выдает отрицательное значение slack. Это значит что на данной частоте данные не успевают выставиться, когда они нужны.

У меня там код банально простой. Считывается 72 бита и в завистмости от условия записываются дальше.

И вот за один такт данные не успевают считаться из фифо и записаться дальше в вектор

Share this post


Link to post
Share on other sites

Было у меня такое... IBUF в одном углу кристалла, а блок логики, к нему относящийся - в другом...

Share this post


Link to post
Share on other sites
Just now, gosha-z said:

Было у меня такое... IBUF в одном углу кристалла, а блок логики, к нему относящийся - в другом...

У меня точно также. Как то мне в одной из моих тем рассказывали про конвеер из таких фифо. Но у меня не вышло. Вот тумаю все таки руками их разместить

Share this post


Link to post
Share on other sites
5 minutes ago, new123 said:

Вот тумаю все таки руками их разместить

А есть варианты??

Share this post


Link to post
Share on other sites
1 minute ago, gosha-z said:

А есть варианты??

Я ещё ни разу так не делал. Вот прощупываю почву, как лучше и стоит ли руками указывать где разместить фифо.

Сама задача у меня простая. В одном углу логика на 156мгц, в другом на 250. Надо между ними перебросить 72бита. Если делать один фифо, то слаков нет, если размер фифо 4 слова. Все что выше, идут слаки и я их реально ощущаю на деле. Вот подумал сделать два фифо между ними. 

Share this post


Link to post
Share on other sites

Приветствую!

12 minutes ago, new123 said:

У меня точно также. Как то мне в одной из моих тем рассказывали про конвеер из таких фифо. Но у меня не вышло. Вот тумаю все таки руками их разместить

Фантазировать на тему что там не так можно долго. Надо бы конкретику - какая частота чтения, что за корка фифо, с какими параметрами сгенеренное, как чтение управляется, что на выходе фифо подключено, и.т.д...  Только анализируя всю цепочку где слак появился  можно решат что делать. 

 

Удачи! Rob.

 

 

Share this post


Link to post
Share on other sites

1) Архитектурно выглядит вот так. Рисунок 1. Это готовые IP сore от Альтеры. Мне нужно перебросить данные справа на лево вниз. UPD прошу прощение. Вырезалось слово внизу слева "принимает 256 бит"
2) Рисунок 2. Каким путем я начал двигаться. Принимать в FIFO на одной частоте. Потом на другой частоте укладывать данные в вектор (массив) на 256 бит кусками по 64. И потом я их защелкиваю на IP core слева внизу. Начал делать это все я давно. Потом я уже узнал, что можно FIFO и разной ширины настроить на выходе. Правда мне это не совсем подходит, мне там нужно вмешиваться, свои заголовки вставлять и тд.
Есть слаки в Time Analyzer. На режимах 0.9mV нет, есть на 0.85, куда я и попадаю. На температурах и -40 и 100.

Как я вижу их на деле? Если я перебрасываю за раз до 300-400 байт, все работает. Все что выше, начинается каша. Может и нормально проскочить, может и каша в данных. Например в текущие 256 бит попасть половину бит от предыдущего значения (предыдущего чтения).
На что рапортует Time Analyzer? Именно на путь данных из FIFO в этот вектор по клоку 250. Где то на 210-220 работало бы нормально. На пути этих данных стоит один case и пару 1-2 If

3) Если FIFO сделать размером 4 слова, то слаков нет. В принципе это можно объяснить память M20K, пока переключится на другой блок может. Для меня этот сайз маловат.
4) Я вспомнил, как мне тут одной из тем так же один из старейшин рассказывал, как для переброски делают конвеер из fifo, отрегулировав их частотой. Незамедлительно погуглив, а делают ли так вообще, понял что да, это решение. И после этого родился Рисунок 3. То есть суть простая, накапливать данные в большом буфере и перед логикой 250Mhz создать мини fifo сайзом 4 слова, и в него постоянно подгружать данные из большого. И уперся пока в стену, все равно рапартует о слаках. Но уже значение гораздо меньше. 

Вот думаю, может мне эти фифошки руками развести подальше и подобрать между ними частоту. Но я ни разу так не делал. 

1.png

2.png

3.png

Edited by new123

Share this post


Link to post
Share on other sites

Приветствую!

35 minutes ago, new123 said:

...
Вот думаю, может мне эти фифошки руками развести подальше и подобрать между ними частоту. Но я ни разу так не делал. 

Золотое правило лентяя - сложную работу делай медленно :biggrin:  Если есть возможность упаковывать данные на стороне записи в FIFO то это упростить цепи на стороне чтения и заодно добавив дополнительный stage регистров между источником данных и входом FIFO. Позволив разместить его ближе к получателю на стороне чтения.

 

Если "ленится" лень, то можно попробовать поставить для FIFO режим First Word Fall Thru. В этом режиме на выходе памяти FIFO обычно добавляется еще  регистр что улучшает времянку чтения. Фактически добавление маленького FIFO на выход большого делает почти то же самое. В простейшем случае такое мини FIFO делают на регистрах на 1 или 2 слова. Что также позволяет "растянуть" связи по кристаллу.

 

 Удачи! Rob.   

 

 

Share this post


Link to post
Share on other sites
10 minutes ago, RobFPGA said:

Если "ленится" лень, то можно попробовать поставить для FIFO режим First Word Fall Thru.

погуглил, это на Xilinx такая штуковина есть.

11 minutes ago, RobFPGA said:

В простейшем случае такое мини FIFO делают на регистрах на 1 или 2 слова

у альтеры к сожалению минимум 4.

Если я правильно понял, вся суть сводится к тому,  что напихать в пути чего нибудь такого, чтобы быть ближе к 250Mhz внизу. О чем я и предположил. 
Я раньше в квартусе однажды вручную назначал куда посадить pll, в какой банк. Может и с fifo такая штука прокатит. Пойду тогда вертеть

Share this post


Link to post
Share on other sites
1 час назад, new123 сказал:

погуглил, это на Xilinx такая штуковина есть.

у альтеры к сожалению минимум 4.

Если я правильно понял, вся суть сводится к тому,  что напихать в пути чего нибудь такого, чтобы быть ближе к 250Mhz внизу. О чем я и предположил. 
Я раньше в квартусе однажды вручную назначал куда посадить pll, в какой банк. Может и с fifo такая штука прокатит. Пойду тогда вертеть

И у альтеры. Называется show ahead FIFO.

show ahead.PNG

Share this post


Link to post
Share on other sites

Приветствую!

27 minutes ago, new123 said:

погуглил, это на Xilinx такая штуковина есть.

у альтеры к сожалению минимум 4.

У Альтеры это называется Show-Ahead. Хотя при конфигурации корки пишут что в этом хуже времянка, но скорее всего это из-за доп логики в цепи управления чтением, а не шины данных. Надо пробовать.

 

IMHO корка FIFO у Альтеры  на мой взгляд не изменилась со времен MaxPlusII :cray2:.  Я когда начал опять с Альтерой работать первым делом свои корки FIFO адаптировал. Чтобы не страдать так мучительно.  

 

"Подвинуть" FIFO к приемнику  можно как явно - используя place constrain, так и не явно просто добавив например 1-2 stage pipeline регистров на входах data/wr_en в FIFO. Это позволит при P&R разместить FIFO ближе к получателю. Хотя для начало все же надо смотреть  как оно сейчас размещено. А то может быть слаки все-же из-за большого числа слоев логики, а не за роутинга.  

 

Свой вариант синхронного мини FWFT FIFO на 1-2 регистра пишется просто, фактически это FSM на 2 или 4 состояния. 

 

 Удачи! Rob.

 

 

Share this post


Link to post
Share on other sites
5 minutes ago, Flip-fl0p said:

Называется show ahead FIFO,

 

4 minutes ago, RobFPGA said:

У Альтеры это называется Show-Ahead

спасибо, я подумал про него. Это мне теперь все пересимулировать надо, как то пробовал его ставить, алго обработки по другому совсем работать начинает.

Я кстати первый большой FIFO в такой режим поставил

4 minutes ago, RobFPGA said:

р 1-2 stage pipeline регистров на входах data/wr_en в FIFO

о! а тут я все тестировал по перетестировал, ставил 9 stage pipeline, сдвинул слак на 50пикосек из 600

4 minutes ago, RobFPGA said:

Хотя для начало все же надо смотреть  как оно сейчас размещено

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

Edited by new123

Share this post


Link to post
Share on other sites

Приветствую!

13 minutes ago, new123 said:

о! а тут я все тестировал по перетестировал, ставил 9 stage pipeline, сдвинул слак на 50пикосек из 600

Поэтому я и говорю что сначала надо смотреть лог крит. путей timing анализа и расположение на кристалле после P&R.  Чтобы понятно было что сколько слоев логики и что тормозить. 

 

Удачи! Rob.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now