Data;
reg [15:0]r_DataPixel;
reg r_DataValid;
reg [12:0]Hcount;
reg [11:0]Vcount;
reg [3:0]FrameCnt;
reg Dump_Frame;
assign DataPixel = Dump_Frame ? r_DataPixel : 24'd0;
assign DataValid = Hcount[0] & Dump_Frame;
//摄像头时钟使能
//assign Frame_Ce = ((Hcount[0]) || (!r_Href)) & Dump_Frame;//1'b1;//(r_DataValid & Dump_Frame)||(!r_DataValid);
//assign Frame_Ce = ((!Hcount[0]) || (!r_Href)) & Dump_Frame;//1'b1;//(r_DataValid & Dump_Frame)||(!r_DataValid);
//时钟为像素时钟
assign Frame_Clk = PCLK;
//打拍
always@(posedge PCLK)
begin
r_Vsync <= Vsync;
r_Href <= Href;
r_Data <= Data;
end
//行同步信号为1时,行计数器加一(行同步信号为0时归零)
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
Hcount <= 0;
else if(r_Href)
Hcount <= Hcount + 1'd1;
else
Hcount <= 0;
//8位转16位,赋予像素数据
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
r_DataPixel <= 0;
else if(~Hcount[0])
r_DataPixel <= {r_Data,Data};
else
r_DataPixel[7:0] <= r_Data;
//产生数据有效信号
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
r_DataValid <= 0;
else if(Hcount[0] && r_Href)
r_DataValid <= 1;
else
r_DataValid <= 0;
//行同步信号由0变为1时,列计数器加一(场同步信号为1时归零)
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
Vcount <= 0;
else if(r_Vsync)
Vcount <= 0;
else if({r_Href,Href} == 2'b01)
Vcount <= Vcount + 1'd1;
else
Vcount <= Vcount;
//场同步信号由0变为1时,帧计数加一,最大为10
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
FrameCnt <= 0;
else if({r_Vsync,Vsync}== 2'b01)begin
if(FrameCnt >= 10)
FrameCnt <= 4'd10;
else
FrameCnt <= FrameCnt + 1'd1;
end
else
FrameCnt <= FrameCnt;
//当计数大于等于10帧时,Dump_Frame变为1,否则为0
always@(posedge PCLK or negedge Rst_n)
if(!Rst_n)
Dump_Frame <= 0;
else if(FrameCnt >= 10)
Dump_Frame <= 1'd1;
else
Dump_Frame <= 0;
endmodule
(3)添加打包好的IP核,并建立连接
(4)修改SDK中的文件
将红框中的寄存器的值改为图片所示的值。即使摄像头输出400*480的图像。
最后烧入程序,可观察到如下结果
7、可改进的地方
可以加个按键来控制sobel算法里的阈值。
(该随笔部分介绍来自小梅哥的教材,侵权删。)
|