基于FPGA图像采集

该模块实现了一套基于OV5640摄像头的图像处理系统,包括I2C配置、图像捕捉、内存管理和VGA显示。通过I2C接口进行摄像头初始化配置,捕获模块接收CMOS信号并转换为像素数据,再经过图像处理单元可选地进行边缘检测,最后由SDRAM控制器和VGA接口模块输出到显示器。设计中考虑了不同工作模式和时钟频率的适配。
摘要由CSDN通过智能技术生成
`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 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值