1,OV7670 有一大堆寄存器需要配置,这些配置可以参考别人已经做好的代码。
2,OV7670 设置为640*480 16的分辨率,30帧每秒,就是30FPS,每一个RGB的数据是16位的,这16位的数据分成两次从8BIT的总线传输过来。
3,计算时钟是多少: 640*480个点,每秒传递30帧(也就是刷屏30次每秒),这样就是640*480*30,而每个点是16位的需要在0OV7670位的传输总线上传输2次。因此显示的存储带宽应该是 640*480*30*2 (字节每秒)。
4,而实际的给OV7670的时钟XCLK应该考虑到消隐和同步的开销,这点计算和VGA的时钟计算相似,计算数值约为25M。采用25M的XCLK 就可以。
5,XCLK是嫁给OV7670的时钟信号,PCLK 是OV7670输出同步信号(而非时钟)。
6,从OV7670获取图像再存在一个缓冲区,之后VGA显示控制器从这个缓冲区获取数据,现在在VGA屏幕上。
7,上面提到的缓冲区,在ZYNQ7 新片有丰富的BRAM,我们直接用BRAM 开辟出深度为307200(460*480),宽度为12位(因为VGA显示是12位的)的BRAM块。采用准双口模式,OV7670的数据每采集两个连续的8位转换并从BRAM的A口写入这个BRAM;VGA控制器直接从B口读出数据进行显示。
8,OV7670采用了类似I2C的串行接口,实现对多个寄存器的配置,SIOD相当于I2C的SDA,是双向的,只我们一般忽略了从OV7670的应答(正确的时序了链接必然得到正确应答,另外如果不应答,程序也似乎没有别的招应对处理)。
9,图像色彩还有点问题,还有继续调试,应该是寄存器配置问题,或者RGB信号线对应。
10,
11,下面是PMOD A B口约束文件的对应。
NET OV7670_PWDN LOC = Y11 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA1
NET OV7670_D<0> LOC = AA11 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA2
NET OV7670_D<2> LOC = Y10 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA3
NET OV7670_D<4> LOC = AA9 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA4
NET OV7670_RESET LOC = AB11 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA7
NET OV7670_D<1> LOC = AB10 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA8
NET OV7670_D<3> LOC = AB9 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA9
NET OV7670_D<5> LOC = AA8 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JA10
NET OV7670_D<6> LOC = W12 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB1
NET OV7670_XCLK LOC = W11 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB2
NET OV7670_HREF LOC = V10 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB3
NET OV7670_SIOD LOC = W8 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB4
NET OV7670_D<7> LOC = V12 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB7
NET OV7670_PCLK LOC = W10 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB8
NET OV7670_VSYNC LOC = V9 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB9
NET OV7670_SIOC LOC = V8 | IOSTANDARD=LVCMOS33 | SLEW=SLOW; # JB10