`include"param.v"
module ov5640_sdram_vga (
input clk ,
input rst_n ,
//ov5640 port
input cmos_vsync ,
input cmos_href ,
input [7:0] cmos_din ,
input cmos_pclk ,
output cmos_xclk ,
output cmos_pwdn ,
output cmos_reset ,
output cmos_sioc ,
inout cmos_siod ,
//sdram port
output [12:0] sdram_addr ,//行、列地址
output [1:0] sdram_bank ,
output sdram_clk ,
output sdram_cke ,
output sdram_rasn ,
output sdram_casn ,
output sdram_csn ,
output sdram_wen ,
output [1:0] sdram_dqm ,
inout [15:0] sdram_dq ,
//vga port
output vga_hsync ,
output vga_vsync ,
output [15:0] vga_rgb
);
//信号定义
wire clk_24m ;
wire clk_100m ;
wire clk_200m ;
wire clk_100m_s ;
wire clk_vga ;
wire cfg_done ;
wire pclk ;
wire [15:0] pixel ;
wire pixel_vld ;
wire pixel_sop ;
wire pixel_eop ;
wire [15:0] mem_din ;
wire mem_din_vld ;
wire mem_din_sop ;
wire mem_din_eop ;
wire [15:0] vga_data ;
wire vga_data_vld;
wire vga_req ;
wire vga_rst ;
assign vga_rst = rst_n & cfg_done;
//模块例化
pll u_pll (
.areset (~rst_n ),
.inclk0 (clk ),
.c0 (clk_24m ),
.c1 (clk_100m ),
.c2 (clk_vga ),
.c3 (clk_200m ),//signaltap采样时钟
.c4 (clk_100m_s ) //100m 相位偏移75度
);
iobuf u_iobuf(
.datain (cmos_pclk ),
.dataout (pclk )
);
`ifdef ONE_SLAVE //i2c接口和cfg模块直接握手
ov5640_config u_cfg(
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
//摄像头接口
/*output */.sio_c (cmos_sioc ),
/*inout */.sio_d (cmos_siod ),
/*output */.cfg_done(cfg_done ) //初始化配置完成
);
`elsif
ov5640_cfg u_cfg( //使用双buf模式
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
//摄像头接口
/*output */.sio_c (cmos_sioc ),
/*inout */.sio_d (cmos_siod ),
/*output */.cfg_done(cfg_done ) //初始化配置完成
);
`endif
capture u_capture(
/*input */.clk (pclk ), //pclk
/*input */.rst_n (rst_n ),
/*input [7:0] */.cmos_din (cmos_din ),
/*input */.cmos_vsync (cmos_vsync ),
/*input */.cmos_href (cmos_href ),
/*input */.cap_en (cfg_done ),//采集使能信号
/*output [15:0] */.pixel (pixel ),
/*output */.pixel_vld (pixel_vld ),
/*output */.pixel_sop (pixel_sop ),//数据包文头
/*output */.pixel_eop (pixel_eop ) //数据包文尾
);
`ifdef ENABLE_EDGE_DETECT
wire [15:0] img_din ;
wire img_din_vld ;
wire img_din_sop ;
wire img_din_eop ;
wire [15:0] imp_dout ;
wire imp_dout_vld ;
wire imp_dout_sop ;
wire imp_dout_eop ;
assign img_din = pixel ;
assign img_din_vld = pixel_vld ;
assign img_din_sop = pixel_sop ;
assign img_din_eop = pixel_eop ;
assign mem_din = imp_dout ;
assign mem_din_vld = imp_dout_vld;
assign mem_din_sop = imp_dout_sop;
assign mem_din_eop = imp_dout_eop;
img_process u_img_process(
/*input */.clk (pclk ),
/*input */.rst_n (rst_n ),
/*input [15:0] */.din (img_din ),
/*input */.din_vld (img_din_vld ),
/*input */.din_sop (img_din_sop ),
/*input */.din_eop (img_din_eop ),
/*output [15:0] */.dout (imp_dout ),
/*output */.dout_vld (imp_dout_vld ),
/*output */.dout_sop (imp_dout_sop ),
/*output */.dout_eop (imp_dout_eop )
);
`elsif
assign mem_din = pixel ;
assign mem_din_vld = pixel_vld;
assign mem_din_sop = pixel_sop;
assign mem_din_eop = pixel_eop;
`endif
sdram_controler u_sdram_ctrl(
/*input */.clk (clk_100m ),
/*input */.clk_in (pclk ),
/*input */.clk_out (clk_vga ),
/*input */.rst_n (rst_n ),
//用户输入
/*input */.rd_en (vga_req ),
/*input [15:0] */.din (mem_din ),
/*input */.din_vld (mem_din_vld ),
/*input */.din_sop (mem_din_sop ),
/*input */.din_eop (mem_din_eop ),
/*output [15:0] */.dout (vga_data ),
/*output */.dout_vld (vga_data_vld ),
//sdram接口
//output sdram_clk ,
/*output */.sdram_cke (sdram_cke ),
/*output */.sdram_csn (sdram_csn ),
/*output */.sdram_rasn (sdram_rasn ),
/*output */.sdram_casn (sdram_casn ),
/*output */.sdram_wen (sdram_wen ),
/*output [1:0] */.sdram_bank (sdram_bank ),
/*output [12:0] */.sdram_addr (sdram_addr ),
/*inout [15:0] */.sdram_dq (sdram_dq ),
/*output [1:0] */.sdram_dqm (sdram_dqm )
);
vga_intf u_vga_intf(
/*input */.clk (clk_vga ),
/*input */.rst_n (vga_rst ),
/*input [15:0] */.din (vga_data ),
/*input */.din_vld (vga_data_vld ),
/*output */.req (vga_req ),
/*output */.vsync (vga_vsync ),
/*output */.hsync (vga_hsync ),
/*output [15:0] */.rgb (vga_rgb )
);
assign cmos_pwdn = 1'b0;
assign cmos_reset = 1'b1;
assign cmos_xclk = clk_24m;
assign sdram_clk = ~clk_100m;
endmodule
/**************************************功能介绍***********************************
Description: OV5640摄像头配置,使用I2C接口配置摄像头寄存器。
I2C接口模块使用请求--应答直接握手模式。
*********************************************************************************/
module ov5640_config (
input clk ,
input rst_n ,
//摄像头接口
output sio_c ,
inout sio_d ,
output cfg_done //初始化配置完成
);
//信号定义
wire [3:0] trans_cmd ;
wire trans_done ;
wire trans_req ;
wire [7:0] trans_dout ;
wire i2c_sda_in ;
wire i2c_scl ;
wire i2c_sda_out ;
wire i2c_sda_out_en ;
//模块例化
i2c_config u_i2c_cfg (
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
/*input */.rw_done (trans_done),
/*output reg */.trans_req (trans_req ),
/*output reg [3:0] */.trans_cmd (trans_cmd ),
/*output reg [7:0] */.trans_dout (trans_dout),
/*output reg */.config_done (cfg_done ) //摄像头配置完成
);
i2c_interface u_i2c_interface(
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
/*input */.trans_req (trans_req ),//传输请求
/*input [3:0] */.trans_cmd (trans_cmd ),//命令码、操作码
/*input [7:0] */.wr_din (trans_dout ),//待发送给从机的数据
/*output reg [7:0] */.rd_dout ( ),//从eeprom读取的一字节数据
/*output reg */.rd_dout_vld ( ),
/*output reg */.trans_done (trans_done ),//i2c_interface 传输一字节完成
/*input */.i2c_sda_in (i2c_sda_in ),
/*output reg */.i2c_scl (i2c_scl ),
/*output reg */.i2c_sda_out (i2c_sda_out ),
/*output reg */.i2c_sda_out_en (i2c_sda_out_en)
///*output reg */.i2c_wr_faile ()
);
assign sio_c = i2c_scl;
assign sio_d = i2c_sda_out_en?i2c_sda_out:1'bz;
assign i2c_sda_in = sio_d;
endmodule
/**************************************功能介绍***********************************
Description: OV5640摄像头配置,使用I2C接口配置摄像头寄存器。
I2C接口模块使用命令队列+数据队列的模式。
*********************************************************************************/
module ov5640_cfg (
input clk ,
input rst_n ,
//摄像头接口
output sio_c ,
inout sio_d ,
output cfg_done //初始化配置完成
);
//信号定义
wire req ;
wire [3:0] cmd ;
wire cmd_vld ;
wire [7:0] wr_dout ;
wire wr_dout_vld ;
wire slave_busy ;
wire sda_in ;
wire sda_out ;
wire sda_out_en ;
wire scl ;
wire [7:0] rd_dout ;
wire rd_dout_vld ;
//模块例化
i2c_cfg u_cfg(
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
//i2c_intf
/*output reg [7:0] */.wr_dout (wr_dout ),
/*output reg */.wr_dout_vld (wr_dout_vld ),
/*output reg [3:0] */.cmd (cmd ),
/*output reg */.cmd_vld (cmd_vld ),
/*output reg */.req (req ),
/*input */.slave_busy (slave_busy ),
/*output reg */.config_done (cfg_done )//配置完成标志
);
i2c_intf u_i2c(
/*input */.clk (clk ),
/*input */.rst_n (rst_n ),
//eeprom_ctrl接口
/*input */.req (req ),
/*input [3:0] */.cmd (cmd ),
/*input */.cmd_vld (cmd_vld ),
/*input [7:0] */.wr_din (wr_dout ),
/*input */.wr_din_vld (wr_dout_vld ),
/*output reg */.slave_busy (slave_busy ),
/*output reg */.fail (),
//eeprom接口
/*input */.sda_in (sda_in ),
/*output reg */.sda_out (sda_out ),
/*output reg */.sda_out_en (sda_out_en ),
/*output reg */.scl (scl ),
/*output reg [7:0] */.rd_dout (rd_dout ),
/*output reg */.rd_dout_vld (rd_dout_vld )
);
assign sio_c = scl;
assign sio_d = sda_out_en?sda_out:1'bz;
assign sda_in = sio_d;
endmodule