冒险武者 发表于 2022-5-22 22:59

安路SparkRoad摄像头监控

本帖最后由 冒险武者 于 2022-5-22 23:16 编辑

<p>购买了一颗OV7725摄像头,一款 1/4 英寸单芯片图像传感器,其感光阵列达到 640*480,能实现最快 60fps VGA 分辨率的图像采集。传感器内部集成了图像处理的功能,包括自动曝光控制(AEC)、自动增益控制(AGC)和自动白平衡(AWB)等。同时传感器具有较高的感光灵敏度,适合低照度的应用。OV7725使用的是两线式接口总线,兼容SCCB协议与IIC协议。</p>

<p>OV7725 的输入时钟频率的范围是 10Mhz~48Mhz,本次实验摄像头的输入时钟为 12Mhz。</p>

<p>OV7725摄像头如下图所示,比较小巧。</p>

<p> &nbsp;</p>

<p>上一篇实现VGA功能的时候,预留了接口,如下图把模式设置位3&lsquo;b100,就可以同步摄像头的数据</p>

<p>可以查看https://bbs.eeworld.com.cn/thread-1203400-1-1.html</p>

<p></p>

<p>摄像头支持多种格式,其中VGA时序要求如下:</p>

<p> &nbsp;</p>

<p>采用SDRAM接口,例化如下:</p>

<pre>
<code>EG_LOGIC_BRAM #( .DATA_WIDTH_A(16),
                                .DATA_WIDTH_B(16),
                                .ADDR_WIDTH_A(16),
                                .ADDR_WIDTH_B(16),
                                .DATA_DEPTH_A(32800),
                                .DATA_DEPTH_B(32800),
                                .MODE("PDPW"),
                                .REGMODE_A("NOREG"),
                                .REGMODE_B("NOREG"),
                                .WRITEMODE_A("NORMAL"),
                                .WRITEMODE_B("NORMAL"),
                                .RESETMODE("SYNC"),
                                .IMPLEMENT("9K"),
                                .INIT_FILE("NONE"),
                                .FILL_ALL("NONE"))
                        inst(
                                .dia(dia),
                                .dib({16{1'b0}}),
                                .addra(addra),
                                .addrb(addrb),
                                .cea(cea),
                                .ceb(ceb),
                                .ocea(1'b0),
                                .oceb(1'b0),
                                .clka(clka),
                                .clkb(clkb),
                                .wea(1'b1),
                                .web(1'b0),
                                .bea(1'b0),
                                .beb(1'b0),
                                .rsta(1'b0),
                                .rstb(1'b0),
                                .doa(),
                                .dob(dob));</code></pre>

<p>再就是实现I2C接口,完成摄像头的初始化工作即可</p>

<p>最后就是实现摄像头图像输出接口,和VGA控制类似,都涉及水平同步、垂直同步信号处理,借用代码</p>

<pre>
<code>module camera_vga
(
        input         wire                 clk,
        input         wire                 reset_n,
       
        output         wire                 csi_xclk,
       
        input         wire                 csi_pclk,
        input         wire         csi_data,
        input         wire                 csi_vsync,
        input         wire                 csi_hsync,
       
        output         reg data_out,
        output         wire                 wrreq,
        output         wire                 wrclk,
        output         reg        wraddr
);

reg pixel_counter = 0;
assign csi_xclk= (reset_n == 1) ? clk : 0;
reg vsync_passed = 0;
reg write_pixel= 0;
reg         subpixel;
reg         current_pixel;
reg wrclk1 = 0;

always@(posedge csi_pclk)
begin
        wrclk1 &lt;= ~wrclk1;
end

always@(negedge wrclk1)
begin
        if(csi_hsync == 1)
                write_pixel &lt;= 1;
        else
                write_pixel &lt;= 0;
end

always@(posedge wrreq )
begin
        data_out &lt;= current_pixel;
end

always@(posedge csi_pclk or negedge reset_n)
begin
        if(reset_n == 0)
        begin
                pixel_counter &lt;= 0;
                vsync_passed &lt;= 0;
        end
        else
        begin
                if(csi_vsync == 1)
                begin
                        pixel_counter &lt;= 0;
                        vsync_passed &lt;= 1;
                        wraddr &lt;= 0;
                end
                else
                        if(csi_hsync == 1 &amp;&amp; vsync_passed == 1)
                        begin
                                if(pixel_counter == 0)
                                begin
                                        pixel_counter &lt;= pixel_counter + 1;
                                        subpixel &lt;= csi_data;
                                end
                                else
                                begin
                                        current_pixel &lt;= { subpixel, csi_data };
                                        pixel_counter &lt;= pixel_counter + 1;
                                        wraddr &lt;= wraddr + 1;
                                end
                        end
                        else
                        begin
                                if(write_pixel == 1)
                                        pixel_counter &lt;= pixel_counter + 1;
                                else
                                        pixel_counter &lt;= 0;
                        end
        end
end

assign wrreq = (write_pixel == 1) &amp;&amp; pixel_counter &gt; 2 ? wrclk1 : 0;
assign wrclk = csi_pclk;

endmodule</code></pre>

<p>&nbsp;在TOP加入应对的模块,设置好模式,摄像头如下所示:</p>

<p>&nbsp;</p>

<p>e9feeb3ffbba5ed4b5fc9ad34a2a11a0</p>

<p>&nbsp;</p>

<p>后续尝试结合SD卡,把摄像头的数据存入SD卡中,这还需要研究下SD卡是如何保存成视频格式的,加油~~~</p>

<p>&nbsp;</p>

<p><br />
&nbsp;</p>

nmg 发表于 2022-5-23 09:41

<p>加油加油,sd卡的,小虾搞过@littleshrimp</p>

nmg 发表于 2022-5-23 09:41

<p>加油加油,sd卡的,小虾搞过 @littleshrimp </p>

littleshrimp 发表于 2022-5-23 10:46

<p>期待你继续弄SD卡 我的SD卡IP一直没调通 想进一步测试发现有一些信号没法添加到逻辑分析仪里</p>
页: [1]
查看完整版本: 安路SparkRoad摄像头监控