【问题标题】:Access Zynq BRAM from PS and PL从 PS 和 PL 访问 Zynq BRAM
【发布时间】: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,但这应该没关系?)。

Block Diagram

要通过 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

我还把它放在一个小图表中,以使其更清楚:

Problem Description

我希望有人能把我引向正确的方向......

【问题讨论】:

  • 我做了一些进一步的研究并开始在 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

标签: memory fpga xilinx zynq


【解决方案1】:

因为“addrb”只有 5 位,这不能字节对齐,所以每次我向 addrb 添加 +1 时,我都会从 bram 获得下一个 256 位,对吧?

这个结论有点太快了。这在很大程度上取决于所有地址总线的连接方式。标准 AXI 地址总线始终具有 LS 地址位,即使它们从未使用过。

例如,我的 AXI DMA 引擎具有 128 宽的数据总线。地址端口还有:

output logic  [31:0] m_axi_awaddr,

但是,底部 4 个地址位 [3:0] 始终为零。如果我想在内存中写入连续的位置,我必须以 16 步(16 字节为 128 位)递增地址总线。

但在其他地方,我有一个带有 8 位宽 4K 深 BRAM 的 VGA 适配器,我将 AXI[2] 连接到 BRAM A[0]。 现在,如果我想在 BRAM 存储器中写入连续的字节位置,我必须以 4 步递增地址总线。

【讨论】:

  • addrb 由 PL 驱动。它是 5 位宽,所以最大可用选项是 32。但我的内存是 256 位 * 32。所以我看不到另一种方式......我已经尝试在 PL 端添加 +1,这似乎很好。如果我做的: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 0×01:0x000000000000000000000000CCCCCCCC000000000000000000000000BBBBBBBB我觉得你是reffering到 AXI 寻址,我可以表示
  • reproduce ... 在我的 bram 的 32 位输入端,我必须 +4 才能进入下一个 32 位(AXI 寻址)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多