|
|
  |
Баг альтеравской FFT корки, Странное поведение в режиме Variable streaming |
|
|
|
Aug 1 2013, 12:13
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227

|
Всем доброго времени суток! Столкнулся с проблемой- при генерации FFT корки (пробовал в версиях Quartus 11-13) в режиме Variable streaming и представлении данных типа floating point, появляется интересная вещь: при интервале между входными пакетами меньшем, чем длина самого пакета, первый выходной пакет имеет нормальный вид, а дальше все пакеты идут повреждёнными. На линии source valid появляется провал длительностью в один такт, на расстоянии от начала пакета равному интервалу между пакетами. После такого провала, линия valid поднимается в '1' и держится так ещё N тактов, где N - число точек преобразования. Дальнейшие пакеты имеют нормальную валидность, но битые данные. Если расстояние больше чем N, то всё хорошо. На форуме Altera толком ничего не нашёл. Кто либо сталкивался с таким поведением корки?
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 1 2013, 14:29
|
Участник

Группа: Свой
Сообщений: 59
Регистрация: 9-06-05
Из: Киев
Пользователь №: 5 857

|
Цитата(R6L-025 @ Aug 1 2013, 15:13)  Дальнейшие пакеты имеют нормальную валидность, но битые данные. А что такое валидность? Вообще, если посмотреть по картинке, с авалоном будто бы всё в порядке, пакеты выдаются/принимаются как положено, ерроры в нулях. Битые данные на выходе могут быть от нарушения целостности данных на входном порту. А провалы source_valid это нормально. А что на входе fftpts?
|
|
|
|
|
Aug 8 2013, 20:50
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227

|
Разрешилась проблема. Оказалось действительно дело в корке. Такое поведение будет наблюдаться при включённом режиме natural order, при типе данных floating point . При выходе из бабочки порядок битов отличен от прямого, для исправления ситуации в корке есть отдельный блок. В нём входной пакет как есть записывается в память, а потом считывается в определённом порядке, восстанавливая прямой порядок отсчётов. Я в описании к корке заметок на этот счёт не нашёл, но если подавать новые данные раньше, чем через N тактов, записанный в буфер пакет не успевает обработаться, и поверх него начинает перезаписываться новый + сам генератор адреса записи/чтения написан так, что при непредвиденном валиде он начинает выдавать неправильный адрес. В качестве решения я создал 2 отдельных компонента блока перестановки, а для разрешения порядка их работы - арбитр. Правда платить за это пришлось более большим размером буфера - вместо 2N теперь 4N 32 битных слов. Хотя , я думаю, можно прицепить и внешнюю память, тут обработка уже выходных данных и доп. задержка не должна сказаться на результате.
|
|
|
|
|
Aug 8 2013, 21:00
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(R6L-025 @ Aug 8 2013, 23:50)  Разрешилась проблема. Оказалось действительно дело в корке. Скорее в ее использовании. Цитата Я в описании к корке заметок на этот счёт не нашёл, но если подавать новые данные раньше, чем через N тактов, записанный в буфер пакет не успевает обработаться, и поверх него начинает перезаписываться новый + сам генератор адреса записи/чтения написан так, что при непредвиденном валиде он начинает выдавать неправильный адрес. А какое поведение Вы предполагали? Запрет записи новых данных? Сброс результата? Возможно, Вам помогло бы просто сбросить все внутренние данные или саму корку FFT при опускании source valid. Просто любопытно, что можно предпринять в подобной ситуации.
|
|
|
|
|
Aug 9 2013, 04:17
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 8-04-11
Из: Ростов-на-Дону
Пользователь №: 64 227

|
На картинке в user guid нарисована ситуация, когда всё работает и с меньшими интервалами между макетами, чем N, поэтому предполагал что она будет нормально работать. Да и обычно подобные состояния, когда новые данные могут повредить старые, запрещаются интерфейсом, например можно было бы повесить сигнал busy, который бы запрещал запись. Сброс врятли бы помог, т.к. source valid опускался немного позже, чем начинали повреждаться данные. Самое простое, что можно предпринять, это подавать данные с достаточным интервалом
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|