EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——最近重新看了一下SDRAM的编程,有些体会写一下 `$ M, n$ @8 a5 ?
6 q. \' a6 t! ^/ K
之前,有人说过,如果可以单独将SDRAM写出来,基本可以确定算 FPGA编程已经是初级水平了。我不讨论这个话到底对不对,但是之前一直觉得SDRAM用FPGA驱起来很难,后来也没有坚持,就放了很长时间。最近有在朋友那儿看到AX309这块板子(我不是做广告,如果有比较关心的,自己晚上搜搜)上相关历程都会涉及到这个东西,所以就想参考别人的历程,将自己的经验写一下。
D1 d% N' ?$ d2 n如果有不对的地方,还请指正。0 J) s; l1 t2 q; U( l
# B9 _' M0 O% y9 R
SDRAM数据手册,网上可以找到的就是镁光和韩国的两个企业所提供的。韩国人提供的材料很简单,我也没时间去他们的官网或者别的途径获取更详细的资料。
8 x2 D9 w( Z# f! I' M9 `. A所以就看镁光的芯片,因为他们的datasheet相对比较全。
4 d( X' X* O3 R5 }SDRAM一般分为两个阶段,初始化阶段和正常工作阶段。先说初始化阶段,从网上搜到的资料显示初始化过程如下: ! `5 i; ~7 M! y5 ^
+ C/ b% e2 c8 p1 L
1 ]2 r, g) }5 ^! J7 Z8 M2 a& u/ N9 e% B1 ?* V; O3 m/ ~
2 o+ m5 m- o7 Z# i4 C% |) ]' B* Y
& i: J. [% ]1 P1 b- I
根据镁光提供的初始化时序图和上图有两点差异:
, }1 `0 u3 A, `5 }" p1、输入稳定期为100us; ( D B: W6 }: W% n0 u( b
2、第3个状态是2个周期。
; i& J! j( \2 O! O; W/ C) S具体如下:0 E8 A' s9 c( S9 }
+ ~6 [3 z1 c7 c. _4 f7 g
2 u, I" B+ f, @; S
先以镁光的时序图为准。7 u1 j2 L4 ~( W5 M6 H
SDRAM有一个时钟范围的要求,外部时钟为50M,通过FPGA内部倍频,可以输出100Mhz的时钟。一个时钟周期为10ns。 9 S! P% c- D1 B5 [9 m/ s1 h
在看这个时序图时,有3点应该注意的:
* M) r, n3 P, K7 z+ B# ]1、状态过程是什么样的。我见到的所有关于Verilog的书上,都会讲到状态机,这个相当于是设计的主心骨,最起码在可综合的设计中是主心骨。
! q7 i# _ R+ Y" ?$ T8 D- i: I2、对应的控制字的变化,如CMD、DQM、ADDR、BA。他在每个状态不通时钟周期的值是什么。 * j( ~, P1 U- y6 o2 S
3、DQ的值。 - w( f K. e) s/ i
3 p4 R) G3 j' g& ?( N* M! x
一般的设计将上面3个点分3个文件实现,这个就会涉及到共同的参数的问题。为了解决这个问题,可以将多个文件中用到的相同参数均编写在一个文件中,然后通过 `include调用这个文件。例如:
+ W* W- w" W# _parameter TRP_CLK = 9'd4,//1, //TRP=18ns预充电有效周期 ( e& e# y! o" v& j
T RFC_CLK = 9'd6,//3, //TRC=60ns自动预刷新周期 5 \$ r7 F7 W* C& [
TMRD_CLK = 9'd6,//2, //模式寄存器设置等待时钟周期 8 `2 K* j- Z9 l
TRCD_CLK = 9'd2,//1, //TRCD=18ns行选通周期 x) y1 ~1 a3 g G% G i0 W! W0 A1 F
: V$ D2 A" w |9 J, W9 n& H
4 \% [' a! `9 _* S6 {/ u
# Y& C( ?$ T8 f9 p后边的等写的差不多了再续!
$ b2 d" p ]( B+ H0 y6 K |