在配置ov7670寄存器后,前10帧图像将不稳定,为了能够达到更好地效果把,前10帧去掉了
//去掉前10帧
reg[3:0] Frame_Cont;
reg Frame_valid;
always @(posedge CMOS_PCLK or negedge iRST_N)
begin
if(!iRST_N)
begin
Frame_Cont <= 0;
Frame_valid <= 0;
end
else if(Init_Done)
begin
if(CMOS_VSYNC == 1'b1 && Frame_valid == 1'b0) //vs上升沿即一帧图像(不懂的看ov的摄像头时序)
begin
if(Frame_Cont < 10)
begin
Frame_Cont <= Frame_Cont + 1'b1;
Frame_valid <= 1'b0;
end
else
begin
Frame_Cont <= Frame_Cont;
Frame_valid <= 1'b1;
end
end
end
else
begin
Frame_Cont <= 0;
Frame_valid <= 0;
end
end
从图上可以看出,第一个数据为一个像素的高8位,第二个数据为像素的低8位。在场信号低,行信号高时,开始捕获数据。把第二个数据拼接到第一个数据后面,实现完整的一个像素输出(RGB565)。
彬哥说ov7670的输入要接缓冲器,要用到sdram,但是我不会,所以想先试下不用sdram会产生什么效果。
//--------------------------------------
//采集rgb565数据流
reg byte_state;
reg[7:0] Pre_CMOS_iDATA;
always @(posedge CMOS_PCLK or negedge iRST_N)
begin
if(!iRST_N)
begin
byte_state <= 0;
Pre_CMOS_iDATA <= 8'd0;
CMOS_oDATA <= 16'd0;
end
else
begin
if(Frame_valid==1'b1)
begin
if(~CMOS_VSYNC & CMOS_HREF)
begin
byte_state <= byte_state + 1'b1;
case(byte_state)
1'b0:Pre_CMOS_iDATA[7:0] <= CMOS_iDATA;
1'b1:CMOS_oDATA <= {Pre_CMOS_iDATA[7:0],CMOS_iDATA};//rgb565
endcase
end
else
begin
byte_state <= 0;
Pre_CMOS_iDATA <= 8'd0;
CMOS_oDATA <= CMOS_oDATA;
end
end
else
begin
byte_state <= 0;
Pre_CMOS_iDATA <= 8'd0;
CMOS_oDATA <= CMOS_oDATA;
end
end
end
endmodule
想要了解更多的内容请去看彬哥的ov7670开发档案0.0。