Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 无法从Linux访问Znyq AXI BRAM_Memory_Embedded Linux_Fpga_Xilinx_Zynq - Fatal编程技术网

Memory 无法从Linux访问Znyq AXI BRAM

Memory 无法从Linux访问Znyq AXI BRAM,memory,embedded-linux,fpga,xilinx,zynq,Memory,Embedded Linux,Fpga,Xilinx,Zynq,在我的项目中,数据被写入通过块Ram IP生成器从自定义IP生成的BRAM。然后,我使用AXI BRAM控制器将内存与AXI总线连接起来,并使运行在ARM上的Linux能够访问内存 控制器的基址为0x4200_0000,范围为8K到0x4200_1FF。内存也有8K个位置,每个位置的宽度为32位 为了确保访问问题不在自定义IP中生成的数据中,我只需对每个8K地址进行编号即可初始化内存,以便地址1包含0x01等,直到0x1FF 当试图从Linux读取这些值时,就会出现问题。在命令行上使用devme

在我的项目中,数据被写入通过块Ram IP生成器从自定义IP生成的BRAM。然后,我使用AXI BRAM控制器将内存与AXI总线连接起来,并使运行在ARM上的Linux能够访问内存

控制器的基址为0x4200_0000,范围为8K到0x4200_1FF。内存也有8K个位置,每个位置的宽度为32位

为了确保访问问题不在自定义IP中生成的数据中,我只需对每个8K地址进行编号即可初始化内存,以便地址1包含0x01等,直到0x1FF

当试图从Linux读取这些值时,就会出现问题。在命令行上使用devmem 0x42000001返回0x04000000和以下内容:

对齐陷阱:devmem 1257 PC=0x0001ca94 Instr=0xe7902005地址=0xb6f9d2fd FSR 0x011

这似乎表明Linux希望每个地址值映射到一个字节,而不是一个32位的字。在devmem 0x42000004返回0x00000004(第四个方向的正确值)之前,会发生对齐陷阱,但无法访问地址(不是4的倍数)中的值。devmem 0x42000002返回0x00040000通知0x04移位和对齐陷阱。我发现了使用mmap映射/dev/mem的原始python脚本的问题:我必须读取每4个地址值,因为每个单独的地址似乎映射到一个字节,但这意味着我只能从每4个值中获取一个

关于如何正确地与AXI控制器及其背后的内存接口,您有什么想法吗

*******编辑以澄清我的问题。如有疑问,请添加图片:

这似乎表明Linux希望每个地址值映射到一个字节

这是所有现代CPU中的标准映射。当将AXI与大于8位的数据总线一起使用时,底部地址位从AXI数据总线中选择一个字节。访问ARM网站并下载AXI规范

控制器的基址为0x4200_0000,范围为8K到0x4200_1FF。内存也有8K个位置,每个位置的宽度为32位

这是错误的,32位的8K具有8K*4=0x0000的地址范围。。0x7FFF

我建议您重新构建BRAM,但对块Ram IP生成器使用不同的参数


我更改了RAM,使暴露于AXI控制器的端口以8位运行

您的Zynq AXI总线可能有32位宽。因此,一个标准连接的内存应该是32位宽的,在这里您应该启用字节写入。 如果将8位内存连接到32位总线,但没有或错误地调整地址,则可能会丢失4个字节中的3个

我不清楚的是你到底想要什么样的行为

带字节访问的标准8Kx32位内存 或 8kx8位内存,其中一个字节位于0x0、0x4、0x8等处。 在案例2中,您应该使用不同的AXI地址:您应该将地址位上移两个位置,使每个字节占据4个地址位置。 您还必须决定将字节放在何处:

仅限LS位置:将MS 24位绑定到零

仅限MS位置:将LS 24位连接到零

在所有4个位置重复:在32位上复制字节4次

你还喜欢什么。这是你的硬件,你可以做你想做的


请注意,对于连接到AXI总线的任何模块,应设置前面的AXI拆分器以覆盖正确的地址范围。但我想你没有这些

我更改了RAM,使暴露于AXI控制器的端口以8位操作,因此具有32K方向。现在,'devmem 0x42000004'返回0x00000001,'devmem 0x42000008'返回0x00000002,但'devmem 0x42000400'返回0x00000000:我不能超过0xFF,但我仍然必须读取它们。AXI总线是32位宽,不能更改这么多,我的数据和内存也是如此。这个问题是因为我无法理解它是如何运行的:我只能读取4的倍数的内存位置。如果地址0x04中的数据在我的示例中是0x01,并且有预加载的数据,但它是0x04,那就可以了。如何寻址0x03?只有执行字节读取时才能读取0x03。看起来你要读一个32位的字,它必须是字对齐的。您需要一种具有良好定义的数据类型(如C)的语言,包括uint8字节1、字节2、字节3;然而,存储在内存中的值是32位字,所以我不想读取字节,我甚至从来没有看到存储在地址中的值,而不是4的倍数。