Доброго времени суток, коллеги! Итак, есть плата PCIe на втором Циклоне (20-ка) + XIO1100. В SOPC'e (Quartus8sp1) простой проект: PCIe ядро + несколько служебных регистров + DMA + CRA + кусок памяти в 4KB. Есть две проблемы: 1. Когда осуществляется схема BAR0 -> регистры(128В) + DMA(128B) + CRA(16KB) + RAM(4KB), то нормально генерируется MSI-прерывание, как от генератора секундной метки (нужен только для проверки), так и от DMA контроллера (замешиваю их в одном из блоков и на ядро засылаю одно из двух). Но стоит мне добавить второй и т.д. BAR, чтобы вывести RAM на него, то прерывание умирает (на ядро приходит, а дальше тишина). При этом обнаружено следующее поведение регистров CRA: при нормальной работе прерывания, я сразу вижу вектор прерывания в статусном регистре (он не равен нулю), при добавлении второго BAR'a все обнуляется. На просторах сети был найден app.note 502-ой, если правильно помню, там осуществлена почти такая-же схема, только на Stratix'e, и все работает на двух BAR'ах. В чем может быть проблема? В штатной схеме будет 4 BAR'a и обойти эту засаду не получится, надо решать... После отпуска я планирую скомпилить проект в 12-ом Квартусе и посмотреть, что получится, но надежды мало... 2. При доступе к регистрам DMA через PCIe, обратно считывается только содержимое регистра write adr, все остальные в нулях и, соответственно, контроллер не работает. Нормальная работа начинается только тогда, когда я управляю DMA через свой шлюз (PCIe->slave->master->DMA). Эта проблема жить не мешает, но, интересно все-таки, почему два стандартных блока SOPC'a меж собой договориться не могут... Заранее благодарен за любой совет и указание направления поиска!
|