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

 
 
> нужен совет по реализации Asynchronous FIFO
lutik
сообщение Oct 31 2005, 10:40
Сообщение #1


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

Группа: Свой
Сообщений: 128
Регистрация: 30-06-04
Из: Odessa
Пользователь №: 216



Доброго дня уважаемым.
Трабла возникла с реализацией Asynchronous FIFO, такого рода:
особенностью является то, что жить будет оно в xc2s100-5 с высокой для ентого чипа частотой - 108MHz по записи и не особо высокой - 25MHz по чтению.
Флаги Пуст/Полон выставляю по следующим условиям
empty <= '1' when (rptr = wptr) else '0';
full <= '1' when ( (wptr - rptr) >= (DEPTH -2) ) else '0';
и далее перевожу их в каждый клок домен отдельно.
empty - в домен чтения, full - в домен записи.

в симуляции все нормально, но синтезатор, ЗАРАЗА, убивает всю времянку со стороны записи. Оно и понятно - сумматор и сравнение в комдинаторике дело не быстрое.

Може кто присоветует другие алгоритмы формирования флагов или ваще как-то по другому fifo это сделать а то замучился совсем.

PS. варианты со счетчиками в коде Грея не предлагать - спартан медленный и 8-ми разрядный счетчик Грея сам по себе не синтезируется на нужную времянку


--------------------
однако..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
USTAS
сообщение Oct 31 2005, 14:16
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 46
Регистрация: 27-09-04
Пользователь №: 731



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

Тогда:

WNR = ( WR & ~RD); // только запись
RNW = (~WR & RD); // только чтение
EMPTY = ~noEMPTY; // флаг "FIFO пусто"

always @ (posedge WCLK)
begin
if (FLUSH) COUNT = 0; // очистка FIFO
else case (1'b1)
WNR: COUNT = COUNT + 1;
RNW: COUNT = COUNT - 1;
endcase
end

always @ (posedge WCLK)
begin
if (FLUSH) noEMPTY = 0;
else if ((COUNT == 0) & WNR) noEMPTY = 1;
else if ((COUNT == 1) & RNW) noEMPTY = 0;
end

always @ (posedge WCLK)
begin
if (FLUSH) FULL = 0;
else if ((COUNT == (DEPTH - 1)) & WNR) FULL = 1;
else if ((COUNT == (DEPTH - 0)) & RNW) FULL = 0;
end
Go to the top of the page
 
+Quote Post



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

 


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


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