之前讲过ov5640摄像头图像采集,但是只包了的摄像头驱动与数据对齐两部分,但是由于摄像头输入的像素时钟与HDMI输出的驱动时钟并不相同,所有需要利用DDR3来将像素数据进行缓存再将像素数据从DDR3中读出,对DDR3的读写参考米联客的IP,可以高效的实现对DDR3的读写。
工程整体框架如图所示:
工程主要包括摄像头驱动模块、数据对齐模块、数据存储模块和HDMI驱动模块。
顶层模块的代码如下所示:
`timescale 1ns / 1psmodule top_ov5640_ddr3_hdmi(input sysclk , //系统时钟//ov5640input 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 , //数据总线//HDMIoutput 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类型,不然可能会产生如下图所示的报错。
摄像头采集图像结果如图所示: