184、 PCIE在FPGA中的实现:从Xilinx IP核的坑说起上周调一块自研的FPGA板卡,PCIE链路死活起不来。LTSSM卡在Detect状态,眼图看着还行,但就是协商不过去。熬到凌晨三点,最后发现是参考时钟的约束没写对——时钟引脚分配在了普通IO上,没走专用时钟路径。这种问题数据手册不会明说,但实际调试中一踩一个准。FPGA实现PCIE的典型架构现在的FPGA厂商都把PCIE硬核做好了,我们其实是在用“积木”。以Xilinx UltraScale+为例,整个PCIE子系统包含几个关键部分:PHY层硬核、PIPE接口、DMA引擎、配置空间寄存器。用户真正要写的代码,其实集中在应用层和数据搬运逻辑。// 例化PCIE IP核的代码片段 pcie_ultrascale_0 u_pcie ( .pci_exp_txp(txp), // 差分发送正端 .pci_exp_txn(txn), // 差分发送负端 .pci_exp_rxp(rxp), // 差分接收正端 .pci_exp_rxn(rxn), // 差分接收负端 .user_clk(user_clk), // 用户时钟,这里注意跨时钟域 .user_reset(user_reset), // 复位信号要同步处理 .s_axis_tx_tdata(tx_data), // 发送数据流 .s_axis