USB FIFO 接上 FPGA 后,电平和保护怎么做稳
USB FIFO 接上 FPGA 后,电平和保护怎么做稳
做多协议调试器时,真正难的是把 USB 数据通道、FPGA 多电源域和外部可变电平接口放在同一块板上,还要让故障可以定位。本文选取立创开源广场的 ProtoBlade V1.0 工程,按同一版嘉立创 EDA 原理图与 PCB 重新核对关键网络,再用器件数据手册重算两个容易被忽略的边界:VIO 能不能真的降到 0.5V,以及 USB 输入保护能承受多大电流。
工程页标注的协议是 GPL 3.0,评论区置顶给出了 GlasgowEmbedded/glasgow 作为上游出处。下面的内容是对公开工程的独立硬件审查、计算和复核,不把第三方工程、上游代码或原图宣称为全部自研;复现时应同时遵守相应许可证。
先看版本和结构
本文使用工程 ID 0535d7dc2545451fac97e2748c5a8f28 的 V1.0 版本,原理图图纸日期为 2025-09-16。整机由 CY7C68013A USB FIFO/8051、iCE40HX8K FPGA、两组 8 路 SN74LVC1T45 电平转换、可调 VIO、电源监测和接口保护组成。FPGA 侧可把同一组引脚复用成 SPI、I2C、UART、JTAG、GPIO、PWM 或逻辑分析通道,USB FIFO 负责把高速数据搬到电脑。

图 1 P1 重新从 EDA 编辑器导出的高清原理图。可以沿着 VBUS → TPD3S014 → +5V、+5V → +3V3/+1V2 和 CY7C68013A ↔ iCE40HX8K 三条路径追线。

图 2 P2 的 FIFO、标志信号和 FPGA 连接。本文只据图核对连接关系,没有把“480Mbps”当成实测吞吐量。
USB 输入先看两个电流边界
Type-C 的 CC1、CC2 各接 5.1kΩ 下拉,角色上是设备端 Rd;D+/D− 进入 CY7C68013A,I2C 的 SDA、SCL 则用 2.2kΩ 上拉到 +3V3。P1 在 VBUS 后放了 TPD3S014,这个器件同时承担受限电流开关和 USB 数据线 ESD 保护。
TI 数据手册给出的 TPD3S014 输入工作范围是 4.5–5.5V,连续输出电流为 0.5A,典型限流点约 0.85A。它适合给这块调试器做受限的 5V 输入通道,但不能把它当成 USB 3.x 的 900mA 供电开关。更稳妥的启动顺序是先确认 +5V 已建立,再打开 VIO 和外部端口;发生短路时只把它当作保护动作,不能当成系统正常供电能力。
这里还有一个容易漏掉的热设计问题。若 USB 输入为 5V,而 +3V3 和 +1V2 都由线性稳压器得到,稳压器的耗散取决于 FPGA、FIFO 和外部负载的实际电流。原理图给了测试点和监测器件,复现时应在最大协议负载下记录 VBUS、+3V3、+1V2 和芯片温度,而不是只看空载能否枚举。
VIO 的 0.5V 下限需要收紧
P4 是这块板最值得复核的部分。每个 SN74LVC1T45DCKR 的 A 侧接 +3V3,B 侧接 VIO,DIR 由 FPGA 控制,A/B 两端各有 100nF 去耦;8 路信号组前面还放了 33Ω 串联电阻,用来减小边沿过冲和连接器反射。

图 3 P4 的电平转换、TVS、DAC、LDO 和电源监测。
项目说明把 VIO 描述成 0.5–3.6V 可调,但 SN74LVC1T45 的 VCCA、VCCB 推荐工作范围都是 1.65–5.5V。也就是说,DAC 和 LDO 即使能把电压调到 0.5V,电平转换器也已经离开推荐工作区。对 V1.0 来说,使用这颗转换器时应把固件允许范围收紧为 1.65–3.6V;若确实要支持 1.2V 逻辑,应更换支持该电压的转换器并重新核对 FPGA 的 VCCIO、输入阈值和时序。
VIO 的控制链是 DAC081C081 → R27 49.9kΩ → TPS73101 FB。DAC081C081 由 +3V3 供电,数据手册给出理想输出关系 V_DAC = V_REF × D / 256,其供电范围是 2.7–5.5V;TPS73101 是 1.2–5.5V、150mA 的可调 LDO。启动时 DAC 输出会复位到 0V,因此固件不应在上电后直接使能外部方向。建议按下面的顺序做软件保护:
- 先写入受限的 DAC 码值,并等待 VIO 稳定。
- 读取 INA233 或板上测试点确认 VIO 落在目标范围。
- 最后改变 DIR 和协议状态,避免外部设备在错误电平下被驱动。
下面的小工具是本文新增的静态检查代码,用来在生成配置前拒绝越界值;它不是项目附件,也不替代实测。
VIO_MIN = 1.65 # SN74LVC1T45 推荐下限
VIO_MAX = 3.60 # 本工程的目标上限
def vio_code(vref: float, code: int) -> float:
if not 0 <= code <= 255:
raise ValueError("DAC code must be 0..255")
v = vref * code / 256.0
if not VIO_MIN <= v <= VIO_MAX:
raise ValueError(f"VIO={v:.3f} V is outside the translator window")
return v
def ina233_current(shunt_v: float, shunt_ohm: float = 0.15) -> float:
return shunt_v / shunt_ohm
33Ω、TVS 和 INA233 是三层边界
P4 的 A、B 两组接口各放了 SP3012-06UTG 阵列,靠近连接器的走线再经过 33Ω 串联电阻。三者作用不同:TVS 负责把 ESD 电流导向地,33Ω 负责限制边沿电流和减小振铃,SN74LVC1T45 的输出能力决定正常驱动电流。33Ω 不是短路保护,不能因为有串联电阻就允许热插拔或把两组 VIO 直接短接。
同一页的 INA233 用来监测 VBUS。原理图把分流电阻标成 0.15Ω,并在 IN+、IN− 旁放 4.7Ω 和 100nF 差分滤波。INA233 的分流输入范围是 ±81.92mV,所以理论满量程电流为:
81.92mV ÷ 0.15Ω = 546.1mA
在 0.5A 时分流电阻耗散为 0.5² × 0.15 = 37.5mW。这两个数可以直接写进上位机的告警阈值,但仍需结合电阻精度、布局寄生和采样平均次数校准,不能把满量程当成推荐持续电流。

