前言:在前几篇文章 已经完成前导序列、SIGNAL域、DATA域各自的基带处理的基础上,本篇文章实现对三个独立的模块的简单调度,以及输出数据缓存。基于802.11a协议的OFDM发射物理层基带数据处理(part1)_CSDN博客
基于802.11a协议的OFDM发射物理层基带数据处理(part2)-CSDN博客
基于802.11a协议的OFDM发射物理层基带数据处理(part3)-CSDN博客
OFDM基带发射机的最后一级模块,输出的时域数据需要遵循PPDU(802.11协议规定的PHY层数据传输格式)的数据格式。
通过编写调度模块,将三个独立的基带处理模块输出进行时间上的调度,并通过发送缓存fifo对数据进行拼接。
调度模块需要考虑的问题:(调度模块通过状态机实现,初始状态为idle态)
1、触发各模块使能的开始时刻?2、对各模块的输入数据调度时的切换条件?3、待一包完整的数据帧调度结束后,向后级发送缓存模块输入调度结束标志信号,使能fifo输出。
调度模块内部状态机工作流程:
在idle态时,检测到上层用户数据发送标志后,状态跳转到preamble_st状态,使能长短训练序列模块;当前测到长短训练序列模块发送数据结束标志tx_preamble_end后,关闭长短训练序列模块使能信号,状态跳转到signal_st状态,使能Signal域基带处理模块;同样检测到tx_signal_end后,关闭Signal域基带处理模块使能,状态跳转到data_st,等待数据域数据全部处理结束后,回到idle态,并产生out_data_end信号,触发下级发送缓存fifo开始输出。
OFDM基带发射机的顶层部分代码如下:
tx_data_field u_data(
.clk_User (clk_80M),
.clk_Modulation (clk_80M),
.reset (reset),
.packetlength (user_packetlength),
.param_valid (frame_start_gen_flag),
.tx_Rate (tx_Rate),
.tx_ConvCodeRate (tx_ConvCodeRate),
.tx_Modulation (tx_Modulation),
.user_tx_data_valid (user_tx_data_valid),
.user_tx_data (user_tx_data),
.tx_add_cyclic_prefix_valid (tx_data_valid),
.tx_add_cyclic_prefix_end (tx_data_end),
.tx_add_cyclic_prefix_re (tx_data_re),
.tx_add_cyclic_prefix_im (tx_data_im)
);
tx_signal_field u_signal(
.clk_Modulation (clk_80M),
.reset (reset),
.packetlength_valid (frame_start_gen_flag),
.packetlength ('d154),
.tx_Rate (tx_Rate),
.in_ready (out_ctrl[1]),
.tx_add_cyclic_prefix_valid (tx_signal_valid),
.tx_add_cyclic_prefix_end (tx_signal_end),
.tx_add_cyclic_prefix_re (tx_signal_re),
.tx_add_cyclic_prefix_im (tx_signal_im)
);
tx_preamble u_preamble(
.clk_Modulation (clk_80M),
.reset (reset),
.tx_preamble_flag (out_ctrl[0]),
. preamble_vlid (tx_preamble_vlid),
. preamble_end (tx_preamble_end),
. preamble_re (tx_preamble_re),
. preamble_im (tx_preamble_im)
);
data_multi_cntrl u_ctrl(
.clk (clk_80M),
.rst (reset),
.tx_start_flag (user_tx_data_start) ,
.tx_Upsample (tx_Upsample),//采样率
.in_data_valid_1 (tx_preamble_vlid),
.in_data_end_1 (tx_preamble_end),
.in_data_re_1 (tx_preamble_re),
.in_data_im_1 (tx_preamble_im),
.in_data_valid_2 (tx_signal_valid),
.in_data_end_2 (tx_signal_end),
.in_data_re_2 (tx_signal_re),
.in_data_im_2 (tx_signal_im),
.in_data_valid_3 (tx_data_valid),
.in_data_end_3 (tx_data_end),
.in_data_re_3 (tx_data_re),
.in_data_im_3 (tx_data_im),
.out_ctrl (out_ctrl),
.out_data_valid (out_data_valid),
.out_data_end (out_data_end),
.out_data_re (out_data_re),
.out_data_im (out_data_im)
);
补充:最后一级发送缓存模块中fifo的深度如何设置?
思考:从以太网中数据传输最大1500字节出发,考虑一帧数据中最多包含多少个OFDM符号?一个OFDM符号又对应多少个采样点呢?
20MHZ采样率时,一个OFDM符号3.2us+0.8us,对应80个采样点;
64QAM调制,一个ofdm符号数据是48*6=288bit;
一帧数据最多包含ofdm符号数:(1500*(4/3)*8)/ 288 ;
fifo最大深度设置:(1500*(4/3)*8)/ 288 * 80 。
文章均是个人日常学习总结,如有理解不正确地方,欢迎指正。