fpga摄像头模块_【正点原子FPGA连载】第三十六章 摄像头显示实验-摘自【正点原子】开拓者 FPGA 开发指南...

1)实验平台:正点原子开拓者FPGA 开发板

2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html

f63f1b7027c7eca4a3f776e0262b63de.png

第三十六章 OV7725摄像头RGB TFT-LCD显示实验

在OV7725摄像头VGA显示实验中,我们成功地在VGA显示器上实时显示出了摄像头采集的图

像。本章我们将使用FPGA开发板实现对OV7725的数字图像采集并通过7寸液晶屏模块实时显示。

本章包括以下几个部分:

36.1 OV7725简介

36.2 实验任务

36.3 硬件设计

36.4 程序设计

36.5 下载验证

OV7725简介

我们在“OV7725摄像头VGA显示实验”中对OV7725的视频传输时序、SCCB协议以及寄存器

的配置信息等内容作了详细的介绍,如果大家对这部分内容不是很熟悉的话,请参考“OV7725

摄像头VGA显示实验”中的OV7725简介部分。

实验任务

本节实验任务是使用开拓者开发板及OV7725摄像头实现图像采集,并通过正点原子推出的

ATK-7’RGBLCD液晶屏模块实时显示。

硬件设计

摄像头扩展接口原理图及OV7725模块说明与“OV7725摄像头VGA显示实验”完全相同,请

参考“OV7725摄像头VGA显示实验”硬件设计部分。RGB TFT-LCD接口部分的硬件设计请参考

“RGB TFT-LCD彩条显示实验”中的硬件设计部分。

由于OV7725、LCD接口和SDRAM引脚数目较多且在前面相应的章节中已经给出它们的管脚列

表,这里不再列出管脚分配。

程序设计

图 36.4.1是根据本章实验任务画出的系统框图。对比“OV7725摄像头VGA显示实验”的系

统框图可以发现,我们只是把VGA驱动模块替换成了LCD顶层模块,其余模块(除PLL时钟模块

外)完全相同。PLL时钟模块用于为I2C驱动模块、LCD顶层模块以及SDRAM读写控制模块提供驱

动时钟;I2C驱动模块和I2C配置模块用于初始化OV7725图像传感器;摄像头采集模块负责采集

摄像头图像数据,并且把图像数据写入SDRAM读写控制模块中;SDRAM读写控制模块负责将用户

数据写入和读出片外SDRAM存储器;LCD驱动模块负责驱动RGB TFT-LCD显示屏。本章使用的LCD

显示屏为ALIENTEK推出的一款7寸RGB接口TFT液晶显示屏,其分辨率为800*480。而OV7725传感

器的最大分辨率为640*480,所以LCD显示屏水平方向上会有160(800-640)个像素点无法显示

图像,为了使图像可以在显示屏的中间位置显示,我们使用LCD显示模块在液晶屏两侧填充黑

色背景。

OV7725摄像头RGB TFT-LCD显示系统框图如下图所示:

d9bb1c173cf44dbf8b20b66d7bd376e6.png

图 36.4.1 OV7725摄像头RGB TFT-LCD显示系统框图

顶层模块的原理图如下图所示:

b71dc91bb72612697b8ef9b15ad13388.png

图 36.4.2 顶层模块原理图

由上图可知,PLL时钟模块用于为I2C驱动模块、LCD顶层模块以及SDRAM读写控制模块提供

驱动时钟,I2C配置模块和I2C驱动模块控制着传感器初始化的开始与结束,传感器初始化完成

后图像采集模块将采集到的数据写入SDRAM读写控制模块,LCD顶层模块从SDRAM控制模块中读

出数据,完成了数据的采集、缓存与显示。其中图像数据采集模块是在SDRAM和传感器都初始

化完成之后才开始输出数据的,避免了在SDRAM初始化过程中向里面写入数据。

FPGA顶层模块(ov7725_rgb565_640x480_lcd)例化了以下六个模块:PLL时钟模块

(pll_clk)、I2C驱动模块(i2c_dri)、I2C配置模块(i2c_ov7725_rgb565_cfg)、摄像头图

像采集模块(cmos_capture_data)、SDRAM读写控制模块(sdram_top)和LCD顶层模块

(lcd_rgb_top)。

PLL时钟模块(pll_clk):PLL时钟模块通过调用锁相环(PLL)IP核实现,总共输出3个

时钟,频率分别为100Mhz、100Mhz(SDRAM相位偏移时钟)和33.3Mhz时钟。100Mhz时钟和100Mhz

相位偏移时钟作为SDRAM读写控制模块的驱动时钟,33.3Mhz时钟作为I2驱动模块和LCD顶层模

块的驱动时钟。

