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

 
 
 
Reply to this topicStart new topic
> Гуру ХДЛ, проясните про FIFO, Как правильно обрабатывать флаги?
des00
сообщение May 30 2005, 04:28
Сообщение #1


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

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



Добрый день!.
Мне в проекте потребовалось использовать модуль синхронного FIFO (т.е. у клок), вроде бы ничего сложно, но т.к. раньше такого не делал, возникла заминка.
Для начала сгенерировал в альдеке то что они предлагают использовать и использовав их код в качестве референсного немного его переписал. Т.к. они в качестве указателей пользуют integer range и обрабатывают его переполнение, я заменл это на std_logic_vector и убрал обработку(это дало код, который синтезатор исе лучше "понял", если судить по его отчету).
Но при симууляции возникили вопросы:
Флаги empty & full в коде регистровые, т.е. сигнал на выходе появляеься на такт позже управляющих сигналов (одновременно с записью/чтением РАМ).
поэтому в тестбенче, который моделирует синхронный модуль, с которого информация пишеться в фифо, и синхронный модуль который читает фифо, происходит "перегрузка".
Например при глубине в 8 чисел, делаеться попытка писать в фифо 9 (строб записи 9 тактов), А при чтении модуль читает 9 чисел, вместо 8.
Эту проблему можно решить если сделать флаги empty&full не регистровыми или ввести дополнительную асинхронную логику в синхронные блоки. Можно усложнить блок управление фифо - например ввести сигнал ошибки записи. (как в апноте от ксайлинкса).
И мой вопрос: Как лучше сделать ?? Просто не хочеться терять много времени на экспиременты.

ЗЫ. Сильно не пинайте если что smile.gif


--------------------
Go to the top of the page
 
+Quote Post
andrew_b
сообщение May 30 2005, 04:35
Сообщение #2


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(des00 @ May 30 2005, 08:28)
Для начала сгенерировал в альдеке

Почему не в CoreGen?
Go to the top of the page
 
+Quote Post
des00
сообщение May 30 2005, 04:41
Сообщение #3


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

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



Цитата(andrew_b @ May 29 2005, 23:35)
Цитата(des00 @ May 30 2005, 08:28)
Для начала сгенерировал в альдеке

Почему не в CoreGen?
*



Core Cen пользует готовые макросы и примитивы , а я хочу научиться писать на языке так, что бы все синтезировалось в то, как было задумано, с помошью правильно написанного кода и атрибутов smile.gif
И я хочу понять принцип, все таки флаги должны быть регистровыми, или асинхронными.


--------------------
Go to the top of the page
 
+Quote Post
Кнкн
сообщение May 30 2005, 05:54
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 646
Регистрация: 21-06-04
Пользователь №: 71



Цитата(des00 @ May 30 2005, 07:41)
И я хочу понять принцип, все таки флаги должны быть регистровыми, или асинхронными.


Можно посмотреть статейки о FIFO тут
http://www.sunburst-design.com/papers/
Go to the top of the page
 
+Quote Post
andrew_b
сообщение May 30 2005, 05:54
Сообщение #5


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(des00 @ May 30 2005, 08:41)
И я хочу понять принцип, все таки флаги должны быть регистровыми, или асинхронными.

http://forum.electronix.ru/index.php?showtopic=3197 ?
Go to the top of the page
 
+Quote Post
oleg_rudakov
сообщение May 30 2005, 06:04
Сообщение #6


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

Группа: Свой
Сообщений: 136
Регистрация: 26-07-04
Из: Europe
Пользователь №: 387



Есть негласный стандарт при проектировании ASIC и FPGA: все, что касается памяти, делать на имеющихся на кристалле ресурсах (hardcore macroses). IBM ASIC Design Group проводила исследование по поводу эффективности применения регистровой памяти (а здесь именно этот тип и получится) при построении FIFO/LIFO. Так вот, до 256 байт - можно. Существенной деградации производительности и ресурсозатрат не проиходит. Все, что свыше этого - только с помощью ядер (аппаратаных примитивов типа BlockRAM у XILINX). Как-то очень давно, роясь в XILINX DataSheets, прочитал прямое указание использовать исключительно BlockRAM для генерации FIFO вместо HDL-inferred.

Нельзя ли уточнить, каковы причины использования Inferred RAM вместо применения готовых и оптимизированных ресурсов?
Go to the top of the page
 
