
四层Spartan6 FPGA核心板(带DDR3)
简介
一个四层的Spartan6 FPGA核心板,带一颗DDR3内存 FPGA型号:XC6SLX16-2FTG256C 封装:FTG256C 引出IO数:没数,但挺多
简介:一个四层的Spartan6 FPGA核心板,带一颗DDR3内存 FPGA型号:XC6SLX16-2FTG256C 封装:FTG256C 引出IO数:没数,但挺多开源协议
:Public Domain
描述
前情提要:
Spartan6系列的FPGA早已属于入土级别的了,开发环境只有那老掉牙的ISE,然后很多现代FPGA的特性也比较欠缺,性价比被ZYNQ7010按在地上摩擦。因此不建议复刻。
做这块板子的起因完全是因为在购物网站瞎逛看见了,13元一片,本着买了不吃亏不上当的想法就整了俩回来做着玩玩,主打的就是一个Vintage和Oldschool。另外想着开源出来可能也会帮助到一些因为各种原因被迫使用Spartan6的人。
更新1:DDR验证成功,添加了DDR调试教程,详见 “5.组装后测试”
参考资料:
原理图参考了正点原子的S6核心板:http://www.openedv.com/docs/boards/fpga/zdyz_S6xtb.html
板子的布局和IO参考了@上电冒烟的ZYNQ核心板(这个才是值得复刻的,而不是我这入土玩意):https://oshwhub.com/z_star/zynq7020-core-board-and-various-rf-modules
因为ISE比较古老,最后确定能用的方案是FT232H+Digilent的固件(同时兼容Vivado)
FT232下载器基于开源广场工程修改而来:https://oshwhub.com/parus_major/xilinx-hs-fpga-xia-zai-qi
下载器固件使用了TT佬提取的Digilent固件:https://www.bilibili.com/video/BV1nT4y1L7uE
目录:
1.设计思路/IO分配
2.供电/退耦
3.PCB设计
4.组装与焊接
5.组装后测试
6.总结
7.BOM成本
设计思路/IO分配:
FPGA的硬件设计主要考虑的就是各个Bank的IO资源应如何分配,我做这个板子的主要目的是为了之后的高速电路项目所服务的,因此在设计上会偏重引出高速IO(LVDS一类的低压高速IO)
同时,尽管嘉立创现在能白嫖6层沉金板(JLC牛逼),但我个人还是想使用4层设计,主要是想探索低成本低复杂度,同时还能达到较高运行速度的PCB设计。
最后,这次的设计我放弃了板载FLASH颗粒,因为拉完IO了才发现FLASH引脚冲突(乐),所以这板子只能通过JTAG加载程序,断电消失。所以只适合调试应用
基于以上几点考量,这次的IO分配如下:
Bank2:使用2.5V供电电压,全部引脚以差分对形式引出,共计18对,其中等长17对,作为标准LVDS输入输出
Bank0:使用3.3V供电电压,全部引脚以差分对形式引出,共计20对,全部等长,作为一般IO输入输出
Bank3:使用3.3V供电电压,部分引出,作为板载外设的IO口,以及扩展Bank0的IO数目
Bank1:使用1.5V供电电压,用来连接DDR3颗粒。
Note:写完这一部分,我才发现,是不是可以将Bank2和Bank0的供电电压调换一下,这样Bank0就可以全部用作2.5V的LVDS接口了。尽管设计中VCCAUX的电源与Bank0同轨,但VCCAUX在官方手册中是可以使用2.5V供电电压的,只不过JTAG电压会降低到2.5V标准,这就需要一个带Buffer的下载器。
DDR3设计时,注意不要漏线,其中有几个信号很容易漏掉:给FPGA的VREF参考电压、给FPGA做DDR校准使用的RZQ电阻
至于板载的外设就没有太多,一个用户LED、一个复位按钮、还有个CH340C做串口通信,其他没了。
供电/退耦:
经典EA3059,单芯四路方案,对于一个16K资源的小FPGA来说,已经足够了。
至于去耦,尽管看着电容的量挺少,但其实只要按照官方手册来就好。对于这个16K的片子来说,官方推荐的退耦方案是每个Bank/每路电压配一个大水塘(或者叫小池子吧,贴片的容量也大不到哪里),然后靠近FPGA芯片的地方放两到三个4.7uF的0603,最后在芯片正背面放两到三个0402的470nF电容即可。
PCB设计:
正如文章开头所说,这次的目标就是挑战一下在只用四层板的同时达到较高的运行速度。四层板因为结构比较简单,所以分配走线层的考量只有两点
1. 运行速度较高的线路只能放在底层和顶层,中间层要保证参考平面的完整性,才能做一定的阻抗控制
2. 电源分配和地层肯定是只能放中间两层了,不然对于BGA来说根本没法走通。
接下来就是设计了,整个过程还是比较顺利的,最后四层结果如下,信号线宽都是5mil,根据阻抗计算的结果,阻抗约为54欧姆。适当加宽可控制在50,DDR的信号线过孔控制在最多两个
小插曲:其实我一开始是想配两颗DDR颗粒的,但是在经过两天尝试后发现,Bank3的内存引脚在使用四层板的情况下,想走通+等长极其困难。如果有大佬走通而且能用的话,欢迎分享设计
还有一点,DDR3的ODT和RST走线长度是放飞自我的一个状态,考虑到这两个引脚不会涉及到高速开关操作,因此为了走线方便就没和其他组做等长(如果这个说法不对,欢迎评论区指正/开喷)
顶层
内层:地层
内层:电源
(Oops,好像才发现自己给底层靠下的信号线的参考面割了三个区域(悲))
底层
组装与焊接:
这一点应该没什么好讲的,焊接顺序主要为:供电电路---测试---焊接主BGA芯片---测试---焊接DDR---焊接被动元件--测试(测试方法见后)
可能比较吓人的就是焊接BGA吧,我个人认为焊接BGA讲究一个胆大心细。
胆大是指给温度不能太低,因为是四层板+芯片面积小,不用铁板烧预热也是可以的,但风枪温度不能给太低。我焊接的参数为:淘宝爆款小风枪+360度+6档风(中档偏上)+无风嘴+风口距离芯片一指高+持续均匀加热3分半。
第一次焊接的时候,老怕风枪温度太高给芯片烧坏。但在咨询了几位有经验的人士之后,得知其实数字片其实挺难吹坏的,真正担心的应该是PCB和芯片的基板。因为这次用的芯片是黑胶封装,真正担心的其实只有PCB。
为了防止PCB烤坏,可以在焊盘周围多加点焊油,或者用锡箔纸/高温胶带盖住即可。焊接的时候阻焊可能会发黄,但不是什么大问题。
至于心细,指的就是上面的几点注意事项。其他的只管猛猛加热就完事。
焊接完成后,应该让板子自然冷却,防止芯片内部的晶片过快热胀冷缩导致损坏。下面是我两次分别焊接两块板子的结果图,两个板子都能正常工作:
第一次(下)第二次(上)
组装后测试:
不通电检查引脚是否焊接良好的方法(此时只焊接了FPGA,DDR没上)
对于这个型号的FPGA,我的测试方法如下:
将万用表打到电阻档/二极管挡,负极接地,正极探各个IO(包括JTAG),应该会测出如下值:
对地阻值:约5.6K
二极体值:约0.3V
这个方法可以检查FPGA的IO引脚是否焊接到位。
如果以上的测试没问题,就可以使用JTAG来检查芯片是否正常,这一步应该就不用解释太多了,ISE的iMPACT或者Vivado的硬件管理器都可以探测(只不过你不能用Vivado给S6做开发)
DDR测试方法:
这个说简单也简单,说复杂也复杂。简单是因为你不用写Verilog就能检测,复杂是因为设置的步骤还挺多的。不过网上也有详细的视频教程
官方手册编号:UG416和UG388
具体步骤为:1.新建DDR的IP核,2.对照手册填写DDR颗粒参数,3. 更改用户约束文件,4.修改PLL相关参数,5.修改样例工程,6.综合生成文件,用ILA检查是否正常
ISE这玩意已经很老了,在新系统上可能会有问题。这里使用的是Windows10,然后ISE以及工具链运行的都是32位版本。
另外,请提前在系统环境变量里面设置ISE及其工具链的地址,不然会报错,如下图:
下面就是具体步骤:
1.新建DDR的IP核
新建一个ISE工程,选择对应的器件,打开IP核生成工具,找到MIG Spartan6,创建(这个应该用不着手把手教)
注意MCB要选C1,然后下一步,我们来填颗粒的信息
2.对照手册填写DDR颗粒参数
因为ISE太老了,没有我们板子上能直接对应的颗粒,而DDR的参数设置又至关重要(特别是各种时序),所以只能自己创建对应的模型。
将基础型号选为图中的颗粒,然后“Create Custom Part”
之后修改框里的参数,如下图(名字随便填一个就好了)
这些值都是手册里有的,如果用别的颗粒需要自己去参考手册,这里的参数仅仅适用我手上这款美光4Gb颗粒
将颗粒模型创建好后,保存选中,接着下一步,直到出现这个界面,我们只留一个读写接口,因为只用于测试目的。
接着又是下一步下一步,直到FPGA Option,我们需要把系统时钟类型改为单端,然后启用Debug选项,才能采集芯片波形
另外还有个RZQ和ZIO引脚,这里因为设计的时候就考虑到了,保持默认即可使用。
然后一直点Next直到成功生成IP。
3.生成ISE工程
成功生成IP核后,关掉软件,在工程目录下面找到这个脚本
双击运行,然后慢慢等待,就会生成一个测试样例的ISE工程文件
Note:运行失败,请检查是否已经将工具链目录添加到环境变量中
4. 更改用户约束文件
打开这个工程,第一件事情就是修改相关引脚和电压参数,因此找到example_top.ucf文件打开
主要有以下几个地方需要修改
一、VCCAUX电压改为3.3V
二、用户时钟输入频率50MHz(20ns)
三、校准状态灯的电压和IO(error灯的R1实际上没连接到任何东西,但还是改改好了,R2连接到calib_done,校准通过亮起)
四、修改时钟输入和复位输入的电压和IO
首先是IO电压和拉低
注意,不要忽略了那个PULLDOWN,虽然名字上说是“低有效”,但实际上是“高有效”,如果不拉低,则会导致一直运行在复位状态
上网找了半天结果只有一个文章提到这个的,挺奇怪,难道大家都没上板验证过吗?
然后是IO端口
注意RST_I是故意连接到了一个空引脚上,因为上面提到的因素,导致板载的RST实际上不适用(默认拉高),我担心FPGA内部拉低的吸流能力不行,所以就不将RST连接到外部端口了
F1是板载50M晶振的接口
5.修改PLL相关参数
为了让DDR运行在300M的速度,我们需要修改PLL参数。在如下位置找到example_top.v文件
然后找到图里的这几行,改成图里面的参数
至于每个时钟参数,官方手册都有对应解释,这里只做简单说明。
OUT0和OUT1,同频、相差180相位,作为DDR主时钟,其运行频率应该是DDR实际时钟的两倍,即:想让外部DDR实际运行频率为325MHz,则这两个时钟的频率应该是650MHz
OUT2,用户时钟,具体在哪里用到了不大清楚
OUT3,校准时钟,一般频率在50-100MHz区间
BOUT_MULT,PLL的倍频参数
DIVCLK_DIVIDE,PLL参考时钟(即外部输入时钟)输入前的分频系数。
我最后选定的参数是,输入50M时钟,先进行2分频,然后倍频25倍到625MHz,校准时钟10分频(62.5M)。
所以理论上,DDR最后的工作速度为312.5MHz,稍后会附上实测。
注:以上的倍频参数都是通过ISE的PLL计算工具生成的,具体可见手册UG388的Clocking部分,里面讲的也挺清楚的
6.修改样例工程
同样是在example_top.v文件里面,找到如下部分
将所有的DATA_MODE改为0101,这是用来配置数据发生器的参数。有了数据发生器我们才能测试DDR的写入是否正常。
DATA_MODE还有其他几种模式,详见UG416的Modifying the Example Design部分。这里改为0101,测试时应该会生成如下数据
7.综合生成文件,用ILA检查是否正常
总算是把样例准备好了,接下来就是将综合的三步流程走完,成功生成比特流后打开最底下的ChipScope
打开ChipScope
选择生成的文件,然后OK,加载程序到FPGA,如果不出意外,板子上的R2 LED会亮起
然后采集波形,放大观察读出的数据
示波器测到的时钟频率(受限于带宽,幅度不对)频率正好312.5MHz
总结:
成品下图:
(图中为DDR3校准通过的LED亮起)
BOM成本:
PCB:白嫖
FPGA:13元
4Gb内存颗粒:9元
电源及其周边配套:约8元
BTB公头:4元(一对)
剩下乱七八糟的东西:算个10元好了
最后,还请各路大佬多多指教,无论是委婉的还是上来直接开喷的,都十分欢迎,毕竟能让我学到就是赚到。
设计图

BOM


评论