搜索
bottom↓
回复: 2

【正点原子FPGA连载】第二十四章OV5640摄像头HDMI显示--摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南

[复制链接]

出0入234汤圆

发表于 2020-8-13 10:46:28 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2020-10-24 10:48 编辑

1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:876744900
QQ群头像.png
5)关注正点原子公众号,获取最新资料


100846rel79a9p4uelap24.jpg

100846f1ce1fg14zbg0va4.png

第二十四章OV5640摄像头HDMI显示



在“OV5640摄像头LCD显示”实验中,我们采用以VDMA为中心的架构设计,实现了OV5640摄像头在LCD屏上的显示。本次实验进一步延伸,我们将OV5640摄像头采集的视频显示在带有HDMI接口的显示器上。
本章包括以下几个部分:
32424.1HDMI简介
24.2实验任务
24.3硬件设计
24.4软件设计
24.5下载验证




24.1HDMI简介
有关HDMI的详细介绍,请参见“HDMI彩条显示”实验。
24.2实验任务
本节实验任务是使用领航者开发板及OV5640摄像头实现图像采集,并通过带有HDMI接口的显示器实时显示。
24.3硬件设计
OV5640模块说明请参考“OV5640摄像头LCD显示实验”,摄像头扩展接口原理图请参考“OV7725摄像头LCD显示实验”的硬件设计部分,HDMI接口部分的硬件设计请参考“HDMI彩条显示”实验中的硬件设计部分。
本次实验的系统架构与“OV5640摄像头LCD显示”实验基本相似,只是把读通道最后端的显示接口部分换成了HDMI显示,当然也不需要传送LCD ID的AXI_GPIO IP核了。系统架构如下图所示:
阿莫论坛发帖领航者专用1498.png

图 24.3.1 系统架构框图

我们将“HDMI彩条显示”实验中的HDMI驱动部分封装成IP核,以便直接在IP Integrator设计画布中进行调用。有关在Vivado中自定义IP核的操作步骤,请参见“自定义IP核”实验。在IP Integrator设计画布中封装后的HDMI驱动IP核如下图所示:
阿莫论坛发帖领航者专用1669.png

图 24.3.2 HDMI驱动IP核

HDMI驱动IP核的Video_In输入接口连接到AXI_Stream to Video Out的输出接口,其需要两个输入时钟:“pclk”和“pclk_x5”,均由动态时钟生成IP核来提供。其复位信号由动态时钟生成IP核的锁定指示locked信号来驱动。如下图所示:
阿莫论坛发帖领航者专用1843.png

图 24.3.3 HDMI驱动IP核的时钟和复位信号

连线后的Block Design如下图所示:
阿莫论坛发帖领航者专用1913.png

图 24.3.4 整体系统框图

接下来验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”。如果验证结果报出错误或者警告,则需要重新检查设计。
为工程添加约束文件,约束文件如下:
  1. [code]#----------------------摄像头接口的时钟---------------------------
  2. #72M
  3. create_clock -period 13.888 -name cam_pclk [get_ports cam_pclk]
  4. set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets cam_pclk_IBUF]

  5. #----------------------HDMI接口---------------------------
  6. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports TMDS_tmds_clk_n]
  7. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN L14} [get_ports TMDS_tmds_clk_p]
  8. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN K19} [get_ports {TMDS_tmds_data_p[0]}]
  9. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[0]}]
  10. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN M14} [get_ports {TMDS_tmds_data_p[1]}]
  11. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[1]}]
  12. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN L16} [get_ports {TMDS_tmds_data_p[2]}]
  13. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[2]}]
  14. set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN G17} [get_ports tmds_oen]

  15. #----------------------摄像头接口---------------------------
  16. set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports cam_rst_n]
  17. set_property -dict {PACKAGE_PIN R17 IOSTANDARD LVCMOS33} [get_ports cam_pwdn]
  18. set_property -dict {PACKAGE_PIN P16 IOSTANDARD LVCMOS33} [get_ports {cam_data[0]}]
  19. set_property -dict {PACKAGE_PIN V15 IOSTANDARD LVCMOS33} [get_ports {cam_data[1]}]
  20. set_property -dict {PACKAGE_PIN W15 IOSTANDARD LVCMOS33} [get_ports {cam_data[2]}]
  21. set_property -dict {PACKAGE_PIN T12 IOSTANDARD LVCMOS33} [get_ports {cam_data[3]}]
  22. set_property -dict {PACKAGE_PIN U12 IOSTANDARD LVCMOS33} [get_ports {cam_data[4]}]
  23. set_property -dict {PACKAGE_PIN V12 IOSTANDARD LVCMOS33} [get_ports {cam_data[5]}]
  24. set_property -dict {PACKAGE_PIN W13 IOSTANDARD LVCMOS33} [get_ports {cam_data[6]}]
  25. set_property -dict {PACKAGE_PIN T14 IOSTANDARD LVCMOS33} [get_ports {cam_data[7]}]
  26. set_property -dict {PACKAGE_PIN T17 IOSTANDARD LVCMOS33} [get_ports cam_href]
  27. set_property -dict {PACKAGE_PIN T15 IOSTANDARD LVCMOS33} [get_ports cam_pclk]
  28. set_property -dict {PACKAGE_PIN R18 IOSTANDARD LVCMOS33} [get_ports cam_vsync]
  29. #cam_scl:
  30. set_property -dict {PACKAGE_PIN P18 IOSTANDARD LVCMOS33} [get_ports {emio_sccb_tri_io[0]}]
  31. #cam_sda:
  32. set_property -dict {PACKAGE_PIN N17 IOSTANDARD LVCMOS33} [get_ports {emio_sccb_tri_io[1]}]

  33. set_property PULLUP true [get_ports {emio_sccb_tri_io[1]}]
