两个主组件控制同一个从设备(地址分配),Intel Quartus Prime Platform Designer (Qsys)

Two master components controlling same slave (address assignation), Intel Quartus Prime Platform Designer (Qsys)

我正在做一个使用DE1-SoC(FPGA + ARM cortex A9)的项目。可以看到一部分设计(Qsys,platform designer)here

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

这个项目的基本思路是FPGA配置好后,应该可以向片上内存写入数据,zpc_1读取内容内存并对其进行处理。

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

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

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

2. zpc_1能读到第一个字,并按照first中的说明继续工作词,可能是什么原因?

如果您需要更多信息来回答问题and/or问题不够清楚理解,请随时询问更多信息(评论)。

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

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

现在答案:

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

A1: 你可以根据需要定义另一个相对于自定义主组件的地址偏移量,并从该地址偏移量开始读取(我使用了图中的0x00000000) .地址应在每个周期递增 0x40 (64) 以逐字读取数据,正如@Unn 评论的那样。

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

A2: 原因是slave(Single port RAM)无法通过single port同时正确响应两个master,用dual port RAM代替解决问题。