基于FPGA的16QAM调制解调.docx
《基于FPGA的16QAM调制解调.docx》由会员分享,可在线阅读,更多相关《基于FPGA的16QAM调制解调.docx(26页珍藏版)》请在冰豆网上搜索。
基于FPGA的16QAM调制解调
基于FPGA的16QAM调制解
调器的实现
组员:
摘要3
一、QAM调制原理3
二、QAM的解调原理4
三、16QAM调制器的实现5
1系统总体框图5
2时钟分频6
3串并转换6
4差分编码和星座映射6
5DDS和线性加法器7
四、QAM解调模块设计7
1低通滤波器模块设计7
2采样判决模块设计8
五、16QAM调制器的仿真结果9
四、附录12
1顶层模块12
2时钟分频模块13
3串并转换模块14
4差分模块和星座映射模块15
5DDS和加法器模块17
6testbench源程序22
7用matlab进行频谱分析23
摘要
QAM(QuadratureAmplitudeModulation)是一种新的调制技术,它在调制过程中利用了相位和幅度两维空间资源,比只利用单一维度空间资源的PSK和ASK调制方式频谱利用率高,不仅如此,QAM的星座点比PSK的星座点更分散,星座点之间的距离因此更大,所以能提供更好的传输性能。
随着第三代移动通信的兴起,传输容量增大,多进制正交幅度调制MQAM(MultipleQuadratureAmplitudeModulation)将得到更加广泛的运用。
本文主要研究了基于FPGA的16QAM调制与解调的实现。
首先说明了QAM调制和解调的原理,然后对各系统组成模块分析与仿真之后提出基于FPGA的16QAM调制与解调的总体设计方案。
最后用Verilog语言编写程序完成了整个系统的仿真,并对编好的程序其进行了编译调试。
文中详细介绍了载波恢复、正交相干解调、FIR低通滤波器和采样判决的基本原理和设计方法。
关键词:
正交相干解调,混频,FPGA,QAM
QAM调制原理
1)
2)
正交幅度调制(QAM)是一种把数字信息包含在载波的振幅和相位中的数字调制方式,也是ASK和PSK的结合。
式
(1)表示了QAM信号,它还可用式
(2)来表示在QAM中是如何结合幅度和相位调制的。
S(t)IkjCos(wct)QKSin(wct)
S(t)Acos(wt)
16QAM信号的产生有两种基本方法:
正交调幅法是用两路正交的四电平振幅键控信号叠加而成;四相叠加法是用两路独立的四相移相键控信号叠加而成。
其中,16QAM正交调幅法的调制方框图如图1所示。
输入的二进制数据经过串一并变换分别进入a1、a2、b1和b2,4个信道:
每个信道的数据速率降为原来的1/4。
2—4电平转换器产生一个四电平的PAM信号,每个2~4电平转换器的输出有2种量值和2种相位。
两个PAM信号分别调制同相和正交载波,每一个调制器有4种可能的输出,经线性加法器合并产生16QAM信号。
图116QAM调制原理图
每路PAM信号的量值和相位由输入的二进制数据及其比特分配模式——星座图决定。
16QAM星座图通常有自然码逻辑和Gray码逻辑2种比特模式。
因为
Gray码可以消除相邻点间符号差错中的2比特误差,即可减小相同符号差错率中的误比特率,IEEE802.1la和HiperLAN/2标准中所有的星座都是Gray码的。
本文在设计16QAM的时候,采用图2的Gray模式进行编码,图中4个比特位从左至右的顺序为blb2ala2。
Q
..10
..11
I
..01
图216QAM星座图的Gray码逻辑模式
QAM的解调原理
解调实质上是调制的逆过程,在理想情况下,MQAM信号的频带利用率为log2M(b/s/Hz),目前,对QAM信号的解调方法很多,其主要方法有以下三种:
模拟相干解调、数字相干解调、全数字解调[4]。
本文采用数字相干解调法对QAM进行解调,原理如图2.1.3所示:
在接收端接收到的调制信号分别和两路相互正交的载波信号相乘,化简之后相同信号的表达式为:
I(t)Y(t)coswt
(AmcowstBmswitn)wctos
正交信号表达式为:
Q(t)Y(t)sinwt
(AmcowstBmswitn)wtsin
其中AmAmcg(t),BmAmsg(t),Y(t)AmcoswtBmsinwt,w2f,经过解调得到同相与正交两路相互独立的多电平基带信号,然后把多电平基带信号经过低通滤波器滤去高频载波之后得到直流分量为Am/2和Bm/2,再进行采样判决、L-2值电平转换和并/串转换还原出基带信号。
此处L4时为16QAM相干解调。
三、16QAM调制器的实现
系统输入数据速率为100Kb/s;系统正交调制载波频率为1MHz。
调制部分主要由Ahera公司推出的Cyclone系列器件EPlC6Q240C8实现.该器件完成对输入数据串并变换、差分编码、星座影射等。
设计EDA工具为Ahera集成设计软件QuartusII7.2版本;硬件描述VerilogHDL语言完成逻辑设计。
本系统还用到仿真工具Matlab,搭建16QAM调制器的simulink模块,采用示波器观看波形。
1系统总体框图
16QAM调制器的实现主要包括时钟模块、串并变换模块、查分编码模块、星
座映射、DDS模块、加法器模块。
系统总体框图如下:
输入
1bit
(cA)
(dB)
5
图3系统总体框图
系统顶层设计如下:
2时钟分频
时钟分频模块clk利用N分频器对10MHz系统时钟信号进行N分频,以产生调制器模块所需的工作时钟。
N分频器是由模N/2计数器实现的,分频输出信号模N/2可自动取反,以产生占空比为1:
1的时钟信号。
由于信号源产生的基带信号为1bit串行数据,其速率为100kbps,经并串转换后的4bit并行数据速率为400kbps,所以,本设计还采用了100分频器和400分频器。
另外将10Mhz直接送入到DDS模块,使得输出的载波频率为1Mhz.
3串并转换
1bit的数据送过来后,通过串并变换,将输入的第一个数据同它后面的三个数据同时输出,形成4bit的并行信号。
4差分编码和星座映射
在本模块,同样根据调制方式不同,选用不同位的数据来进行处理。
由于几乎都采用相干检测的方式进行解调,因此在解调端载波恢复存在着4个相位稳定点,即提取的相干载波可能与接收信号载波有4种相位关系,称作4重相位模糊度旧3。
部分差分编码能消除4重相位模糊度对解调的影响。
而部分差分编码相对于全差分编码由于减少了差分编码的bit数。
因而减少了误码扩散,具有较好的误码性能。
由于同样的符号误码率下,采用格雷编码比自然码的比特误码率小,所以多幅度电平的电平逻辑采用格雷编码映射。
星座影射模块输入4bit并行数据,输出为I/Q路对应的四幅值之一;4bit并行信号需要将其影射到信号平面,星座影射实现采用查表法分别输出I/Q对应的幅值.对应的量化表如下:
表1星座映射
00
-2
01
-1
11
1
10
2
5DDS和线性加法器
在DDS模块中,采用系统时钟10Mhz,由公式foKfc/2可知:
但取频率字为K=32'b11001100110011001100110011001,fc=10MHZ,N=32时,可得到输出的正余弦波的频率为1MHz。
四、QAM解调模块设计
由于接收到的16QAM信号经混频之后的信号为基带信号和2倍载波频率的高频分量之和,因此混频后的信号需经过低通滤波,采样判决和电平转换把基带信号还原出来。
因此解调模块分为三个子模块:
低通滤波器、采样判决器和电平转换器。
1低通滤波器模块设计
由于系统只要求将高频分量滤除,这里采用相对简单而易实现的FIR低通滤波器。
FIR滤波器由有限个采样值组成,在每个采样时刻完成有限个卷积运算,可以将其幅度特性设计成多种多样,同时还可以保证精确、严格的相位特性。
在高阶滤波器中,还可以通过FFT来计算卷积,从而极大提高运算效率。
这些优点使得FIR滤波器得到广泛应用[9]。
FIR滤波器只存在N个抽头h(n),N也被称为滤波器的阶数,则滤波器的输出可以通过卷积的形式表示为:
(3-5)
N1
y(n)x(n)*h(n)h(k)x(nk)
i0
FIR滤波器实现的基本方法是用一个有限级数的傅里叶变换去逼近所要求的滤波器响应,基本设计方法可以分为窗口法和频率采样法两种。
本次设计选用窗口法设计FIR滤波器,其设计步骤如下:
1确定数字滤波器的性能要求:
截止频率Fc,滤波器单位脉冲响应长度N
2根据性能要求,合理选择单位脉冲响应h(n)的奇偶对称性,从而确定理想频率响应Hd(ej)的幅频特性和相频特性。
3得到单位脉冲响应Hd(ej)后,在实际计算中,可对Hd(ej)按M(M远大于N)点等距离采样,并对其求IDFT得hm(n),用hm(n)代替hd(n)。
④选择适当的窗函数w(n),根据h(n)hm(n)w(n)求所需设计的FIR滤波器单位脉冲响应。
⑤求H(ej),分析其幅频特性,若不满足要求,可适当改变窗函数形式或长度N,重复上述设计过程,以得到满意结果。
其中,选取的窗函数为布莱克曼窗:
2n4n
w(n)[0.420.5cos()0.08cos()]RN(n)(3-6)
N1N1
由于整个设计中,基带信号频率不超过200Hz,载波频率5MHz,因此设置滤波器截止频率Fc300Hz,阶数N32,采样频率为FPGA时钟频率50M,采用QuartusII软件的IPcore进行设计。
2采样判决模块设计
采样判决模块采用的是门限的思路设计,即当输入电平的二进制数值处于某门限范围之内时,将此电平值判断为此门限范围内的某一特定值。
由于16QAM的I、Q两路中任意一路都载有4种电平值,因此设计三个电平门限值,将8位总线数值区间分成4等份,然后将时钟信号进行分频,每间隔特定时间段就对输入信号进行采样和判决。
流程图如图3.2.1。
采样取值
电平值4
图3.2.1采样判决设计流程图
五、16QAM调制器的仿真结果
1使用Quartus自带仿真器仿真,其总体仿真图如下:
图516QAM调制器的quartus仿真
2将程序导入到modelsim中,通过编写testbench,得到如下仿真结果:
图616QAM调制器的modeldsim仿真
3使用MATLAB中simulink库文件搭建一个16QAM调制系统:
观察最后的两个示波器,首先是没有加入噪声的波形,显示如下
图8没有噪声的输出波形
让输出信号通过10dB噪声的AWGN信道后,输出波形如下:
图9通过AWGN信道后的输出波形
同时会得到映射在星座图上的点,图形如下:
10
图10星座映射图
4对输出的数据进行频谱分析
通过在testbench中编写程序,保存输出的数据,再用MATLAB进行频谱分析,
图11输出信号的频谱分析
11
四、附录
1顶层模块
moduletop(clk,//
rst,//
en,//
data_in,//1bitdata_out,//16QAM
DATA_I,//I
DATA_Q);//Qinputclk,rst,en;
inputdata_in;
outputsigned[17:
0]data_out;
outputsigned[3:
0]DATA_I,DATA_Q;wireclk_dds;//DDS
wireclk_100;//100kbs
wireclk_400;//25kbs
wire[3:
0]data1;
wire[3:
0]data2;
clkclkqam(
.clk_sys(clk),.rst(rst),.clk_dds(clk_dds),.clk_100(clk_100),.clk_400(clk_400));
shiftshiftqam(
.clk_in(clk_100),
.clk_out(clk_dds),.data_in(data_in),.rst(rst),
系统时钟
复位
使能信号
信号输入
信号输出路对应的量化值路对应的量化值
12
块的输入时钟
2时钟分频模块
//10MHz
moduleclk(clk_sys,
rst,
clk_dds,clk_400,clk_100);
//10MHz//25Kbs//100Kbs
inputclk_sys;
inputrst;
outputclk_dds,clk_400,clk_100;
regclk_400,clk_10,clk_100;
reg[7:
0]count2,count3,count4;
assignclk_dds=clk_sys;
always@(posedgeclk_sysorposedgerst)
begin
if(rst)
begin
count2<=0;
clk_100<=0;
end
else
begin
if(count2==49)
begincount2<=0;clk_100<=~clk_100;
end
else
begincount2<=count2+'b1;clk_100<=clk_100;
end
end
end
always@(posedgeclk_100orposedgerst)
begin
if(rst)
begin
count3<=0;
clk_400<=0;
end
else
begin
if(count3==1)
begin
count3<=0;clk_400<=~clk_400;
end
else
begincount3<=count3+'b1;clk_400<=clk_400;
end
end
13
endendmodule
3串并转换模块
moduleshift(clk_in,//
clk_out,//data_in,//data_out,//
rst,
en);
inputclk_in,clk_out,rst,en;
inputdata_in;
outputreg[3:
0]data_out;
reg[3:
0]dout;
always@(posedgeclk_inorposedgerst)beginif(rst)
begin
dout<=0;
end
else
beginif(en)begindout<={dout[2:
0],data_in};
end
elsedout<=dout;
end
end
always@(posedgeclk_outorposedgerst)begin
if(rst)
data_out<=0;
else
data_out<=dout;
14
写入信号的时钟输出信号的时钟输入信号输出信号
endendmodule
4差分模块和星座映射模块
输入信号
路对应的量化值
路对应的量化值
输出信号
modulediff(clk,data_in,//data_out_i,//Idata_out_q,//Qrst,data);//inputclk,rst;
input[3:
0]data_in;
outputsigned[3:
0]data_out_i,data_out_q;reg[3:
0]data_out_i,data_out_q;
outputreg[3:
0]data;wirea,b,c,d;regdataa,datab;regprea,preb;reg[1:
0]regi,regq;assigna=data_in[3];assignb=data_in[2];assignc=data_in[1];assignd=data_in[0];//assigndata={regi,regq};always@(posedgeclkorposedgerst)beginif(rst)beginprea<=0;
endelsebegindataa<=(a==0)?
prea:
~prea;prea<=dataa;endendalways@(posedgeclkorposedgerst)beginif(rst)
beginpreb<=0;
endelsebegindatab<=(b==0)?
preb:
~preb;preb<=datab;
endend
15
always@(posedgeclkorposedgerst)
begin
if(rst)
begin
regi<=0;
regq<=0;
end
else
begin
regi<={dataa,c};regq<={datab,d};endendalways@(posedgeclk)begincase(regi)
'b00:
data_out_i<=-'d2;
'b01:
data_out_i<=-'d1;
'b11:
data_out_i<='d1;
'b10:
data_out_i<='d2;
endcase
end
always@(posedgeclk)
begin
case(regq)
'b00:
data_out_q<=-'d2;
'b01:
data_out_q<=-'d1;
'b11:
data_out_q<='d1;
'b10:
data_out_q<='d2;
endcase
end
always@(posedgeclkorposedgerst)
begin
if(rst)
begin
data<=0;
end
else
begin
data<={regi,regq};
end
endendmodule
16
5DDS和加法器模块
moduleadd(clk_dds,//输入信号时钟
rst,
en,
data,
dataout,);//16QAM信号
inputrst,en,clk_dds;
input[3:
0]data;
outputsigned[17:
0]dataout;
regsigned[16:
0]csignal,ssignal;
wiresigned[15:
0]cosine;//cos
wiresigned[15:
0]sine;//sin值wire[31:
0]addra;//DDS频率字
assignaddra='b11001100110011001100110011001;
assigndataout={csignal[16],csignal}+{ssignal[16],ssignal};always@(posedgeclk_ddsorposedgerst)begin
if(rst)
begin
csignal<=0;
ssignal<=0;
end
else
begin
case(data)
4'b0000:
begin//-2cos-2sincsignal[16:
1]<=~cosine[15:
0];csignal[0]<=0;ssignal[16:
1]<=~sine[15:
0];ssignal[0]<=0;
end
4'b0001:
begin//-2cos-sincsignal[16:
1]<=~cosine[15:
0];csignal[0]<=0;ssignal[16]<=~sine[15];ssignal[15:
0]<=~sine[15:
0];end
4'b0010:
begin//-2cos+2sincsignal[16:
1]<=~cosine[15:
0];csignal[0]<=0;ssignal[16:
1]<=sine[15:
0];ssignal[0]<=0;
end
4'b0011:
begin//-2cos+sincsignal[16:
1]<=~cosine[15:
0];csignal[0]<=0;ssignal[16]<=sine[15];ssignal[15:
0]<=sine[15:
0];end
4'b0100:
begin//-cos-2sin
csignal[16]<=~cosine[15];csignal[15:
0]<=~cosine[15:
0];ssignal[16:
1]<=~sine[15:
0];ssignal[0]<=0;
end
17
4'b0101:
begin//-cos-sincsignal[16]<=~cosine[15];csignal[15:
0]<=~cosine[15:
0];ssignal[16]<=~sine[15];ssignal[15:
0]<=~sine[15:
0];
end
4'b0110:
begin//-cos+2sincsignal[16]<=~cosine[15];csignal[15:
0]<=~cosine[15:
0];ssignal[16:
1]<=sine[15:
0];ssignal[0]<=0;
end
4'b0111:
begin//-cos+sincsignal[16]<=~cosine[15];csignal[15:
0]<=~cosine[15:
0];ssignal[16]<=sine[15];ssignal[15:
0]<=sine[15:
0];
end
4'b1000:
begin//