CMOS图像传感器RGB计算程序注释:
module shift_1(
clk0, //输入时钟
data_in1, //输入第一行数据
data_in2, // 输入第二行数据
data_in3, //输入第三行数据
qR,qG,qB, //输出RGB分量
out_D14,out_D24,out_D34,//延迟输出4个时钟输出
sel //用于选择像素位置对应的计算方法
) ;
input wire clk0;
input wire [1:0] sel;
input wire [11:0] data_in1;
input wire [11:0] data_in2;
input wire [11:0] data_in3;
output wire [11:0] qR;
output wire [11:0] qG;
output wire [11:0] qB;
output wire [11:0] out_D14;
output wire [11:0] out_D24;
output wire [11:0] out_D34;
wire [11:0] qD12D32,qD21D23,qD11D13,qD31D33,qD11D13D31D33,qD12D32D21D23;
wire coutD12D32,coutD21D23,coutD11D13,coutD31D33,coutD11D13D31D33,coutD12D32D21D23;
reg [11:0] reg_D11;
reg [11:0] reg_D12;
reg [11:0] reg_D13;
reg [11:0] reg_D21;
reg [11:0] reg_D22;
reg [11:0] reg_D23;
reg [11:0] reg_D31;
reg [11:0] reg_D32;
reg [11:0] reg_D33;
reg [11:0] reg_D14;
reg [11:0] reg_D24;
reg [11:0] reg_D34;
assign out_D14=reg_D14;
assign out_D24=reg_D24;
assign out_D34=reg_D34;
第一行和第一列只参与计算第二行和第二列的边界RGB计算,以后不用
D41 D13 D12 D11
D42 D23 D22 D21
D43 D33 D32 D31
R G R G
G B G B
R G R G
G B G B
//求D12和D32的平均值,偶数行偶数列的R值,奇数行的奇数列的B值
ADD_W11 ADD_W11_D12D32(reg_D12[11:1],
reg_D32[11:1],
coutD12D32,
qD12D32[10:0]);
assign qD12D32[11]=coutD12D32;
///求D21和D23的平均值,偶数行偶数列的B值,奇数行的奇数列的R值
ADD_W11 ADD_W11_D21D23(
reg_D21[11:1],
reg_D23[11:1],
coutD21D23,
qD21D23[10:0]);
assign qD21D23[11]=coutD21D23;
/////connor /求D11和D13的平均值,
ADD_W11 ADD_W11_D11D13(
reg_D11[11:1],
reg_D13[11:1],
coutD11D13,
qD11D13[10:0]);
assign qD11D13[11]=coutD11D13;
///求D31和D33的平均值,
ADD_W11 ADD_W11_D31D33(
reg_D31[11:1],
reg_D33[11:1],
coutD31D33,
qD31D33[10:0]);
assign qD31D33[11]=coutD31D33;
///求四角的平均值,奇数行偶数列的B值,偶数行的奇数列的R值
ADD_W11 ADD_W11_D11D13D31D33(
qD11D13[11:1],
qD31D33[11:1],
coutD11D13D31D33,
qD11D13D31D33[10:0]);
assign qD11D13D31D33[11]=coutD11D13D31D33;
////cress add
//求十字处的平均值,奇数行偶数列的G值,偶数行的奇数列的G值
ADD_W11 ADD_W11_D12D32D21D23(
qD12D32[11:1],
qD21D23[11:1],
coutD12D32D21D23,
qD12D32D21D23[10:0]);
assign qD12D32D21D23[11]=coutD12D32D21D23;
R G R G
G B G B
R G R G
G B G B
// 00=
mux4_1 mux4_1_R(
qD12D32, //sel=00; 偶数行偶数列
qD11D13D31D33,//sel=01 偶数行奇数列
reg_D22, //奇数行偶数列 sel=10
qD21D23, //奇数行奇数列 sel=11
sel,
qR);
mux4_1 mux4_1_G(
reg_D22, //sel=00; 偶数行偶数列
qD12D32D21D23, //sel=01 偶数行奇数列
qD12D32D21D23, //奇数行偶数列 sel=10
reg_D22, //奇数行奇数列 sel=11
sel,
qG);
mux4_1 mux4_1_B(
qD21D23, //sel=00; 偶数行偶数列
reg_D22, // sel=01 偶数行奇数列
qD11D13D31D33,/ /奇数行偶数列 sel=10
qD12D32, //奇数行奇数列 sel=11
sel,
qB);
//end
always @(posedge clk0 )
begin //以下是四级移位寄存器
reg_D11 <= data_in1;
reg_D21 <= data_in2;
reg_D31 <= data_in3;
reg_D12 <= reg_D11;
reg_D22 <= reg_D21;
reg_D32 <= reg_D31;
reg_D13 <= reg_D12;
reg_D23 <= reg_D22;
reg_D33 <= reg_D32;
reg_D14<=reg_D13;
reg_D24<=reg_D23;
reg_D34<=reg_D33;
end
endmodule |