前文中讲解了SDRAM的总体思想,以为有了例程,改了改一些时钟方面的问题就行了,然而烧录到自己的开发板上却不好使!
(备注:特权例程所用飓风二代,我的是飓风四代,这点没有关系!主要的修改就是1.时钟频率不同25-48;
2.SDRAM芯片不同HY-winbond,结果是,我的是13位地址,他的是12位地址,也就是容量不同)
现象一:烧录成功后,串口显示程序出现FF,之后再无数据!
于是又是研读了一番程序,看了看自己的程序,没有发现可以更改的地方,只是把时钟,计数方面的修改的更为精准,继续烧录,现象一样!于是便开始了浩浩荡荡的仿真之路!
在添加仿真文件时,才发现原来我的fifo模块不知何时被我改成了例程中的了,也就是飓风二代配置的fifo。于是修改过后,重新烧录,结果。。。。
现象二:结果一直显示FF,而不会送进其他数据!好吧,继续仿真!
其实,先前我曾做了一些仿真,没完成,如今又隔了这么多天,中间学习了时序分析(到现在也没搞懂),实验等等,当然,拖拉也算其中!所以,对于本来就不是太明白的SDRAM,现在来说就生疏起来了!于是又简单的缕了缕!开始真仿真!
问题出来了!整整一个上午各种ERROR DESIGNED ,明明每个例程都编译通过了,就是准备仿真时出现错误!其间不停的重新新建工程(因为我怀疑是不是原来文件夹删除的不彻底,有文件干扰!后来证明。。当然是错的),然后又把特权的例程全搬过来仿真,正常(因为怀疑是不是软件问题)。。最后才发现,modelsim软件,编译时各个文件关联性不大,只要每一个例程的语法无误,就能正确编译,而仿真时就不行了,各个文件必须关联正确,而我就是因为不知道什么时候把程序修改了,导致引脚关联失败(比如,例化时,由于只在子程序中修改了引脚,导致无法仿真)!最终,我还总结了一个方法可以查看到底哪个子程序出现了问题:一个一个点击仿真文件,加载失败的,就是它这个子程序出现问题!这样当我们直接点按bestbench时,就不会因为出现加载错误而无从下手了!通过这个阶段的仿真,发现整个模块到了SDRAM都是能正常输出的,至于是否正确,不得而知!这才感觉,自己对SDRAM这个例程了解的不够,连仿真都不能很好的看明白!所以又暂停了!准备仔细研读例程,然后再仿真!这次研读,使我较深切的了解了数据的传输过程,心得如下:
1.为什么要分八次刷新,而不是延时八次刷新所需要的时间,让其自动刷新八次?
答:1.SDRAM刷新需要命令,所以在每次刷新时,都要重新给一个命令( 刷新指令代码)
2.除了初始化需要刷新,后面的自刷新状态,也要刷新,而个刷新只需要刷新一次,例程中,调用了其中一次刷新!
2.例程中有几个“延时”状态?
答:1.行列有效其间有个延时
2.数据读出有个潜伏期
等等!这是次要的!更重要的是通过把握这几个延时,来深刻的理SDRAM的读写流程!
3.例程中有个专门的“计时状态机”,它的作用是什么?
答:由于状态间的转换需要延时,所以设计成每次状态转换时,计时器清零并开始计时,到了指定时间进入下个状态!
4.如何写入的数据?
我本来认为是送进一个地址,然后写入一个数据!但仔细研读并且查看RTL图发现,地址是直接送进SDRAM地址端口,而只有数据是通过FIFO送进的!而且数据写入SDRAM中,是ACTIVITIES(其中的一个状态机)其间,但是地址却是一个时钟增加一个然后在ACTIVITIES其间才送进,但问题是,当我送进地址时,我是不知道此时地址已经加到哪个数字了!况且例程中行列地址都在一个22位寄存器中,每次取低9位为列地址,高13位为行地址!我又怎能保证是按照(00),(01)。。。。的顺序写入地址的呢?(希望你们明白我的意思)按照我的理解应该是送进一个地址,写入数据,读出地址,读出数据!紧接着送进紧挨着的地址。。。。也就是说,最起码,地址加一的指令应该ACTIVITIES时做的改变!
5.最重要的信息!
HDQM和LDQM拉低!因为特权和开发板硬件电路这两个管脚是接地的!而我的是悬空的,必须认为拉低!
6.指令代码做那些改变?
由于地址是13个,而指令码是通过地址端送的!向前改了一些(主要集中在模式寄存器中),后来发现在自刷新命令中,对同样是对A10设置,对于12脚的是令左起第二位为1,但是13脚的却是左起第三位为1
7.刷新间隔改变了!
12位的是4096行,64ms完成的话是每行15um,13位的是8192行,每行7.5us!
8.除此之外,对其他的一些寄存器的位数做了修改!
于是先烧录看看“战况如何”
现象三:毫无规律可言的各种数据!
于是继续仿真!并发现:
1.这个例程的数据写入,读出并不是我认为的,而是随机的读入地址(也就是此时地址记到什么地方了,到了ACTIVITIES状态我就往这个地址写入数据)然后递增的写入当前地址,等到地址记满,然后清零,进入读状态,遍历地址,有数据送出(好像也不太对,待研究)
2.开始的200us延时完,计数器清零,对应的延时完成标志寄存器只能产生一个高脉冲,计数器清零后,变低!而后面相关例程就必须再等一个200us延时才能行动!不符合200us一旦延时完成,立即开始工作的想法!所以修改!
通过修改,再次烧录后!结果。。。
现象四:数据已经能递增显示,但是会出现漏值和重值!所以有待研究,今天就到这吧!
(用手机打的,硬生生的打了一个半小时,本来是来图书馆自习的!)