我试图将一些数据写入双端口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
我也将其放在一个小图中,以使其更清楚:
我希望有人能让我朝着正确的方向...
答案 0 :(得分:0)
因为“ addrb”只有5位,所以不能按字节对齐,因此每次我向+1添加+1时,我都会从bram获取下一个256位,对吧?。
这个结论有点太快了。这在很大程度上取决于您所有地址总线的连接方式。标准的AXI地址总线始终具有LS地址位,即使它们从未使用过。
例如,我的AXI DMA引擎具有128宽数据总线。地址端口仍具有:
output logic [31:0] m_axi_awaddr,
但是,后4个地址位[3:0]始终为零。如果要在内存中写入连续的位置,我必须以16为步长递增地址总线(16个字节为128位)。
但是在其他地方,我有一个VGA适配器,它具有8位宽的4K深BRAM,我将AXI [2]连接到BRAM A [0]。 现在,如果要在BRAM存储器中写入连续的字节位置,则必须以4为步长递增地址总线。