【发布时间】:2019-09-27 09:22:05
【问题描述】:
我正在尝试将一些数据写入双端口 BRAM 并从 PL 中读取。 我从 IP 目录创建了一个定制的 BRAM,并将它放在一个包装器中,以便我可以在框图中使用它。 PORTA 宽度为 32 位,PORTB 宽度为 256 位。我需要传输 1024 个 8 位值,因此 PORTA 深度为 256(8 位),PORTB 深度为 32(5 位)。我在 32 位模式下使用标准 BRAM 控制器(深度为 2048,但这应该没关系?)。
要通过 AXI 接口将数据写入 BRAM,我使用函数 Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF)。当我想访问 BRAM 中的下一个 32 位数据时,使用Xil_Out32(BASE_ADDR+4, 0xFFFFFFFF)。 +4 导致内存是字节对齐的,对吧? (当我使用 +1 时,我的程序崩溃了)。
要通过 PL 从 BRAM 读取数据,我只需在 addrb[4:0] 上放置一个地址,然后在两个时钟周期后从 doutb[255:0] 获取我的数据。因为“addrb”只有 5 位,这不能是字节对齐的,所以每次我向 addrb 添加 +1 时,我都会从 BRAM 中获得下一个 256 位,对吧?
好的。现在我的问题: 我在 PS 上执行以下操作:
Xil_Out32(BASE_ADDR+0, 0xFFFFFFFF);
Xil_Out32(BASE_ADDR+4, 0xAAAAAAAA);
并从 PL 读取我的 256 位输出上的地址 0x00,输出如下所示:
0x000000000000000000000000AAAAAAAA000000000000000000000000FFFFFFFF
我还把它放在一个小图表中,以使其更清楚:
我希望有人能把我引向正确的方向......
【问题讨论】:
-
我做了一些进一步的研究并开始在 PL 端模拟我的问题。我将以下数据写入 BRAM: addra: 0x00 Data: 0xAAAAAAAA addra: 0x01 Data: 0xBBBBBBBB addra: 0x02 Data: 0xCCCCCCCC ... addra: 0x08 Data: 0x11111111 现在我的 256 位输出读取: addrb: 0x00 Data: 0x。 ....CCCCCCCCBBBBBBBBAAAAAAAAA 地址:0x01 数据:0x....................... ....11111111 所以一切都如我所料。这给我留下了一个问题,我如何使用 AXI 从 PS 端访问地址 0x01、0x02、0x03 ???当我访问与 n*0x04 不同的地址时,我的程序崩溃了
-
这是我对这个问题的解决方案:我创建了一个 vhdl 模块,它将输入右移两位(除 / 4)并将其放在 bram 控制器的地址输出和 bram 本身之间。现在我可以以 0x04 的增量从 PS 访问整个 BRAM