冒险武者 发表于 2022-8-1 00:18

安路SparkRoad实现个人照相机

本帖最后由 冒险武者 于 2022-8-1 00:17 编辑

<p>利用周末空闲时间,简易板照相机只能说基本功能达到了,主要功能如下</p>

<p>1.实时显示视频流</p>

<p>2.按拍照按钮后,把图像数据存到sdram中,然后存到sd卡</p>

<p>3.视频显示用的是VGA显示屏(可惜没有TFT_LCD接口)</p>

<p>&nbsp;</p>

<p></p>

<p>按钮的定义:按键0:模式选择:视频流与查看照片&nbsp; 按键1与3上下翻找照片,按键3打开拍照,拍完后返回视频流,如下所示:</p>

<pre>
<code>always@(posedge camera_wclkornegedge rst_n)
begin
    if(!rst_n) begin
             pai_cnt&lt;=   2'b00 ;
             mode   &lt;=   1'b1 ;
             pai_en   &lt;=   1'b0 ;
        end
        else if((tim == 8'd40) &amp;&amp; pai_en ) begin//&amp;&amp; (camera_addr == 16'h0)
                pai_en   &lt;=   1'b0 ;
                mode   &lt;=   1'b1 ;
        end
        else if(key_pulse) begin//mode
                mode   &lt;=   ~mode ;
                pai_cnt&lt;=   8'h0 ;
        end
        else if(key_pulse) begin//up
                pai_cnt&lt;=pai_cnt+ 1'b1;   
        end
        else if(key_pulse) begin //pai
                mode   &lt;=1'b0 ;
                pai_en   &lt;=1'b1 ;
                pai_cnt&lt;=pai_cnt+ 1'b1;
        end
        else if(key_pulse)begin//down
                pai_cnt&lt;=pai_cnt- 1'b1;
        end
end

always@(posedge clk_50mornegedge rst_n)
begin
    if(!rst_n)
                        key_led&lt;= 5'h1F;
        else if(key_pulse)
                        key_led   &lt;= ~key_led;
        else if(key_pulse)
                        key_led   &lt;= ~key_led;
        else if(key_pulse)
                        key_led   &lt;= ~key_led;
        else if(key_pulse)
                        key_led&lt;= ~key_led;
        else if(key_pulse)
                        key_led &lt;= ~key_led;                     
        else
                key_led      &lt;= key_led;
end </code></pre>

<p>&nbsp;</p>

<p>sdram的控制直接修改例程获得</p>

<pre>
<code>Sdram_Control_4Port Sdram_Control(
                //        HOST Side
                .CTRL_CLK(clk_sdr_ctrl),        //输入参考时钟,默认100M,如果为其他频率,请修改pll设置
                .SDRAM_CLK(clk_sdram),                //SDRAM时钟,默认100M(90°),如果为其他频率,请修改pll设置
                .RESET_N(rst_n),                        //复位输入,低电平复位

                //        FIFO Write Side 1
                .WR1_DATA(camera_wrdat),        //写入端口1的数据输入端16bit
                .WR1(camera_wrreq),                  //写入端口1的写使能端,高电平写入
                .WR1_ADDR(21'b0),                  //写入端口1的写起始地址
                .WR1_MAX_ADDR((IMG_W*IMG_H)),        //写入端口1的写入最大地址
//                .WR1_LENGTH(10'd1),                //一次性写入数据长度
                .WR1_LENGTH(10'd256),                //一次性写入数据长度
                .WR1_LOAD((~rst_n)&amp;(init_ready) ),
                                                                        //写入端口1清零请求,高电平清零写入地址和fifo
                .WR1_CLK(camera_wclk),                //写入端口1 fifo写入时钟
                .WR1_FULL(),                                //写入端口1 fifo写满信号
                .WR1_USE(),                                        //写入端口1 fifo已经写入的数据长度
                //        FIFO Write Side 2
                .WR2_DATA(sd_wrdat),                        //写入端口2的数据输入端16bit
                .WR2(1'b0),                                        //写入端口2的写使能端,高电平写入
                .WR2_ADDR(21'd32800),                                //写入端口2的写起始地址
                .WR2_MAX_ADDR(32800),                //写入端口2的写入最大地址 (IMG_W*IMG_H)
                .WR2_LENGTH(9'd256),                                //一次性写入数据长度       
                .WR2_LOAD((~rst_n)&amp;(init_ready)),                        //写入端口2清零请求,高电平清零写入地址和fifo
                .WR2_CLK(sd_clk),                                //写入端口2 fifo写入时钟
                .WR2_FULL(),                                //写入端口2 fifo写满信号
                .WR2_USE(),                                        //写入端口2 fifo已经写入的数据长度
                //        FIFO Read Side 1
                .RD1_DATA(sd_rddat),                //读出端口1的数据输出端16bit
                .RD1(sd_rden),                          //读出端口1的读使能端,高电平读出
                .RD1_ADDR(21'b0),                        //读出端口1的读起始地址
                .RD1_MAX_ADDR(32800),                //读出端口1的读出最大地址(IMG_W*IMG_H)
//                .RD1_LENGTH(10'd1),                //一次性读出数据长度
                .RD1_LENGTH(10'd256),                //一次性读出数据长度
                .RD1_LOAD((~rst_n) &amp; (init_ready)),
                                                                        //读出端口1 清零请求,高电平清零读出地址和fifo
                .RD1_CLK(sd_clk),                        //读出端口1 fifo读取时钟
                .RD1_EMPTY(),                                //读出端口1 fifo读空信号
                .RD1_USE(),                                        //读出端口1 fifo已经还可以读取的数据长度

                //        FIFO Read Side 2
                .RD2_DATA(sd_rddat),                                //读出端口2的数据输出端16bit
                .RD2(vga_den),                                        //读出端口2的读使能端,高电平读出
                .RD2_ADDR(21'd32800),                        //读出端口2的读起始地址
                .RD2_MAX_ADDR((IMG_W*IMG_H)),                        //读出端口2的读出最大地址
                .RD2_LENGTH(9'd256),                        //一次性读出数据长度       
                .RD2_LOAD((~rst_n) &amp; (init_ready)),                        //读出端口2清零请求,高电平清零读出地址和fifo
                .RD2_CLK(clk_lcd),                                //读出端口2 fifo读取时钟
                .RD2_EMPTY(),                                //读出端口2 fifo读空信号
                .RD2_USE()                                        //读出端口2 fifo已经还可以读取的数据长度
        );        </code></pre>

<p>&nbsp;</p>

<p>SD读写是SPI协议控制,copy正点原子的相关文件后修改的获得</p>

<pre>
<code>//SD卡顶层控制模块
sd_ctrl_top u_sd_ctrl_top(
    .clk_ref         (clk_sd),
    .clk_ref_180deg    (clk_sd_180deg),
    .rst_n             (rst_n),
    //SD卡接口
    .sd_miso         (sd_miso),
    .sd_clk            (sd_clk),
    .sd_cs             (sd_cs),
    .sd_mosi         (sd_mosi),
    //用户写SD卡接口
    .wr_start_en       (wr_start_en),
    .wr_sec_addr       (wr_sec_addr),
    .wr_data         (wr_data),
    .wr_busy         (wr_busy),
    .wr_req            (wr_req),
    //用户读SD卡接口
    .rd_start_en       (rd_start_en),
    .rd_sec_addr       (rd_sec_addr),
    .rd_busy         (rd_busy),
    .rd_val_en         (rd_val_en),
    .rd_val_data       (rd_val_data),      
   
    .sd_init_done      (sd_init_done)
    );</code></pre>

<p>&nbsp;</p>

<p>需要强调的是SD卡中存数据无法形成照片,因为涉及到照片格式与文件相关簇信息管理,暂时搞不定,这个可以研究手册</p>

<p>视频显示用的是VGA接口显示器,可惜该单板没有预留TFT_LCD显示屏,用TFT_LCD屏那就更加完美</p>

<p>&nbsp;</p>

<p>视频如下:</p>

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

<p>大家可以看到闪屏,抓取的照片不是很花屏现场等等问题,研发就是遇到问题,分析问题,解决问题过程,这次试用对个人能力有一定提升,总体体验不错。</p>

<p>&nbsp;</p>

1nnocent 发表于 2022-8-1 09:14

<p>这摄像头是优信电子买的吗?那个型号?</p>

wangerxian 发表于 2022-8-1 16:00

<p>这分辨率和频率,感觉这芯片性能可以啊,而且内存也不小。<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" />把FPGA玩的挺6!</p>

冒险武者 发表于 2022-8-1 22:41

1nnocent 发表于 2022-8-1 09:14
这摄像头是优信电子买的吗?那个型号?

<p>OV2640摄像头,在淘宝一搜很多</p>
页: [1]
查看完整版本: 安路SparkRoad实现个人照相机