图 4 P3 保存了与信号完整性相关的测试记录。它能帮助定位边沿和回流问题,但图片本身不能替代当前板卡的实测条件说明。
用自检命令把问题拆开
项目给出了可复核的命令链。第一次上电先做 LED、引脚回环和电源电路自检,再进入协议测试:
ProtoBlade run selftest leds
ProtoBlade run selftest pins-loop
ProtoBlade run selftest voltage
ProtoBlade run uart --tx A1 --rx A0 -V 3.3 -b 115200 tty
protoblade run i2c-initiator --scl A0 --sda A1 --pulls -b 100 -V 3.3 scan
protoblade run spi-controller --sck A0 --cs A3 --copi A1 --cipo A2 -f 100 -V 3.3 01 02 03 04
这些命令分别覆盖 LED、引脚回环、板载 DAC/LDO、UART、I2C 和 SPI。它们的价值在于把故障分层:selftest voltage 失败时先查 VIO 和反馈网络,协议命令失败时再查 DIR、33Ω 电阻和连接器。逻辑分析仪示例还要求输入不超过 3.3V;在没有外部衰减或电平转换时不要把 5V 方波直接接入。
PCB 上要重点复核什么

图 5 同一 V1.0 工程导出的 PCB 顶层。USB、FIFO、FPGA 和两组接口的位置关系清晰可见。

图 6 同一 V1.0 工程导出的 PCB 底层。复现时重点检查 TVS 到地的回流、FPGA 电源过孔和连接器旁的地参考。
下单前建议逐项确认:
- USB D+/D−、FIFO 时钟和 FPGA 时钟附近不要被跨分割地切断,差分/高速线按工程文件标出的阻抗要求处理。
- TVS 的地回路尽量短,不能让 ESD 电流穿过 FPGA 或电平转换器的公共地。
- +1V2、+3V3 和 VIO 的去耦电容贴近对应引脚;TPS73101 的反馈线避开高 di/dt 走线。
- 外部端口第一次连接时固定 VIO、确认 DIR,再插入目标设备;项目页面已经明确禁止带电热插拔。
复现边界和结论
公开工程的 Windows CLI 流程依赖 oss-cad-suite、MSYS2、GTKWave 和 Zadig。本文只复核了同一版本的 EDA 图、器件数据手册和项目页给出的命令,没有焊接实物,也没有把项目页中的波形截图重新标成本文实测结果。真正复现时,先用低压、限流电源和无源回环验证,再逐步接入外设。
这块板最有价值的地方不是“支持很多协议”这句宣传,而是把 USB FIFO、FPGA、多电压域和可保护的外部接口放进一个能追线、能自检的工程。最需要修正的地方也很明确:SN74LVC1T45 的 VCCB 下限是 1.65V,固件不能把 DAC 的 0.5V 输出直接当成可用 VIO。 把这个边界写进配置检查,再配合 INA233 电流告警和分层自检,复现时才不会把一次错误电平变成一组损坏的外设。
资料与许可
- 项目来源:ProtoBlade 调试终端,工程页标注 GPL 3.0。
- 上游出处:GlasgowEmbedded/glasgow,仓库元数据标注 0BSD;本文仅作来源与许可证说明,不把上游内容当作原创代码。
- 器件依据:SN74LVC1T45 数据手册、TPD3S014 数据手册、INA233 数据手册、DAC081C081 数据手册、TPS731 数据手册。
- 图片均为上述工程 V1.0 从嘉立创 EDA 编辑器重新导出的原理图和 PCB 顶底面,正文只做裁切和缩放;验证范围为静态连接、参数计算和命令可复核性。
技术交流,欢迎关注微信公众号:美男子玩编程。



