【Altera SoC体验之旅】高速数据采集之数据传输(1)
[复制链接]
本帖最后由 chenzhufly 于 2015-4-19 02:03 编辑
作者:chenzhufly QQ:36886052 1、 硬件环境 硬件平台: Embest SoC --LarkBoard 软件平台:开发板-linux-3.10.31 Quartus 14.0 2、系统设计 上回写到,中断是干什么的?中断就是通知ARM去接客的,那么ARM如何去接待尊贵的客人呢?,又如何能够获取到正确的数据呢?天空一声霹雳,HPS-FPGA Interfaces闪亮登场!主要包含: - FPGA-to-HPS bridge
- HPS-to-FPGA bridge
- Lightweight HPS-to-FPGA bridge
- FPGA-to-HPS SDRAM interface
通过对HPS-FPGA Interfaces的深入学习和了解,我修改了高速数据采集的框架设计,系统框图如下: 1)中断挂在Lightweight HPS-to-FPGA bridge 2)数据缓存挂在HPS-to-FPGA bridge;Lightweight HPS-to-FPGA bridge只有2M的寻址空间,感觉不太适合挂数据buffer,HPS-to-FPGA bridge有640M的寻址空间,够用了。 3)每中断一次,ARM从FPGA的ROM中取一次数据,这是本次实验的重点!
这次主要是测试一下红圈圈里面的东西,为进一步的数据传输做准备,先传个ROM的数据,这个方便测试!
3、qsys的设计 下图是qsys的设计和连接关系如下图所示:
从图上可以看出rom挂载在HPS-to-FPGA bridge上,偏移地址为0
rom加载的文件方法可参照: https://bbs.eeworld.com.cn/thread-459695-1-1.html
复制代码
当然也可以在quartus中新建一个Memory files,然后自己手添测试数据,我就是这么干的,哈哈。下图是ROM的初始化数据 4、驱动更新 在上回的驱动上做一些小小的修改,支持每次中断的时候把ROM中的数据取出来并打印到中断上; 1)定义一些宏 - #define ROM_BASE 0xc0000000
- #define ROM_SIZE 64
- void *fpga_rom_mem;
复制代码
2)初始化 - if (!request_mem_region(ROM_BASE,ROM_SIZE,"rom_test")) {
- printk( KERN_INFO"rom_test Memory region busy\n");
- return -EBUSY;
- }
- fpga_rom_mem = ioremap(ROM_BASE,ROM_SIZE);
- if(!fpga_rom_mem) {
- printk( KERN_INFO" rom_test ioremap failed\n");
- return -EIO;
- }
复制代码
3)中断处理函数 - for (i=0;i < ROM_SIZE;i++){
- tmp = ioread8(fpga_rom_mem + i);
- printk("%d ",tmp);
- }
- printk("\n");
复制代码
5、测试结果
这是终端打印的结果,每中断一次打印一次,对比一下是不是和上面ROM的初始化文件一样一样的,说明整个数据链路已经通了!
6、小结 1)这次主要是测试一下HPS-to-FPGA bridge,通过读取ROM中的数据来确认正确性,目前已经测试成功; 2)修改了一下系统设计,随着对soc的不断认识,可能后续还会做一些调整,soc的内容太多了,一时半会学不透啊; 3)下一步准备把ADC采集的数据挂上去,做进一步的测试,欢迎大伙一起交流
|