VERDVANA'S BLOG Verdvana

FPGA与DDR3的原理图和PCB设计


封面

1 前言

        去年做了一块Xilinx Artix的核心板,想在上面放一片Micron的DDR4颗粒,可惜Xilinx的FPGA只有UltraScale的才支持DDR4,所以只能选用DDR3。

  • 开发环境:
    • Altium Designer 20.2.3
    • Vivado 2020.1
  • 操作系统:
    • Windows 10 Pro 1903
  • 器件(部分):
    • FPGA:Xilinx XC7A35T-1CSG325C (CSG235)
    • DDR3:Micron MT41J256M8 (FBGA78)
    • 电源IC:TI TPS51200 (VSON-10)

2 电气特性

        根据JEDEC制定的DDR3 SDRAM STANDARD文档可知,DDR3的供电电压范围为1.35V~1.5V,接口采用SSTL 15标准。本设计选用1.5V的DDR3器件。所以需要板载一颗DC-DC降压转换器来产生1.5V的供电电源来给DDR3中的VDD和VDDQ供电,其中VDD给核心逻辑供电,而VDDQ给IO Buffer供电,通常情况下这两个电源统一使用相同的1.5V。这里采用了Ti的TLV62130x来产生1.5V电源。

        另外,DDR3还需要参考电压Vref和跟踪终止电压(Tracking Termination Voltage)VTT。其中Vref是用来判断IO的高低电平,因此对其精度有更高的要求,它的值是VDDQ的一半。在成本敏感或布局灵活的设计中会采用VDDQ分压的方式产生Vref,这里一般选用1-10K,精度为1%的电阻来分压。也有使用电源芯片来提供Vref的设计,看了一些Xilinx和Intel PSG官方的开发板发现基本都使用Ti的TPS51200终端稳压器。这款芯片支持DDR、DDR2、DDR3、DDR3L、LPDDR3、DDR4的Vref和VTT输出。VTT用来上拉DDR3控制线,VTT的值同样为VDDQ的一半,它的电流比较大,同时存在较大的噪声,并且要求电源及可以提供电流,又可以吸收电流。如果设计中的DDR3颗粒只有一片,通常是不需要VTT的。


3 电路原理设计

        既然DDR3的IO为SSTL 15标准,FPGA与DDR3连接BANK的VCCO需要连接1.5V的电压。本设计选用的Artix芯片只有三个通用的BANK,因此计划只使用一个BANK连接DDR3,该BANK采用1.5V电压,其它BANK采用3.3V电压。

        电源IC选用了在各种FPGA评估板上出镜率很高的TPS51200,它可以以一个3.3V的参考电压来产生DDR3所需要的1.5V、Vref和VTT电压,这部分电路原理设计如图:

img10

        DDR3颗粒选用了Micron的MT41J256M8DA-125,FBGA-78封装,引脚划分如下:

Signal Name Type Class
A[14:0] Input ADDR
BA[2:0] Input ADDR
CK_p/CK_n Input ADDR
CKE Input ADDR
WE_n/RAS_n/CAS_n Input ADDR
CS_n Input ADDR
ODT Input ADDR
RESET_n Input ADDR
DM Input DQ
DQ[7:0] I/O DQ
DQS_p/DQS_n I/O DQ
VREFDQ Supply PWR
VREFCA Supply PWR
VDDQ Supply PWR
VDD Supply PWR
VSSQ Supply PWR
VSS Supply PWR
ZQ Reference -
NC - -

        其中,DDR3_CK_P和DDR3_CK_N是FPGA输出给DDR3的差分时钟,需要接在FPGA的差分时钟引脚上;DDR3_DQS_P和DDR3_DQS_N是数据同步差分信号,需要接在FPGA的带有DQS的差分引脚上。其余为单端信号。

        初次设计时,我以为只需要注意以上两对差分信号线,其余信号在一个BANK内随便接就可以。于是根据PCB上Pin的距离分配了引脚映射,然后布线做等长。但感觉有些不放心,于是用Vivado新建了一个工程,添加了DDR3 SDRAM的MIG。当进行到Pin Selection这一步时,我按照PCB设计的引脚映射填写相应的Pin Number:

img1

        填写完之后点击“Validate”验证结果出现如下错误:

img2

        看来不仅是需要BANK的VCCO相同、差分信号接到对应引脚上,控制组和数据组也不能在相同的Byte Number里。此BANK有四个Byte Number,T0~T3,其中差分时钟线只能在T1,DQS只能在T0或T1,要满足“控制组和数据组也不能在相同的Byte Number里”这一条件,数据组只能在T0,恰好这T0正好有11个IO,和数据组包含的信号数量相同,因此重新映射,分配引脚,点击验证,发现还有错误,这是因为带有Verf的IO只有在内部Verf使能的情况下才能用作GPIO,保险起见不用这种IO,再次分配引脚,终于验证通过:

img3

        最终的DDR3部分硬件原理图如图所示:

img4


4 PCB设计

        DDR3部分的PCB设计中,把之前设计好的原理图映射到PCB之后,就可以按照之前表格中的Class对DDR3的信号分类:

img5

        布局方面,要根据板子大小对FPGA和DDR3颗粒布局,就近(DDR3颗粒与FPGA的DDR3相关引脚靠近)但不影响焊接,而且要为绕线留出足够的空间:

img6

        布线方面,由于只有一片DDR3颗粒,没啥拓扑结构,所以比较简单。首先要遵循以下原则:

  • 根据之前设定的Class分组布线,优先走差分线;
  • 差分线尽量不打超过两对过孔;
  • 数据线同组同层,地址线不需要;
  • 3W走线;
  • 差分阻抗100Ω;
  • 数据组(DDR3_ADDR Class)组内等长误差小于10mil;
  • 地址组(DDR3_DQ Class)组内等长误差小于30mil。

        这里重点关注第三条规则。首先要关注板子的层叠设计:

img7

        本设计采用了六层层叠,可以看到只有顶层、第三层、和底层可以走线,考虑到顶层放置了大量器件而且密度较高,顶层和低层还有一些差分时钟线要走,所以初步规划数据线所在的Class走第三层,第四层作为参考平面。

        第五条差分阻抗根据板材计算好线宽即可,后续也可以调整。其它在拉线过程中注意就行。

        数据线、地址线和时钟之间的延迟要考虑好,也就是信号线的长度要满足:时钟线长度 > 地址线长度 > 数据线长度,这样能够保证在时钟沿来临时数据已备好。另外电源部分扇出后打孔到PWR层即可。

        布线完成:

img8

        电源部分需要把电源引脚扇出打孔到PWR层,然后在PWR层做电源分割:

img9

        这样核心板上DDR3的部分就完成了。


        告辞。