• OV5640摄像头配置一些值得注意的关键点(三)


    一、字节标志的注意点

        由于摄像头的输出是RGB56格式,所以需要将两帧的数据进行拼接,之后送到上位机进行显示。

     1 reg    byte_flag;
     2 
     3 always@(posedge cmos_pclk_i)
     4 begin
     5     if(!rst_n_reg[4])
     6         byte_flag <= 0;
     7     else if(cmos_href_r)
     8         byte_flag <= ~byte_flag;
     9     else
    10         byte_flag <= 0;
    11 end

    上面always块是对拼接的两帧数据设置一个标志信号,在byte_flag==1时进行拼接,既然要进行拼接,就需要将数据进行同步寄存,故有

    always@(posedge cmos_pclk_i)
    begin
        if(!rst_n_reg[4])
            cmos_data_d0 <= 8'd0;
        else if(cmos_href_r)
            cmos_data_d0 <= cmos_data_r;    //MSB -> LSB
        else if(~cmos_href_r) 
            cmos_data_d0 <= 8'd0;
    end

    将当前的摄像头输出数据cmos_data_r寄存到cmos_data_d0,相当于延迟了一个时钟。

    那么,在什么时候进行拼接,就是在byte_flag==1时,可是需要注意第一个always块的byte_falg赋值是在cmos_pclk_i的下一个时钟的上升沿完成,在第一个always块结束时byte_flag还是0,需要等待byte_falg==1,所以第三个always块

    reg [15:0] rgb565;
    always@(posedge cmos_pclk_i)
    begin
        if(!rst_n_reg[4])
            rgb565 <= 16'd0;
        else if(cmos_href_r&byte_flag)
            rgb565 <= {cmos_data_d0,cmos_data_r};    //MSB -> LSB
        else if(~cmos_href_r) 
            rgb565 <= 8'd0;
    end

    上述always块等待byte_flag变为高电平。当byte_flag==1时候进行两帧数据拼接。

    由于数据需要拼接,拼接完毕后的数据才是有效数据,那么必然需要一个标志作为输出有效信号,也就是表明此时数据有效的信号,所以存在以下代码块:

    reg    byte_flag_r0;
    always@(posedge cmos_pclk_i)
    begin
        if(!rst_n_reg[4])
            byte_flag_r0 <= 0;
        else 
            byte_flag_r0 <= byte_flag;
    end
    
    assign    clk_ce =out_en? byte_flag_r0:1'b0;

    为什么需要定义byte_flag_r0将byte_flag延时一个像素时钟呢?因为byte_flag_r0比byte_flga延时一个像素时钟,在这个延时的时钟过程中,完成数据的拼接,当完成数据拼接后,正好此时的数据有效且byte_flag_r0==1,故将byte_flag_r0作为输出有效标志。

    将上面的第一个第二个always块写在一起更容易明白,可参考小梅哥例程中的配置方式,

        //capture and sync RGB565 cmos_din
        reg    [7:0]    cmos_din_r;
        reg    [15:0]    cmos_frame_data_r;
        reg            byte_flag;
        always@(posedge cmos_pclk or negedge rst_n)
        if(!rst_n) begin
            cmos_din_r <= 0;
            byte_flag <= 0;
            cmos_frame_data_r <= 0;
        end
        else if(cmos_href) begin
            byte_flag <= ~byte_flag;
            cmos_din_r <= cmos_din;
            if(byte_flag == 1'b1)
                cmos_frame_data_r <= {cmos_din_r, cmos_din};    //MSB -> LSB
            else
                cmos_frame_data_r <= cmos_frame_data_r;
        end
        else begin
            cmos_din_r <= 0;
            byte_flag <= 0;
            cmos_frame_data_r <= cmos_frame_data_r;
        end

    (二)、此外,在代码案例中,存在前n个帧数据丢弃的情况,目前见过10帧、12帧、15帧,其作用个人理解为预留出5640摄像头的IIC配置初始化过程。

  • 相关阅读:
    CSS 3列等高
    CSS分列等高
    jQuery函数
    JQuery解析JSON数据
    2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25};let p2=p1;】请问p1和p2是同一个对象吗?
    2020-09-24:jvm监控系统是通过jmx做的么?
    2020-09-23:TCP头部信息有哪些?
    2020-09-22:已知两个数的最大公约数和最小公倍数,并且这两个数不能是最大公约数和最小公倍数本身。如何判断这两个数是否存在?
    2020-09-21:已知最大公约数和最小公倍数,如何判断这两个数是否存在?
    2020-09-20:如何判断一个数是质数?
  • 原文地址:https://www.cnblogs.com/qq575654643/p/11826676.html
Copyright © 2020-2023  润新知