分享一次FPGA与ARM通过GPMC接口通信的测试案例,所用开发板为创龙TL437xF-EVM,该板搭载TI AM437x ARM Cortex-A9处理器与Xilinx Spartan-6 FPGA,具体连接与测试过程所示。
1、 本测试程序通过FPGA模拟GPMC内存设备,使其在Linux系统中相当于外部存储器。利用GPMC总线进行数据读写时,只需调用mmap函数将物理地址映射至用户空间,之后便可像访问普通内存一样直接读写,操作简便高效,提升了数据传输的灵活性与实时性。
2、 进入开发板文件系统中的/opt目录,运行命令./set_flash_fpga_pin.sh以初始化FPGA程序加载功能所对应的管脚配置,确保后续操作正常进行。
3、 运行指定命令以启动FPGA程序加载功能,通过ARM处理器经SPI总线将gpmc.bit文件写入FPGA。执行脚本flash_fpga.sh后,系统会输出运行状态信息。若打印结果显示FPGA_DONE的值为1,则表明.bit文件已成功加载至FPGA并准备就绪,可进行后续操作。
4、 该.bit文件用于实现FPGA与ARM之间的GPMC通信,相关.bit文件、.mcs文件及源代码均存放于FPGA光盘的DemoappGPMC目录中,便于查阅与使用。
5、 将ARM光盘中Demoappdevmem2/bin目录下的内存读写工具可执行文件devmem2复制到开发板文件系统的任意路径。该工具通过mmap机制将物理地址映射为进程的虚拟地址,随后对映射后的虚拟地址进行读写操作,实现对硬件寄存器或内存区域的直接访问,便于调试与开发。
6、 在 devmem2 文件所在目录执行命令,对目标地址进行读写操作:Target ./devmem2 0x10000001 0x10000000 0x12。
7、 该命令用于向物理地址0x01000000写入一千万字节的0x12数据,随后读取以测试读写速度和错误率。读写操作通过memset和memcpy函数实现,用以评估内存访问性能与稳定性,适用于底层硬件或系统级性能验证场景。
8、 FPGA通过ARM的GPMC总线连接至CS1,起始地址为0x1000000,采用16位数据线与地址线复用模式,已配置最大访问空间为16MB。
9、 errorrate=0.0%表明读取数据与写入数据完全一致,说明GPMC通信运行正常。
10、 devmem2工具使用方法详解
11、 使用devmem2工具可检测内存的读写速度与错误率,其命令格式为:devmem2 phy_addr length type data。该命令将指定数据data写入物理地址phy_addr,长度为length字节,随后读取该段内存内容,通过比对写入与读出的数据,计算出传输速率并统计错误发生情况,从而评估内存访问性能与稳定性。
12、 每次读写操作的宽度由type参数决定,其中phy_addr为物理地址,length表示以字节为单位的读写长度。type可选值包括b、h、w、m和d。b表示每次处理8位数据;h为16位;w和d均为32位;m也按8位操作,但写入时调用memset函数,读取时使用memcpy函数。当type为b、h、w或m时,系统将输出实际读写的数据量、传输速度以及错误率;当type为d时,则输出向目标内存写入及读回的具体数值,用于验证数据一致性。该机制根据不同类型的操作需求,灵活选择数据宽度与内存操作方式,兼顾性能测试与数据正确性校验,适用于多种底层内存访问场景,确保读写过程的可控性与可观测性。
13、 data为待写入内存的32位无符号整数,实际写入时会依据读写宽度对数据进行截取。若type参数为b或m,则取data的低8位;若type参数为h,则取data的低16位;当type参数为w时,不作截取,使用data全部32位数据进行写入操作。
14、 同一物理地址在不同参数下读取结果可能不同。测试表明,采用m选项可提升读写速度。同时,读写数据长度越长,测得的速度越精确。为获得更准确性能数据,建议使用较长的数据块进行测试,以充分反映实际读写能力。
15、 结束之际,记得记录并与同行多交流。
