零基础学FPGA (二十二) SDR SDRAM(理论篇)
时间:01-28
来源:互联网
点击:
其实说实话这一个月来也没怎么看新知识,大体梳理了一下以前学过的知识,回顾了一下SOPC的学习。对于SOPC的学习我打算暂时先放一放,因为前面还有一个要写的没有完成,也是一直以来无法写起的一个题目,就是今天我们要写的SDRAM的操作。等写完这个,我们再回到SOPC,带领大家调USB2.0!
由于SDRAM本身就是一个比较复杂的东西,之前小墨在学这方面东西的时候感觉很是吃力,于是那时候便暂时放下了,知道年后这段时间,小墨又重新拾起这个知识点,想要一口气把它调通了,再往下看其他的东西。学SDRAM,理论要懂,代码设计,仿真调试,时序分析,时序约束,都很重要。之前由于只是把代码写好了,对时序分析和时序约束这方面的知识还只是空白,所以怎么调都调不通。开学以来,小墨仔仔细细的研究了一下时序,也看了不少的资料,对时序也算是有所见解,摸透了倒是不敢说,至少是懂了那些公式的由来,输入输出延时的计算,相位偏移的计算,以及源同步时序模型的理解等等,也做了不少的笔记,亲手将其数值计算过,然后再将其添加到我的SDRAM工程之中,经过好几天的调试,稳定不稳定倒是不敢说,因为同一个程序换到不同的开发板上,如果不经过重新的时序约束,是很难跑起来的,小墨这几天就亲身经历过,同一段代码在两块板子上不能同时跑,要换约束参数,当然这是受PCB板的布局,SDRAM和FPGA的型号的影响,所以这段代码的稳定性要具体情况具体分析。
代码的编写还是参考了启蒙老师特权老师的代码,感觉这段代码写的很经典,借助特权老师推荐的《高手进阶,终极内存技术》这一篇文章,可以很好的理解SDRAM的工作原理,我是这样学习这段代码的,首先将《高手进阶,终极内存技术》看一遍,当然第一遍不好看懂,然后结合代码再一遍一遍的去看工作原理,慢慢的就会明白特权老师为什么要这么处理了,然后再自己亲手将这段代码敲出来,遇到不懂得可以再去参考源代码,这样从头到尾敲完之后,工作原理这一块大体上就算是熟悉了,然后是仿真调试,这是一个漫长的过程,要有耐心,再然后就是学习时序,亲手将约束值算出来,再根据时序报告进行微调,直到有一天看到自己从头到尾做出来的工程,能后顺利的跑起来,心中便会产生极大的成就感,那么恭喜你,你在FPGA设计方面可以算是一个小高手了(和刚开始学的人相比)。
接下来的文章我打算这么安排,第一篇,也就是这一篇说一下理论,即SDRAM的工作原理和一些参数的含义,第二篇文章我要给SDRAM的设计做一个架构,就是用状态机的方式,描述每一个过程,给代码编写做一个清晰的思路,同时解读一下特权老师的代码和其中比较难懂的设计方法,最后一篇文章我们从静态时序分析写起,一直写到SDRAM的收敛,其中包括建立保持时间的余量问题,输入输出的延时的计算,SDRAM时钟相位的计算,以及timequest的使用,时序报告的查看方法等,大概在一两周的时间写完,也希望大家多多支持,你们的支持,更是我前进的最好动力!
一、从结构说起
先来说一下SDRAM的结构吧。当然没有人家讲的那么专业,只说说我的理解。
1、P-bank
SDRAM,也即我们的内存,我们的电脑,手机等设备都离不开我们的内存。一个设备运行速度的快慢,内存起到关键性的作用,就像我们的电脑,开机之后一般都是把一些应用程序加载到内存里运行,因为RAM的读写速度要远远大于ROM,而我们的SDRAM,即同步动态随机存储器,就是通过不断地刷新,充电,防止电容电量的丢失,从而保留住数据。与CPU交换数据,根据CPU位宽的不同,要相应选择不同的SDRAM芯片,SDRAM芯片的位宽不等,我们用的这片SDRAM是16位位宽,假设我们的CPU是64位的,那么我们要想与之匹配,就必须用到4片这样的SDRAM,才能构成64位的位宽,那么由这4片SDRAM 构成的芯片集合,我们称之为物理bank,即P-bank,CPU通过控制SDRAM的片选信号,控制相应的芯片
2、L-bank
再往芯片里面看,每一片SDRAM里面,有几个存储阵列,我们开发板上的都是4个存储阵列,这样的存储阵列,我们称它为逻辑bank,即L-bank。每个存储阵列里面有2^12行,2^8列,我们可以通过控制SDRAM的地址线,来选中相应的行与列,进而确定一个存储单元,每个存储单元里面就是我们的数据了,我们的芯片是16位的,所以我们的存储单元也就是16位的。
这样一来,CPU通过片选信号选中一片SDRAM,然后访问某一个L-bank,通过行列地址确定某一个存储单元,将存储单元里的数据读出来送到CPU。这样看来,芯片的位宽就是我们的存储单元的位宽,若是一同选中所有SDRAM芯片,那么输出的也就是16X4=64位的CPU位宽了。
3、芯片容量 与 内存容量
我们来算一下SDRAM的芯片容量,一片SDRAM芯片假设有4个L-bank,2^12行,2^8列,那么它就含有4 x 2^12 x 2^8个存储单元,又因为每个存储单元里面有16位数据,因此,我们的芯片容量为 4 x 2^12 x 2^8 x 16 = 64Mbit = 16MB,如果是一个P-bank里面是4片SDRAM的话,那么我们的内存容量就是4 x 16 = 64MB
我们再算一下,假如我们的SDRAM的芯片位宽是8位的但是芯片容量不变,即芯片位宽是8位,芯片容量是16MB,那么,要想与64位的CPU匹配,我们需要8片SDRAM,那么我们的内存容量就是8 x 16 = 128MB,由此可见,在芯片容量相同的情况下,位宽越小,内存容量越大。这就说明了,为什么我们的台式电脑要用位宽小的芯片,因为台式电脑空间大,位宽越小,用的芯片越多,内存也就越大,相反,我们的手机就必须用大位宽的芯片,从而节约空间,但是付出了内存容量小的代价,这也说明了为什么我们的手机或者笔记本电脑不如台式机运行速度快的原因,在内存方面差了一大截
下面是我用画图做的一个框架,帮助大家理解
由于SDRAM本身就是一个比较复杂的东西,之前小墨在学这方面东西的时候感觉很是吃力,于是那时候便暂时放下了,知道年后这段时间,小墨又重新拾起这个知识点,想要一口气把它调通了,再往下看其他的东西。学SDRAM,理论要懂,代码设计,仿真调试,时序分析,时序约束,都很重要。之前由于只是把代码写好了,对时序分析和时序约束这方面的知识还只是空白,所以怎么调都调不通。开学以来,小墨仔仔细细的研究了一下时序,也看了不少的资料,对时序也算是有所见解,摸透了倒是不敢说,至少是懂了那些公式的由来,输入输出延时的计算,相位偏移的计算,以及源同步时序模型的理解等等,也做了不少的笔记,亲手将其数值计算过,然后再将其添加到我的SDRAM工程之中,经过好几天的调试,稳定不稳定倒是不敢说,因为同一个程序换到不同的开发板上,如果不经过重新的时序约束,是很难跑起来的,小墨这几天就亲身经历过,同一段代码在两块板子上不能同时跑,要换约束参数,当然这是受PCB板的布局,SDRAM和FPGA的型号的影响,所以这段代码的稳定性要具体情况具体分析。
代码的编写还是参考了启蒙老师特权老师的代码,感觉这段代码写的很经典,借助特权老师推荐的《高手进阶,终极内存技术》这一篇文章,可以很好的理解SDRAM的工作原理,我是这样学习这段代码的,首先将《高手进阶,终极内存技术》看一遍,当然第一遍不好看懂,然后结合代码再一遍一遍的去看工作原理,慢慢的就会明白特权老师为什么要这么处理了,然后再自己亲手将这段代码敲出来,遇到不懂得可以再去参考源代码,这样从头到尾敲完之后,工作原理这一块大体上就算是熟悉了,然后是仿真调试,这是一个漫长的过程,要有耐心,再然后就是学习时序,亲手将约束值算出来,再根据时序报告进行微调,直到有一天看到自己从头到尾做出来的工程,能后顺利的跑起来,心中便会产生极大的成就感,那么恭喜你,你在FPGA设计方面可以算是一个小高手了(和刚开始学的人相比)。
接下来的文章我打算这么安排,第一篇,也就是这一篇说一下理论,即SDRAM的工作原理和一些参数的含义,第二篇文章我要给SDRAM的设计做一个架构,就是用状态机的方式,描述每一个过程,给代码编写做一个清晰的思路,同时解读一下特权老师的代码和其中比较难懂的设计方法,最后一篇文章我们从静态时序分析写起,一直写到SDRAM的收敛,其中包括建立保持时间的余量问题,输入输出的延时的计算,SDRAM时钟相位的计算,以及timequest的使用,时序报告的查看方法等,大概在一两周的时间写完,也希望大家多多支持,你们的支持,更是我前进的最好动力!
一、从结构说起
先来说一下SDRAM的结构吧。当然没有人家讲的那么专业,只说说我的理解。
1、P-bank
SDRAM,也即我们的内存,我们的电脑,手机等设备都离不开我们的内存。一个设备运行速度的快慢,内存起到关键性的作用,就像我们的电脑,开机之后一般都是把一些应用程序加载到内存里运行,因为RAM的读写速度要远远大于ROM,而我们的SDRAM,即同步动态随机存储器,就是通过不断地刷新,充电,防止电容电量的丢失,从而保留住数据。与CPU交换数据,根据CPU位宽的不同,要相应选择不同的SDRAM芯片,SDRAM芯片的位宽不等,我们用的这片SDRAM是16位位宽,假设我们的CPU是64位的,那么我们要想与之匹配,就必须用到4片这样的SDRAM,才能构成64位的位宽,那么由这4片SDRAM 构成的芯片集合,我们称之为物理bank,即P-bank,CPU通过控制SDRAM的片选信号,控制相应的芯片
2、L-bank
再往芯片里面看,每一片SDRAM里面,有几个存储阵列,我们开发板上的都是4个存储阵列,这样的存储阵列,我们称它为逻辑bank,即L-bank。每个存储阵列里面有2^12行,2^8列,我们可以通过控制SDRAM的地址线,来选中相应的行与列,进而确定一个存储单元,每个存储单元里面就是我们的数据了,我们的芯片是16位的,所以我们的存储单元也就是16位的。
这样一来,CPU通过片选信号选中一片SDRAM,然后访问某一个L-bank,通过行列地址确定某一个存储单元,将存储单元里的数据读出来送到CPU。这样看来,芯片的位宽就是我们的存储单元的位宽,若是一同选中所有SDRAM芯片,那么输出的也就是16X4=64位的CPU位宽了。
3、芯片容量 与 内存容量
我们来算一下SDRAM的芯片容量,一片SDRAM芯片假设有4个L-bank,2^12行,2^8列,那么它就含有4 x 2^12 x 2^8个存储单元,又因为每个存储单元里面有16位数据,因此,我们的芯片容量为 4 x 2^12 x 2^8 x 16 = 64Mbit = 16MB,如果是一个P-bank里面是4片SDRAM的话,那么我们的内存容量就是4 x 16 = 64MB
我们再算一下,假如我们的SDRAM的芯片位宽是8位的但是芯片容量不变,即芯片位宽是8位,芯片容量是16MB,那么,要想与64位的CPU匹配,我们需要8片SDRAM,那么我们的内存容量就是8 x 16 = 128MB,由此可见,在芯片容量相同的情况下,位宽越小,内存容量越大。这就说明了,为什么我们的台式电脑要用位宽小的芯片,因为台式电脑空间大,位宽越小,用的芯片越多,内存也就越大,相反,我们的手机就必须用大位宽的芯片,从而节约空间,但是付出了内存容量小的代价,这也说明了为什么我们的手机或者笔记本电脑不如台式机运行速度快的原因,在内存方面差了一大截
下面是我用画图做的一个框架,帮助大家理解
- 基于PLB总线的H.264整数变换量化软核的设计(03-20)
- 我的FPGA学习历程(05-23)
- Virtex-5推动超宽带通信和测距的发展(01-06)
- Altera FPGA下载配置(11-11)
- 基于ARM9和CPLD的输入输出系统设计(04-09)
- 基于FPGA的高速图像采集系统设计(03-30)