13041|17

74

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

BeagleBone GPMC接口读写FPGA双口RAM 高速数据采集 DDS波形发生器 [复制链接]

 
前面完成BeagleBoneNand Flash的启动,之后花了一段时间试验BeagleBone GPMC读写外部存储器,针对BeagleBoneGPMC接口扩展一块FPGA板子,基本功能就是在FPGA里做一个双口RAMBeagleBone GPMC实现对双口RAM的读写操作。当然,FPGA外挂高速ADDA,完成GPMC读写双口RAM的功能后完全可以做基于ARM+FPGA的高速数据采集及DDS波形发生器。
本文的思路主要参考一下这篇帖子:

1TI GPMC 简要说明
通用存储器控制,即用来访问外部存储器的。主要参考下《AM335x ARM ® Cortex™-A8 Microprocessors(MPUs) TechnicalReferenceManual 》该文档的7.1 GPMC

支持的外部存储器说明:
存储器类型:NORFlashlike,asynchronous and synchronous devices或者NAND Flashlike devices,stream mode
数据总线宽度:8-bits或者16-bits
地址数据总线复用情况:non-multiplexed/AD/AADAAD没见过)
同步和异步区别在于:同步需要时钟信号,异步不需要时钟信号,具体自己去体会哈。
GPMC读支持single accessmultiple access(burst if synchonous,pageifasynchronous)
,写支持Single accessMultipleaccess(burstifsynchronous,considered as singleifasynchronous)
目前Multipleaccess还没弄明白。

由于需要用GPMC读写FPGA 双口RAM,所以采用synchonous single access NOR Flashlike 16bit模式,其硬件连接示意图如下:图1:GPMC读写FPGA 双口RAM硬件连接示意图

2、试验过程
1BeagleBone通过GPMC接口读写FPGA做的双口单时钟(读写时钟共用GPMC时钟)RAM
2)高速数据采集:FPGA控制高速AD FPGA做的双口双时钟(读写时钟分开)RAM作为AD数据缓存,GPMC时钟用作RAM读时钟,FPGA PLL输出时钟作高速AD采样时钟及写RAM时钟;
3DDS波形发生器,目前DDS还没有开始做。
简单完成BeagleBone通过GPMC写双口双时钟(读写时钟分开)RAM,即将高速DA需要的数据预存在RAM里,FPGA PLL输出时钟作高速DA时钟及读RAM时钟,FPGARAM预存的数据送到高速DA实现固定频率波形产生。

