WiFi 6 OFDMA机制的FPGA仿真验证与资源分析
WiFi 6(802.11ax)引入OFDMA(Orthogonal Frequency Division Multiple Access),将20/40/80/160MHz信道切分为最小资源单元(RU,26-tone),允许AP并行调度多用户数据。在芯片前端验证中,常用FPGA原型对OFDMA的RU分配逻辑、IFFT组帧、AXI流控做RTL仿真与资源预估。本文以Xilinx Kintex UltraScale+为例说明要点。
一、OFDMA RU分配与控制逻辑建模
802.11ax定义RU类型:RU-26(26-tone)、RU-52、RU-106、RU-242(20MHz)、RU-484(40MHz)、RU-996(80MHz)等。FPGA侧需维护一张RU Allocation Table:
// ru_alloc.v 简化示例:记录各用户分配的RU索引与音调数
typedef struct packed {
logic [4:0] user_id; // 0=未分配
logic [2:0] ru_type; // 3'b000=RU26, 001=RU52, 010=RU106...
logic [9:0] tone_cnt; // 26/52/106/242...
logic [7:0] start_sub; // 子载波起始索引(相对于80MHz)
} ru_map_t;
ru_map_t ru_table [0:3]; // 假设最大并发4用户(80MHz)
// 分配逻辑(由高层调度写)
always_ff @(posedge clk) begin
if (alloc_vld)
ru_table[alloc_idx] <= '{alloc_uid, alloc_ru, TONE_CNT[alloc_ru], alloc_start};
end
RU分配须满足不重叠、对齐到RU边界(26音倍数字边界),违例时返回alloc_err。
二、OFDMA组帧:多RU并行IFFT拼接
传统OFDM每符号填全盘子载波;OFDMA需按RU掩码填充,其余子载波置0(NULL tone)。
2.1 子载波填充核心
// 假设128-pointIFFT对应20MHz(简例);实际80MHz用512-pt
always @(posedge clk) begin
if (s_axis_tvalid) begin
// 清空子载波RAM
for (int k=0;k<FFT_N;k++) sc_ram[k] <= 32'sh0;
// 对每个已分配RU填数据
for (int u=0;u<NUM_USER;u++) if (ru_table[u].user_id!=0) begin
int base = ru_table[u].start_sub;
for (int t=0;t<ru_table[u].tone_cnt;t++)
sc_ram[base+t] <= user_data[u][t]; // Q15格式复数
end
ifft_start <= 1'b1;
end
end
2.2 AXI-Stream接口
用户侧用axis_tdata(每RU数据按音调交织或分开通道)送入;控制侧用RU分配表同步。建议在RU边界插入TLAST标记完整OFDMA符号。
三、Testbench仿真验证要点
1. 单RU全占(退化OFDM):RU-242(20MHz)填满→比对已知IFFT向量
2. 双RU不重叠:RU-26 + RU-26 在不同偏移,其余置0 → 检查频谱空洞
3. 动态重配:运行中改ru_table,下一符号按新分配填→验证分配锁存与alloc_err
4. AXI反压:s_axis_tready随机拉低,确保RU填充状态机不丢数据
典型仿真顶层:
initial begin
rst_n = 0; #100 rst_n=1;
// 1. 写ru_table
@(posedge clk); alloc_vld <= 1; ...
// 2. 给user_data axis流
fork gen_axis_data(); join
// 3. 等符号完成
wait(ifft_done);
$finish;
end
四、资源消耗分析(Kintex UltraScale+ 示例)
假设80MHz 512-pt IFFT + 4并行RU缓冲:
资源 估算值 说明
LUT ~3.8k RU查表、AXIS控制、IFFT控制
FF ~2.2k 流水线/状态寄存器
BRAM 6~8块 (18Kb) IFFT旋转因子ROM + RU暂存FIFO
DSP 4~6 IFFT内部 butterfly(Xilinx DDS Compiler)
若扩展至8~16用户并发(160MHz 1024-pt IFFT),BRAM升至12~16块,LUT约6k,仍在中型FPGA可接受范围。
五、常见设计陷阱
现象 原因 修正
IFFT输出频谱异常(能量集中低频) RU起始子载波未按DC null居中 确保DC tone(index=FFT_N/2)强制0
用户数据错位(音调顺序反) C/A码或用户数据未按升频子载波序 按标准子载波索引映射,不按RU自然序
重配时一符号混入新旧RU ru_table更新未与symbol边界同步 用symbol_boundary脉冲锁存分配
AXI死锁高负载 RU FIFO满但ifft_start未及时拉 加almost_full阈值提前反压
六、结语
FPGA验证WiFi 6 OFDMA前端的核心是RU分配表正确性 + 按RU掩码填零子载波 + IFFT边界同步。通过行为仿真确认多RU并行填充与动态重配,再结合Xilinx FFT IP资源报告预估BRAM/DSP用量,即可在原型阶段确认算法可行性并为SoC集成铺路。





