CCD_Capture和Raw2RGB的工作原理
1、Cmos sensor的主时钟是靠GPIO_1[11]引脚提供,也就是CCD_MCLK信号。
根据语句always @(posedge CLOCK_50) CCD_MCLK=~CCD_MCLK可知,CCD_MCLK是25MHz的时钟信号,而25MHz正好是MT9M011这个sensor所需的主工作时钟。
2、CCD_Capture每个时钟(CCD_PIXCLK=25MHz)捕获进来的数据CCD_DATA是10bits,表示的可能是绿1(G1)、红(R)、蓝(B)或者是绿2(G2),靠GPIO_1[9:0]提供。
【Q1】CCD_Capture中利用if(X_Cont<1279)来确定一行为1280个点,但是为什么在Y_Cont的计数方面不用设定一个范围,例如加一条判断语句if(Y_Cont<1023)?
难道是iFVAL这个信号是在一帧的1024行数据都输出后变为低电平,从而使{Pre_FVAL, iFVAL}=2'b10,进而使mCCD_FVAL=0,因而触发X_Cont和Y_Cont都变为0。
需要给出X_Cont这个计数器是为了告诉后面,传给你们的数据虽然是一连串的,但是要按一行1280个点进行区分。
3、如果cmos sensor是默认的1280*1024分辨率,则在1280*1024个像素点后,Frame_Cont加1。所以Raw2RGB的输入数据是1280*1024个。
4、Raw2RGB中使用了LineBuffer,实际上是移位寄存器altshift_taps,参数为:输入shiftin和输出shiftout的数据位数为10bit,并行输出taps的个数number_of_taps=2,tap的宽度tap_distance=1280。
这意味着同时输出2行1列像素点,总共1280个时钟后能输出2行完整的图像。
由语句mDVAL<={iY_Cont[0] | iX_Cont[0]}? 1'b0 : iDVAL可知,
1)若当前为偶数行(iY_Cont[0]=0)时,须每2个点才能使mDVAL=iDVAL(这样一行的有效输出点缩小一半至640列);
2)若当前为奇数行(iY_Cont[0]=1)时,mDVAL=0,不输出实时数据。(有效的输出行数也缩小一半至512行)
程序最后面的给mCCD_R、mCCD_G、mCCD_B赋值的4个if判断语句说明:
每次可输出的数据是对2*2像素块的处理结果。
所以,Raw2RGB输出的数据,一行只有640个点,总共是512行。
从sdram_4port_control的写入量WR1_MAX_ADDR=640*512,也可以印证:经过Raw2RGB处理后的1帧图像是512行640列。每个像素点是用3个10bit的R、G、B值来表示。