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

Posted

技术标签:

【中文标题】两个主组件控制同一个从设备(地址分配),英特尔 Quartus Prime Platform Designer (Qsys)【英文标题】:Two master components controlling same slave (address assignation), Intel Quartus Prime Platform Designer (Qsys) 【发布时间】:2018-09-13 13:04:53 【问题描述】:

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

片上存储器(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(来自 c++ 的 boost 库)类型数据写入,zpc_1 的 readdata 宽度为 512 位。地址分配相对于 h2f_lw_axi_master

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

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

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

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

【问题讨论】:

问题一的答案取决于您的问题中不清楚的两件事:什么是Avalon总线宽度(即writedata/readdata的位宽)以及单位是什么每个地址代表(默认情况下它的再见可寻址,但可以通过更改总线的addressUnits 属性来更改)?我不确定您在第二个问题中要问什么。 @Unn readdata 宽度为 512 位,我没有更改 addressUnits 属性。现在它是字节可寻址的,以确保我用小型测试 ram 块对其进行了检查。 @Unn 我的意思是根据zpc_1的verilog代码,它应该能够移动地址并逐个读取每个单词的内容('address 您需要将总线上的地址增加 64,而不是 1;您需要为您的zpc_1 模块发布一些代码,以查看为什么它没有从 RAM 中读取超过第一个 512 位字。 (address <= address + 'd64 应该是正确的) @Unn 感谢您的努力,问题已解决。用了双口内存,问题解决了。并按照你说的做地址。 【参考方案1】:

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

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

现在答案:

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

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

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

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

【讨论】:

以上是关于两个主组件控制同一个从设备(地址分配),英特尔 Quartus Prime Platform Designer (Qsys)的主要内容,如果未能解决你的问题,请参考以下文章

三菱Q系列PLC模拟量输入输出地址是怎样编号的

linux设备树-中断控制器驱动

基于Intel82576芯片的网卡

基于Intel 82571芯片的网卡介绍

三菱q系列plc输出怎么分配的?

什么是vrrp