ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PEX8311+FPGA+DSP的PCIe采集控制板与PROTEL99工程

PEX8311+FPGA+DSP的PCIe采集控制板与PROTEL99工程 工业控制、测试测量这类场合主机侧要高速下指令、实时回传采集数据设备侧还得有硬实时的控制环路这两件事塞进一颗芯片里通常做不干净。这套以 PEX8311 牵头的 PCIE 应用开发板思路就是把两件事拆开PCIE 侧交给专用桥片业务逻辑交给 FPGA实时控制丢给 TMS320F28335。整包硬件工程用 PROTEL99 完成原理图和 PCB 文件都在里面属于那种拿到手就能改改就用的半成品平台。它适合三类人一是手上压着老平台维护任务、需要复用 99SE 工程习惯的硬件工程师二是想搞明白 PCIE 到底怎么从金手指一路走到本地总线、再走到 DSP 的嵌入式开发者三是需要一块能跑的 PCIE 采集/控制卡原型、又不想从零画板的项目负责人。下面我把这块板子从架构到布线、从原理图到打样调试的整条链路拆开讲重点讲清楚每一个设计动作背后的原因以及那些手册上不会写的坑。1. 这块板到底解决什么问题整体架构与选型拆解1.1 三段式数据通路是核心整块板子最值得先看清楚的是它的数据流被切成了三段每一段用的器件类型都不一样。上位机就是插卡的那台主机通过 PCIE 链路把数据推给 PEX8311桥片把这串高速串行包翻译成一条并行本地总线上的读写周期FPGA 挂着这条本地总线把数据搬进内部 FIFO 或者寄存器组FPGA 的另一侧又用 XINTF 接口挂到 TMS320F28335 上DSP 通过读写自己的外部存储空间就能把数据取走或者回传。反方向也同理DSP 写 XINTFFPGA 收到后通过本地总线推给 83118311 再打包上传给主机。这么切的好处非常直接。PCIE 协议栈复杂、链路训练、TLP 封包拆包这些东西自己用 FPGA 实现一套软核不是不行但调试周期会拉得很长而且版本一升级就得重来。用 8311 这种专用桥片PCIE 侧的事情它全包了你只需要面对一条相对老实的并行总线时序清晰、逻辑分析仪一挂就能看。FPGA 在这中间扮演的是翻译官缓冲池把两种完全不同的总线时序对起来同时用 FIFO 吸收两侧的速率差和突发性。DSP 则完全不用管 PCUE 那一套它只认自己的 XINTF 时序代码上就是在几个固定地址读写工程师上手成本极低。我见过不少人一上来就想用一颗 FPGA 把 PCIE 硬核、控制算法、数据缓存全包了。能做成但对团队要求很高PCIE 硬核的时序约束、跨时钟域、驱动开发、算法定点化四件事同时压上来任何一环出问题都会让整个项目卡住。分段之后每一段都可以单独验证出了问题也容易定位到是哪一段。1.2 三颗器件的分工边界PEX8311 是 PLX后来被收购的 PCI Express 到本地总线桥单通道 Gen1理论单向带宽 250MB/s 量级。对绝大多数工业采集和控制场景这个带宽是够的尤其是配上 DMA 之后实际能跑出来的持续吞吐通常能到百兆字节每秒级别。它支持本地总线地址数据复用和非复用两种接法也支持两个 DMA 通道还有串行 EEPROM 用来加载配置信息。FPGA 在这块板上的定位很明确总线桥接 数据缓冲 必要的时序整形。不承担算法主运算只做搬数据和握手。选型上不需要太大逻辑单元够放几个 FIFO、一套地址译码、一套跨时钟域同步电路就行管脚数量反而是重点——要同时接 8311 的本地总线和 DSP 的 XINTFIO 数量不能省。选择时优先看 IO 数量、是否有足够的 Block RAM 做 FIFO、以及封装是否方便布线。TMS320F28335 是 TI C2000 系列里的经典款150MHz 主频带浮点单元XINTF 外部接口能直接挂异步外设。把它放在这里看中的就是实时性和外设资源ePWM、ADC、eCAP 一应俱全做电机控制、电源变换、数据采集都是熟路子。它不需要参与 PCIE 通信只通过 XINTF 跟 FPGA 交换数据代码里就是往几个固定地址读写非常干净。1.3 为什么这套工程还在用 PROTEL99这个问题必须正面回答不然很多人第一反应就是都什么年代了还用 99SE。原因通常有三层。第一层是存量很多工业设备厂商的硬件资产库里从九十年代末到 2010 年前后的板子全是 99SE 工程格式统一、元件库统一、评审流程统一新板子在这个体系里走最省事。第二层是许可与 IT 环境有些内网环境只部署了 99SE新工具装不上或者审批麻烦团队只能沿着老路走。第三层是能力匹配99SE 画这种双层或四层、几十个网络标号的中低速板子功能完全够用熟练工程师用起来速度极快。但必须承认它的短板没有真正的差分对规则没有交互式等长绕线只有 Tools 菜单下的长度匹配工具阻抗计算要靠层叠管理器里附带的计算器跨页高速信号的约束管理基本靠人脑和文档。所以用 99SE 做 PCIE 板考验的不是工具而是工程师自己有没有把规则记在脑子里、落实到检查清单上。后面第 4 章我会专门讲 99SE 里怎么靠手工手段实现等长和差分控制。2. 关键器件特性拆解与接口时序匹配2.1 PEX8311 侧必须搞清的几件事用 8311 最容易翻车的地方是配置空间的初始化。芯片上电后会去读串行 EEPROM从里面加载 Vendor ID、Device ID、子系统 ID、Class Code 以及各个 BAR 的大小和类型。EEPROM 里面没烧内容或者内容不对主机枚举时看到的可能就是一堆默认值BAR 申请不到你期望的空间驱动加载直接失败。所以打样前一定要把 EEPROM 的配置内容先规划好写清楚每个 BAR 要多大空间、映射到本地总线还是内部寄存器、是内存空间还是 IO 空间。第二个关键是本地总线模式的选择。8311 支持地址数据复用和非复用两种本地总线接法复用模式下地址和数据共用一批引脚省管脚但时序更紧非复用模式下地址线独立逻辑分析仪抓波形更直观FPGA 侧写逻辑也更容易。考虑到 FPGA 的 IO 本来就紧张同时还要接 DSP实际项目中选复用模式的偏多但调试阶段非复用确实省心。这个取舍没有标准答案取决于你的 IO 预算和团队调试习惯。第三是本地总线时钟。8311 的本地总线跑在一个独立的时钟域上这个时钟通常由外部有源晶振提供频率选择要兼顾 FPGA 的时序余量和带宽需求。频率越高带宽越大但对 FPGA 内部时序收敛和 PCB 走线质量的要求也越高。我的经验是从中低频率起步先把功能跑通再评估要不要提频。2.2 FPGA 作为总线翻译官的实现要点FPGA 内部逻辑其实可以拆成四个模块来看。第一个是本地总线从设备接口负责识别 8311 发过来的读写周期、锁存地址、响应数据、拉低准备好信号。第二个是 XINTF 从设备接口负责识别 DSP 发过来的片选和读写选通、给出数据、必要时用 XREADY 插入等待周期。第三个是双口 FIFO 或者寄存器堆作为两侧的数据交换区。第四个是中断与状态逻辑把 8311 侧的中断信号、DSP 侧的中断请求、各种状态位管理起来。跨时钟域是这个模块里最容易出问题的地方。本地总线的时钟和 XINTF 的时钟来自不同源两者之间传数据必须做同步。FIFO 指针这种多比特信号不能直接用两级触发器打拍要么用格雷码加两级同步要么直接用 FPGA 厂商提供的异步 FIFO IP。地址和数据总线更麻烦因为它们是随读写选通一起有效的必须用握手信号把它们圈住让对侧只在确定有效的窗口内采样。还有一个隐蔽的坑DSP 的 XINTF 是异步接口配置成多少个等待周期是可以调的。如果 FPGA 侧逻辑还没把数据准备好DSP 又没插足够的等待读回来的就是垃圾数据或者上一次的残留。稳妥做法是让 FPGA 用 XREADY 信号主动申请延长周期而不是靠软件里试出一个刚好够用的等待参数——那种参数在温度变化、电压波动、批次差异下很容易失效。2.3 TMS320F28335 的 XINTF 时序约束F28335 的 XINTF 是异步并行接口有独立的地址总线、数据总线、片选和读写选通每个 Zone 可以单独配置时序参数包括建立、激活、跟踪三个阶段的最小周期数。芯片把外部空间分成了几个 Zone每个 Zone 有固定的片选和地址范围实际接线时通常把 FPGA 映射到其中一个 Zone 上地址范围取够用就行。配置的时候有个容易忽略的点XINTF 的时钟来自系统时钟的分频而这个分频系数和 Zone 的时序参数共同决定了实际访问速度。如果你的 FPGA 逻辑响应需要若干个时钟周期那就要把 Zone 的激活周期配置得比它长同时留出余量。我的习惯是先按保守值配置用示波器或者逻辑分析仪实测一次读写的完整波形确认余量之后再逐步收紧每次都重新测一遍。数据总线宽度也要提前定。XINTF 支持不同的数据宽度配置宽度选得越宽同样的数据量占用的访问次数越少但 FPGA 侧的接口逻辑也更占资源。对于以命令和小批量数据为主的场景窄总线足够对于大批量流式数据宽总线更划算。这个决策要和上位机的数据包结构一起考虑避免出现宽度很宽但每次都只填几个字节的浪费。2.4 时钟与复位网络的统一规划这块板上有三个主要时钟域必须提前规划好各自的来源和走向。PCIE 侧需要一路 100MHz 的差分参考时钟通常由主板通过金手指提供走线时要严格按差分规则处理。本地总线侧需要一个本地时钟源由板上有源晶振提供。DSP 侧用一颗晶振经过内部锁相环倍频到系统主频同时 DSP 还能输出一路时钟给 FPGA用作 XINTF 侧的同步参考。复位方面PCIE 侧的复位来自接口信号需要经过电平转换或者同步之后送给 8311系统侧还要有一个独立的板级复位源保证在上位机没上电或者没枚举之前FPGA 和 DSP 能进入确定状态。这里有个实际经验不要让 DSP 的复位完全依赖 PCIE 侧的复位信号因为很多人调试时是先给板子单独供电、后插主机顺序一乱就容易出现一侧已经跑起来、另一侧还在复位里的状态调试现象会非常迷惑。用一个独立的上电复位芯片同时管住系统侧PCIE 复位另外单独处理逻辑上清爽很多。3. PROTEL99 原理图设计实操3.1 元件库准备与自建元件99SE 时代最大的痛点之一就是元件库不齐。8311 这种 BGA 封装、几百个管脚的芯片标准库里基本不可能有现成的必须自己建。我的做法是分两步先建原理图符号把管脚按功能分组摆放而不是按物理顺序一字排开。按功能分组的好处是原理图上连线清晰832 个管脚一字排开画出来谁都不想看评审也没法审。建符号时有几个细节要注意。电源和地管脚不要隐藏99SE 允许把电源管脚设成隐藏并自动连接看起来省事但一旦网络名写错或者漏连ERC 根本查不出来最后只能靠人肉核对。命名上保持和手册一致别自己发明缩写否则半年后回来改板自己都认不出哪个脚是哪个。管脚编号一定要和封装一一对应BGA 封装的编号通常是字母加数字的组合容易看花眼建完之后至少找两个人交叉核对一遍。PCB 封装更要小心。BGA 的焊盘直径、球间距、阻焊开窗尺寸都有讲究建议直接找器件厂商的封装推荐文档或者用 IPC 标准计算器算一遍。别从别的项目直接复制过来不同批次的芯片封装可能有差异尤其是球径和间距。3.2 图纸分页与网络标号规范一块中等复杂度的板子原理图肯定要分好几页。合理的分法是按功能模块分PCIE 接口与桥片区、FPGA 及其配置电路区、DSP 及其外设区、电源区、时钟与复位区。分页之后跨页信号全靠网络标号这时候命名规范就变成生死攸关的事情。我的规矩是这样的总线类信号统一前缀比如本地总线地址用统一前缀加位号数据线同理差分对的两个网络用固定的后缀区分正负并且从原理图阶段就成对出现方便后面在 PCB 里批量选中控制信号用功能加极性后缀低电平有效的加明确的标记。特别要注意的是别用中文标号也别用特殊符号99SE 对特殊字符的处理一直不太靠谱导出网表的时候容易出莫名其妙的错误。另外99SE 的全局网络标号是全局有效的不同页里出现同名标号就自动连在一起。这既是优点也是陷阱同一个名字在 FPGA 页和 DSP 页都用就会把两处连起来。命名的时候要带上模块前缀比如给 FPGA 侧和 DSP 侧的同类信号加上不同的模块标识避免误连。3.3 电源域划分与去耦网络这块板至少有三个电源域PCIE 接口提供的 12V 和 3.3V、板内降压出来的各级电压、以及芯片各自需要的核心电压和 IO 电压。画原理图时建议把每个芯片的电源管脚单独拉出来一片区域把去耦电容和它并排放在一起而不是把电容统一堆在图纸角落。统一堆放的后果是画 PCB 时你得靠记忆去放很容易漏。去耦电容的配置上大容量和小容量搭配使用是常规做法每个电源管脚附近放小容量的高频去耦每个电源域再放若干大容量的储能电容。这里有个经验值BGA 封装芯片的背面空间要提前规划好去耦电容要尽量靠近管脚宁可多放几个过孔从背面接过去也别为了省事放在远处。特别是内部有多路电源域的芯片每一路的去耦都要独立考虑不能共用。原理图上还要把电源域之间的连接关系标清楚比如哪一路是给核心供电、哪一路是给 IO 供电、有没有上下电顺序要求。有些芯片要求核心电压先建立、IO 电压后建立或者反过来这个顺序要求必须在原理图上标注出来并在电源设计时用使能信号或者电源管理芯片来实现。3.4 ERC 检查与常见报错处置99SE 的 ERC 检查能力有限但只要认真用能拦下相当一部分低级错误。跑完 ERC 之后常见的几类报错要区别对待。管脚冲突类报错多半是两个输出管脚接到了同一个网络或者输入管脚悬空这类必须逐条查清不能放过。未连接管脚类报错要看是设计上真的不用还是漏连了前者可以在属性里标记为忽略后者必须补上。还有一类报错是电源管脚未驱动通常是因为电源网络被当成了普通网络。这时候要检查电源网络是否被正确定义。另外元件重复位号、网络标号拼写不一致这类问题ERC 不一定能全部揪出来需要自己写检查清单手动过一遍。我个人的习惯是ERC 跑完之后把原理图从头到尾再读一遍不是看连线而是按信号流向读从接口进去、经过哪颗芯片、到达哪个引脚、再从哪出来。这个读图过程往往能发现 ERC 发现不了的设计逻辑错误比如把读写选通接反了、片选接到了错误的 Zone 上。花半小时读图后面可能省下两周的调试时间。4. PCB 布局布线的核心环节实现4.1 叠层设计与 100 欧姆差分阻抗计算PCIE 的差分阻抗要求是 100 欧姆差分对应单端大约 50 欧姆。在 99SE 里做阻抗控制要先用层叠管理器定好叠层结构把每一层的材料、厚度、铜厚设置好然后用里面附带的阻抗计算功能估算线宽和间距。给一个实际可用的估算过程方便你建立直觉。假设用常规 FR-4 材料介电常数取 4.3顶层到内层地平面的介质厚度 0.2mm铜厚按 1 盎司约 0.035mm算。单端微带线的阻抗可以按下面的经验关系估算单端阻抗大致正比于介质厚度的对数、反比于线宽的对数介质越厚、线越细阻抗越高差分阻抗还要考虑两根线之间的耦合间距越小耦合越强差分阻抗越低把这些关系代进去算介质厚度 0.2mm 的情况下线宽做到 0.23mm 左右、间距 0.2mm 左右差分阻抗大致落在 100 欧姆附近。这个结果只能用来起步实际误差可能有正负百分之十因为介电常数会随频率和树脂含量变化压合后的实际介质厚度也和你标称的不完全一样。正确的做法是把叠层和线宽间距参数发给板厂让他们用实际压合参数回算并给出阻抗测试报告。如果板厂不支持阻抗测试那就自己留一条测试线板子回来之后用 TDR 测一下根据实测结果决定后续批次要不要调整线宽。我见过不少项目直接抄别人的线宽结果换了一家板厂、材料批次一变阻抗偏了十几个点链路虽然能连上但眼图很差高温下就出误码。4.2 PCIE 差分对的布线规则差分对是这块板最讲究的部分。规则可以总结成几条但每条背后的原因要明白。对内等长是第一位的。同一对的正负两根线长度差要控制在很小的范围内否则两根线上的信号到达时间不一致差分信号会退化成带共模分量的信号接收端眼图张开度变差。经验值是对内长度差控制在几个密耳以内。在 99SE 里没有自动对内等长工具需要手工绕蛇形线或者用 Tools 菜单里的长度匹配功能选定网络后设定目标长度由工具自动绕线绕完之后一定要目视检查一遍确认绕出来的蛇形线节距均匀、没有回折。对内间距要恒定。两根线要全程保持大致相同的间距不要一会儿贴近一会儿分开。间距变化会造成局部阻抗不连续产生反射。布线的时候最好让两根线绑在一起走拐弯处两根线同步拐别出现一根拐大弯一根拐小弯的情况。差分对之间不需要严格等长。这一点经常被误解。PCIE 的发送方向每一对是独立的对与对之间没有严格的到达时序要求只要各自满足对内等长即可。真正需要注意的是对与对之间的间距要保持足够距离避免串扰通常建议至少三倍线宽以上的间隔有条件的话在不同层之间用地平面隔开。参考平面要完整。差分线经过的区域下方必须有连续的参考平面不能跨平面分割。跨分割会让回流路径断裂阻抗突变辐射也变大。布线前先把平面规划好把分割区域的边界画出来布差分线的时候绕着走。过孔要少且对称。每条差分线经过的过孔数量越少越好如果必须换层两根线要同时换层、用过孔对称布置并且换层处旁边要加回流过孔给信号提供就近的回流路径。不同层之间走线长度也要计入总长度不能只算某一层。4.3 本地总线和 XINTF 总线的走线策略这两条总线虽然不像 PCIE 那么敏感但也不建议随意。地址线、数据线、控制线最好分组走同一组线尽量走同一层参考同一个平面。地址线和数据线内部不需要严格等长因为它们的时序余量通常比 PCIE 大得多但走线长度还是尽量接近避免出现某几根线特别长、导致时序裕度被吃掉。控制信号要特别注意。读写选通、片选、准备好这些信号往往是决定采样时刻的关键它们的走线要尽量短、尽量直避免绕远。如果 FPGA 和 DSP 之间的控制信号走线很长可以在 FPGA 侧做输出寄存把时序关系拉直。跨时钟域的接口线要格外当心。本地总线的时钟域和 XINTF 的时钟域不同如果这两组信号在 PCB 上长距离并行走线容易互相串扰导致其中一侧偶发采样错误。分组的时候把两组信号在空间上分开中间用地线或者地平面隔开。4.4 电源平面分割与去耦电容摆放四层板的典型叠层是顶层信号、内层地、内层电源、底层信号。电源平面做分割的时候要按电源域划分清楚分割边界要留出足够的间距避免不同电源域靠得太近产生耦合。分割的宽度要保证电流密度不超过铜箔的承受能力大电流路径要留足够的铜宽必要时用多个过孔并联。去耦电容的摆放原则是就近、短回路。电容的一端接电源管脚另一端接地两者的回路面积要小。做法是把电容放在芯片背面对应的位置电源引脚直接打过孔到电容焊盘再短距离打到地平面上。电容的电源过孔和地过孔要尽量靠近减少回路电感。大容量储能电容可以放在稍远的位置但也要保证电流路径短而宽。实际经验里有一个容易被忽略的细节BGA 芯片背面的去耦电容会和信号过孔抢空间。所以在 BGA 扇出规划阶段就要把电容位置一起考虑进去预留出足够的区域。如果做完了扇出才发现电容放不下只能把电容挪远效果大打折扣。4.5 金手指区域的特殊处理金手指部分有几个硬性要求。板厚要符合规范太厚插不进去太薄接触不良。金手指的倒角要按规定做通常是在插入端做一个斜切便于插拔并对准。金手指区域的正反两面都要做且不能铺铜、不能走线只能保留金手指本身和必要的连接走线。金手指的走线要尽量短尤其是 PCIE 的几对差分信号从金手指到桥片的走线越短越好中间不要有过多过孔和绕行。参考时钟差分对也要按同样的规则处理。金手指区域的丝印要避开接触面避免印料影响接触。还有一个工艺细节金手指通常需要做特殊表面处理保证耐磨和低接触电阻这个要和板厂沟通清楚用常规喷锡工艺做金手指是很容易出问题的。4.6 PROTEL99 的规则设置与 DRC99SE 的规则系统虽然简单但基本够用。布线前至少要设置好几类规则安全间距根据工艺能力设定线宽按信号类型分别设定电源和地要单独加宽过孔尺寸统一到板厂能做的范围短路检查必须开启。差分线在 99SE 里没有专门的规则只能靠命名约定加手工操作。建议把差分网络按固定后缀命名布线时用查找功能批量选中然后统一设置线宽和间距。等长用 Tools 菜单里的长度匹配功能先在规则里设定好目标长度再执行。DRC 跑完之后重点看几类报错间距违规判断是真的违规还是可以接受的未布线网络一条都不能放过短路必须查清。另外 99SE 的 DRC 对某些跨层的情况检查不充分重要的差分线和电源网络建议手工再核对一遍别完全依赖工具。5. 常见问题与排查技巧实录5.1 链路训练失败的排查路径板子插上主机之后如果系统根本识别不到设备或者识别到了但报错第一步是确认金手指接触是否良好换一个插槽试试排除机械接触问题。第二步用示波器或者差分探头测 PCIE 参考时钟确认 100MHz 差分时钟存在、幅度正常、波形干净。这路时钟如果来自主板要确认主板这个插槽是否真有时钟输出。如果时钟正常但还是识别不到就要怀疑差分信号本身。这时候可以用 TDR 测差分线的阻抗看看是不是偏离太多也可以用高速示波器观察链路训练时发送的差分信号看幅度和眼图。很多情况下问题出在参考平面不完整或者对内不等长上改板之前可以先确认这两个点。还有一种常见情况是复位信号的问题。PCIE 侧的复位信号如果电平不匹配或者时序不对桥片会一直处在复位状态表现就是完全没反应。这时候测一下复位引脚的波形确认它在链路上电之后被正确释放。5.2 本地总线读写异常的定位方法链路通了、驱动装上了但读写数据不对这时候问题多半在本地总线或者 FPGA 逻辑上。定位方法是从简到繁先写一个固定的测试寄存器往里面写一个固定值再读回来确认最基本的读写通路是通的。如果不通用逻辑分析仪抓本地总线的波形看读写周期有没有正常发出、地址对不对、数据有没有被驱动。如果基本读写通了但批量传输有问题重点查 FIFO 的状态逻辑和 DMA 配置。常见的坑是 FIFO 的空满标志和实际数据量不一致导致数据被截断或者重复。还有一个坑是 DMA 的传输长度寄存器和实际配置不匹配比如单位是字节还是双字搞混了。DSP 侧读写异常的话先确认 XINTF 的时序配置是否足够宽松可以用软件方式把等待周期调到明显偏大看问题是否消失。如果消失说明是时序余量不够如果依然存在问题可能在 FPGA 逻辑或者两侧的握手协议上。这个放宽参数看现象是否改变的思路能快速把问题在时序和逻辑之间分开。5.3 枚举与空间映射类问题主机枚举阶段的问题通常和 EEPROM 配置有关。如果 BAR 申请不到空间或者申请到的空间大小和预期不符先检查 EEPROM 里的配置内容。可以采用的办法是先用默认配置让卡能被识别成一个通用设备确认物理链路和枚举流程没问题再逐步调整成目标配置。这样能把物理链路问题和配置内容问题分开避免两头一起查。地址映射的问题也很常见。桥片的本地总线地址和主机侧的地址之间要做映射映射关系配置错了主机会把数据写到错误的本地地址上去表现为数据丢了或者写到了别的地方。调试时可以把映射关系简化成一对一先跑通再改。5.4 99SE 使用过程中的坑99SE 在 Windows 新版本系统上运行需要一些兼容性处理建议在虚拟机或者兼容模式下跑避免出现保存失败、文件损坏这类问题。文件路径不要太深也不要用中文路径否则容易出现打不开或者保存异常。规则设置方面99SE 不支持按类设置复杂规则很多约束要靠手工。建议自己在工程目录下维护一份检查清单文档每次布线完成后逐条核对。原理图和 PCB 之间的同步也是一样网表更新之后要仔细核对有没有元件被误删或者重命名。还有一个很实际的坑99SE 的自动保存和撤销功能都不太可靠大板子的操作建议频繁手动保存并且定期另存一个版本。改板的时候保留几个历史版本出问题还能回退。这些习惯看着土但真能救命。6. 打样、焊接与上电验证顺序6.1 上电前的静态检查板子回来之后第一件事不是上电而是目视加万用表检查。重点看几个地方各个电源网络对地是否短路尤其是核心电压这种低电压大电流的电源短路了上电就是一缕烟芯片有没有明显的焊接缺陷BGA 尤其要检查是否虚焊、桥接金手指有没有氧化或者损伤。BGA 焊接质量在目视下很难判断有条件的话用 X 光检查一遍尤其是桥片和 FPGA 这两颗。如果没有 X 光设备至少要确认焊接厂有 BGA 返修能力出问题能修。6.2 分级上电与波形验证上电要分级。先只上主电源测各路电压是否正常、纹波是否在允许范围内确认之后再上核心电压。如果电源有上下电顺序要求要用示波器看几路电源的上升沿时序是否符合要求。电源正常之后先测时钟。三路时钟都要测PCIE 参考时钟、本地总线时钟、DSP 主时钟。测的时候注意探头的接地要短用弹簧地针而不是长引线否则测出来的波形全是环路耦合进来的噪声。时钟幅度、频率、占空比、抖动都要看一下。然后是复位。确认所有复位信号在上电后都被正确释放释放的时刻和时钟稳定的时刻之间的关系要合理。这一步做好了后面调试会顺利很多。6.3 联调顺序与经验总结联调建议按链路顺序推进不要跳步。先单独给板子供电确认 FPGA 能配置成功、DSP 能跑起来最基本的程序比如翻转一个 IO这一步不涉及 PCIE最容易验证。然后插到主机上不装驱动先在系统设备列表里确认设备能被枚举出来。这一步过了说明物理链路和最基本的配置没问题。接着装驱动做最简单的寄存器读写测试。再往后是 DMA 传输测试从小数据量开始逐步加大到满带宽同时用逻辑分析仪观察本地总线上的实际活动。最后才是把 DSP 拉进来做三方联调。这一路走下来我在实际项目里体会最深的是两点。一是所有暂时先这么接的地方最后都会变成调试时最头疼的问题尤其是电源和复位这种基础网络省事一时还债很久。二是逻辑分析仪和示波器不是出问题才用的而是每推进一步都用它确认一次实际波形把我以为是这样的变成我看到了是这样的。这块板子涉及三个不同的时钟域和两种总线协议靠猜是猜不出来的老老实实测比什么都快。后续如果要扩展我一般会建议在这个框架上加一版把 FPGA 到 DSP 的接口从单 Zone 扩展成双 Zone一个走命令、一个走数据流减少相互阻塞同时在本地总线侧加一个片外的 SRAM 或 FIFO 做深缓冲让突发数据的吸收能力更强。这些改动不大但对手头任务多的项目来说边际收益很明显。
返回列表