+Quote Post
des00
сообщение May 30 2005, 06:21
Сообщение #7


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

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



Цитата(oleg_rudakov @ May 30 2005, 01:04)
Есть негласный стандарт при проектировании ASIC и FPGA: все, что касается памяти, делать на имеющихся на кристалле ресурсах (hardcore macroses). IBM ASIC Design Group проводила исследование по поводу эффективности применения регистровой памяти (а здесь именно этот тип и получится) при построении FIFO/LIFO. Так вот, до 256 байт - можно. Существенной деградации производительности и ресурсозатрат не проиходит. Все, что свыше этого - только с помощью ядер (аппаратаных примитивов типа BlockRAM у XILINX). Как-то очень давно, роясь в XILINX DataSheets, прочитал прямое указание использовать исключительно BlockRAM для генерации FIFO вместо HDL-inferred.

Нельзя ли уточнить, каковы причины использования Inferred RAM вместо применения готовых и оптимизированных ресурсов?
*


Причины как я уже указал, в том, что хочу научиться писать на хдл, без применения black box, там где это возможно, например с помощью констрейна RAM_STYLE можно уложить память описанную на хдл, туда куда нужно.
А насчет distributed ram если нужен фифо на 16 слов, зачем пользовать 2 килобайтный блок ? ?)

Цитата(andrew_b @ May 30 2005, 00:54)
Цитата(des00 @ May 30 2005, 08:41)
И я хочу понять принцип, все таки флаги должны быть регистровыми, или асинхронными.

http://forum.electronix.ru/index.php?showtopic=3197 ?
*



спасибо, знакомлюсь

Цитата(andrew_b @ May 30 2005, 00:54)
Цитата(des00 @ May 30 2005, 08:41)
И я хочу понять принцип, все таки флаги должны быть регистровыми, или асинхронными.

http://forum.electronix.ru/index.php?showtopic=3197 ?
*



Вопрос по пдф, xapp131, рисунок Figure 2: 511 x 8 Synchronous FIFO
у меня получаються точно такиеже осцилограммы, за одним исключением на рисунке 2 строб записи прерываеться одновременно с установлением сигнала full. У меня в в тест бенче процесс записи:
Код
process (clk) is
....
begin
.....
if (rising_edge(clk)) then
 if (full /= '1') then
    write_allow <= '1';
 else
    write_allow <= '0';
  end if;
.............


и строб записи перекрывается с full на такт sad.gif(


--------------------
Go to the top of the page
 
+Quote Post
oleg_rudakov
сообщение May 30 2005, 06:27
Сообщение #8


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

Группа: Свой
Сообщений: 136
Регистрация: 26-07-04
Из: Europe
Пользователь №: 387



Цитата(des00 @ May 30 2005, 09:16)
Цитата(oleg_rudakov @ May 30 2005, 01:04)
Есть негласный стандарт при проектировании ASIC и FPGA: все, что касается памяти, делать на имеющихся на кристалле ресурсах (hardcore macroses). IBM ASIC Design Group проводила исследование по поводу эффективности применения регистровой памяти (а здесь именно этот тип и получится) при построении FIFO/LIFO. Так вот, до 256 байт - можно. Существенной деградации производительности и ресурсозатрат не проиходит. Все, что свыше этого - только с помощью ядер (аппаратаных примитивов типа BlockRAM у XILINX). Как-то очень давно, роясь в XILINX DataSheets, прочитал прямое указание использовать исключительно BlockRAM для генерации FIFO вместо HDL-inferred.

Нельзя ли уточнить, каковы причины использования Inferred RAM вместо применения готовых и оптимизированных ресурсов?
*


Причины как я уже указал, в том, что хочу научиться писать на хдл, без применения black box, там где это возможно, например с помощью констрейна RAM_STYLE можно уложить память описанную на хдл, туда куда нужно.
А насчет distributed ram если нужен фифо на 16 слов, зачем пользовать 2 килобайтный блок ? ?)
*



Действительно, для указанного объема памяти использовать 2 Кб ресурсов не следует. До 256 байт - вполне подойдет регистровая память. Об этом я писал выше.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение May 30 2005, 06:41
Сообщение #9


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(des00 @ May 30 2005, 10:16)
А насчет distributed ram если нужен фифо на 16 слов, зачем пользовать 2 килобайтный блок ? ?)

