Quick Start:从零到运行一个国产FPGA 5G小基站原型
- [object Object]
预期结果:开发板上电后,LED指示PLL锁定,CPRI链路同步成功,BBU模拟器显示上行/下行数据流正常。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | 安路PH1A180、紫光同创Logos-2、高云GW5AST-138 | Xilinx Artix-7 / Kintex-7 评估板(仅用于原型验证) | — |
| EDA版本 | TD 5.0+ / PDS 2024.1+ / Gowin YunSDR 1.9.8+ | Vivado 2020.1+(仅用于原设计移植) | — |
| 仿真器 | ModelSim SE / Questa / 国产芯华章GalaxSim | Vivado Simulator(仅用于原设计) | — |
| 时钟/复位 | 差分晶振 122.88 MHz(或10 MHz参考+内部PLL倍频) | 单端 100 MHz + 外部时钟缓冲器 | — |
| 接口依赖 | CPRI v7.0 / eCPRI 1.0,SerDes速率 9.8304 Gbps | JESD204B(ADC/DAC接口) | — |
| 约束文件 | 时序约束(create_clock、set_input_delay、set_output_delay) | 物理约束(IO_LOC、IO_BANK) | — |
| 操作系统 | Windows 10/11 64-bit 或 Ubuntu 20.04/22.04 | CentOS 7(旧版工具链) | — |
目标与验收标准
- 功能点:实现O-RAN Split 7.2x的RU侧基带处理(FFT/IFFT、PRACH检测、IQ数据压缩),支持20 MHz带宽(100 RB)。
- 性能指标:上行/下行吞吐量 > 150 Mbps(20 MHz, 64QAM);端到端延迟 < 1 ms(RU侧处理)。
- 资源/Fmax:LUT使用率 < 70%,BRAM < 60%,DSP < 50%;Fmax ≥ 245.76 MHz(SerDes参考时钟)。
- 验收方式:通过O-RAN前传一致性测试(使用VIAVI或Keysight测试仪);或与商用BBU对接,实现VoNR通话。
实施步骤
阶段一:工程结构与IP替换
- [object Object]
常见坑与排查
- 坑1:国产PLL的VCO频率范围可能不支持245.76 MHz输出,需改用整数边界模式或级联PLL。
- 坑2:SerDes的CDR(时钟数据恢复)锁定时间比Xilinx长,需在链路初始化时增加等待超时(如500 μs)。
阶段二:关键模块实现——CPRI链路层
// 示例:CPRI链路状态机(简化版)
module cpri_link_fsm (
input wire clk_122m88,
input wire rst_n,
input wire serdes_locked,
output reg [1:0] link_state // 0:RESET, 1:SYNC, 2:OPERATIONAL
);
always @(posedge clk_122m88 or negedge rst_n) begin
if (!rst_n) begin
link_state <= 2'b00;
end else begin
case (link_state)
2'b00: if (serdes_locked) link_state <= 2'b01;
2'b01: if (sync_detected) link_state <= 2'b10;
2'b10: if (loss_of_sync) link_state <= 2'b00;
default: link_state <= 2'b00;
endcase
end
end
endmodule逐行说明
- 第1行:模块声明,模块名为cpri_link_fsm。
- 第2行:输入端口clk_122m88,122.88 MHz时钟。
- 第3行:输入端口rst_n,异步复位(低有效)。
- 第4行:输入端口serdes_locked,SerDes锁定指示。
- 第5行:输出端口link_state,2位宽,表示链路状态(0:RESET, 1:SYNC, 2:OPERATIONAL)。
- 第7行:always块,敏感列表为clk_122m88上升沿或rst_n下降沿。
- 第8行:if条件判断,若rst_n为低(复位有效),则执行复位操作。
- 第9行:复位时,link_state赋值为2'b00(RESET状态)。
- 第10行:else分支,非复位时执行状态机逻辑。
- 第11行:case语句,根据当前link_state进行状态转移。
- 第12行:状态2'b00(RESET):若serdes_locked为高,则跳转到2'b01(SYNC)。
- 第13行:状态2'b01(SYNC):若sync_detected为高,则跳转到2'b10(OPERATIONAL)。
- 第14行:状态2'b10(OPERATIONAL):若loss_of_sync为高,则跳回2'b00(RESET)。
- 第15行:default分支,捕获未定义状态,回到RESET。
- 第16行:endcase结束case语句。
- 第17行:end结束always块。
- 第19行:endmodule结束模块。
阶段三:时序约束与物理约束
使用国产工具的命令行或GUI界面添加以下约束(以TD为例):
create_clock -name clk_122m88 -period 8.138 [get_ports clk_p]
set_input_delay -clock clk_122m88 -max 2.0 [get_ports data_in*]
set_output_delay -clock clk_122m88 -min 1.5 [get_ports data_out*]逐行说明
- 第1行:创建时钟约束,时钟名clk_122m88,周期8.138 ns(对应122.88 MHz),源端口为clk_p。
- 第2行:设置输入延迟约束,时钟域clk_122m88,最大延迟2.0 ns,应用于所有data_in*端口。
- 第3行:设置输出延迟约束,时钟域clk_122m88,最小延迟1.5 ns,应用于所有data_out*端口。
验证结果
完成上述步骤后,执行以下验证流程:
- [object Object]
排障指南
- PLL无法锁定:检查输入时钟频率是否在PLL允许范围内;尝试调整PLL的反馈分频系数或使用整数边界模式。
- SerDes链路不稳定:增加CDR锁定等待时间;检查参考时钟抖动是否超标(峰峰值 < 50 ps);验证PCB走线阻抗匹配(100 Ω差分)。
- 时序违例:优化RTL流水线深度;在约束文件中增加set_multicycle_path;尝试降低Fmax至200 MHz作为过渡。
- 误码率过高:检查CPRI帧的CRC校验;确认8B/10B编码无误;用BERT(误码率测试仪)逐段排查。
扩展与优化
- 支持更大带宽:将设计扩展至40 MHz(200 RB)或100 MHz(273 RB),需调整FFT点数和SerDes速率。
- 多扇区支持:利用国产FPGA的多通道SerDes,实现4T4R或8T8R配置。
- 功耗优化:使用国产工具的功耗分析报告,关闭未使用的逻辑块;降低核心电压(如从1.0 V降至0.9 V,需确认器件支持)。
参考与附录
- O-RAN前传规范(CUS Plane v7.0)
- CPRI规范v7.0(接口物理层)
- 安路TD用户指南(原语与约束章节)
- 紫光同创PDS设计手册(SerDes配置)
- 高云YunSDR开发板原理图(时钟树与电源)






