本帖最后由 冒险武者 于 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_A(16),
.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加入应对的模块,设置好模式,摄像头如下所示:
e846311e5cc5ce7e5fac538d33f11230
后续尝试结合SD卡,把摄像头的数据存入SD卡中,这还需要研究下SD卡是如何保存成视频格式的,加油~~~
|