OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4682|回复: 0

[XILINX] 【正点原子FPGA连载】第二十一章 OV7725摄像头HDMI显示--摘自【正点原子】领航者ZYNQ之嵌入式开发指南_V1.2

[复制链接]

1107

主题

1118

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4615
金钱
4615
注册时间
2019-5-8
在线时间
1218 小时
发表于 2020-9-8 15:01:52 | 显示全部楼层 |阅读模式
1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:905624739 点击加入群聊
5)关注正点原子公众号,获取最新资料更新
1.jpg
1120.png
第二十一章 OV7725摄像头HDMI显示

在“OV7725摄像头LCD显示”实验中,我们采用以VDMA为中心的架构设计,实现了OV7725摄像头在LCD屏上的显示。本次实验进一步延伸,我们将OV7725摄像头采集的视频显示在带有HDMI接口的显示器上。
本章包括以下几个部分:
1         
1         
1.1        HDMI简介
1.2        实验任务
1.3        硬件设计
1.4        软件设计
1.5        下载验证
HDMI简介
有关HDMI的详细介绍,请参见“HDMI彩条显示”实验。
实验任务
本节实验任务是使用领航者开发板及OV7725摄像头实现图像采集,并通过带有HDMI接口的显示器实时显示。
硬件设计
摄像头扩展接口原理图及OV7725模块说明与“OV7725摄像头LCD显示实验”完全相同,请参考“OV7725摄像头LCD显示实验”硬件设计部分。HDMI接口部分的硬件设计请参考“HDMI彩条显示”实验中的硬件设计部分。
本次实验的系统架构与“OV7725摄像头LCD显示”实验基本相似,只是把读通道最后端的显示接口部分换成了HDMI显示,当然也不需要传送LCD ID的AXI_GPIO IP核了。系统架构如下图所示:
image002.png
图 0.1 系统架构框图
我们将“HDMI彩条显示”实验中的HDMI驱动部分封装成IP核,以便直接在IP Integrator设计画布中进行调用。有关在Vivado中自定义IP核的操作步骤,请参见“自定义IP核”实验。在IP Integrator设计画布中封装后的HDMI驱动IP核如下图所示:
image004.png
图 0.2HDMI驱动IP核
HDMI驱动IP核的Video_In输入接口连接到AXI_Stream to Video Out的输出接口,其需要两个输入时钟:“pclk”和“pclk_x5”,均由动态时钟生成IP核来提供。其复位信号由动态时钟生成IP核的锁定指示locked信号来驱动。如下图所示:
image006.png
图 0.3HDMI驱动IP核的时钟和复位信号
连线后的Block Design如下图所示:
image008.png
图 0.4整体Block Design框图
接下来验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告,点击“OK”。如果验证结果报出错误或者警告,则需要重新检查设计。
为工程添加约束文件,约束文件如下:
  1. #----------------------摄像头接口的时钟---------------------------

  2. create_clock -period 41.600 -name cmos_pclk [get_ports cam_pclk]

  3. set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets cam_pclk_IBUF]

  4. #----------------------HDMI接口---------------------------

  5. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports TMDS_tmds_clk_n]

  6. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN L14} [get_ports TMDS_tmds_clk_p]

  7. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN K19} [get_ports {TMDS_tmds_data_p[0]}]

  8. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[0]}]

  9. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN M14} [get_ports {TMDS_tmds_data_p[1]}]

  10. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[1]}]

  11. set_property -dict {IOSTANDARD TMDS_33  PACKAGE_PIN L16} [get_ports {TMDS_tmds_data_p[2]}]

  12. set_property -dict {IOSTANDARD TMDS_33                 } [get_ports {TMDS_tmds_data_n[2]}]

  13. set_property -dict {IOSTANDARD LVCMOS33 PACKAGE_PIN G17} [get_ports tmds_oen]

  14. #----------------------摄像头接口---------------------------

  15. set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports cam_rst_n]

  16. set_property -dict {PACKAGE_PIN R17 IOSTANDARD LVCMOS33} [get_ports cam_sgm_ctrl]

  17. set_property -dict {PACKAGE_PIN P16 IOSTANDARD LVCMOS33} [get_ports {cam_data[0]}]

  18. set_property -dict {PACKAGE_PIN V15 IOSTANDARD LVCMOS33} [get_ports {cam_data[1]}]

  19. set_property -dict {PACKAGE_PIN W15 IOSTANDARD LVCMOS33} [get_ports {cam_data[2]}]

  20. set_property -dict {PACKAGE_PIN T12 IOSTANDARD LVCMOS33} [get_ports {cam_data[3]}]

  21. set_property -dict {PACKAGE_PIN U12 IOSTANDARD LVCMOS33} [get_ports {cam_data[4]}]

  22. set_property -dict {PACKAGE_PIN V12 IOSTANDARD LVCMOS33} [get_ports {cam_data[5]}]

  23. set_property -dict {PACKAGE_PIN W13 IOSTANDARD LVCMOS33} [get_ports {cam_data[6]}]

  24. set_property -dict {PACKAGE_PIN T14 IOSTANDARD LVCMOS33} [get_ports {cam_data[7]}]

  25. set_property -dict {PACKAGE_PIN T17 IOSTANDARD LVCMOS33} [get_ports cam_href]

  26. set_property -dict {PACKAGE_PIN T15 IOSTANDARD LVCMOS33} [get_ports cam_pclk]

  27. set_property -dict {PACKAGE_PIN R18 IOSTANDARD LVCMOS33} [get_ports cam_vsync]

  28. #cam_scl:

  29. set_property -dict {PACKAGE_PIN P18 IOSTANDARD LVCMOS33} [get_ports {emio_sccb_tri_io[0]}]

  30. #cam_sda:

  31. set_property -dict {PACKAGE_PIN N17 IOSTANDARD LVCMOS33} [get_ports {emio_sccb_tri_io[1]}]

  32. set_property PULLUP true [get_ports {emio_sccb_tri_io[1]}]
