2019年4月10日
OV7670_SDRAM_VGA
ov7670_sdram_vga.rar
(131.21 KB, 下载次数: 1109)
一、功能说明: ov7670_sdram_vga工程实现了FPGA采集OV7670型CMOS摄像头的图像数据,存储到SDRAM,并经由VGA显示在VGA显示器上的功能。
二、适配板卡: 该工程支持小梅哥的众多FPGA开发板,包括AC620、AC609以及红色经典(Starter)开发板。
三、配置文件: 在工程文件夹内,提供了一个名为sof的文件夹,该文件夹下存放了可以直接下载到对应的硬件板卡中查看实验现象的FPGA配置文件(.sof),连接好GM7123型VGA模块和OV7670摄像头,下载对应的sof文件到开发板中。就能在VGA显示器上查看到实时的摄像头采集图像了。
四、引脚分配脚本: 另外在工程文件夹内,提供了一个名为tcl的文件夹,该文件夹下存放了针对每个FPGA开发板的引脚分配脚本,当用户需要基于某个具体的板卡进行调试时,只需要在Quartus软件中依次点击tools -》 tcl scripts,然后选中对应板卡的tcl文件,点击run按钮即可完成引脚更新。
2019年4月12日
OV7670_SDRAM_Display
ov7670_sdram_display.rar
(254.98 KB, 下载次数: 1186)
在上一版ov7670_sdram_vga工程的基础上,进行了进一步的修改,实现支持VGA(640*480分辨率)、4.3寸TFT显示屏(480*272分辨率)、5寸触摸TFT显示屏(800*480)分辨率,继续支持AC620、AC609、Starter开发板。
应用说明:
一、模式配置:
为了一个工程能够同时支持多个板卡(AC620、AC609以及红色经典(Starter)),以及每个板卡能够支持多种显示设备(VGA、4.3寸屏、5寸屏),在显示设备驱动设计时,使用了一个配置文件,名为“disp_parameter_cfg.v”,该文件中提供了3个可选择的预定义项:
1、显示设备类型:- `define HW_TFT
- //`define HW_VGA
复制代码
这两项主要定义硬件输出设备是使用VGA(GM7123 VGA输出模块)还是使用TFT显示屏(4.3、5寸屏),使用哪种硬件,就将对应的定义取消注释,以使其生效,而另一项通过注释的方式屏蔽。该定义主要在“disp_driver.v”文件的60~68行左右位置生效,为了调整显示设备的输出像素时钟相位,VGA输出时需要把控制器时钟取反输出,才能正常工作,否则会花屏,而TFT屏则不能取反,因此采用条件编译的方式实现。
2、显示设备颜色模式- `define MODE_RGB888
- //`define MODE_RGB565
复制代码
这两项主要定义硬件输出设备使用的颜色模式,从硬件设计上来讲,GM7123型VGA 输出模块设计的是24位色RGB888模式,而4.3寸和5寸显示屏使用的是16位色RGB565模式。本意是使用哪种硬件,就选择对应的颜色输出模式,但是发现这样会给工程的可移植性增加很多麻烦,因此在实际使用时,一律使用24位色RGB888模式,对于不同硬件的颜色位数的适配,放到了引脚分配时候完成,如果是VGA,则Red、Green、Blue三个颜色每个8位都分配指定引脚;如果是TFT,则将Red[7:3]、Green[7:2]、Blue[7:3]分别分配给TFT屏的Red[7:3]、Green[7:2]、Blue[7:3],剩余信号不再指定管脚。
因此,在实际使用时,该项参数固定为选择MODE_RGB888
3、分辨率设定
VGA输出为640*480分辨率、4.3寸TFT显示屏480*272分辨率、5寸触摸TFT显示屏800*480分辨率,当选择不同的硬件时,显示设备驱动所需要采用的时序参数也是不一样的,因此通过分辨率设定选项来指定不同的参数。- `define Resolution_480x272 1 //时钟为9MHz
- //`define Resolution_640x480 1 //时钟为25.175MHz
- //`define Resolution_800x480 1 //时钟为33MHz
- //`define Resolution_800x600 1 //时钟为40MHz
- //`define Resolution_1024x768 1 //时钟为65MHz
- //`define Resolution_1280x720 1 //时钟为74.25MHz
- //`define Resolution_1920x1080 1 //时钟为148.5MHz
复制代码
4.3寸屏就使能Resolution_480x272、5寸屏就使能Resolution_800x480、VGA就使能Resolution_640x480。该参数有多个地方生效
第1个地方就是在本文件中,根据不同的分辨率选择,定义每个分辨率对应的时序参数,代码如下
第2个地方在“ov7670_sdram_display.v”文件,也就是工程顶层中,大约75~80行,根据不同的分辨率设置写入到SDRAM中的图像的长宽尺寸,代码如下所示:
- `ifdef Resolution_480x272
- parameter IMG_WIDTH = 480;
- parameter IMG_HIGHT = 272;
- `else
- parameter IMG_WIDTH = 640;
- parameter IMG_HIGHT = 480;
- `endif
复制代码
第3个地方也在“ov7670_sdram_display.v”文件,也就是工程顶层中,大约153~165行,进一步参数化设计,指定CMOS图像采集模块输出采集到的整幅图像的那一个区域。该选项主要是考虑到OV7670摄像头输出的图像大小固定为640*480像素,而4.3寸屏的分辨率只有480*272像素,所以通过设置CMOS图像采集模块仅输出640*480图像的正中心的480*272个像素的数据出来存入SDRAM,以实现图像裁剪的功能。该条件编译代码如下所示:
- CMOS_Capture_RGB565
- #(
- .CMOS_FRAME_WAITCNT (4'd10), //Wait n fps for steady(OmniVision need 10 Frame)
- `ifdef Resolution_480x272
- .OUTIMG_HSTART (12'd79), //实际输出图像的宽度起始像素
- .OUTIMG_HSTOP (12'd559), //实际输出图像的宽度结束像素
- .OUTIMG_VSTART (12'd103), //实际输出图像的高度起始像素
- .OUTIMG_VSTOP (12'd375) //实际输出图像的高度结束像素
- `else
- .OUTIMG_HSTART (12'd0), //实际输出图像的宽度起始像素
- .OUTIMG_HSTOP (12'd640), //实际输出图像的宽度结束像素
- .OUTIMG_VSTART (12'd0), //实际输出图像的高度起始像素
- .OUTIMG_VSTOP (12'd480) //实际输出图像的高度结束像素
- `endif
- )
复制代码
第4个地方还是在“ov7670_sdram_display.v”文件中,大约273~290行
因为OV7670的输出分辨率为640*480,而5寸显示屏的分辨率为800*480,也就是说,5寸屏的行像素比OV7670的输出图像行像素多160个像素,因此,根据像素一一对应的关系,显示屏必然有160*480个像素区域没有实际图像像素与之对应,为了正常显示,可以将这个区域分成两部分,左右各80*480个像素,采用黑色填充,这样640*480的图像就会显示在5寸屏的正中心位置。该部分代码如下所示:
- //定义不同分辨率时输出数据的选择情况
- `ifdef Resolution_800x480
- assign Disp_Red = disp_req?Disp_Red_r : 8'd0;
- assign Disp_Green = disp_req? Disp_Green_r : 8'd0;
- assign Disp_Blue = disp_req? Disp_Blue_r : 8'd0;
-
- always@(posedge ClkDisp)
- disp_req <= (DataReq && (H_Addr > 79) && (H_Addr < 720));
-
- assign RD_Req = disp_req;
-
- `else
- assign Disp_Red = Disp_Red_r;
- assign Disp_Green = Disp_Green_r;
- assign Disp_Blue = Disp_Blue_r;
-
- assign RD_Req = DataReq;
- `endif
复制代码
基本上几个设计要点就解释清楚了。再有什么内容,后面再补充吧。
2019年4月22日
修改了下,加入了对OV7725摄像头的支持,因此文件名称也改为了通配型的ov7xxx,不再特指某个具体型号,同时,将条件编译开关独立写在sys_cfg.v文件中,不再放在显示屏的参数配置文件里了,体现分层思想。
ov7xxx_sdram_display.rar
(188.74 KB, 下载次数: 871)
|