1.1 Xilinx平台DDR3控制器使用
这部分主要是使用Vivado中MIG IP核的使用,网上有很多参考例程,这里就不过多描述了,主要说明及使用,详见文末附件。
1.2 基于OV5640的FPGA-DDR HDMI显示
有了下面的框图,对于本次设计其实是事半功倍的,如下:
驱动架构即数据流向图(我盗图我快乐)
1) 、 OV5640 摄像头接口: 是连接到开发板的物理接口,摄像头模块安装在这个接口上
2) 、 HDMI 接口: 是图形的输出接口, 图像数据从 HDMI 接口输出
3) 、 sensor_decode 模块: 解码 OV5640 摄像头的图像数据, 然后转为 R/G/B 数据, 同时需要产生 HS 信号、 VS 信号、 de 信号提供给后续模块使用。如下面一段代码
1.assign rgb_o = {rgb565[15:11],3'd0 ,rgb565[10:5] ,2'd0,rgb565[4:0],3'd0};
2.//assign rgb_o = {grid_data_2,grid_data_2,grid_data_2};
3.assign clk_ce =out_en? byte_flag_r0:1'b0;
4.assign vs_o = out_en ? vsync_d[1] : 1'b0;
5.assign hs_o = out_en ? href_d[1] : 1'b0;
4)、 vga_lcd_driver 模块: 产生 RGB(VGA)输出时序。
5)、MIG_BURST_IMAGE模块:管理图像数据和内存管理,MIG_BURST_IMAGE模块中包括了CH0_FIFO模块、CH6_FIFO模块、MIG_DDR控制器、MSG_FIFO消息盒、M_S内存管理状态机,此外还包括CH0_FIFO的读请求,以及CH6_FIFO的写请求。
1.1.1 主要代码分析
这节不附源码,所有的源码请参考《003_OV5640_DDR3_DEMO\OV5640_DEMO》,每个源码分析时会附上源码文件名称,只需要找到相关文件即可。
OV5640的寄存器配置
《i2c_timing_ctrl.v》
本文件主要实现IIC的时序,具体可以参考上面章节关于IIC的介绍。
《I2C_OV5640_RGB565_Config.v》
本文件主要是OV5640所有的寄存器配置,主要的寄存器都有注释,可以参考源文件。
sensor_decode.v
《sensor_decode.v》
OV5640 输入的图像是 640X480 分辨率的图形,为了观察数据的方便, 未来观察行场信号是否正确,笔者先利用上一课中用到的测试图形方案数据代码 OV5640 产生的 RGB 数据, 而行场型号继续使用 OV5640 产生的行场信号。 这么做的目的, 主要是我们在对 OV5640 解码的时候可能采样的颜色时序会出问题,但是一开始又不能定位问题, 这样可以循序渐进式解决问题。
vga_lcd_driver.v
《vga_lcd_driver.v》
vga_lcd_driver 模块的作用是产生一副 640X480 分辨率的 RGB 使出时序, RGB 的数据来源来自 CH6_FIFO。 读者可以修改不同分辨率输出不同的测试图形。
FIFO模块
FIFO的作用在这次工程中主要目的是为了匹配不同速率之间的数据交互,主要包括写入FIFO和读出FIFO,下面以写入FIFO数据为例,另一个FIFO和此相同,请参考示例教程及源码。
《MIG_BURST_IMAGE.v》
CHX_FIFO 是 IP CORE 在 MIG_BURST_IMAGE 模块中被调用, 输入的图像数据需要经过这个 FIFO把宽度是 32bit 的像素点转为 256bit(32bitX8)。 这个模块主要的信号介绍如下:
CHX_FIFO_RST : 用于复位 FIFO,image_data_gen 模块每次新的一帧数据过来的时候,会复位FIFO, 这样实现对 FIFO 的清除。
CHX_wclk_i : 是写 FIFO 的时钟, 这个时钟来自于顶层的模块和 Image_data_gen 时钟一致。
CHX_rclk_i : 同 MIG 控制的用户时钟一致。
CHX_data_i: 一个 32bit 的数据, 测试数据一个像素是 24bit 所以 CH0_data_i 的31bit~24bit 这里是无效的。
CHX_wren_i: 写 FIFO 使能, 连接到 Image_data_gen 的 de 信号上, 通过 Image_data_gen 实现对 FIFO 的写。
CHX_rden_i: 读 FIFO 使能, 这个信号用于从 FIFO 读取 256bit 的数据, 写入到 MIG 控制器
CHX_data_o : 256bit 长度的数据, 用于输出到 MIG 控制的, 所以可以看出每一次写命令写入到 MIG 控制点的数据量是 8 个像素点。
CHX_empty : 笔者 debug 的时候观察的信号, 对程序没有任何作用。
CHX_rusdw_o
:用来观察
CHX_FIFO
中有多少数据可以读出来的,也是用来产生
MIG
控制器写
MIG
请求的信号。
1.2 编译下载,观察输出
本章实验代码有 2 个如下图所示, 分别对应本课程中每个实验步骤
OV5640_TS_DATA: 增加测试数据代码的部分
OV5640_DEMO: 去掉测试数据采用真实摄像头数据的部分
DOC: 相关参考资料
图3‑17本章节文件夹内容
链接: https://pan.baidu.com/s/1mAbtGQPuYGEzP3JtT8z5sQ
提取码: dwv3