从开学开始写程序,写了大约三个周,程序写的差不多了,然后又调试了一个周,今天可以将ov7670采集的数据显示在显示屏上面了,在调试的过程
遇到了很多bug,简单的几分钟能解决,麻烦的可以调试上一天,而且quartus编译速度又慢,调试一次就得几分钟,等的过程也是比较煎熬的。趁现在刚调试
过了没多久,记录一下之前遇见的bug以及解决过程。
- 第一个遇到的问题是速度匹配的问题,这个问题想了好久,也貌似搞了两天才解决的,描述一下遇到的问题,首先整个系统可以分为 ov7670 -- fifo -- sdram -- fifo -- vga , 因为VGA刷新到有效区域的时候,第二个FIFO里面必须有数,要不然fifo就会被读空 ,所以sdram给出的数据的速度必须大于vga的刷新的速度,刚开始用的是sdram是50M,速度根本跟不上VGA的速度,fifo很快就被读空,然后我就把sdram提高到100M,还是不行,但是我之前看得网上得人大部分都是用100M写得,我知道这是我代码得问题,可能是我之间得延时时间太长了吧,所以我把时间能精简得精简了一些,把vga速度从50M降到40M,vga速度是可以匹配了,如果把ov7670给加上之后,sdram读写速度又跟不上了,因为ov7670出来得每一帧数据都需要显示,不能调,除非整帧舍弃,我又把vga速度尝试降到35M,但是显示屏不支持,这时候我思考怎么把sdram得速度提上去,要不要提高到150M,在我考虑得时候,突然想到了另一个点子,之前sdram写核读数据都是4个一组得读写,看了一下sdram数据手册,有页突发得,4个一组得和8个一组,于是我改成8个一组,改成每组数据8个之后,速度终于可以匹配上了。
- 第二个遇到的问题是显示区域大小,我看OV7670的官方手册上说,每一个HREF对应640tps,我以为是640组数据,每组数据是8bit,因为每一个像素是由是由两组数据组合而成好的,,我以为宽只有320个大小,实际上我i用sigtab抓的时候并不是这样,他是640个像素呢。
- 第三方问题是我刚写完程序得时候,把程序下进去,vga上显示还乱一片,不过也正常,第一遍也不可能就写得没有bug,于是我就先开始验证ov7670有没有写对,ov7670主要分为两个点第一是iic时序,第二就是配置时序,为了验证写得对不对,我就用上探针,先把要读得数据写进去,然后再读出来,看一下寄存器得值有没有被写进去,感觉调试这种事情,严谨一些还是很有好出得,要不到最后数据没出来,你都不知道是哪个地方出了问题,寄存器配置我用的CB写得,因为一共100多个,我就直接用别人配好得了。
- 第四个问题是再我想看ov7670得href和vs信号时,发现vs和href信号之间是紧着得,跟时序图不一样,那时我想难道时我寄存器配置得问题吗?考虑了一个下午,没有结果,为哦就在fpga交流群问了一下,也没人回复,然后问了一下fpga好友,他说我得sigtab采样时钟不对,我当时用vga时钟踩得,不是同步得,所以我又把sigtab采样时钟改成pclk,果真好了。
- 第五个问题,ov7670有好几种调试模式,其中有显示八条彩条得模式,我再显示屏上显示出来得条纹是斜得,而且很乱,感觉许多颜色交杂在仪器了,因为是斜的,我就思考是不是ov7670的一行数据大于vga显示的一行数据,因为只有这样,在vga上才会出现倾斜的现象,检查了一下,也没毛病,于是我就把,sdram调整成640X480大小,这样sdram的行和列正好对应这ov7670的大小,在调试的时候发现,最后一列数据没有写进去,原来换行的时候,最后一列数据还没开始写,就开始换行了,改了之后图像就变直了。
- 当调成正常模式,在vga上可以模糊的显示图像了,但是是动的,这是侯问题定位在ov7670,sdram前fifo,sdram后FIFO,sdarm这四个点,于是我把SDRAM写的数据换成自己预先调号的,这样如果可以的话,证明问题出在前半部分,否则就是后半部分出问题了,结果数据是波动的,这样的话,后半部分肯定有问题,我用sigtab抓了一下数据,发现读出来的数据不对,难道是sdram出问题了吗?我又用之前的测试方法(sdram写进去的数据是列),重新测了一遍之后数据没问题呀,但是如果是行,读出来的数据就不对,一时半会没想到问题出在哪个地方,于是我就把{行,列}一起写进sdram里面,测了一下,发现行还是不对,但是列是对的,这时我怀疑sdram写时序和读时序,其中有一个或者两个都没在规定的时间写进去,改了一下时序,还是不行,然后看了一下别人写的代码,我的少了一个预重电过程,加上之后,图像完美的呈现在vga上。