芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 16274|回复: 9

【设计实例】AC540-SoC基于SDRAM共享的摄像头图像采集显示系统

[复制链接]
  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
    发表于 2021-2-25 10:12:39 | 显示全部楼层 |阅读模式
    一、先把项目跑起来
    1、烧写资料包中“06_预制作镜像”文件夹下的“AC540-SoC-Console.img”镜像到SD卡中
    2、将摄像头插入到开发板右侧的摄像头接口中。
    3、使用烧录好的SD卡启动开发板,进入Linux系统后,直接执行root目录下的ov5640_capture可执行文件。
    4、在屏幕上能看到摄像头采集到的图像数据

    问题说明:
    1、图像效果卡,帧率低
    图像效果卡是因为本案例是采集一帧显示一帧,再采集一帧的方案,而且绘图使用的是直接描点的方式,没有用内存搬运方案,因此显示更新速率更慢。
    2、屏幕左上角有黑点
    黑点是Linux系统的屏幕Console的光标,这个光标目前还在按照固定的时间更新,所以会覆盖此部分图像,看到光标,可在内核配置中关闭屏幕console功能,就不会闪烁了。


    二、工程源码
    1、本案例对应的Quartus工程,就是镜像里默认使用的工程,名为“AC540_SoC_GHRD_pro.rar”,如果网盘没有找到,可以重新进网盘链接,在“02_设计实例\Quartus_Project”文件夹下找到。2、本案例对应的Linux应用程序源码,名为“ov5640_capture”,在“02_设计实例\C_User_Code”文件夹下的“C_User_Code.rar”压缩包中,如果找不到,可以可以重新进网盘链接下载这个文件。


    三、技术方案
    1、本案例使用的是FPGA直接写HPS侧DDR3的方案,HPS侧配置导出一个DDR3 SDRAM写端口,供FPGA侧写入数据使用。
    2、为了避免Linux将该段内存规划为系统内存,因此在Uboot中,将512MB的DDR3存储空间的高128M保留不使用,确保Linux系统运行起来之后,不会去读写该段存储空间。当图像采集存储完成之后,在Linux侧使用虚拟地址映射的方式,来读取该段空间中的数据。
    3、此方案相较于使用F2H_AXI_Bridge方案的优势在于,此方案直接使用FPGA将数据写入到了HPS侧的SDRAM中,不需要编写内核驱动进行数据的搬运,只需要直接在Linux用户程序中读取这段地址的数据即可。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    31

    积分

    新手上路

    Rank: 2

    积分
    31
    发表于 2021-3-18 22:46:39 | 显示全部楼层
    请问小梅哥这个代码有吗:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P:P
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
     楼主| 发表于 2021-3-19 09:11:51 | 显示全部楼层
    ccb97 发表于 2021-3-18 22:46
    请问小梅哥这个代码有吗 ...

    帖子里说了代码的位置哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-5 18:16
  • 0

    主题

    3

    帖子

    40

    积分

    新手上路

    Rank: 2

    积分
    40
    发表于 2021-3-24 19:04:04 | 显示全部楼层
    稍微改进了一点。还是用片上sram做图像缓存,不过是用了三个64K的dpsram,每个能存240x240的图像,再把它们拼接成720x240的画面。效果如附件所示。

    VID_20210324_183418.rar

    3.86 MB, 下载次数: 1080

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-5 18:16
  • 0

    主题

    3

    帖子

    40

    积分

    新手上路

    Rank: 2

    积分
    40
    发表于 2021-3-24 19:47:12 | 显示全部楼层
    为什么要把240x240的一帧图像放在sram里呢?因为camera端和display端的流率不一样。双端口SRAM并没有一个rdaddress和wraddress的协调机制,可能导致显示的是老信息,(当读流率快于写流率时)或者丢帧(当读流率慢于写流率时。)但只要全部内存只存储一个frame的图像信息,就感觉不出来。因为此时同一个空间位置上的图像信息只存在SRAM中一个固定的位置里。在这个点上,produce过快,或者consume过快,这个点上显示的信息都还是时间轴上正确的,即老信息显示在前,新信息显示在后。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    2

    积分

    新手入门

    Rank: 1

    积分
    2
    发表于 2021-6-2 10:59:09 | 显示全部楼层
    请问下:“在Uboot中,将512MB的DDR3存储空间的高128M保留不使用”这个能否帮忙给些参考资料,谢谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
     楼主| 发表于 2021-6-3 14:21:34 | 显示全部楼层
    uboot下输入这两条命令即可:
    setenv mmcboot 'setenv bootargs console=ttyS0,115200 root=${mmcroot} rw rootwait mem=384M;bootz ${loadaddr} - ${fdtaddr}'
    saveenv
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
     楼主| 发表于 2021-6-4 10:03:48 | 显示全部楼层
    wx_EsX86Y58 发表于 2021-3-24 19:47
    为什么要把240x240的一帧图像放在sram里呢?因为camera端和display端的流率不一样。双端口SRAM并没有一个rd ...

    这个东西标准的说法叫帧缓存,可以开启多帧缓存,一帧存,一帧显示。这样避免读写同时针对同一块存储区域,造成断裂效果
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    31

    积分

    新手上路

    Rank: 2

    积分
    31
    发表于 2021-7-4 15:42:12 | 显示全部楼层
    admin 发表于 2021-6-3 14:21
    uboot下输入这两条命令即可:
    setenv mmcboot 'setenv bootargs console=ttyS0,115200 root=${mmcroot} rw  ...

    请问一下小梅哥,这条命令在什么地方输入,按照AC501的参考文档是直接生成preloader.img和uboot.img然后直接写入SD卡的,那要怎么修改uboot呢,我看工程文件夹下面有一个uboot.src,这是好像是编译脚本得到的,请问一下这个设置内存的方式具体操作是什么样子的,您的文档和下面这个链接里面的操作有什么异同呢https://blog.csdn.net/zjy900507/article/details/82460103
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-5 18:16
  • 0

    主题

    3

    帖子

    40

    积分

    新手上路

    Rank: 2

    积分
    40
    发表于 2021-8-10 20:55:02 | 显示全部楼层
    我理解之所以要把384M以上的地址段在uboot时保留不用,是为了让uboot进行完以后,没有程序或者什么数据段占据这段空间吧。这样在应用程序里img_sdram_virtual_base = mmap( NULL, 800*480*2, ( PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0x18000000)这条语句时,就不会发生mmap不上的问题吧。
    反正uboot这里是真复杂,不知道看些什么资料好。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-11-21 18:24 , Processed in 0.208552 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表