3. FPGA验证平台搭建:Xilinx/Altera开发板选型、USB PHY芯片连接与时钟复位方案
USB主机控制器控制传输的FPGA验证,其成败高度依赖于底层硬件平台的正确性与稳定性。本章聚焦于验证平台的三大核心要素:FPGA开发板选型、USB PHY芯片的接口连接(ULPI/UTMI)以及时钟与复位方案的设计。一个设计不当的平台,即使RTL逻辑正确,也会因信号完整性问题或时序违例导致验证失败。
3.1 FPGA开发板选型:Xilinx与Altera的考量
选择开发板时,需综合考虑逻辑资源、高速收发器、可用IO数量以及调试接口。下表对比了Xilinx与Altera(现Intel)主流开发板在USB验证场景下的关键参数:
| 对比维度 | Xilinx KC705 (Kintex-7) | Xilinx ZC702 (Zynq-7000) | Altera DE5-Net (Stratix V) | Altera DE10-Nano (Cyclone V SoC) |
|---|---|---|---|---|
| 逻辑资源 (LE/LC) | ~326K | ~85K | ~622K | ~110K |
| 高速收发器 | GTX (12.5 Gbps) | 无 (仅PL端) | GXB (12.5 Gbps) | 无 (仅PL端) |
| USB PHY接口 | FMC连接器 (可扩展) | FMC + EMIO (PS端) | HSMC连接器 | Arduino + GPIO |
| 调试能力 | ChipScope Pro | Vivado ILA + PS调试 | SignalTap II | SignalTap II + HPS调试 |
| 适用场景 | 高速USB 2.0/3.0验证 | USB+ARM协同验证 | 大规模控制传输验证 | 低成本原型验证 |
3.2 USB PHY芯片连接:ULPI与UTMI接口详解
FPGA内部实现的是数字逻辑层(Link Layer),而物理层信号(如差分D+/D-)由外部PHY芯片处理。ULPI(UTMI+ Low Pin Interface)和UTMI(USB 2.0 Transceiver Macrocell Interface)是两种最常用的接口标准。
3.2.1 UTMI接口(8位/16位并行)
UTMI是较早期的接口,采用并行数据总线。其典型信号包括:
- Data[7:0] / Data[15:0]:双向数据总线。
- XcvrSelect:收发器选择(HS/FS/LS)。
- TermSelect:终端电阻选择。
- OpMode[1:0]:操作模式(正常/非驱动/禁用)。
- RxValid / RxActive:接收数据有效指示。
- TxValid / TxReady:发送数据握手信号。
UTMI接口的优点是时序直观,但缺点是引脚数较多(8位模式下约30根信号线),在FPGA布局布线时容易造成IO拥挤。
3.2.2 ULPI接口(8位双倍数据率)
ULPI通过将时钟频率提升至60MHz,并在时钟的双沿采样数据,将数据总线宽度降为8位,大幅减少了引脚数量。其核心信号仅需:
- Data[7:0]:双向数据/控制复用总线。
- Dir:方向控制(PHY->Link)。
- Nxt:下一字节指示(PHY->Link)。
- Stp:停止信号(Link->PHY)。
- Clk:60MHz参考时钟(由PHY提供或外部提供)。
以下是ULPI接口在FPGA顶层模块中的典型例化代码片段:
module usb_ulpi_top (
// ULPI PHY 接口
input wire ulpi_clk, // 60MHz 时钟
inout wire [7:0] ulpi_data, // 双向数据总线
input wire ulpi_dir, // 方向控制
input wire ulpi_nxt, // 下一字节
output wire ulpi_stp, // 停止信号
output wire ulpi_rst, // PHY复位 (低有效)
// 系统接口
input wire sys_clk, // 系统时钟
input wire sys_rst_n // 系统复位
);
// 三态缓冲器控制
wire [7:0] data_out;
wire data_out_en;
reg [7:0] data_in;
assign ulpi_data = data_out_en ? data_out : 8'bz;
always @(posedge ulpi_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
data_in <= 8'b0;
else if (!ulpi_dir) // Dir=0时,FPGA驱动数据总线
data_in <= ulpi_data;
end
// ... 后续ULPI状态机与USB主机控制器逻辑 ...
endmodule
3.3 时钟与复位方案
时钟和复位是FPGA验证平台中最容易被忽视却又最容易引发故障的环节。USB主机控制器涉及多个时钟域,必须谨慎处理。
3.3.1 时钟域划分
典型的USB主机控制器验证平台包含以下时钟域:
- ULPI时钟域 (60MHz):由PHY芯片提供或外部晶振产生,用于ULPI接口数据收发。
- 系统时钟域 (100MHz/125MHz):用于主机控制器内部状态机、DMA引擎和寄存器访问。
- 应用层时钟域 (可变):用于上层协议处理或CPU接口。
3.3.2 复位策略
复位方案需同时满足PHY芯片和FPGA逻辑的时序要求:
| 复位信号 | 来源 | 有效电平 | 最小脉宽 | 作用域 |
|---|---|---|---|---|
| PHY_RST_N | FPGA GPIO | 低电平 | > 1ms | USB PHY芯片 |
| SYS_RST_N | 板级复位按钮 / 电源监控 | 低电平 | > 10ms | FPGA全局复位 |
| ULPI_SW_RST | FPGA内部逻辑 | 高电平 | > 5个ULPI时钟周期 | ULPI接口状态机 |
复位释放必须满足异步置位、同步释放的原则,避免亚稳态传播。以下是一个标准的复位同步器实现:
module rst_sync (
input wire clk,
input wire rst_async_n, // 异步复位输入
output wire rst_sync_n // 同步复位输出
);
reg [1:0] rst_meta;
always @(posedge clk or negedge rst_async_n) begin
if (!rst_async_n) begin
rst_meta <= 2'b00;
end else begin
rst_meta <= {rst_meta[0], 1'b1};
end
end
assign rst_sync_n = rst_meta[1];
endmodule
3.4 验证平台整体架构
下图展示了基于ULPI接口的USB主机控制器FPGA验证平台的整体连接关系:
3.5 常见连接故障与排查
在搭建验证平台时,以下三类故障最为常见:
- PHY芯片无法枚举:检查PHY_RST_N复位时序是否满足1ms要求,测量ULPI_CLK是否存在且频率稳定在60MHz±0.25%。
- ULPI数据总线冲突:使用示波器或ILA抓取Dir信号,确认FPGA在Dir=0时正确驱动数据总线,在Dir=1时释放为高阻态。
- 时钟域间数据错乱:检查跨时钟域同步器是否使用两级触发器或异步FIFO,避免在ULPI时钟域直接采样系统时钟域信号。