EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——最近重新看了一下SDRAM的编程,有些体会写一下 / E; U* @1 {5 y" C" S$ Q/ m( X# D
; Z% r* h) l- I/ Z8 `, |9 r( }" X
之前,有人说过,如果可以单独将SDRAM写出来,基本可以确定算 FPGA编程已经是初级水平了。我不讨论这个话到底对不对,但是之前一直觉得SDRAM用FPGA驱起来很难,后来也没有坚持,就放了很长时间。最近有在朋友那儿看到AX309这块板子(我不是做广告,如果有比较关心的,自己晚上搜搜)上相关历程都会涉及到这个东西,所以就想参考别人的历程,将自己的经验写一下。
3 O6 a1 _2 G( r5 L J" z如果有不对的地方,还请指正。$ E$ L/ f. i; {+ o
2 l- D. ?- J. ZSDRAM数据手册,网上可以找到的就是镁光和韩国的两个企业所提供的。韩国人提供的材料很简单,我也没时间去他们的官网或者别的途径获取更详细的资料。
7 {. \- `3 u7 U! @/ L' i) `+ ?所以就看镁光的芯片,因为他们的datasheet相对比较全。 , |# q4 Q% E8 C* A/ D& r. @
SDRAM一般分为两个阶段,初始化阶段和正常工作阶段。先说初始化阶段,从网上搜到的资料显示初始化过程如下: 1 }5 a9 D! {4 T5 m3 G
5 W0 ` y) s0 K( [+ ~( }1 T9 n( h7 t
, u% ?2 n( X4 e1 Q( l
; z0 D _7 Q r) q
7 P1 h' b! V8 q& v( t' @% s根据镁光提供的初始化时序图和上图有两点差异:
" p$ E$ Y9 Z+ J1、输入稳定期为100us;
+ m+ F8 Y. M v: q* Y$ Q. }1 E2、第3个状态是2个周期。
# b8 i9 ] c' B" k. ?) P具体如下:; L& G! y4 Z% _: h5 \
* P4 _6 a: X3 i( G: s
4 w) H2 i0 {: ]
先以镁光的时序图为准。
" _2 p& s$ L3 B3 a9 U$ bSDRAM有一个时钟范围的要求,外部时钟为50M,通过FPGA内部倍频,可以输出100Mhz的时钟。一个时钟周期为10ns。 8 f" l& ?) N; |3 O/ y. F
在看这个时序图时,有3点应该注意的: 8 t! e/ x$ ]6 |) j
1、状态过程是什么样的。我见到的所有关于Verilog的书上,都会讲到状态机,这个相当于是设计的主心骨,最起码在可综合的设计中是主心骨。
% e3 O! p4 H L8 g7 V# n2、对应的控制字的变化,如CMD、DQM、ADDR、BA。他在每个状态不通时钟周期的值是什么。
) X0 N! d' Z1 U; @% k) {3、DQ的值。
8 j9 h! z6 O/ X! o6 C$ c7 J- j' F+ K# X# z! v
一般的设计将上面3个点分3个文件实现,这个就会涉及到共同的参数的问题。为了解决这个问题,可以将多个文件中用到的相同参数均编写在一个文件中,然后通过 `include调用这个文件。例如:
% s0 H; `2 }: A; Oparameter TRP_CLK = 9'd4,//1, //TRP=18ns预充电有效周期 5 n# p3 X8 G( ^8 t% s; F6 }
T RFC_CLK = 9'd6,//3, //TRC=60ns自动预刷新周期
: o& `8 u; ^+ G+ d) C, K( j TMRD_CLK = 9'd6,//2, //模式寄存器设置等待时钟周期 9 X5 E+ b2 e- v
TRCD_CLK = 9'd2,//1, //TRCD=18ns行选通周期 & T: l, |1 Y6 }9 G0 f
, w i$ W+ S; y O+ @3 R
5 e8 \( T r& s8 F& L+ p q: m: z( m( Z
后边的等写的差不多了再续!
u U1 D9 ~( ^ C! v- G _ |