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

 
 
> Cyclone3, DDR2 и АЦП, Проблема
djhall
сообщение Aug 2 2013, 09:03
Сообщение #1


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

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



Здравствуйте,
возникла у меня довольно странная проблема.
Есть плата собственного производства, на ней установлены Cyclone3, память DDR2 и АЦП. Задача - по нажатию кнопки в программе на компьютере сохранить данные от АЦП в памяти и затем передать их в компьютер. Это реализовано с использованием прямого доступа к памяти и FIFO. Работает хорошо, но сделано это было в Quartus 9.0 и Nios IDE, т.е. без eclipse.
Сейчас использую Quartus 12.1sp1. Открываю старый проект перегенерю систему в SOPC Builder, компелирую в Quartus, компелирую программу в Eclipse, прошиваю - не работает. А точнее всё запускается, програма переходит в нужную подпрограмму и зависает в ожидании окончания DMA.
Причём проделал такой эксперимент взял старый старые и новые .sof и .elf и попытался перекомбинировать старое с новым, чтобы понять где ошибка (т.к. базовые адреса в SOPC не менялись я подумал, что так можно делать). Результат - хорошо работает только старые .sof и .elf любые другие комбинации работаю плохо и либо зависают при первом же нажатии на кнопку получения данных или через короткое время.

В чём может быть проблемма? Может какие нибудь особенности нового Quartus или Eclipse и они как-то по другому компилируют?

P.S. Т.е. получается, что на старой прошивке ПЛИС новая программа работает плохо. Т.е. дело в компиляторе программы. Хотя это тоже очень странно ведь программа только инициализирует DMA и запускает приём данных, а далее данные записываются в память минуя процессор. Так почему же он зависает ведь прошивка старая - работающая?

Сообщение отредактировал djhall - Aug 2 2013, 10:03
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
krux
сообщение Aug 9 2013, 18:02
Сообщение #2


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

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



если говорить про SGDMA то суть в следующем:
под дескрипторы берется onchip_ram
прикидываете сколько дескрипторов поместиться в вашей onchip_ram
делаете uncached_malloc() столько раз, сколько у вас есть дескрипторов
Составляете связанный список из дескрипторов, собираете дескрипторы в цепочку alt_avalon_sgdma_construct_stream_to_mem_desc()
запускаете SGDMA.

при этом начинает заполнятся первый кусок памяти, выделенный через uncached_malloc(). сразу после - второй, и т.д. DMA-операция продолжается до тех пор, пока всё выделенное пространство не быдет записано. После записи каждого куска выделенной памяти можно настроить выдачу прерывания. После этого нужно "перезарядить" DMA при помощи alt_avalon_sgdma_construct_stream_to_mem_desc(), и снова стартануть.

Другой вариант, - при формировании цепочки дескрипторов их можно "закольцевать", и запустить DMA, при этом DMA-запись не будет останавливаться вообще никогда. Тут важно успевать что-то делать с данными пока они не будут перезаписаны следующкей порцией приходящих данных.


зы. за одну операцию запуска можно передать гораздо больше чем 64k


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post



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

 


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


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