问题总结
这是我用Eclipse下载到AC620时出现的相关错误,仅此收录在这篇博客里面,会不定时得更新。
一.SDRAM存储问题:
这个问题要看你下载是否报错之前的界面,也就是verify那里,注意看下地址,然后一般根据地址就会发现是SDRAM报错。
1.一般这里报错都是PLL锁相环得时钟相位差给错了
2.可能有玄学问题,就那种什么都不改,昨天好好得,今天就会报错得那种,也很正常。碰到了,不要管他,仔细照着把Qsys弄好,然后重新写Eclipse代码。注意每次更改Qsys后要对Eclipse得BSP文件重新Generate以下。具体图如下所示:
SDRAM相位差计算方法
对于第一种问题,以下是相关的解决方案:
首先先介绍下PLL和SDRAM的相关计算方法:
虽然可能不会去用,但是不能不会怎么么去计算,万一可以教教妹子啥的呢?
正文开始:
SDRAM和NIos II连接的典型框图如下图所示:
SDRAM和System使用同一个PLL输出时钟,可以保证System Clock和SDRAM Clock的相对抖动比较小。外部晶振的时钟送入PLL,然后由PLL产生两个同频的时钟一个供给Nios II系统使用,另一个供给SDRAM使用。(把PLL设置成Zero Buffer Mode可以比较方便地控制SDRAM Clock和输入时钟Extern Clock的相位关系。)Nios II系统中的SDRAM控制器和SDRAM通过双向数据线以及其它的单向控制线和SDRAM相连。
SDRAM Clock通常是C0输出或者C1输出,C0和C1都是PLL专用于输出外部时钟的,有比较小的抖动。由于一个FPGA中通常有若干个PLL,综合后使用哪个PLL是由输入时钟Extern Clock决定的,所以SDRAM Clock必须和Extern Clock是同一个PLL的专用输入管腿和专用输出管腿。调试SDRAM和Nios II 的最关键是调整SDRAM Clock的相位。
下面推导SDRAM Clock和ExternClock的相位关系。
用实现向上箭头表示Extern Clock的上升沿,用虚线向上箭头表示Sdram Clock的上升沿。
先看第一种情况:
FPGA输出数据,而SDRAM采样数据。FPGA在ExternClock(输出时钟引脚)上升沿的时候送出数据,经过最大Tcoutmax(FPGA)的时间在FPGA的管腿输出,由于SDRAM的输入建立时间为Tsu(SDRAM),所以Sdram Clock的采样时机必须在信号到达SDRAM后再等Tsu(SDRAM)。忽略PCB板传输延时,有:
Tlead=T-(Tcoutmax(FPGA)+Tsu(SDRAM));其中Tlead 为SDRAMClock相对ExternClock的最大提前量,T为时钟周期。
在下一个时钟上升沿来了后,FPGA会驱动新的信号,在经过最小Tcoutmin(FPGA)的时间(相当于输出保持时间)可能把先前驱动的信号冲掉,而SDRAM要求输入信号要求在采样的时候保持Tih(SDRAM)的时间,所以SDRAM的采样时机必须在Tcoutmin(FPGA)到来之前Tih(SDRAM)。忽略PCB板传输延时,有:
Tlag=Tcoutmin(FPGA)-Tih(SDRAM);其中Tlag为SDRAMClock相对ExternClock的最大落后量,Tih(SDRAM)为SDRAM输入保持时间
再看第二种情况:
SDRAM输出数据,FPGA采样数据。分析和上面类似,最后有:
Tlead=Tcoutmin(SDRAM)-Tih(FPGA);
Tlag=T-(Tcoutmax(SDRAM)+ Tsu(FPGA));
选取最小的Tlead和最小的Tlag和SDRAMClock允许的最大提前量和最大落后量。举个例子:Nios II 和SDRAM(MT48LC4M32B2-7)相连主频100MHz。其数据如下:
- Data In: Tsu = 2 ns, Tih = 1 ns
- Data Out: Toh (Tcoutmin )=2.5 ns, Thz/tac (Tcoutmax)= 5.5 ns (CL=3)
Tlead=2.5 – 1 ns = 1.5 ns (Data Undefined)
FGPA的数据可以在编译报告的时序分析部分得到,Tcoutmax(FPGA),Tsu(FPGA),Tih(FPGA)分别可以从Tco,Tsu,Th部分得到各个SDRAM相关信号的最大值。而Tcoutmin(FPGA)则可以运行Fast timing model timing analyzer 来得到。
比如:
- Data In: Tsu = 1.75 ns, Tih = 0 ns ,T = 10 ns
- Data Out: Tcoutmin(FPGA) = 2 ns,Tcoutmax(FPGA)=5.5 ns
Tlead=T-(Tcoutmax(FPGA)+Tsu(SDRAM))=10ns-5.5ns-2ns=2.5ns
Tlead=Tcoutmin(SDRAM)-Tih(FPGA)=2.5ns-0ns=2.5ns
选一个小的,仍然是2.5ns。即Tlead=2.5ns
Tlag = Tcoutmin(FPGA)-Tih(SDRAM)=2ns-1ns=1ns,
Tlag = T-(Tcoutmax(SDRAM)+Tsu(FPGA))=10-5.5ns-1.75ns=2.75ns
结果中咱选一个小的,即Tlag=1ns。
所以SDRAM Clock的相对ExternalClock相位为-2.5ns~+1ns之间。在生成PLL时指定在这个范围内的相位偏移就可以了。
注意:因为FPGA的时序分析报告都是以External Clock来算的,所以我们并没有使用System Clock来分析。
通过分析我们知道了Qsys里面PLL的相位应该设置成多少,但是肯定有很多人不愿意看这么长篇大论的推断吧:AC620的PLL相位一般设成-90度,其他的可以根据相关例程的PLL设置。