Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Aletra, Qsys, работа двух dma-котроллеров с одной памятью
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
novartis
Набросал в qsys такую систему: pcie, on-chip memory, два dma controller. Прикрепил картинку
Нажмите для просмотра прикрепленного файла.

Если контроллеру 0 дать задание перекачивать большой объем данных, например, из памяти в pcie, а контроллеу 1 в это время давать маленькие команды тоже на перекачку данных из памяти в pcie, не возникнут ли конфликты и как будет осуществляться работа такой системы? контроллеры будут получать доступ к памяти по очереди (в рамках своих burst пакетов) или кто первый начал качать данные, тот и будет их качать, пока все не выкачает?
alexadmin
Цитата(novartis @ Dec 20 2014, 17:30) *
контроллеры будут получать доступ к памяти по очереди (в рамках своих burst пакетов) или кто первый начал качать данные, тот и будет их качать, пока все не выкачает?


По очереди. Есть арбитраж, настраивается через arbitration shares - сколько подряд транзакций может выполнить каждое устройство.
novartis
Спасибо за ответ!

Решил все таки посмотерть, как это будет работать в живую.
PCIE не стал использовать, заменил ее на Nios.
Собрал такую систему:
Нажмите для просмотра прикрепленного файла

dma_0 и dma_1 настроены одинаково:
length - 14 bit
enable burst transfers
maximum burst size (words) - 128
data transfer fifo depth - 32

ram1 и ram2 настроены одинаково:
ширина слова 8 бит
размер памяти 4096 байт

В ниосе набросал исходный код на си.
Настроил сигналтап, запасся попкорном.

Вылезла следующая проблема.
Выставляю dma_0 размер транзакции 256 байт.
То есть в его регистр length по адресу 0x3 записываю 256.
В регистре control (адрес 0x6) выставляю работу по-байтно, с прерыванием, с ожиданием обнуления регистра length.
Стартую контроллер.
Прерывание не приходит.

Делаю тоже самое, но с меньшим length, например 255, все срабатывает.

Вот картинка из сигналтапа при 256:
Нажмите для просмотра прикрепленного файла
Вот картинка из сигналтапа при 255:
Нажмите для просмотра прикрепленного файла


Посмотрел в qsys на сигналы dma. Сигнал burstcount шириной 8 бит. Значит его максимальное значение 255.

Получается при length=255 чтение происходит с burstcount=255, и чтение происходит всех 255 слов.
А при length=256 в восьмибитной шине burstcount все нули (что и видно в сигналтапе), и производится чтение 1 слова (что и видно в сигналтапе).
После этого дма подвисает, больше он ничего не вычитывает, сигнал done не выставляется.

Это вообще нормально?? Я предполагал, что dma_controller должен разбить заданный блок на порции не больше maximum burst size слов. И в случае с length=256 сначала должен был сформироваться пакет на чтение 255 слов, а потом еще пакетик на чтение 1 слова. А тут сразу маленький пакетик 05.gif .




des00
вы уверенны что birstsize не равен burst_length-1 ? обычно так делают.
novartis
Да я не про это писал. Я к тому, что задаю, например, для дма отправить 300 байт, он 300-256 = 44 байта отправляет и висит.
novartis
Спасибо за ссылку, как я понял, они там описывают проблему с дма и предлагают ее решить, задавая размер блока дма кратным размеру burst.
Попробовал так сделать - не помогло.

Стал копать альтеровскую Knowledge Base > Browse Knowledge Base, нашел такую ссылку:
http://www.altera.com/support/kdb/solution...032006_770.html

Цитата
Title
When I enable burst for the SOPC Builder DMA component, why are some of my DMA transfers truncated or stalled?
Description
For the SOPC Builder DMA component when burst transfers are enabled, the maximum amount of data that can be transferred is limited to the maximum burst transfer length (The Burst Transactions “Maximum Burst Size” setting in the DMA parameters tab). For a width N of burstcount, the maximum burst length is 2(N-1).

Any transfers larger than the maximum burst count length are truncated by the DMA component and may stall the DMA burst transfer operation.

Workarounds:
1) Increase the DMA component’s “Maximum Burst Size” words to be greater than the largest DMA transfer length that will be used in your system. The maximum burst size value must be a power of 2.
2) Limit the DMA transfers to be no larger than the “Maximum Burst Size” setting in the DMA parameters tab.

Note: This issue only affects the SOPC Builder DMA component when burst is enabled. This does not affect the DMA in non-burst mode.

All versions of the DMA controller are affected by this burst issue.


Нехилый такой косяк. Подсунули бяку maniac.gif .

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.