本帖最后由 冒险武者 于 2022-5-22 23:16 编辑
购买了一颗OV7725摄像头,一款 1/4 英寸单芯片图像传感器,其感光阵列达到 640*480,能实现最快 60fps VGA 分辨率的图像采集。传感器内部集成了图像处理的功能,包括自动曝光控制(AEC)、自动增益控制(AGC)和自动白平衡(AWB)等。同时传感器具有较高的感光灵敏度,适合低照度的应用。OV7725使用的是两线式接口总线,兼容SCCB协议与IIC协议。
OV7725 的输入时钟频率的范围是 10Mhz~48Mhz,本次实验摄像头的输入时钟为 12Mhz。
OV7725摄像头如下图所示,比较小巧。
上一篇实现VGA功能的时候,预留了接口,如下图把模式设置位3‘b100,就可以同步摄像头的数据
可以查看https://bbs.eeworld.com.cn/thread-1203400-1-1.html
摄像头支持多种格式,其中VGA时序要求如下:
采用SDRAM接口,例化如下:
- EG_LOGIC_BRAM
- .DATA_WIDTH_B(16),
- .ADDR_WIDTH_A(16),
- .ADDR_WIDTH_B(16),
- .DATA_DEPTH_A(32800),
- .DATA_DEPTH_B(32800),
- .MODE("PDPW"),
- .REGMODE_A("NOREG"),
- .REGMODE_B("NOREG"),
- .WRITEMODE_A("NORMAL"),
- .WRITEMODE_B("NORMAL"),
- .RESETMODE("SYNC"),
- .IMPLEMENT("9K"),
- .INIT_FILE("NONE"),
- .FILL_ALL("NONE"))
- inst(
- .dia(dia),
- .dib({16{1'b0}}),
- .addra(addra),
- .addrb(addrb),
- .cea(cea),
- .ceb(ceb),
- .ocea(1'b0),
- .oceb(1'b0),
- .clka(clka),
- .clkb(clkb),
- .wea(1'b1),
- .web(1'b0),
- .bea(1'b0),
- .beb(1'b0),
- .rsta(1'b0),
- .rstb(1'b0),
- .doa(),
- .dob(dob));
再就是实现I2C接口,完成摄像头的初始化工作即可
最后就是实现摄像头图像输出接口,和VGA控制类似,都涉及水平同步、垂直同步信号处理,借用代码
- module camera_vga
- (
- input wire clk,
- input wire reset_n,
-
- output wire csi_xclk,
-
- input wire csi_pclk,
- input wire [7:0] csi_data,
- input wire csi_vsync,
- input wire csi_hsync,
-
- output reg [15:0] data_out,
- output wire wrreq,
- output wire wrclk,
- output reg [15:0] wraddr
- );
-
- reg [19:0] pixel_counter = 0;
- assign csi_xclk = (reset_n == 1) ? clk : 0;
- reg vsync_passed = 0;
- reg write_pixel = 0;
- reg [7:0] subpixel;
- reg [15:0] current_pixel;
- reg wrclk1 = 0;
-
- always@(posedge csi_pclk)
- begin
- wrclk1 <= ~wrclk1;
- end
-
- always@(negedge wrclk1)
- begin
- if(csi_hsync == 1)
- write_pixel <= 1;
- else
- write_pixel <= 0;
- end
-
- always@(posedge wrreq )
- begin
- data_out <= current_pixel;
- end
-
- always@(posedge csi_pclk or negedge reset_n)
- begin
- if(reset_n == 0)
- begin
- pixel_counter <= 0;
- vsync_passed <= 0;
- end
- else
- begin
- if(csi_vsync == 1)
- begin
- pixel_counter <= 0;
- vsync_passed <= 1;
- wraddr <= 0;
- end
- else
- if(csi_hsync == 1 && vsync_passed == 1)
- begin
- if(pixel_counter[0] == 0)
- begin
- pixel_counter <= pixel_counter + 1;
- subpixel <= csi_data;
- end
- else
- begin
- current_pixel <= { subpixel, csi_data };
- pixel_counter <= pixel_counter + 1;
- wraddr <= wraddr + 1;
- end
- end
- else
- begin
- if(write_pixel == 1)
- pixel_counter <= pixel_counter + 1;
- else
- pixel_counter <= 0;
- end
- end
- end
-
- assign wrreq = (write_pixel == 1) && pixel_counter > 2 ? wrclk1 : 0;
- assign wrclk = csi_pclk;
-
- endmodule
在TOP加入应对的模块,设置好模式,摄像头如下所示:
播放器加载失败: 未检测到Flash Player,请到 安装
e846311e5cc5ce7e5fac538d33f11230
后续尝试结合SD卡,把摄像头的数据存入SD卡中,这还需要研究下SD卡是如何保存成视频格式的,加油~~~
|