3GPMC实现
1Linux板文件里初始化GPMC相关管脚
板文件路径:/root/bone-linux/arch/arm/mach-omap2
/root/bone-linux/  改成自己的ARM Linux源码目录
相关代码:
  1. /* Pin mux for fpga module */
  2. static struct pinmux_config fpga_pin_mux[] = {
  3.         {"gpmc_ad0.gpmc_ad0",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  4.         {"gpmc_ad1.gpmc_ad1",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  5.         {"gpmc_ad2.gpmc_ad2",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  6.         {"gpmc_ad3.gpmc_ad3",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  7.         {"gpmc_ad4.gpmc_ad4",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  8.         {"gpmc_ad5.gpmc_ad5",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  9.         {"gpmc_ad6.gpmc_ad6",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  10.         {"gpmc_ad7.gpmc_ad7",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  11.         {"gpmc_ad8.gpmc_ad8",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  12.         {"gpmc_ad9.gpmc_ad9",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  13.         {"gpmc_ad10.gpmc_ad10",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  14.         {"gpmc_ad11.gpmc_ad11",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  15.         {"gpmc_ad12.gpmc_ad12",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  16.         {"gpmc_ad13.gpmc_ad13",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  17.         {"gpmc_ad14.gpmc_ad14",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  18.         {"gpmc_ad15.gpmc_ad15",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  19.         
  20.         
  21.         {"lcd_data0.gpmc_a0",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  22.         {"lcd_data1.gpmc_a1",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  23.         {"lcd_data2.gpmc_a2",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  24.         {"lcd_data3.gpmc_a3",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  25.         {"lcd_data4.gpmc_a4",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  26.         {"lcd_data5.gpmc_a5",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  27.         {"lcd_data6.gpmc_a6",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  28.         {"lcd_data7.gpmc_a7",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  29.         {"lcd_vsync.gpmc_a8",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  30.         {"lcd_hsync.gpmc_a9",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  31.         {"lcd_pclk.gpmc_a10",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  32.         {"lcd_ac_bias_en.gpmc_a11",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  33.         {"lcd_data8.gpmc_a12",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  34.         {"lcd_data9.gpmc_a13",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  35.         {"lcd_data10.gpmc_a14",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  36.         {"lcd_data11.gpmc_a15",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  37.         
  38. //        {"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  39. //        {"gpmc_wpn.gpmc_wpn",          OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
  40. //        {"gpmc_csn0.gpmc_csn0",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  41.         {"gpmc_csn0.gpio1_29", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  42. {"gpmc_csn1.gpmc_csn1",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  43. //{"gpmc_csn1.gpio1_30", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  44. //        {"gpmc_csn2.gpmc_csn2",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  45.         {"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  46. //        {"gpmc_advn_ale.gpmc_advn_ale",  OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  47.         {"gpmc_oen_ren.gpmc_oen_ren",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  48.         {"gpmc_wen.gpmc_wen",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  49. //        {"gpmc_ben0_cle.gpmc_ben0_cle",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  50.         {"gpmc_clk.gpmc_clk",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA | <font color="#ff0000">AM33XX_INPUT_EN</font>},
  51.         {NULL, 0},
  52. };
复制代码
特别注意GPMC_CLKAM33XX_INPUT_EN属性的配置,未知管脚需要到文件mux33xx.c下修改相关内容。csn1作片选,csn0、2作GPIO用。
2GPMC驱动设计
主要参考内核源代码里的gpmc.c以及gpmc.h文件,内核里是platform平台驱动,我改成了最基础的字符设备驱动,水平有限。
源码文件见附件:附件1:GPMC驱动源码
3)读写应用程序编写
源码文件见附件:附件2:读写应用程序源码
4FPGA端程序设计
1FPGABeagleBone的连接图如下:图2:FPGA与BeagleBone的连接图
2FPGA原理图输入截图如下:图3:FPGA原理图输入截图
(3FPGA管脚配置TCL文件相关部分:
  1. set_location_assignment PIN_118 -to GPMC_A[1]
  2.         set_location_assignment PIN_113 -to GPMC_A[2]
  3.         set_location_assignment PIN_114 -to GPMC_A[3]
  4.         set_location_assignment PIN_104 -to GPMC_A[4]
  5.         set_location_assignment PIN_112 -to GPMC_A[5]
  6.         set_location_assignment PIN_101 -to GPMC_A[6]
  7.         set_location_assignment PIN_103 -to GPMC_A[7]
  8.         set_location_assignment PIN_87 -to GPMC_A[8]
  9.         set_location_assignment PIN_81 -to GPMC_AD[0]
  10.         set_location_assignment PIN_80 -to GPMC_AD[1]
  11.         set_location_assignment PIN_57 -to GPMC_AD[2]
  12.         set_location_assignment PIN_58 -to GPMC_AD[3]
  13.         set_location_assignment PIN_79 -to GPMC_AD[4]
  14.         set_location_assignment PIN_76 -to GPMC_AD[5]
  15.         set_location_assignment PIN_53 -to GPMC_AD[6]
  16.         set_location_assignment PIN_55 -to GPMC_AD[7]
  17.         set_location_assignment PIN_73 -to GPMC_AD[8]
  18.         set_location_assignment PIN_65 -to GPMC_AD[9]
  19.         set_location_assignment PIN_67 -to GPMC_AD[10]
  20.         set_location_assignment PIN_71 -to GPMC_AD[11]
  21.         set_location_assignment PIN_64 -to GPMC_AD[12]
  22.         set_location_assignment PIN_63 -to GPMC_AD[13]
  23.         set_location_assignment PIN_70 -to GPMC_AD[14]
  24.         set_location_assignment PIN_69 -to GPMC_AD[15]
  25.         set_location_assignment PIN_72 -to GPMC_CLK
  26.         set_location_assignment PIN_75 -to GPMC_CSN
  27.         set_location_assignment PIN_59 -to GPMC_OEN_REN
  28.         set_location_assignment PIN_60 -to GPMC_WEN
复制代码
5BeagleBone通过GPMC接口读写FPGA做的双口单时钟(读写时钟共用GPMC时钟)RAM SignalTapII抓图:
图4:GPMC-Read
图5:GPMC-Write
ADDA原理图见附件3:adc和附件4:dac,软件部分上面搞定了,这个也不难,后续需要根据具体应用进行深入。

[ 本帖最后由 黑非拉 于 2013-12-12 11:12 编辑 ]

GPMC读写FPGA 双口RAM硬件连接示意图.PNG (52.24 KB, 下载次数: 26)

GPMC读写FPGA 双口RAM硬件连接示意图.PNG

FPGA与BeagleBone的连接图.PNG (66.69 KB, 下载次数: 23)

FPGA与BeagleBone的连接图.PNG

FPGA原理图输入程序截图.PNG (32.83 KB, 下载次数: 18)

FPGA原理图输入程序截图.PNG

GPMC-Read.png (102.04 KB, 下载次数: 9)

图4:GPMC-Read

图4:GPMC-Read

GPMC-Write.png (99.9 KB, 下载次数: 10)

图5:GPMC-Write

图5:GPMC-Write

fpgadev.c

26.71 KB, 下载次数: 252

test_fpgadev.c

747 Bytes, 下载次数: 184

adc.SchDoc

235.5 KB, 下载次数: 124

dac.SchDoc

195.5 KB, 下载次数: 96

最新回复

GPMC 跟 外部FPGA  是 几V 的电平? 3.3V ?  2.5V ?   详情 回复 发表于 2017-7-20 18:18

点评

fpga代码呢大哥  详情 回复 发表于 2013-12-21 20:14
点赞(1) 关注(2)
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

回复 楼主黑非拉 的帖子

fpga代码呢大哥
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
大哥我也是用这个方案,但是我是将GPMC接口连接FPGA,一种是在FPGA中构建双口ram,或者将数据直接通过FPGA连接到外部的双口ram芯片上;
就是GPMC接口接到了FPGA,同时在FPGA外面挂了一个双口ram,要么将GPMC通过FPGA直连到外部双口ram;
要么FPGA先收下GPMC接口数据,然后再转到外部双口ram;
要么在FPGA中构建一个双口ram;
我估计都要试试;
现在板子还没有回来,所以只是构想,
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

4
 
大哥,问下,gpmc的clk可以接FPGA的普通IO么

点评

可以的。 FPGA的代码你看下图就知道了,很简单。  详情 回复 发表于 2013-12-24 09:24
 
 
 

回复

74

帖子

2

TA的资源

一粒金砂(中级)

5
 
wy52119514 发表于 2013-12-22 16:52
大哥,问下,gpmc的clk可以接FPGA的普通IO么

可以的。
FPGA的代码你看下图就知道了,很简单。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
fpga代码呢?
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

7
 
大哥你测过GPMC的速度可以达到多少呢?,以你这个方式

点评

gpmc的速度确实很重要,这个只是初步想法,要考虑的东西还很多,特别是采集这一块  详情 回复 发表于 2014-6-18 22:12
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
你好:
        我使用你的驱动做测试的时候,加载内核的时候出现下面的情况
Failed to request memory region
******Request GPMC CS ******
gpmc_cs_read_reg invoked without initializing GPMC
Failed to request GPMC CS1
io内存申请失败,请问一下 你测试的时候出现这种情况了吗,能不能不申请IO空间 直接映射基地址啊?
谢谢!

点评

我也也到了。有人解决了吗  详情 回复 发表于 2014-8-18 16:32
 
 
 

回复

74

帖子

2

TA的资源

一粒金砂(中级)

9
 
wy52119514 发表于 2014-3-24 20:24
大哥你测过GPMC的速度可以达到多少呢?,以你这个方式

gpmc的速度确实很重要,这个只是初步想法,要考虑的东西还很多,特别是采集这一块
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主,现在速度这一块突破到多少了

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
zhuzengkun 发表于 2014-4-22 11:05
你好:
        我使用你的驱动做测试的时候,加载内核的时候出现下面的情况
Failed to request memory  ...

我也也到了。有人解决了吗
 
 
 

回复

4

帖子

1

TA的资源

一粒金砂(初级)

12
 
附件1和附件2是在哪里呀
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

13
 
受教, 我正在用AM4377
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

14
 
非常不错的资料!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
看代码里面并没有配置时序呀,是不需要吗?
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

16
 
楼主发帖辛苦了,谢谢分享!!!!!!!!!!
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

17
 
本帖最后由 miaoguoqiang 于 2016-6-15 13:28 编辑

你这里没有添加初始化吗
{evm_fpga_init, DEV_ON_BASEBOARD, PROFILE_NONE},

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
GPMC 跟 外部FPGA  是 几V 的电平? 3.3V ?  2.5V ?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表