近期项目需要实现DSP与FPGA之间的高速数据交换,用到了DM8168的GPMC接口。这部分的中文资料网上还是比较少的,于是苦苦研究芯片的数据手册和参考指南,最近终于有所成果,在Linux下调用GPMC驱动函数调通了GPMC接口,因此发出调试过程与大家分享。 在本文中,我们将深入探讨如何通过GPMC接口利用EDMA(Enhanced Direct Memory Access)进行高速数据传输,特别是在DSP(Digital Signal Processor)与FPGA(Field-Programmable Gate Array)之间的应用。GPMC(General-Purpose Memory Controller)是一个通用存储控制器,常见于TI(Texas Instruments)的DSP芯片如DM8168中,它用于与外部存储设备如NOR Flash、NAND Flash、SRAM等进行通信。 硬件连接方面,GPMC接口在DM8168中工作在125MHz的异步模式下。在这个项目中,GPMC配置为与FPGA通信,选择NOR Flash模式,但只使用16位数据线而不使用地址线,模拟FIFO(First-In-First-Out)操作。具体连接包括:GPMC_CS3作为片选信号,GPMC_OEN作为输出使能时钟,以及16位数据线D[15:0]。此外,还需要一个FIFO_RRST信号来通知FPGA重置读取指针。 在接口协议上,选择异步读取方式,不使用GPMC_CLK。数据传输在GPMC_OEN的下降沿进行,由FPGA在该时钟边沿发送数据。 在Linux环境下,DSP端的代码主要涉及GPMC和EDMA的配置。GPMC的配置涉及7个特殊寄存器,这些配置已通过Linux内核中的gpmc驱动封装成函数,可以直接调用。例如,可以定义一个`gpmc_timings`结构体来设定时序参数。在EDMA配置中,源地址和目标地址都是物理地址,源地址通常设置为不自增模式,以适应FPGA端的数据读取方式。 以下是一个简化的GPMC配置代码示例: ```c static struct gpmc_timings fpga_timings = { // ... 各种时序参数 ... }; static int gpmc_config(void) { // ... 初始化和配置步骤 ... } ``` FPGA端的代码设计需确保在GPMC_OEN下降沿到来时将16位数据传送到GPMC_DATA,并自动增加地址。 通过GPMC接口和EDMA的配合,可以在DSP和FPGA之间实现高效的数据交换。在文中提到的实例中,8KB字节的读取时间大约是235us,达到了34MB/s的传输速率。通过进一步优化GPMC接口的时序参数,这个速度还可以提高。这种方法对于需要高速数据传输的嵌入式系统设计具有很高的实用价值,尤其是在处理大量数据的实时应用中。
剩余7页未读,继续阅读
- 粉丝: 3
- 资源: 892
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助