复制代码
[/code]
最后在左侧Flow Navigator导航栏中找到PROGRAM AND DEBUG,点击该选项中的“ Generate Bitstream”,对设计进行综合、实现、并生成Bitstream文件。
在生成Bitstream之后,在菜单栏中选择 File > Export > Export hardware导出硬件,并在弹出的对话框中,勾选“Include bitstream”。然后在菜单栏选择File > Launch SDK,启动SDK软件。
24.4软件设计
打开SDK后,我们创建一个Application Project,向工程中的添加的源文件与“OV5640摄像头LCD显示”实验完全相同,请读者参考“OV5640摄像头LCD显示”实验的“软件设计”部分。
不同之处在于main.c源文件,由于显示设备是带有HDMI接口的显示器,所以不需要进行ID的读取,也不需要根据ID号来设置视频参数,我们直接将视频参数设置为固定即可。
main函数的代码如下所示:
  1. 1   #include <stdio.h>
  2. 2   #include <stdlib.h>
  3. 3   #include <string.h>
  4. 4   #include "xil_types.h"
  5. 5   #include "xil_cache.h"
  6. 6   #include "xparameters.h"
  7. 7   #include "xaxivdma.h"
  8. 8   #include "xaxivdma_i.h"
  9. 9   #include "display_ctrl_hdmi/display_ctrl.h"
  10. 10  #include "vdma_api/vdma_api.h"
  11. 11  #include "emio_sccb_cfg/emio_sccb_cfg.h"
  12. 12  #include "ov5640/ov5640_init.h"
  13. 13  
  14. 14  //宏定义
  15. 15  #define DYNCLK_BASEADDR  XPAR_AXI_DYNCLK_0_BASEADDR  //动态时钟基地址
  16. 16  #define VDMA_ID          XPAR_AXIVDMA_0_DEVICE_ID    //VDMA器件ID
  17. 17  #define DISP_VTC_ID      XPAR_VTC_0_DEVICE_ID        //VTC器件ID
  18. 18  
  19. 19  //全局变量
  20. 20  //frame buffer的起始地址
  21. 21  unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR
  22. 22                                          + 0x1000000);
  23. 23  XAxiVdma     vdma;
  24. 24  DisplayCtrl  dispCtrl;
  25. 25  VideoMode    vd_mode;
  26. 26  
  27. 27  int main(void)
  28. 28  {
  29. 29      u32 status;
  30. 30      u16 cmos_h_pixel;                    //ov5640 DVP 输出水平像素点数
  31. 31      u16 cmos_v_pixel;                    //ov5640 DVP 输出垂直像素点数
  32. 32      u16 total_h_pixel;                   //ov5640 水平总像素大小
  33. 33      u16 total_v_pixel;                   //ov5640 垂直总像素大小
  34. 34  
  35. 35      cmos_h_pixel = 1280;                //设置OV5640输出分辨率为1280*720
  36. 36      cmos_v_pixel = 720;
  37. 37      total_h_pixel = 2570;
  38. 38      total_v_pixel = 980;
  39. 39  
  40. 40      emio_init();                         //初始化EMIO
  41. 41      status = ov5640_init( cmos_h_pixel,  //初始化ov5640
  42. 42                            cmos_v_pixel,
  43. 43                           total_h_pixel,
  44. 44                           total_v_pixel);
  45. 45      if(status == 0)
  46. 46          xil_printf("OV5640 detected successful!\r\n");
  47. 47      else
  48. 48          xil_printf("OV5640 detected failed!\r\n");
  49. 49  
  50. 50      vd_mode = VMODE_1280x720;
  51. 51  
  52. 52      //配置VDMA
  53. 53      run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,
  54. 54                              frame_buffer_addr,0,0,BOTH);
  55. 55      //初始化Display controller
  56. 56      DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);
  57. 57      //设置VideoMode
  58. 58      DisplaySetMode(&dispCtrl, &vd_mode);
  59. 59      DisplayStart(&dispCtrl);
  60. 60  
  61. 61      return 0;
  62. 62  }
复制代码

代码中的第35-38行设置OV5640的输出图像的分辨率大小为固定的1280*720,然后40-48行就是初始化EMIO和ov5640。由于我们使用HDMI显示器来显示视频画面,不需要做出像“OV5640摄像头LCD显示”实验中的根据ID来配置显示模式这样的动作,所以第50行将vd_mode结构体变量直接赋值固定值VMODE_1280x720。代码的剩下部分依次初始化VDMA、VTC和动态时钟配置IP核。
24.5下载验证
编译完工程之后我们就可以开始下载程序了。将OV5640摄像头模块插在领航者Zynq开发板的“OLED/CAMERA”插座上,并将HDMI电缆一端连接到开发板上的HDMI插座、另一端连接到显示器。将下载器一端连电脑,另一端与开发板上的JTAG端口连接,连接电源线并打开电源开关。
在SDK软件下方的SDK Terminal窗口中点击右上角的加号设置并连接串口。然后下载本次实验硬件设计过程中所生成的BIT文件,来对PL进行配置。最后下载软件程序,下载完成后,在下方的SDK Terminal中可以看到应用程序打印的信息,如下图所示:
阿莫论坛发帖领航者专用16496.png

图 24.5.1 串口打印的信息

同时,显示器上显示出OV5640摄像头采集的图像,说明本次OV5640摄像头HDMI显示的实验在领航者ZYQN开发板上验证成功,如下图所示:
阿莫论坛发帖领航者专用16604.png

图 24.5.2 实验结果


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出16170入6148汤圆

发表于 2020-8-23 12:17:32 来自手机 | 显示全部楼层
打赏!

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

出0入0汤圆

发表于 2020-8-25 20:51:28 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 16:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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