А какая вам разница? Если есть лишний блок памяти, почему бы его не использовать?

Про диаграммы: может, ошибка?
Go to the top of the page
 
+Quote Post
des00
сообщение May 30 2005, 06:45
Сообщение #10


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

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



Цитата(andrew_b @ May 30 2005, 01:41)
Цитата(des00 @ May 30 2005, 10:16)
А насчет distributed ram если нужен фифо на 16 слов, зачем пользовать 2 килобайтный блок ? ?)

А какая вам разница? Если есть лишний блок памяти, почему бы его не использовать?

Про диаграммы: может, ошибка?
*



Да нет, похоже я начинаю немного "въезжать" после прочтения пдф и мои логические рассуждения оправдываються glare.gif :

The Empty flag is set when either the fifocount is zero, or when the fifocount is one and only a
Read is being performed. This early decoding allows Empty to be set immediately after the last
Read. It is cleared after a Write operation (with no simultaneous Read). Similarly, the Full flag
is set when the fifocount is 255, or when the fifocount is 254 and only a write is being
performed. It is cleared after a Read operation (with no simultaneous Write).

т.е. похоже что флаги действительно имеют латентность в 1 такт и это нужно учитывать, либо более ранним выставлением флагов, либо дополнительной обработкой снаружи фифо.


--------------------
Go to the top of the page
 
+Quote Post
BSV
сообщение May 30 2005, 19:50
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045



У Xilinx'а есть несколько xapp'ов, посвященных реализации синхронных (один клок на чтение и на запись) и асинхронных (разные клоки) FIFO на блочной и распределенной памяти, смотрите на их сайте (там есть и исходники для разных вариантов).
Флаги лучше применять регистровые - положительно скажется на частоте.

Кстати, исходники там довольно корявые (если их творчески переработать с использованием generate и констант в разрядности шин - они получаются более компактными и их легче модифицировать для разных задач). К сожалению с глубиной (особенно для асинхронных FIFO) все не так просто, поскольку для генерации флагов там применяются счетчики Грея.


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
des00
сообщение May 31 2005, 03:55
Сообщение #12


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

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



Цитата(BSV @ May 30 2005, 14:50)
Флаги лучше применять регистровые - положительно скажется на частоте.
*

информацию с сайта ксайлинкса изучаю.
А насчет флагов у меня и был вопрос, о том, как учитывают задержку флагов на такт.


--------------------
Go to the top of the page
 
+Quote Post
Genn
сообщение Jun 1 2005, 17:36
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 48
Регистрация: 14-04-05
Пользователь №: 4 146



Цитата(des00 @ May 31 2005, 06:55)
Цитата(BSV @ May 30 2005, 14:50)
Флаги лучше применять регистровые - положительно скажется на частоте.
*

информацию с сайта ксайлинкса изучаю.
А насчет флагов у меня и был вопрос, о том, как учитывают задержку флагов на такт.
*




Задержку флагов не учтешь: событие, о котором сигнализирует флаг, увы, произошло на такт раньше. Но вообще ничего страшного здесь нет, этот флаг вполне можно использовать, например, если темп поступления входных данных, а именно строб WE идет со скважностю >= 2. В этом случае установка флага как раз соответсвует времени записи нового слова. Если же запись данных производится непрерывными блоками (сигнал WE установлен более чем на один такт), то в этом случае надо пользоваться флагами, соответствующими неполному заполнению FIFO.
Go to the top of the page
 
+Quote Post
des00
сообщение Jun 2 2005, 03:53
Сообщение #14


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

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



Цитата(Genn @ Jun 1 2005, 12:36)
Задержку флагов не учтешь: событие, о котором сигнализирует флаг, увы, произошло на такт раньше. Но вообще ничего страшного здесь нет, этот флаг вполне можно использовать, например, если темп поступления входных данных, а именно строб WE идет со скважностю >= 2. В этом случае установка флага как раз соответсвует времени записи нового слова. Если же запись данных производится непрерывными блоками (сигнал WE установлен более чем на один такт), то в этом случае надо пользоваться флагами, соответствующими неполному заполнению FIFO.
*


Спасибо за короткий и понятный ответ. smile.gif
Вы окончательно утвердили мои сомнения.


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

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 08:05
Рейтинг@Mail.ru


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