从camera出的像素格式为bayer格式,单通道提取,生成灰度图。
GRBG4个通道都用某一通道的数据填充。
算法实现,使用双端ram来实现该算法。由于bayer阵列,一个点的像素信息,在bayer阵列中占据两行。
算法思路
取一大小为2行阵列的dpram;每次写入2行数据,而读取时,只选则其中一行读取。且一行中的两个通道都读取同一地址的数据。
代码实现
//file name: gray.v
//author: shugen.yin
//date: 2017.10.18
//function: 单通道数据提取
//log:
module gray(
input cmos_pclk,
input cmos_href,
input cmos_vsync,
input [7:0] cmos_data,
output reg [10:0] v_cnt,
output reg cmos_href_o,
output reg cmos_vsync_o,
output reg [7:0] cmos_data_o
);
parameter IMG_H = 640;
//reg [10:0] v_cnt;
reg [11:0] h_cnt;
always @(posedge cmos_pclk) /*行计数*/
if(cmos_href)
h_cnt <= h_cnt + 1'b1;
else
h_cnt <= 0;
always @(posedge cmos_pclk) /*帧计数*/
if(cmos_vsync)
v_cnt <= 0;
else if(h_cnt==(IMG_H-1))
v_cnt <= v_cnt + 1'b1;
else
v_cnt <= v_cnt;
reg [10:0] rdaddress;
reg [10:0] wraddress;
reg cmos_href_r;
reg cmos_vsync_r;
reg rden;
wire [7:0] q;
always @(posedge cmos_pclk) /*做缓冲,防止读写冲突*/
begin
cmos_href_r <= cmos_href;
cmos_vsync_r <= cmos_vsync;
end
always @(posedge cmos_pclk)
if(cmos_vsync_r)
wraddress <= 0;
else if(cmos_href_r)
if(wraddress<(IMG_H*2-1)) /*dpram中存储两行的数据*/
wraddress <= wraddress + 1'b1;
else /*两行结束地址清0*/
wraddress <= 0;
else
wraddress <= wraddress;
always @(posedge cmos_pclk)
if(cmos_vsync_r)
rdaddress <= 0;
else if(cmos_href_r)
if(rdaddress<(IMG_H-1)) /*读时,只读一行*/
rdaddress <= rdaddress + 1'b1; /*此处地址虽然加1,但是后面没有用到最低位*/
else
rdaddress <= 0;
else
rdaddress <= rdaddress;
always @(posedge cmos_pclk)
if(cmos_vsync_r)
rden <= 0;
else
rden <= cmos_href_r;
dpram dpram_inst
(
.clock(cmos_pclk) , // input clock_sig
.data(cmos_data) , // input [7:0] data_sig
.rdaddress({rdaddress[10:1],1'b0}) , // input [10:0] rdaddress_sig
.rden(rden) , // input rden_sig
.wraddress(wraddress) , // input [10:0] wraddress_sig
.wren(cmos_href_r) , // input wren_sig
.q(q) // output [7:0] q_sig
);
always @(posedge cmos_pclk)
begin
cmos_href_o <= rden;
cmos_vsync_o <= cmos_vsync_r;
cmos_data_o <= q;
end
endmodule