I2C驱动模块(i2c_dri):I2C驱动模块负责驱动OV7725 SCCB接口总线,用户可根据该模

块提供的用户接口可以很方便的对OV7725的寄存器进行配置,该模块和“EEPROM读写实验”章

节中用到的I2C驱动模块为同一个模块,有关该模块的详细介绍请大家参考“EEPROM读写实验”

章节。

I2C配置模块(i2c_ov7725_rgb565_cfg):I2C配置模块的驱动时钟是由I2C驱动模块输出

的时钟提供的,这样方便了I2C驱动模块和I2C配置模块之间的数据交互。该模块寄存需要配置

的寄存器地址、数据以及控制初始化的开始与结束,同时该模块输出OV7725的寄存器地址和数

据以及控制I2C驱动模块开始执行的控制信号,直接连接到I2C驱动模块的用户接口,从而完成

对OV7725传感器的初始化。有关该模块的详细介绍请大家参考“OV7725摄像头VGA显示实验”

章节。

摄像头图像采集模块(cmos_capture_data):摄像头图像采集模块在像素时钟的驱动下

将传感器输出的场同步信号、行同步信号以及8位数据转换成SDRAM读写控制模块的写使能信号

和16位写数据信号,完成对OV7725传感器图像的采集。有关该模块的详细介绍请大家参考

“OV7725摄像头VGA显示实验”章节。

SDRAM读写控制模块(sdram_top):SDRAM读写控制器模块负责驱动SDRAM片外存储器,缓

存图像传感器输出的图像数据。该模块将SDRAM复杂的读写操作封装成类似FIFO的用户接口,

非常方便用户的使用。在“SDRAM读写测试实验”的程序中,读写操作地址都是SDRAM的同一存

储空间,如果只使用一个存储空间缓存图像数据,那么同一存储空间中会出现两帧图像叠加的

情况,为了避免这一情况,我们在SDRAM的其它BANK中开辟一个相同大小的存储空间,使用乒

乓操作的方式来写入和读取数据,所以本次实验在“SDRAM读写测试实验”的程序里做了一个

小小的改动,有关该模块的详细介绍请大家参考“SDRAM读写测试实验”章节,修改部分请大

家参考“OV7725摄像头VGA显示实验”章节。

LCD顶层模块(lcd_rgb_top):LCD顶层模块例化了LCD驱动模块(lcd_driver)和LCD显示模块(lcd_display)。LCD驱动模块负责驱动RGB TFT-LCD显示屏,通过读取SDRAM读写控制

模块来输出像素数据,本次实验将LCD驱动模块的内部信号data_req(数据请求信号)输出至

端口,方便从SDRAM控制器中读取数据,有关LCD驱动模块的详细介绍请大家参考“RGB TFT-LCD

彩条显示实验”章节。LCD显示模块完成液晶屏两侧填充黑色背景,中间区域显示图像数据的

功能。

ATK-7’RGBLCD模块液晶屏的分辨率为800*480,而OV7725传感器的分辨率为640*480,所

以LCD显示屏水平方向上会有160(800-640)个像素点无法显示图像。LCD显示模块实现的功能

是将摄像头采集的图像在LCD屏幕的中间区域显示。

LCD显示模块的代码如下:

1 module lcd_display(

2 input lcd_clk, //lcd驱动时钟

3 input sys_rst_n, //复位信号

4

5 input [10:0] pixel_xpos, //像素点横坐标

6 input [10:0] pixel_ypos, //像素点纵坐标

7 input [15:0] cmos_data, //CMOS传感器像素点数据

8 output [15:0] lcd_data, //LCD像素点数据

9 output data_req //请求像素点颜色数据输入

10 );

11

12 //parameter define

13 parameter H_LCD_DISP = 11'd800; //LCD分辨率——行

14 parameter H_CMOS_DISP = 11'd640; //CMOS分辨率——行

15

16 localparam BLACK = 16'b00000_000000_00000; //RGB565 黑色

17

18 //reg define

19 reg data_val ; //数据有效信号

20

21 //wire define

22 wire [10:0] display_border_pos_l; //左侧边界的横坐标

23 wire [10:0] display_border_pos_r; //右侧边界的横坐标

24

25 //*****************************************************

26 //** main code

27 //*****************************************************

28

29 //左侧边界的横坐标计算 (800-640)/2-1 = 79

30 assign display_border_pos_l = (H_LCD_DISP - H_CMOS_DISP)/2-1;

31

32 //右侧边界的横坐标计算 640 + (800-640)/2-1 = 719

33 assign display_border_pos_r = H_CMOS_DISP + (H_LCD_DISP - H_CMOS_DISP)/2-1;

34

35 //请求像素点颜色数据输入 范围:79~718,共640个时钟周期

