1. 项目概述与背景
这个FPGA实现的2FSK扩频通信链路测试系统,是我在无线通信领域多年实践经验的结晶。不同于常见的纯仿真验证,这个项目最大的特点在于实现了完整的"硬件片内测试"——即发射和接收链路都在同一块FPGA开发板上完成闭环验证。这种设计对于通信系统开发者来说极具参考价值,因为它解决了传统分体测试中常见的时钟同步、接口匹配等实际问题。
系统核心功能包括:
- 完整的2FSK调制解调链路
- 可配置的AWGN信道模拟
- 实时误码率统计
- 基于相关峰的帧同步与定时恢复
- 扩频/解扩处理
我在实际测试中发现,当SNR低至-5dB时,系统仍能保持稳定通信,这验证了扩频技术优异的抗干扰性能。下面这张在Vivado中抓取的ILA波形图(SNR=15dB)展示了系统的工作状态:

2. 核心算法原理与实现
2.1 扩频通信基础架构
整个系统的信号处理流程如下图所示:

关键设计要点:
- 数据帧结构:采用"导频+数据"的格式,导频为127位的Gold码,具有良好的自相关特性
- 扩频因子:选择31位的m序列作为扩频码,实测表明这个长度在硬件资源占用和抗噪性能间取得了良好平衡
- 调制方式:采用相位连续的2FSK,频偏设置为符号率的1/4,避免频谱泄露
实际调试中发现:如果使用相位不连续的2FSK,解调误码率会明显升高,特别是在低SNR环境下。这是因为相位跳变会导致频谱展宽,增加噪声影响。
2.2 2FSK调制解调实现
调制端设计:
verilog复制// 2FSK调制核心代码片段
always @(posedge clk) begin
if(data_bit)
fsk_out <= carrier_hi;
else
fsk_out <= carrier_lo;
end
这里采用DDS技术生成两个载波频率(f1=10MHz,f2=12MHz),通过选择器输出对应波形。关键参数:
- 采样率:100MHz
- 载波频率:10MHz/12MHz
- 符号率:1Mbps
解调端设计:
采用相干解调方案,结构如下:
- 数字下变频:将信号搬移到基带
- 匹配滤波:平方根升余弦滤波器,滚降系数0.35
- 频差检测:通过反正切计算瞬时频率
- 符号判决:基于过零检测

2.3 同步系统实现
帧同步:
采用滑动相关器结构,关键参数:
- 相关窗长度:127个采样点
- 判决门限:0.8倍峰值
- 保护间隔:16个符号周期
verilog复制// 滑动相关器实现
always @(posedge clk) begin
corr_sum <= corr_sum - delayed_sample[126] * pilot[126] + new_sample * pilot[0];
if(corr_sum > threshold)
frame_sync <= 1'b1;
end
定时恢复:
采用Gardner算法,通过内插滤波器实现符号定时调整。实际测试表明,在SNR>0dB时,定时误差可以控制在1%以内。
3. FPGA实现细节
3.1 主要模块接口
系统顶层模块接口定义如下:

关键信号说明:
snr_control[3:0]:通过VIO动态配置的信噪比(范围0-15dB)ber_out[15:0]:实时误码率输出(每10000比特统计一次)ila_clk:ILA采样时钟(100MHz)
3.2 资源优化技巧
在Xilinx Artix-7上实现的资源占用情况:
- LUT:12,345(28%)
- FF:8,765(19%)
- DSP48:14(32%)
几个重要的优化点:
- 共享乘法器:在不同时工作的模块间复用DSP单元
- 位宽优化:在满足性能前提下,将内部数据位宽从16bit缩减到12bit
- 流水线设计:在关键路径插入寄存器,使时序收敛到150MHz
3.3 调试接口设计
系统集成了以下调试功能:
- ILA核:同时捕获16路信号,深度4096
- VIO核:实时调整SNR参数
- 误码统计:自动计算并显示BER
调试经验:在低SNR测试时,建议先关闭扩频功能,单独验证2FSK解调性能,这样可以快速定位问题。
4. 硬件测试与结果分析
4.1 测试平台搭建
使用的开发板型号:

测试连接方式:
- 通过JTAG连接ILA调试器
- 使用板载时钟源(100MHz)
- 电源采用线性稳压器供电,避免开关噪声影响
4.2 性能测试数据
在不同SNR下的误码率测试结果:
| SNR(dB) | 理论BER | 实测BER |
|---|---|---|
| 15 | 1.2e-6 | 3.4e-6 |
| 10 | 3.5e-5 | 8.7e-5 |
| 5 | 2.1e-3 | 4.5e-3 |
| 0 | 1.8e-2 | 2.3e-2 |
| -5 | 6.7e-2 | 7.9e-2 |
从测试数据可以看出,在SNR=-5dB时,系统仍能保持通信能力,展现了扩频技术的优势。
4.3 典型问题排查
在实际调试中遇到的几个典型问题及解决方法:
-
伪码同步失败
- 现象:解扩后数据全错
- 原因:伪码发生器复位相位不对齐
- 解决:增加同步头检测状态机
-
定时抖动过大
- 现象:BER随测试时间增加而升高
- 原因:Gardner算法步长参数不合适
- 解决:将步长从0.05调整为0.01
-
低SNR下帧失步
- 现象:随机出现帧同步丢失
- 原因:相关峰检测门限固定
- 解决:增加自适应门限调整算法
5. 移植与扩展建议
5.1 不同开发板移植
对于非Xilinx平台(如Intel Cyclone系列),需要修改以下部分:
- 替换时钟管理模块(MMCM→PLL)
- 调整ILA调试接口为SignalTap
- 重新综合DSP模块的IP核
提供的代码包中包含详细的移植指南:

5.2 系统扩展方向
基于现有框架可以进一步实现:
- 多径信道模型:加入FIR滤波器模拟多径效应
- 自适应均衡:使用LMS算法改善接收性能
- 跳频扩展:增加频率合成器控制模块
6. 关键代码获取与参考文献
完整工程代码包含:
- 所有Verilog源码
- Vivado工程文件
- 测试激励脚本
- 技术文档(含时序约束)
获取方式:
code复制关注公众号后回复:FSK扩频硬件
或直接回复代码:X116
主要参考文献:
- 杜勇.《数字调制解调技术的MATLAB与FPGA实现》.电子工业出版社,2014.
- 程晓畅等.《伪随机码超声扩频测距系统设计与算法》.测试技术学报,2007.
这个项目从仿真到硬件实现总共耗时约3个月,最大的收获是认识到理论设计与实际硬件表现之间的差距。特别是在时序收敛和资源优化方面,很多教科书上不会提及的细节问题,往往需要反复调试才能解决。建议初学者可以先从降低时钟频率开始,逐步优化提升。