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

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

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

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

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


person delviewtravian    schedule 27.09.2019    source источник
comment
Я провел дополнительное исследование и начал моделировать свою проблему на стороне PL. Я записываю следующие данные в BRAM: addra: 0x00 Data: 0xAAAAAAAA addra: 0x01 Data: 0xBBBBBBBB addra: 0x02 Data: 0xCCCCCCCC ... addra: 0x08 Data: 0x11111111 Теперь мой 256-битный вывод читает: addrb: 0x00 Data: 0x. ……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… .... 11111111 Так что все как я ожидал. Это оставляет меня с проблемой, как я получаю доступ к адресам 0x01, 0x02, 0x03 со стороны PS с помощью AXI ??? Моя программа просто кренится, когда я обращаюсь к адресу, отличному от n * 0x04   -  person delviewtravian    schedule 27.09.2019
comment
Вот мое решение этой проблемы: я создал модуль vhdl, который сдвигает вход вправо на два бита (деление / 4) и помещает его между адресом, выходящим из контроллера bram, и самим устройством bram. Теперь я могу получить доступ ко всей BRAM из PS с шагом 0x04   -  person delviewtravian    schedule 07.10.2019


Ответы (1)


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

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

Например, мой движок AXI DMA имеет шину данных шириной 128. В адресном порту все еще есть:

output logic  [31:0] m_axi_awaddr,

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

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

person Oldfart    schedule 27.09.2019
comment
addrb управляется PL. Он имеет ширину 5 бит, поэтому максимальное количество доступных вариантов - 32. Но моя память - 256 бит * 32. Так что я не вижу другого пути ... Я уже пробовал добавить +1 на стороне PL, и это кажется нормальным. Если я: Xil_Out32 (BASE_ADDR + 0, 0xFFFFFFFF) Xil_Out32 (BASE_ADDR + 4, 0xAAAAAAAA) Xil_Out32 (BASE_ADDR + 8, 0xBBBBBBBB) Xil_Out32 (BASE_ADDR + 16, 0xCCCCCCCC) Я получаю addrb 0x00: 0x000000000000000000000000AAAAAAAA000000000000000000000000FFFFFFFF 0x01: 0x000000000000000000000000CCCCCCCC000000000000000000000000BBBBBBBB Я думаю, что вы ВЕ к адресации AXI, которую я могу передать - person delviewtravian; 27.09.2019
comment
воспроизвести ... На 32-битной стороне ввода моего брама мне нужно сделать +4, чтобы перейти к следующему 32-битному (AXI-адресация) - person delviewtravian; 27.09.2019