不带fifo的OV7670 用20块的摄像头做WiFi实时传图小车( 二 )


2、修改保存的图像的大小
要改变图像大小,只需修改.v的最大地址大小

不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图

不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图
NOTE:这里的地址大小最好是与和的整数倍,否则在显示图像的时候会出现图像会进行移动 。
注意:我在上面记录了的配置时给了320*240的图像大小,但我最后并没有使用,一方面是因为图像大了传输过慢,另一方面是因为建议图像的大小是他的以及的整数倍,否则显示图像的时候可能会出现图像的移动 。
3、FPGA与STM32的SPI通信
为了实现高速率的传输,我设置了SPI通信为21M,需要注意的是一下几点:
为了保证SPI和STM32的通信,一定要让STM32与FPGA共地!!!SPI模块的时钟 SPI模块的CS
4、将FPGA做成一个FIFO
因为原来的程序中,摄像头的数据是存储在sdram中,使用了乒乓操作,一边读取一边存储,并且设计是考虑到VGA的时序,基本读取与存储是可以很好的同步的进行,但在我这个项目中,我对图像数据的处理明显时远远慢于图像数据的输出,因此我需要将FPGA做成一个保存数据的FIFO(吐槽一下:此处点题,20块的摄像头不带fifo就是这么真实,但凡他有一个fifo我可以简便不少.....)
为了达到fifo的效果,我从入手修改了他的交换bank的条件
case(state_write)3'd0:begin if(frame_write_done&& frame_read_done) //to be sure data with the same image has been wrotestate_write <= 3'd1;else state_write <= 3'd0;end3'd1:begin wr_load <= 1'b0; state_write <= 3'd2; end3'd2:begin wr_load <= 1'b1; state_write <= 3'd3; end3'd3:begin wr_load <= 1'b0; state_write <= 3'd4; end3'd4:beginif(bank_switch_flag)state_write <= 3'd5;elsestate_write <= 3'd4;end3'd5:beginif(frame_write_done&& frame_read_done) //to be sure data with the same image has been wrotebeginwr_bank <= ~wr_bank;state_write <= 3'd0;endelsebeginwr_bank <= wr_bank;state_write <= 3'd4;endenddefault:;
如上所示,在读取完并且写入完毕后才交换bank,以此来配合较慢的读取,但是相应的最终会导致显示的图像有延迟,延迟取决于传输时间、压缩时间等一系列因素 。
不过,其中的神来之笔是我将读取的时钟更换了,不再由pll锁相环提供,而是由SPI模块的读取完毕的信号来作为时钟,通过rtl图可以清楚的看到这一点
不带fifo的OV7670  用20块的摄像头做WiFi实时传图小车

文章插图
这条时钟一方面是作为sdram读取fifo的时钟,另一方面是作为转换灰度图的时钟,因为这个转换是完全流水线结构,所以他的只需要经过3个时钟周期的时滞就可以8位流量的输出灰度值 。
5、小车的驱动
小车的驱动主要是依靠PWM来进行驱动,但需要注意的是,转弯时的摩擦力比较大,需要更强的驱动能力,因此在收到转弯指令的时候可以适当提高PWM的占空比,提高驱动能力 。
2、有关STM32的设计
1、库的使用
这个库是我在CSDN找的,这是链接stm32驱动 数据转BMP格式再转JPEG存储_木木so的博客-CSDN博客
但他是RGB的压缩,我为了更进一步的压缩,把他修改成了灰度图的jpeg压缩,具体可以看我的代码,或者直接使用 。
这位大佬移植了,不过貌似是一个比较旧的版本......压缩质量使用的还是浮点数,不过不影响使用 。
值得一提的是,如果去查看可以在其的->-->下可以看到,这个是官方的移植,不过他把整个给移植过来了,整个工程太大了,所以还是选择使用这个阉割版 。。。。。。
2、STM32与上位机通信