之前讲过ov5640摄像头图像采集,但是只包了的摄像头驱动与数据对齐两部分,但是由于摄像头输入的像素时钟与HDMI输出的驱动时钟并不相同,所有需要利用DDR3来将像素数据进行缓存再将像素数据从DDR3中读出,对DDR3的读写参考米联客的IP,可以高效的实现对DDR3的读写。
工程整体框架如图所示:
工程主要包括摄像头驱动模块、数据对齐模块、数据存储模块和HDMI驱动模块。
顶层模块的代码如下所示:
`timescale 1ns / 1ps
module top_ov5640_ddr3_hdmi(
input sysclk , //系统时钟
//ov5640
input cmos_href_i , //行同步信号
input cmos_vsync_i , //场同步信号
input cmos_pclk_i , //输入时钟
input [7:0] cmos_data_i , //输入像素
output cmos_xclk_o , //摄像头驱动时钟
output cmos_scl , //时钟总线
inout cmos_sda , //数据总线
//HDMI
output HDMI_TX_CLK_P , //时钟
output HDMI_TX_CLK_N ,
output [2:0] HDMI_TX_P , //数据
output [2:0] HDMI_TX_N ,
//DDR3接口信号;
inout [63 : 0] ddr3_dq , //ddr3 数据;
inout [7 : 0] ddr3_dqs_n , //ddr3 dqs负;
inout [7 : 0] ddr3_dqs_p , //ddr3 dqs正;
output [14 : 0] ddr3_addr , //ddr3 地址;
output [2 : 0] ddr3_ba , //ddr3 banck地址;
output ddr3_ras_n , //ddr3 行选择;
output ddr3_cas_n , //ddr3 列选择;
output ddr3_we_n , //ddr3 读写选择;
output ddr3_reset_n , //ddr3 复位;
output [0:0] ddr3_ck_p , //ddr3 时钟正;
output [0:0] ddr3_ck_n , //ddr3 时钟负;
output [0:0] ddr3_cke , //ddr3 时钟使能;
output [0:0] ddr3_cs_n , //ddr3 片选;
output [7 : 0] ddr3_dm , //ddr3_dm;
output [0:0] ddr3_odt , //ddr3_odt;
output card_power_en //板卡使能信号
);
需要注意的是本次工程利用Block Design来搭建数据缓存模块,其中的ip参考自米联客具体框图如下所示:
需要注意的是利用clk_wiz ip来生成期望的时钟信号时,需要将ip核的输入时钟来源设置为Global类型,不然可能会产生如下图所示的报错。
摄像头采集图像结果如图所示: