Спасибо за ответ!
Решил все таки посмотерть, как это будет работать в живую.
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 слова. А тут сразу маленький пакетик

.