189、 PCIE与Avalon总线互连:一次真实的FPGA调试手记
调试间里烟雾缭绕——不是真的烟,是我盯着示波器屏幕上那些杂乱无章的Avalon总线信号时,脑子里冒出的焦躁。客户板卡上的FPGA死活不响应主机通过PCIE发来的配置命令,而逻辑分析仪抓到的Avalon-MM总线波形显示,地址相位正常,但数据相位永远都是0xFFFFFFFF。这场景太经典了:PCIE端点设备已经调通,Avalon子系统单独测试也没问题,可一旦把两者对接,系统就“装死”。
问题根源:时钟域与位宽对齐
翻出最初的RTL代码,问题出在PCIE IP核的AXI-ST接口到Avalon-MM桥接模块上。PCIE核输出的数据位宽是128位,而我们的Avalon子系统设计为64位。当初为了省事,直接做了个简单的位宽截断:
// 错误示范:这里踩过大坑! assign avalon_writedata = pcie_data[63:0]; // 只取低64位 assign avalon_byteenable = pcie_be[7:0]; // 字节使能也没对齐更致命的是,PCIE核工作在250MHz,Avalon总线跑在125MHz。两个时钟域之间只做了简单的寄存器同步,完全没考虑跨时钟域的数据完整性。当PCIE突发写入超过4个DW时,Avalon侧必然丢失数据。
重构桥接逻辑:双时钟FIFO与动态位宽转换
真正的解决方案需要三个核心组件