基于802.11a协议的OFDM发射物理层基带数据处理(part4)

前言:在前几篇文章 已经完成前导序列、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 。

文章均是个人日常学习总结,如有理解不正确地方,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值