OV7670摄像头:
SCCB协议有两线也有三线,两线为SIO_C与SIO_D,三线为SIO_E、SIO_C与SIO_D。
2线的SCCB总线只能是一个主器件对一个从器件控制,但3线SCCB接口可以对多个从器件控制,因此当只有一个从机(slave device)时用两线,有多个从机时用三线。
其中SIO_C只能由主机配置(FPGA),SIO_D是一个三态门,双向数据线,既可以由主机控制,也可以由从机控制。
在创建fifo的设置中wrfifo和rdfifo的读和写时钟需要设置为独立;增加同步清零;增加wr的read-side usedw引脚,增加rd的write-side usedw引脚。
vga的数据引脚需注意:顺序为r[4:0]:g[5:0]:b[4:0]
颜色太蓝,不知为何,尝试将引脚顺序修改为b[4:0]:g[5:0]:r[4:0]后,发现太红。可能是其他问题?
直接复制demo的代码是没有问题的,查看demo的引脚接法就是r[4:0]:g[5:0]:b[4:0]
对比之后查明原因,fifo的宽度应该是16bit(直接对应vga的rgb565),我设置的时候搞成了8bit
程序执行的输入和输出只看主程序的IO,其他IO是使用的程序内变量,或者子程序内变量:
在进行vga视频显示的图像灰度化处理时,rgb2gray部分的输入数据是lcd_rgb,输出是vgad。vgad也是主程序的输出;lcd_rgb是sdram_vga_top的输出。sdram_vga_top的作用是从sdram读取图像数据到fifo并从fifo输出给vga接口,如果没有rgb2gray部分则输出为vgad,否则输出为lcd_rgb以方便转化为灰度图再输出数据vgad给vga引脚用于显示。
视频的采集30hz与图像的显示帧率60hz不一致,一般是中间使用一个快速的存储机构sdram来实现匹配。
想对图像做卷积,发现采集的图像是640*480*16bit的图像,要一次取3行数据,发现移位寄存器内存不够。
1.需要使用(3个bank+3个fifo)*2的方式来吗?
2.或者将fifo深度增加,然后直接读出到3个移位寄存器?这种方法看起来可行性比较高。但是,要通过fifo中间寄存器来补充3个移位寄存器,比较麻烦,还可能影响速度。
3.或者将wrfifo的数据直接存储到sdram的3个bank中,然后直接从3个bank中并行读出数据进行处理?看起来最简便。
rdfifo的作用是防止数据拖影?那么这种方式下也需要一个fifo吧,将卷积结果存放于fifo中,然后fifo数据给vga显示。
实际在bank中每次都是存储完一帧图像再进行乒乓切换的。
4.创建3个rdfifo,并行读出,然后计算卷积并送给vga显示。这个看起来才比较可行。