Я пытаюсь записать данные в двухпортовый 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
Я также поместил это в небольшую диаграмму, чтобы было понятнее:
Я надеюсь, что кто-то может направить меня в правильном направлении ...