36 assign data_req = ((pixel_xpos >= display_border_pos_l) &&

37 (pixel_xpos < display_border_pos_r)) ? 1'b1 : 1'b0;

38

39 //在数据有效范围内,将摄像头采集的数据赋值给LCD像素点数据

40 assign lcd_data = data_val ? cmos_data : BLACK;

41

42 //有效数据滞后于请求信号一个时钟周期,所以数据有效信号在此延时一拍

43 always @(posedge lcd_clk or negedge sys_rst_n) begin

44 if(!sys_rst_n)

45 data_val <= 1'b0;

46 else

47 data_val <= data_req;

48 end

49

50 endmodule

在代码的第 22 至 第 23 行定义 了 LCD 显 示 屏 中 间 显 示 区 域 的 左 侧 边界的 横坐标

(display_border_pos_l)和右侧边界的横坐标(display_border_pos_r),我们不难计算出

左侧边界为79,右侧边界为719。pixel_xpos为LCD当前像素点的横坐标,当该坐标位于液晶屏

中间显示区域内时,输出一个数据请求信号,用来读取SDRAM读写控制模块缓存的图像数据,

如代码中第35至37行所示。SDRAM读写控制模块内部使用FIFO输出图像数据,因此有效数据滞

后于请求信号一个时钟周期,我们将数据有效信号(data_val)延时一拍,如代码中的第42至

第48行所示。

2d04058fcf0843cc6f6840c7c971f9dd.png

图 36.4.3、图 36.4.4为采集到的SignalTap波形图。

54ccef537994822028367a0147b1841f.png

图 36.4.3 LCD左侧边界横坐标信号SignalTap波形图

图 36.4.4 LCD右侧边界横坐标信号SignalTap波形图

由图 36.4.3、图 36.4.4可知,数据请求信号(data_req)在pixel_xpos(LCD像素点横

坐标)的值为79~718范围内为高电平,高电平持续时间共640个像素时钟周期;从上图可以看

到,有效数据滞后于请求信号一个时钟周期,所以我们在程序中将数据有效信号(data_val)

延时了一拍。

我们在前面说过,本章实验程序设计和“OV7725摄像头VGA显示实验”相比,只是把VGA驱

动模块替换成了LCD顶层模块,其余模块(除PLL时钟模块外)完全相同。本章节主要介绍下LCD

显示模块,而其它相同模块的程序设计详情请大家参考“OV7725摄像头VGA显示实验”章节。

下载验证

首先我们打开OV7725摄像头RGB TFT-LCD显示实验工程,在工程所在的路径下打开

ov7725_rgb565_640x480_lcd/par文件夹,在里面找到“ov7725_rgb565_640x480_lcd.qpf”并

双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以

及特殊字符等。工程打开后如图 36.5.1所示:

c7965e8c17fa1ae52a4a75f4c3b06108.png

图 36.5.1 OV7725摄像头RGB TFT-LCD显示实验工程

然后将OV7725摄像头插入开发板上的摄像头扩展接口(注意摄像头镜头朝外);将FPC 排

线一端与ALIENTEK的7寸RGB接口模块上的J1接口连接,另一端与开拓者开发板上的J1接口连接;

如图 36.5.2、图 36.5.3所示。连接时,先掀开FPC连接器上的黑色翻盖,将FPC排线蓝色面朝

上插入连接器,最后将黑色翻盖压下以固定FPC排线。

连接实物图如下图所示:

75eb0199a6cfea9d22b8091954fdf6ca.png

图 36.5.2 ATK-7’ RGBLCD 模块 FPC 连接器

1ed89c715e40d399ae40946f571b38aa.png

图 36.5.3 开拓者开发板 FPC 连接器

最后将下载器一端连电脑,另一端与开发板上的JTAG端口连接,连接电源线并打开电源开

关。

接下来我们下载程序,验证OV7725摄像头RGB TFT-LCD实时显示功能。

工程打开后通过点击工具栏中的“Programmer”图标打开下载界面,通过“Add File”按

钮选择

ov7725_rgb565_640x480_lcd/par/output_files

目录下的

“ov7725_rgb565_640x480_lcd.sof”文件。开发板电源打开后,在程序下载界面点击

“Hardware Setup”,在弹出的对话框中选择当前的硬件连接为“USB-Blaster[USB-0]”。然

后点击“Start”将工程编译完成后得到的sof文件下载到开发板中,如图 36.5.4所示:

30992a9e45ed08e65c6fc1be33003da7.png

图 36.5.4 程序下载完成界面

下载完成后观察显示器的显示图像如图 36.5.5所示,说明OV7725摄像头LCD显示程序下载

验证成功。

dc249fc5f9d0861e4dbff5318f3df412.png

图 36.5.5 RGB TFT-LCD实时显示图像

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值