最近为了跑某个软核,于是在寻找一个FPGA板子,最开始考虑的是7k480t,但是发现容量不够塞不进去,后面在朋友的推荐下发现了这个XCVU9P,全称为 AMD Virtex UltraScale+ FPGA VCU118,不过到手发现是CIV器件(IDCODE位为0x?4b35093),速度等级为 -1-e (也就是筛片时筛出不同体质的),不过作为一个FPGA初学者的起点来说(这是我第一块板子),还是提供了一个较高的起点。
根据AMD官方描述:CIV版本的区别为 管脚数小于700个,GTs/SerDes 线速率总和上限小于500G
这个板子的来源似乎是中兴的一个智能网卡,直接插上电脑会发现出现大量网络设备
02:0f.0 PCI bridge: Xilinx Corporation Device 9138
03:00.0 Ethernet controller: Red Hat, Inc. Virtio network device
但是在中兴官网并没有记载,按照ROM里面写的东西可以得知这玩意型号叫做 XE310 ,具备两个QSFP28 两个SFP28,板子上也引出了JTAG和UART,我用的是tigard(https://github.com/tigard-tools/tigard )来进行下载调试,没有买官方的那个下载器(
使用openFPGALoader通过tigard来执行相关操作,扫链可得相关信息
Jtag frequency : requested 6.00MHz -> real 6.00MHz
index 0:
idcode 0x4b35093
manufacturer xilinx
family virtexusp
model xcvu9p
irlength 18
接下来就是搞定这上面的DDR和时钟,时钟部分是由一个Si5381A芯片来实现的,据调查一共接了四组时钟出来
时钟
首先使用 ClockBuilder Pro 导出一份配置,用来研究,然后调查得知目前这个芯片是用I2C控制的状态,进一步跑线可以得到
R16 SI5381_A0/CSb W15 SI5381_A1/SDO
V14 SI5381_SCLK W14 SI5381_SDA/SDIO
AA12 SI5381_RSTN U12 SI5381_INTRN
他的控制部分全部接到了FPGA上面,未来要使用的话大概率需要在bitstream里面加入这部分对于时钟的控制(
以及在Claude老师帮助下,发现了这个板子上有些特殊定义
0x090E = 0x02 |
XAXB 是两脚晶体(XTAL),不是振荡器(XO) |
|---|---|
0x0016 = 0x00 |
关掉 LOL_ON_HOLD,否则强制 holdover 的 DSPLL 会假报失锁 |
结合这个情况那就可以得到魔改之前导出的配置下面的配置,其他部分还是参考原厂导出来的配置(((
Reference : 54 MHz ← 导出时选的是 "XO - Oscillator",本板实为 XTAL
Outputs : OUT3 / OUT4 / OUT5 / OUT6 = 300 MHz, LVDS 2.5 V
OUT3 -> DSPLL A (Free Run) OUT4 -> DSPLL B
OUT5 -> DSPLL C (Free Run) OUT6 -> DSPLL D (Free Run)
Fvco = 14.7456 GHz MXAXB = 273 + 1/15
P0..P3 = 150 Fms1 = 600 MHz
最终可得:
SYSINCAL=0 LOSXAXB=0 LOL A=0 B=1 C=0 D=0
cfgmclk 97606820 cnt / 2009 ms = 48.585 MHz
OUT3->C1 602347854 cnt / 2009 ms = 299.825 MHz
OUT4->C3 602347853 cnt / 2009 ms = 299.825 MHz
OUT5->C2 602347854 cnt / 2009 ms = 299.825 MHz
OUT6->C4 602347854 cnt / 2009 ms = 299.825 MHz
以及这玩意的一些寄存器信息:
| 地址 | 名称 | 用途 |
|---|---|---|
0x0002/03 |
PN_BASE |
得到 0x5381 代表成功识别芯片 |
0x000B |
I2C_ADDR |
基址;叠加 A1/A0 strap 得到实际地址 |
0x000C |
STATUS |
bit0 SYSINCAL(1 = 未校准/未配置)、bit1 LOSXAXB(1 = 基准丢失) |
0x000D |
LOS |
各输入通道失锁;本板 IN0–3 未接,置位属正常 |
0x000E |
LOL |
bit0..3 = DSPLL A..D 失锁 |
0x0016 |
LOL_ON_HOLD |
写 0x00,否则 holdover 的 DSPLL 假报 LOL(坑 2) |
0x00FE |
DEVICE_READY |
0x0f = 寄存器可访问 |
0x0102 |
OUTALL_DISABLE_LOW |
bit0 = 0 → 所有输出被全局关断 |
0x0108 + 5n |
OUTn_CFG |
bit0 OUTn_PDN,1 = 该路下电 |
0x090E |
XAXB_EXTCLK_EN |
本板必须写 0x02(XTAL 模式) |
0x0B24/25 |
配置前后导码 | 0xC0/0x04 开始,0xC3/0x06 结束,必须成对 |
0x0540 |
— | 前导码 0x01、后导码 0x00 |
DDR
然后是DDR部分,群友给了一份不太完整的脚位,而且分成了四组 4+2+1+2(64+32+16+32bit) 一共18G,在GPT老师的协助猜测脚位下,成功跑通了 C4和C2 ,但是C1还是没通(
| 通道 | 位宽 | 状态 |
|---|---|---|
| C1 | 64 bit | DQS Gate |
| C2 | 32 bit | ✅ 校准 + 读写全通过 |
| C3 | 16 bit | DQS Gate |
| C4 | 32 bit | ✅ 校准 + 读写全通过 |
经过群友的最新的点位,现在跑通了,发现是有两组球对调了((
PCIe
这个板子在屁股上有一个SFF-8654的接口,通过这个就可以转接出两个M.2 但是还未做探索
UART
在板子的屁股下半部分,可以看到有三个排针,按照丝印可得这就是UART,但是按照常规思路发现这个东西确实能正常输出 但是输入也就是RX似乎是不对的,不能往里面输入东西
后来发现是我的tigard有问题导致只能收不能发
未完待续(
版权属于:Kiritake Kumi (Niconeiko) ,本文所引用的第三方材料版权归属为:第三方材料的所有者
本文链接:https://blog.yazawaniko.com/index.php/archives/344/
除特殊标注以及**影像内容**外,均使用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议 ,影像内容请务必联系确认是否可以转载使用