1)实验平台:正点原子超越者FPGA开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=631660290421
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-chaoyuezhe.html
4)本章实例源码下载:
30_ov7725_hdmi.rar
(6.23 MB, 下载次数: 28)
5)正点原子FPGA交流群:905624739点击加入:![]()
6)关注正点原子公众号,获取最新资料更新
第三十七章OV7725摄像头HDMI显示实验
在OV7725摄像头RGB-LCD显示实验中,成功地在LCD屏上实时显示出了摄像头采集的图像。本章将使用FPGA开发板实现对OV7725的数字图像采集并在HDMI显示器上实时显示。
本章包括以下几个部分:
3737.1 简介37.2 实验任务
37.3 硬件设计
37.4 程序设计
37.5 下载验证
37.1简介
在“OV7725摄像头RGB-LCD显示实验”中对OV7725的视频传输时序、SCCB协议以及寄存器的配置信息等内容作了详细的介绍,如果大家对这部分内容不是很熟悉的话,请参考“OV7725摄像头RGB-LCD显示实验”中的OV7725简介部分。
37.2实验任务
本节实验任务是使用超越者开发板及OV7725摄像头实现图像采集,通过HDMI接口驱动HDMI显示器,并实时显示出图像。
37.3硬件设计
摄像头扩展接口原理图及OV7725模块说明与“OV7725摄像头RGB-LCD显示实验”完全相同,请参考“OV7725摄像头RGB-LCD显示实验”硬件设计部分。HDMI接口部分的硬件设计请参考“HDMI彩条显示实验”中的硬件设计部分。
由于OV7725、HDMI接口和DDR3引脚数目较多且在前面相应的章节中已经给出它们的管脚列表,这里不再列出管脚分配。
37.4程序设计
图 37.4.1是根据本章实验任务画出的系统框图。对比“OV7725摄像头RGB-LCD显示实验”的系统框图可以发现,本次实验只是把LCD顶层模块替换成了HDMI顶层模块,将图像采集顶层模块替换成图像采集模块,修改了时钟模块,其余模块完全相同。
图像采集顶层模块和图像采集模块的区别在于,图像采集顶层模块包含了摄像头裁剪模块,但是由于本次实验所用的HDMI显示器的分辨率大于摄像头的分辨率,因此本次实验不需要对摄像头图像进行裁剪。时钟模块用于为I2C驱动模块、HDMI顶层模块以及DDR控制模块提供驱动时钟;I2C驱动模块和I2C配置模块用于初始化OV7725图像传感器;摄像头采集模块负责采集摄像头图像数据,并且把图像数据写入DDR控制模块中;DDR控制模块负责将用户数据写入和读出片外DDR3存储器;HDMI顶层模块负责驱动HDMI显示器。本章使用的HDMI显示器其分辨率为1024*768,而OV7725传感器的最大分辨率为640*480,所以HDMI显示器需要填充黑色的像素点。修改时钟模块的原因在于超越者开发板所用的器件只有2个pll ip核,这2个pll一个用于ddr控制器,另一个用于HDMI模块,因此本次实验的时钟模块用了DCM_CLKGEN这个IP核,用于产生其他模块所需的时钟。
顶层系统框图如下所示:
图 37.4.1 顶层系统框图
由上图可知,时钟模块(clock)为HDMI顶层模块、DDR控制模块以及I2C驱动模块提供驱动时钟。I2C配置模块和I2C驱动模块控制着传感器初始化的开始与结束。传感器初始化完成后,图像采集模块将采集到的数据写入DDR控制模块,HDMI顶层模块从DDR控制模块中读出数据并驱动显示器显示,这时整个系统才完成了数据的采集、缓存与显示。需要注意的是图像数据采集模块是在DDR3和传感器都初始化完成之后才开始输出数据的,避免了在DDR3初始化过程中向里面写入数据。
顶层模块的代码如下:
FPGA顶层模块(ov7725 _hdmi)例化了以下六个模块:时钟模块(clock)、I2C驱动模块(i2c_dri)、I2C配置模块(i2c_ov7725_rgb565_cfg)、图像采集模块(cmos_capture_data)、DDR控制模块(ddr3_control)和HDMI顶层模块(hdmi_top)。
时钟模块(clock):时钟模块通过调用DCM_CLKGEN IP核实现,共输出3个时钟,频率分别为300Mhz、50Mhz时钟和100Mhz时钟。300Mhz时钟作为DDR控制模块的运行时钟;100Mhz时钟作为DDR控制模块的驱动时钟;50Mhz时钟作为I2C驱动模块和HDMI顶层模块的驱动时钟。
I2C驱动模块(i2c_dri):I2C驱动模块负责驱动OV7725 SCCB接口总线,用户可根据该模块提供的用户接口可以很方便的对OV7725的寄存器进行配置,该模块和“EEPROM读写实验”章节中用到的I2C驱动模块为同一个模块,有关该模块的详细介绍请大家参考“EEPROM读写实验”章节。
I2C配置模块(i2c_ov7725_rgb565_cfg):I2C配置模块的驱动时钟是由I2C驱动模块输出的时钟提供的,这样方便了I2C驱动模块和I2C配置模块之间的数据交互。该模块寄存需要配置的寄存器地址、数据以及控制初始化的开始与结束,同时该模块输出OV7725的寄存器地址和数据以及控制I2C驱动模块开始执行的控制信号,直接连接到I2C驱动模块的用户接口,从而完成对OV7725传感器的初始化。有关该模块的详细介绍请大家参考“OV7725摄像头RGB-LCD显示实验”章节。
图像采集模块(cmos_capture_data):摄像头采集模块在像素时钟的驱动下将传感器输出的场同步信号、行同步信号以及8位数据转换成DDR控制模块的写使能信号和16位写数据信号,完成对OV7725传感器图像的采集。有关该模块的详细介绍请大家参考“OV7725摄像头RGB-LCD显示实验”章节。
DDR控制模块(ddr3_control):DDR读写控制器模块负责驱动DDR片外存储器,缓存图像传感器输出的图像数据。该模块将MIG IP核复杂的读写操作封装成类似FIFO的用户接口,非常方便用户的使用。有关DDR控制模块的详细介绍请大家参考“DDR读写测试实验”章节。
HDMI顶层模块(hdmi_top):HDMI顶层模块负责驱动HDMI显示器的驱动信号的输出,同时为其他模块提供参数和数据请求信号。HDMI顶层模块例化了HDMI驱动模块(video_driver)、HDMI显示模块(video_display)和RGB转DVI模块(rgbtodvi_top)。HDMI驱动模块负责产生行场信号和数据有效使能信号和像素点的横纵坐标。HDMI显示模块将内部信号data_req(数据请求信号)输出至端口,方便从DDR控制器中读取数据,并填充黑色数据。RGB转DVI模块负责将RGB888格式的视频图像转换成TMDS数据输出。有关HDMI驱动模块、RGB转DVI模块的详细介绍请大家参考“HDMI彩条显示实验”章节,HDMI显示模块详细介绍请大家参考“OV7725摄像头RGB-LCD显示实验”章节。
时钟模块的代码如下:
- 1 module clock(
- 2 input sys_clk, //系统输入时钟
- 3
- 4 output clk_ddr, //ddr运行时钟
- 5 output clk_50m, //50m时钟
- 6 output clk_100m, //100m时钟
- 7 output locked_100m, //时钟稳定信号
- 8 output locked_300m //时钟稳定信号
- 9
- 10 );
- 11
- 12 //wire define
- 13 wire clk_50m;
- 14 wire clk_in;
- 15 wire clk_ddr;
- 16 wire clk_100m;
- 17 wire locked_100m;
- 18 wire locked_300m;
- 19
- 20 //*****************************************************
- 21 //** main code
- 22 //*****************************************************
- 23
- 24 //将输入时钟引入BUFG
- 25 IBUFG clkin1_buf
- 26 (.O (clk_in),
- 27 .I (sys_clk));
- 28
- 29 BUFG u_BUFG
- 30 (.O (clk_50m),
- 31 .I (clk_in));
- 32
- 33 //产生300m时钟
- 34 DCM_CLKGEN_300M u_DCM_CLKGEN_300M
- 35 (
- 36 .CLK_IN1 (clk_50m),
- 37 .CLK_OUT1 (clk_ddr),
- 38 .RESET (1'b0),
- 39 .LOCKED (locked_300m)
- 40 );
- 41
- 42 //产生100m时钟
- 43 DCM_CLKGEN_100M u_DCM_CLKGEN_100M
- 44 (
- 45 .CLK_IN1 (clk_50m),
- 46 .CLK_OUT1 (clk_100m),
- 47 .LOCKED (locked_100m) ,
- 48 .RESET (1'b0)
- 49 );
- 50
- 51 endmodule
复制代码
代码第25行至27行是XILINX的IBUFG的底层原语,其全称是输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF原语,否则在布局布线时会报错。
代码第29行至31行是XILINX的BUFG的底层原语,其全称是全局缓冲,它的输入是IBUFG的输出。BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。
代码第34行至49行是对DCM_CLKGEN IP的例化,有关DCM_CLKGEN IP的详细介绍请参考“IP核之MMCM/PLL实验”。
37.5下载验证
编译完工程之后就可以开始下载程序了。将OV7725摄像头模块插在超越者开发板的“OLED/CAMERA”插座上,并将HDMI电缆一端连接到开发板上的HDMI插座、另一端连接到显示器。将下载器一端连电脑,另一端与开发板上的JTAG端口连接,连接电源线并打开电源开关。接下来我们下载程序,验证OV7725 HDMI实时显示功能。下载完成后HDMI显示器上会显示OV7725摄像头采集到的图像,如下图所示,说明OV7725 HDMI实时显示程序下载验证成功。
图 37.5.1 OV7725 HDMI实时显示图像
|