1

我正在使用 DE1-SoC(FPGA + ARM cortex A9)做一个项目。你可以在这里看到设计的一部分(Qsys,平台设计者)

片上存储器(RAM、image_memory)由两个不同的主控器控制。其中一个主模块是众所周知的h2f_lw_axi_master(由 Quartus Prime 软件提供,使 ARM 和 FPGA 数据交换成为可能),另一个zpc_1是我设计的自定义主模块。

这个项目的基本思想是,FPGA配置完成后,应该可以将数据写入片上存储器,zpc_1读取存储器的内容并对其进行操作。

每个字的长度为 512 位(64 字节),共有 1200 个字(因此分配的地址从0x0002_0000开始,到0x0003_2bff结束,足够的空间用于 76800 = (512 * 1200) /8 字节。hps 使用 uint512_t (来自 boost 库c++) 类型数据写入和 zpc_1 的 readdata 宽度为 512 位。地址是相对于h2f_lw_axi_master分配的。

我有两个关于这个系统的问题。

1 、 zpc_1 HDL代码中读取数据的地址是否应该从0x20000偏移开始,每个周期递增0x40(64)来逐字读取数据?(或任何其他方法)

2. zpc_1能够读取第一个字,并按照第一个字的指示连续工作,可能是什么原因?

如果您需要更多信息来回答问题和/或问题不够清楚以至于无法理解,请随时询问更多信息(评论)。

4

1 回答 1

1

问题是当其中一个主控与从属交互时,从属没有正确允许另一个主控(在协议中有一个名为“waitrequest”的信号,我没有正确使用该信号,当我使用它时该信号正确地,奴隶总是发送 waitrequest 这也帮助我调试问题)。

尝试了如图所示的双端口 RAM, 并通过正确使用“waitrequest”信号修改了组件,一切都开始正常工作。

现在答案:

Q1:zpc_1 HDL代码中读取数据的地址是否应该从0x20000偏移开始,每个周期递增0x40(64)来逐字读取数据?(或任何其他方法)

A1:您可以根据需要定义相对于自定义主组件的另一个地址偏移量,并从该地址偏移量开始读取(我使用的是 0x00000000,如图所示)。地址应在每个周期递增 0x40 (64) 以逐字读取数据,如 @Unn 注释。

Q2:zpc_1 能够读取第一个字,并按照第一个字的指示连续工作,可能是什么原因?

A2:原因是slave(Single port RAM)无法通过单口同时正确响应两个master,换成双口RAM即可解决。

于 2018-09-18T06:14:47.953 回答