拿到紫光同创PGL50H开发板的第一时间,很多工程师最想验证的就是PCIE通信功能。作为FPGA与主机交互的高速通道,PCIE的稳定性和性能直接影响后续开发效率。本文将用实验室手把手教学的方式,带你从零完成IP核配置到设备识别的完整流程,过程中会特别标注那些容易踩坑的细节。
工欲善其事,必先利其器。在开始PCIE测试前,需要确保基础环境配置正确。紫光同创PGL50H开发板配套的PDS开发工具链是整套流程的起点,建议使用官方推荐的2023.1及以上版本。
必须检查的三个前置条件:
IP核安装是第一个关键环节。与常规FPGA开发不同,紫光同创的PCIE IP需要手动导入:
bash复制# 进入IP核安装目录
cd /opt/Pango/6_IP_setup_packet/PCIE
# 执行安装脚本
sudo ./install_pcie_ip.sh
安装过程中常遇到的两个问题:
注意:IP核版本需要与PDS软件严格匹配,如果遇到"Unrecognized IP format"错误,建议重新下载对应版本的IP核包。
安装完成后,可以通过以下命令验证是否成功:
bash复制pds --list-ip | grep PCIE
正常应该显示类似"PCIE_X1_GEN2"的IP核标识。
新建工程时,器件型号选择容易出错的环节。PGL50H-6IFBG484这个型号包含多个速度等级,务必选择"-6"速度等级(对应芯片上的标记)。
关键参数配置表:
| 参数项 | 推荐值 | 错误配置后果 |
|---|---|---|
| Lane数量 | X1 | 不匹配会导致链路训练失败 |
| 协议版本 | Gen2 | Gen3可能不稳定 |
| 参考时钟 | 100MHz | 必须与硬件设计一致 |
| 数据位宽 | 32bit | 64bit需要特殊配置 |
在IP Compiler界面中,需要特别注意Advanced选项卡下的BAR空间设置。初学者建议保持默认的32-bit内存空间配置,等链路调通后再根据应用需求调整。
tcl复制# 示例约束文件关键片段
set_property LOC HSST_LANE0_X0Y0 [get_ports pcie_txp]
set_property IOSTANDARD LVDS_25 [get_ports pcie_refclk_p]
时钟配置是最容易出问题的环节。开发板上的REFCLK1已经通过硬件连接至HSST Bank,在软件中必须选择"refclk1"选项,否则会导致无法建立链路。
盘古50K开发板的PCIE接口采用标准的PCIe x1金手指连接器,但需要注意几个特殊设计:
信号对应关系表:
| FPGA管脚 | PCIE信号 | 开发板连接位置 |
|---|---|---|
| HSST_LANE0_TXP | PCIE_TX_P | 金手指A2引脚 |
| HSST_LANE0_RXN | PCIE_RX_N | 金手指B3引脚 |
| BANK4_VCCO_0 | REFCLK_P | 晶振输出 |
硬件连接时常见问题排查:
重要提示:在接通电源状态下插拔PCIE板卡可能损坏设备,务必先断电操作。
使用PDS进行综合实现时,建议采用增量编译策略节省时间。在Flow Navigator中勾选"Incremental Implementation"选项,可以大幅缩短后续修改后的编译时间。
时序收敛技巧:
烧写固件到Flash的完整命令序列:
bash复制# 生成烧写文件
pds -bitstream pcie_test.bit -format mcs -interface SPIx4 -size 32
# 连接编程器
program_flash -c USB-Blaster -m 0 -f pcie_test.mcs
常见烧写问题解决方法:
成功烧写固件后,将开发板插入电脑的PCIE插槽(建议使用x16插槽以获得更好机械稳定性)。在Linux系统下可以通过以下命令检查设备识别情况:
bash复制lspci -vvv | grep "Pango"
Windows设备管理器中应该能看到"PCI Express Device"条目,如果没有黄色感叹号表示驱动加载正常。此时可以通过DMA测试验证实际传输性能:
c复制// 简单的DMA测试代码示例
void pcie_dma_test() {
uint32_t *src = alloc_dma_buffer(1MB);
uint32_t *dst = alloc_dma_buffer(1MB);
start_dma_transfer(src, dst, 1MB);
while(!dma_complete());
verify_data(src, dst, 1MB);
}
性能优化建议:
当链路训练失败时,HSST眼图扫描是最有效的诊断手段。PDS内置的SignalTap工具可以捕获训练过程中的关键信号:
tcl复制# SignalTap配置示例
create_debug_core hssi_eye_scan altera_signaltap
set_parameter ENABLE_ADVANCED_TRIGGER 1
add_probe hssi_rx_data
add_probe hssi_rx_valid
常见错误代码速查表:
| 错误代码 | 含义 | 解决方案 |
|---|---|---|
| 0x1001 | 链路训练超时 | 检查参考时钟质量 |
| 0x2003 | DLL链路失锁 | 复位PCIE硬核 |
| 0x3005 | 接收端检测失败 | 验证RX端接电阻值 |
对于需要长时间稳定运行的场景,建议添加温度监控逻辑。PGL50H内置的温度传感器可以通过Avalon-MM接口访问:
verilog复制// 温度监测代码片段
always @(posedge clk) begin
if(temp_read_req) begin
temp_data <= {8'h0, TEMP_SENSOR};
temp_valid <= 1'b1;
end
end
在完成基础测试后,可以尝试修改IP核配置探索性能边界。比如将Lane数改为x2,或者将协议版本升级到Gen3,观察系统稳定性变化。不过要注意这些修改可能需要调整硬件设计。