Доступ к Zynq BRAM из PS и PL - PullRequest
       143

Доступ к Zynq BRAM из PS и PL

1 голос
/ 27 сентября 2019

Я пытаюсь записать некоторые данные в двухпортовый BRAM и прочитать их из PL.Я создал настроенную BRAM из каталога IP и поместил ее в оболочку, чтобы использовать ее на блок-диаграмме.Ширина PORTA - 32-разрядная, а ширина PORTB - 256-разрядная.Мне нужно передать 1024 8-битных значений, поэтому глубина PORTA равна 256 (8 бит), а глубина PORTB равна 32 (5 бит).Я использую стандартный BRAM-контроллер в 32-битном режиме (глубина 2048, но это не должно иметь значения?).

Блок-схема

Для записи данных вBRAM через AXI-интерфейс я использую функцию Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF).Когда я хочу получить доступ к следующим 32-битным данным в BRAM, используйте Xil_Out32(BASE_ADDR+4, 0xFFFFFFFF).+4 потому что память выровнена по байту, верно?(Когда я использую +1, моя программа падает).

Чтобы прочитать данные из BRAM через PL, я просто помещаю адрес в addrb[4:0] и получаю свои данные двумя тактами позже из doutb[255:0].Потому что "addrb" только 5 бит, это не может быть выровнено по байту, поэтому каждый раз, когда я добавляю +1 к addrb, я получаю следующие 256 бит из BRAM, верно?.

ОК.Теперь к моей проблеме: я выполняю следующее на PS:

Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF);
Xil_Out32(BASE_ADDR+4, 0xAAAAAAAA);

и читаю адрес 0x00 на моем 256-битном выходе из PL, вывод выглядит так:

0x000000000000000000000000AAAAAAAA000000000000000000000000FFFFFFFF

Я такжеПоместите это в небольшую диаграмму, чтобы сделать ее более понятной:

Описание проблемы

Я надеюсь, что кто-то может направить меня в правильном направлении ...

1 Ответ

0 голосов
/ 27 сентября 2019

Потому что "addrb" только 5 бит, это не может быть выровнено по байту, поэтому каждый раз, когда я добавляю +1 к addrb, я получаю следующий 256-битный от Брэма, верно?.

Этот вывод слишком быстр.Это сильно зависит от того, как все ваши адресные шины подключены.Стандартно, адресная шина AXI всегда имеет биты адреса LS, даже если они никогда не используются.

Например, мой механизм AXI DMA имеет шину данных шириной 128.Адресный порт по-прежнему имеет:

output logic  [31:0] m_axi_awaddr,

Однако 4 младших бита адреса [3: 0] всегда равны нулю.Я ДОЛЖЕН увеличить свою адресную шину с шагом 16 (16 байт - 128 бит), если я хочу записать последовательные места в памяти.

Но в других местах у меня есть адаптер VGA с 8-битной BRAM шириной 8 бит, где я подключаю AXI [2] к BRAM A [0].Теперь мне нужно увеличить адресную шину с шагом 4, если я хочу записать последовательные байтовые ячейки в память BRAM.

...