1. 前言
在前面的文章对OFDM技术和802.11a进行了简单的介绍,并对发射机的基带设计提供了一些自己的思路。上一篇文章,基于valid-ready双向握手机制设计了整个系统常用到的串并转换模块,并且将其参数化,使用非常方便。这章再详细讲述下发射机基带系统的整体构架,需要把协议的逻辑理清楚才方便后面仿真和实现。自己刚开始看也是一头雾水,后面花时间整理了一些图片,发现理解起来容易了不少。下面结合图片加上少量的文字说明,进行讲解。
2.整体架构
OFDM的发射机的结构如下图所示。可以将OFDM发射机分为5个部分,分别是上层用户数据产生模块(MAC层), 802.11a前导码产生模块(长、短训练码),802.11a signal域数据产生模块(Rate和Length), 802.11a data域数据产生模块(service域,PSDU,尾比特以及填充比特), 802.11a组帧模块(PPDU)。
2.1 用户数据产生模块
在进行OFDM实验的时候,希望能够产生一些测试数据,能够用于之后的系统的验证,在这里可以设计一个数据产生模块,该模块能够按照需要产生测试的数据,并且将数据的长度给到后续的模块进行使用。
这个数据长度是字节长度,数据长度将会填充在802.11a当中的signal域当中,除此之外,在计算OFDM 符号个数的时候,也需要使用数据的长度。
L
=
48
×
K
×
M
×
r
a
t
e
L=48 \times K\times M \times rate
L=48×K×M×rate
其中
L
L
L表示数据长度,
K
K
K表示OFDM符号数,
M
M
M表示调制阶数,
r
a
t
e
rate
rate表示编码速率,48是实际子载波个数。
我们用matlab产生测试数据,并存为txt文件,供后面使用,代码如下:
%% 原始序列输入
num_in = round(rand(1,1e4));
%% 参数设置
%调制参数设置
M = 4; %调制阶数。1-BPSK,2-QPSK,3-8QAM,4-16QAM,5-32QAM,6-64QAM
k = 1 ; %OFDM符号数
code_rate = 9; %卷积编码速率。12--无卷积编码,9--3/4速率,6--1/2速率,8--2/3速率
leng_num_in = k .* 48 .* M ./12 .* code_rate;
num_in = num_in(1:leng_num_in); %截取输入序列长度
w = length(num_in)./code_rate.*6 /192; %调制前数据组数目
%%写txt文件
fid= fopen('D:/FPGA/OFDM_802.11a_my/TX/matlab/test_data.txt','w');
fprintf(fid,'%d\r\n',num_in);
fclose(fid);
需要注意的是,原始序列输入使用了rand函数生成0-1之间的随机数,所以每运行一次,测试数据是会改变的。
2.2 Preamble产生模块
在Preamble产生模块当中,实现802.11a的短训练序列(STS)和长训练序列(LTS)的生成。
2.3 signal域
在前导码之后是signal域,signal域主要包含Rate和Length两个字段,Rate用于传输有关后续数据符号所用到调制信息和码速率。Length字段用于传输PSDU传输的用户数据的字节数。
在Rate字段需要根据所需要的调制方式和码速率填入对应的值。
- Length字段需要注意的是,传输是从LSB到MSB。
- 除了Rate字段和Length字段之外,还有一些还有一些其他校验位和空闲位。
- 其中bit4是保留位,bit17是偶校验位,用来对前面的16bit进行校验。还有6位的尾bit。
2.4 Data域
在signal域之后就是数据域,Data域主要包含16bit的service域,PSDU,6bit的尾比特以及填充比特。
service域的前7个比特需要给领用来初始化接收机的解扰器,剩下的为保留位,在发送机当中总给零,在之后就是PSDU域,该域由用户数据转换而来,用户数据转换为bit序列填入到PSDU域当中。在PSDU域结束之后是6bit的尾bit,尾bit之后是pad比特,pad比特的目的是使得DATA域的长度能够刚好为OFDM symbol的整数倍。
关于padbit的计算,在802.11a协议当中也给出了详细的说明: 首先计算出当前数据长度下,所需要的OFDM的symbol的数量,其中16+8*length+6,分别表示的是,service域bit,psdu数据bit,6位尾bit,NDBPS表示每个OFDM包含的数据bit的数量。相除的结果进行向上取整,从而得到完整的OFDM的符号个数,在用完整的OFDM符号的个数所包含的bit数减去总共的bit数量,从而得到需要填充的pad比特。
下表展示了不同调制方式的速率:
2.5 802.11a组帧模块
在最后还有一个802.11a的组帧模块,该模块的作用是将前导码,signal域,Data域所产生的时域波形给整合成最终需要发送的OFDM的数据。按照前导码,signal域,Data域的形式进行排列。
3. Data域和Signal域的具体实现
在Data域和Signal域模块当中,还有一些子模块,这些子模块对实现整个802.11a发射机十分重要,后面慢慢进行更新介绍。
我们从Data域入手,因为Signal域只包含一个OFDM符号,且不用扰码和删余操作。Preamble产生模块当中的短训练序列(STS)和长训练序列(LTS),由于数据是固定的,我们可以预先存储在ROM当中,之后按照需要读出来即可。所以从最复杂的部分开始下手,弄清楚了Data域的实现过程之后,signal域的实现就十分简单了。
原文连接(相关文章合集):OFDM的xilinx FPGA实现