复制代码
最后在左侧Flow Navigator导航栏中找到PROGRAM AND DEBUG,点击该选项中的“ Generate Bitstream”,对设计进行综合、实现、并生成Bitstream文件。在生成Bitstream之后,在菜单栏中选择 File > Export > Exporthardware导出硬件,并在弹出的对话框中,勾选“Include bitstream”。然后在菜单栏选择File > Launch SDK,启动SDK软件。
软件设计
打开SDK后,我们创建一个Application Project,向工程中的添加的源文件与“OV7725摄像头LCD显示”实验完全相同,请读者参考“OV7725摄像头LCD显示”实验的“软件设计”部分。
不同之处在于main.c源文件,由于显示设备是带有HDMI接口的显示器,所以不需要进行ID的读取,也不需要根据ID号来设置视频参数,我们直接将视频参数设置为固定即可。
main函数的代码如下所示:
  1.   #include <stdio.h>

  2.   #include <stdlib.h>

  3.   #include <string.h>

  4.   #include "xil_types.h"

  5.   #include "xil_cache.h"

  6.   #include "xparameters.h"

  7.   #include "xaxivdma.h"

  8.   #include "xaxivdma_i.h"

  9.   #include "display_ctrl_hdmi/display_ctrl.h"

  10.   #include "ov7725/ov7725_init.h"

  11.   #include "vdma_api/vdma_api.h"

  12.   #include "emio_sccb_cfg/emio_sccb_cfg.h"



  13.   //宏定义

  14.   #define DYNCLK_BASEADDR   XPAR_AXI_DYNCLK_0_BASEADDR  //动态时钟基地址

  15.   #define VDMA_ID           XPAR_AXIVDMA_0_DEVICE_ID    //VDMA器件ID

  16.   #define DISP_VTC_ID       XPAR_VTC_0_DEVICE_ID        //VTC器件ID



  17.   //全局变量

  18.   XAxiVdma     vdma;

  19.   DisplayCtrl  dispCtrl;

  20.   VideoMode    vd_mode;

  21.   //frame buffer的起始地址

  22.   unsigned int const frame_buffer_addr = (XPAR_PS7_DDR_0_S_AXI_BASEADDR

  23.                                           + 0x1000000);



  24.   int main(void)

  25.   {

  26.       u32 status;



  27.       emio_init();               //初始化EMIO

  28.       status = ov7725_init();    //初始化ov7725

  29.       if(status == 0)

  30.           xil_printf("OV7725 detected successful!\r\n");

  31.       else

  32.           xil_printf("OV7725 detected failed!\r\n");



  33.       vd_mode = VMODE_640x480 ;  //视频参数设置为固定的640*480



  34.       //配置VDMA

  35.       run_vdma_frame_buffer(&vdma, VDMA_ID, vd_mode.width, vd_mode.height,

  36.                               frame_buffer_addr,0,0,BOTH);

  37.       //初始化Display controller

  38.       DisplayInitialize(&dispCtrl, DISP_VTC_ID, DYNCLK_BASEADDR);

  39.       //设置VideoMode

  40.       DisplaySetMode(&dispCtrl, &vd_mode);

  41.       DisplayStart(&dispCtrl);



  42.       return 0;

  43.   }
复制代码
代码中的第31、32行分别初始化EMIO和ov7725。第38行将vd_mode结构体变量直接赋值VMODE_640x480,因为OV7725摄像头输出的视频分辨率为固定的640x480,而且我们使用HDMI显示器来显示视频画面,不需要做出像“OV7725摄像头LCD显示”实验中的根据ID来配置显示模式这样的动作。代码的剩下部分依次初始化VDMA、VTC和动态时钟配置IP核。
下载验证
编译完工程之后我们就可以开始下载程序了。将OV7725摄像头模块插在领航者Zynq开发板的“OLED/CAMERA”插座上,并将HDMI电缆一端连接到开发板上的HDMI插座、另一端连接到显示器。将下载器一端连电脑,另一端与开发板上的JTAG端口连接,连接电源线并打开电源开关。
在SDK软件下方的SDK Terminal窗口中点击右上角的加号设置并连接串口。然后下载本次实验硬件设计过程中所生成的BIT文件,来对PL进行配置。最后下载软件程序,下载完成后,在下方的SDK Terminal中可以看到应用程序打印的信息,如下图所示:
image010.png
0.1 串口打印的信息
同时,显示器上显示出OV7725摄像头采集的图像,说明本次OV7725摄像头HDMI显示的实验在领航者ZYQN开发板上验证成功,如下图所示:
image012.jpg
0.2 实验结果





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 13:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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