基于FPGA的16QAM调制解调_第1页
基于FPGA的16QAM调制解调_第2页
基于FPGA的16QAM调制解调_第3页
基于FPGA的16QAM调制解调_第4页
基于FPGA的16QAM调制解调_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于FPGA的16QAM调制解调器的实现 组员:目录摘要3一、QAM调制原理3二、QAM的解调原理4三、16QAM调制器的实现51 系统总体框图52 时钟分频63 串并转换64 差分编码和星座映射65 DDS和线性加法器7四、QAM解调模块设计71 低通滤波器模块设计72 采样判决模块设计8五、16QAM调制器的仿真结果9四、附录131 顶层模块132 时钟分频模块143 串并转换模块154 差分模块和星座映射模块165 DDS 和加法器模块186 testbench 源程序237 用matlab 进行频谱分析24摘要QAM(Quadrature Amplitude Modulation)是一

2、种新的调制技术,它在调制过程中利用了相位和幅度两维空间资源,比只利用单一维度空间资源的PSK和ASK调制方式频谱利用率高,不仅如此,QAM的星座点比PSK的星座点更分散,星座点之间的距离因此更大,所以能提供更好的传输性能。随着第三代移动通信的兴起,传输容量增大,多进制正交幅度调制MQAM (Multiple Quadrature Amplitude Modulation)将得到更加广泛的运用。本文主要研究了基于FPGA的16QAM调制与解调的实现。首先说明了QAM调制和解调的原理,然后对各系统组成模块分析与仿真之后提出基于FPGA的16QAM调制与解调的总体设计方案。最后用Verilog语言编

3、写程序完成了整个系统的仿真,并对编好的程序其进行了编译调试。文中详细介绍了载波恢复、正交相干解调、FIR低通滤波器和采样判决的基本原理和设计方法。关键词:正交相干解调,混频,FPGA,QAM 一、QAM调制原理正交幅度调制(QAM)是一种把数字信息包含在载波的振幅和相位中的数字调制方式,也是ASK和PSK的结合。式(1)表示了QAM信号,它还可用式(2)来表示在QAM中是如何结合幅度和相位调制的。 (1) (2)16QAM信号的产生有两种基本方法:正交调幅法是用两路正交的四电平振幅键控信号叠加而成;四相叠加法是用两路独立的四相移相键控信号叠加而成。其中,16QAM正交调幅法的调制方框图如图1所

4、示。输入的二进制数据经过串一并变换分别进入a1、a2、b1和b2,4个信道:每个信道的数据速率降为原来的14。24电平转换器产生一个四电平的PAM信号,每个24电平转换器的输出有2种量值和2种相位。两个PAM信号分别调制同相和正交载波,每一个调制器有4种可能的输出,经线性加法器合并产生16QAM信号。 图1 16QAM调制原理图每路PAM信号的量值和相位由输入的二进制数据及其比特分配模式星座图决定。16QAM星座图通常有自然码逻辑和Gray码逻辑2种比特模式。因为Gray码可以消除相邻点间符号差错中的2比特误差,即可减小相同符号差错率中的误比特率,IEEE8021la和HiperLAN2标准中

5、所有的星座都是Gray码的。本文在设计16QAM的时候,采用图2的Gray模式进行编码,图中4个比特位从左至右的顺序为blb2ala2。图2 16QAM星座图的Gray码逻辑模式二、QAM的解调原理解调实质上是调制的逆过程,在理想情况下,MQAM信号的频带利用率为,目前,对QAM信号的解调方法很多,其主要方法有以下三种:模拟相干解调、数字相干解调、全数字解调4。本文采用数字相干解调法对QAM进行解调,原理如图2.1.3所示:串并转换多电平转换LPF采样判决载波恢复LPF多电平转换采样判决QAM信号图2.1.3 QAM解调器框图在接收端接收到的调制信号分别和两路相互正交的载波信号相乘,化简之后相

6、同信号的表达式为: (2-6)正交信号表达式为: (2-7)其中,经过解调得到同相与正交两路相互独立的多电平基带信号,然后把多电平基带信号经过低通滤波器滤去高频载波之后得到直流分量为和,再进行采样判决、L-2值电平转换和并/串转换还原出基带信号。此处时为16QAM相干解调。三、16QAM调制器的实现系统输入数据速率为100 Kbs;系统正交调制载波频率为1 MHz。调制部分主要由Ahera公司推出的Cyclone系列器件EPlC6Q240C8实现该器件完成对输入数据串并变换、差分编码、星座影射等。设计EDA工具为Ahera集成设计软件Quartus II 72版本;硬件描述Verilog HD

7、L语言完成逻辑设计。本系统还用到仿真工具Matlab,搭建16QAM调制器的simulink模块,采用示波器观看波形。 1 系统总体框图 16QAM调制器的实现主要包括时钟模块、串并变换模块、查分编码模块、星座映射、DDS模块、加法器模块。系统总体框图如下: 图3 系统总体框图系统顶层设计如下:图4 系统顶层设计2 时钟分频时钟分频模块clk利用N分频器对10MHz系统时钟信号进行N分频,以产生调制器模块所需的工作时钟。N分频器是由模N2计数器实现的,分频输出信号模N2可自动取反,以产生占空比为1:1的时钟信号。由于信号源产生的基带信号为1bit串行数据,其速率为100 kbps,经并串转换后

8、的4 bit并行数据速率为400 kbps,所以,本设计还采用了100分频器和400分频器。另外将10Mhz直接送入到DDS模块,使得输出的载波频率为1Mhz.3 串并转换 1bit的数据送过来后,通过串并变换,将输入的第一个数据同它后面的三个数据同时输出,形成4bit的并行信号。4 差分编码和星座映射 在本模块,同样根据调制方式不同,选用不同位的数据来进行处理。由于几乎都采用相干检测的方式进行解调,因此在解调端载波恢复存在着4个相位稳定点,即提取的相干载波可能与接收信号载波有4种相位关系,称作4重相位模糊度旧3。部分差分编码能消除4重相位模糊度对解调的影响。而部分差分编码相对于全差分编码由于

9、减少了差分编码的bit数。因而减少了误码扩散,具有较好的误码性能。 由于同样的符号误码率下,采用格雷编码比自然码的比特误码率小,所以多幅度电平的电平逻辑采用格雷编码映射。星座影射模块输入4bit并行数据,输出为IQ路对应的四幅值之一;4 bit并行信号需要将其影射到信号平面,星座影射实现采用查表法分别输出I/Q对应的幅值.对应的量化表如下:表1 星座映射I/Q路输入数据对应的量化值00-201-11111025 DDS和线性加法器 在DDS模块中,采用系统时钟10Mhz,由公式可知:但取频率字为K=32'b11001100110011001100110011001, fc=10MHZ,

10、 N=32时,可得到输出的正余弦波的频率为1MHz。四、QAM解调模块设计由于接收到的16QAM信号经混频之后的信号为基带信号和2倍载波频率的高频分量之和,因此混频后的信号需经过低通滤波,采样判决和电平转换把基带信号还原出来。因此解调模块分为三个子模块:低通滤波器、采样判决器和电平转换器。1 低通滤波器模块设计由于系统只要求将高频分量滤除,这里采用相对简单而易实现的FIR低通滤波器。FIR滤波器由有限个采样值组成,在每个采样时刻完成有限个卷积运算,可以将其幅度特性设计成多种多样,同时还可以保证精确、严格的相位特性。在高阶滤波器中,还可以通过FFT来计算卷积,从而极大提高运算效率。这些优点使得F

11、IR滤波器得到广泛应用9。FIR滤波器只存在个抽头,也被称为滤波器的阶数,则滤波器的输出可以通过卷积的形式表示为: (3-5)FIR滤波器实现的基本方法是用一个有限级数的傅里叶变换去逼近所要求的滤波器响应,基本设计方法可以分为窗口法和频率采样法两种。本次设计选用窗口法设计FIR滤波器,其设计步骤如下:确定数字滤波器的性能要求:截止频率,滤波器单位脉冲响应长度。根据性能要求,合理选择单位脉冲响应的奇偶对称性,从而确定理想频率响应的幅频特性和相频特性。得到单位脉冲响应后,在实际计算中,可对按(远大于)点等距离采样,并对其求IDFT得,用代替。选择适当的窗函数,根据求所需设计的FIR滤波器单位脉冲响

12、应。求,分析其幅频特性,若不满足要求,可适当改变窗函数形式或长度,重复上述设计过程,以得到满意结果。其中,选取的窗函数为布莱克曼窗: (3-6)由于整个设计中,基带信号频率不超过200Hz,载波频率5MHz,因此设置滤波器截止频率,阶数,采样频率为FPGA时钟频率50M,采用Quartus II软件的IP core进行设计。2 采样判决模块设计采样判决模块采用的是门限的思路设计,即当输入电平的二进制数值处于某门限范围之内时,将此电平值判断为此门限范围内的某一特定值。由于16QAM的I、Q两路中任意一路都载有4种电平值,因此设计三个电平门限值,将8位总线数值区间分成4等份,然后将时钟信号进行分频

13、,每间隔特定时间段就对输入信号进行采样和判决。流程图如图3.2.1。Y电平值1电平值2电平值3电平值4NNNYYN门限区间1门限区间2门限区间3采样取值图3.2.1 采样判决设计流程图五、16QAM调制器的仿真结果1 使用Quartus 自带仿真器仿真,其总体仿真图如下:图5 16QAM调制器的quartus仿真2将程序导入到modelsim中,通过编写testbench,得到如下仿真结果:图6 16QAM调制器的modeldsim仿真3 使用MATLAB中simulink库文件搭建一个16QAM调制系统:图7 16QAM调制系统在MATLAB中的仿真实现 观察最后的两个示波器,首先是没有加入

14、噪声的波形,显示如下图8 没有噪声的输出波形让输出信号通过10dB噪声的AWGN 信道后,输出波形如下:图9 通过AWGN信道后的输出波形同时会得到映射在星座图上的点,图形如下:图10 星座映射图4 对输出的数据进行频谱分析 通过在testbench中编写程序,保存输出的数据,再用MATLAB进行频谱分析,得到结果如下:图11 输出信号的频谱分析四、附录1 顶层模块 module top(clk, /系统时钟rst, /复位en, /使能信号data_in, /1bit信号输入data_out, /16QAM信号输出DATA_I, /I路对应的量化值DATA_Q); /Q路对应的量化值 inp

15、ut clk,rst,en; input data_in; output signed17:0 data_out; output signed 3:0 DATA_I,DATA_Q; wire clk_dds; /DDS块的输入时钟 wire clk_100; /100kbs wire clk_400; /25kbs wire 3:0 data1; wire 3:0 data2; clk clkqam( .clk_sys(clk), .rst(rst), .clk_dds(clk_dds), .clk_100(clk_100), .clk_400(clk_400) );shift shiftqa

16、m( .clk_in(clk_100), .clk_out(clk_dds), .data_in(data_in), .rst(rst), .en(en), .data_out(data1) );diff diffqam( .clk(clk_dds), .rst(rst), .data_in(data1), .data_out_i(DATA_I), .data_out_q(DATA_Q), .data(data2) );add addqam ( .clk_dds(clk_dds), .rst(rst), .en(en), .data(data2), .dataout(data_out) );e

17、ndmodulemodule clk( clk_sys, /10MHz rst, clk_dds, /10MHz clk_400, / 25Kbs clk_100); /100Kbs input clk_sys; input rst; output clk_dds,clk_400,clk_100; reg clk_400,clk_10,clk_100; reg 7:0 count2,count3,count4; assign clk_dds=clk_sys;always (posedge clk_sys or posedge rst) begin if (rst) begin count2&l

18、t;=0; clk_100<=0; end else begin if (count2=49) begin count2<=0; clk_100<=clk_100; end else begin count2<=count2+'b1; clk_100<= clk_100; end end endalways (posedge clk_100 or posedge rst) begin if (rst) begin count3<=0; clk_400<=0; end else begin if (count3=1) begin count3&l

19、t;=0; clk_400<=clk_400; end else begin count3<=count3+'b1; clk_400<= clk_400; end end endendmodule2 时钟分频模块3 串并转换模块 module shift (clk_in, /写入信号的时钟clk_out, /输出信号的时钟data_in, /输入信号data_out, / 输出信号rst,en);input clk_in,clk_out,rst,en;input data_in;output reg 3:0 data_out;reg 3:0 dout;always (

20、posedge clk_in or posedge rst) begin if(rst) begin dout<=0; end else begin if(en) begin dout<=dout2:0,data_in; end else dout<=dout; end end always (posedge clk_out or posedge rst) begin if(rst) data_out<=0; else data_out<=dout;endendmodule4 差分模块和星座映射模块module diff(clk, data_in, / 输入信号d

21、ata_out_i, /I路对应的量化值data_out_q, /Q路对应的量化值rst,data); /输出信号 input clk,rst;input 3:0 data_in;output signed 3:0 data_out_i,data_out_q;reg 3:0 data_out_i,data_out_q;output reg 3:0 data;wire a,b,c,d;reg dataa,datab;reg prea,preb;reg 1:0regi,regq;assign a=data_in3;assign b=data_in2;assign c=data_in1;assign

22、 d=data_in0;/assign data=regi,regq;always (posedge clk or posedge rst) begin if (rst) begin prea<=0; end else begin dataa <= (a=0)? prea : prea;prea <= dataa;endendalways (posedge clk or posedge rst) begin if (rst) begin preb<=0; end else begin datab <= (b=0)? preb : preb;preb <= d

23、atab; endend always (posedge clk or posedge rst) begin if (rst) begin regi<=0; regq<=0; end else begin regi<=dataa,c; regq<=datab,d; endendalways (posedge clk )begin case(regi) 'b00 : data_out_i<=-'d2; 'b01 : data_out_i<=-'d1; 'b11 : data_out_i<='d1; '

24、;b10 : data_out_i<='d2; endcaseendalways (posedge clk)begin case(regq) 'b00 : data_out_q<=-'d2; 'b01 : data_out_q<=-'d1; 'b11 : data_out_q<='d1; 'b10 : data_out_q<='d2; endcaseendalways (posedge clk or posedge rst)begin if(rst) begin data<=0; end

25、 else begin data<=regi,regq; endendendmodule5 DDS 和加法器模块module add(clk_dds, /输入信号时钟rst,en,data, dataout,); /16QAM信号input rst,en,clk_dds;input 3:0 data;output signed17:0 dataout;reg signed16:0 csignal,ssignal;wire signed 15:0 cosine; /cos值wire signed 15:0 sine; /sin值wire 31:0 addra; / DDS频率字assign

26、 addra='b11001100110011001100110011001;assign dataout= csignal16,csignal+ ssignal16,ssignal;always (posedge clk_dds or posedge rst)begin if(rst) begin csignal <= 0;ssignal <= 0; end else begin case(data) 4'b0000: begin /-2cos-2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal

27、16:1 <= sine15:0; ssignal0 <= 0; end4'b0001: begin / -2cos-sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:0;end4'b0010: begin / -2cos+2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0;

28、 end4'b0011: begin / -2cos+sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b0100: begin / -cos-2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b0101: begin / -cos-

29、sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b0110: begin/ -cos+2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b0111: begin / -cos+sin csignal16 <= cosi

30、ne15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b1000: begin / 2cos-2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1001: begin / 2cos-sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssi

31、gnal16:1 <= sine15:0; ssignal0 <= 0; end4'b1010: begin /2cos+2sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1011: begin / 2cos+sin csignal16:1 <= cosine15:0; csignal0 <= 0; ssignal16 <= sine15; ssignal15:0 <= sine15:

32、0; end4'b1100: begin / cos-2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b1101: begin / cos-sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end4'b1110: begin

33、/ cos+2sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16:1 <= sine15:0; ssignal0 <= 0; end 4'b1111: begin / cos+sin csignal16 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <= sine15; ssignal15:0 <= sine15:0; end default: begin csignal <= 0; ssignal &l

34、t;= 0;endendcaseendend dds ddsqam( .data(addra), .en(en), .reset(rst), .clk(clk_dds), .sine(sine), .cose(cosine) );Endmodule/module dds(data, en, clk, reset, sine, cose); / DDS模块input 31 : 0 data; /频率控制字input en; /频率控制字写使能input clk; input reset; output signed15 : 0 sine; /正弦信号输出output signed15 : 0 c

35、ose; /余弦信号输出reg 31 : 0 ADD_A; /正弦波产生模块的相位累加器reg 31 : 0 ADD_B; /余弦波产生模块的相位累加器÷reg signed 15 : 0 cose_DR; /余弦波的查找表地址reg signed 15 : 0 sine_DR; /wire 31 : 0 data; /频率控制字wire 9 : 0 ROM_A;wire signed 15 : 0 cose_D;wire signed 15 : 0sine_D;assign cose = cose_DR;assign sine = sine_DR;assign ROM_A = AD

36、D_B31 : 22; begin if(reset) /系统初始化时,默认的频率控制字为0 ADD_A <= 0; else if(en) ADD_A <= data; else ADD_A <= ADD_A ;endalways (posedge clk or posedge reset)begin if(reset) ADD_B <= 0; else ADD_B <= ADD_B + ADD_A; /ADD_B为累加的结果endalways (posedge clk or posedge reset)begin if(reset) cose_DR <=

37、 0; else cose_DR <= cose_D;endalways (posedge clk or posedge reset)begin if(reset) sine_DR <= 0; else sine_DR <= sine_D;end/调用两个ROM,存储着正余弦波形一个周期的数值。rom_cose cose1( .addra(ROM_A), .clka(clk), .douta(cose_D);rom_sine sine1( .addra(ROM_A), .clka(clk), .douta(sine_D);endmodule module rom_sine(

38、/产生sin信号模块addra,clka,douta);inputclka;input9:0addra;output15:0douta;regsigned15:0douta;always (posedge clka) begin case(addra)10'd 1 : douta= 16'd 1 ;10'd 2 : douta= 16'd 1 ;10'd 3 : douta= 16'd 2 ; 10'd 1021 : douta= -16'd2 ;10'd 1022 : douta= -16'd1 ;10'd 1023 : douta= -16'd1 ;10'd 1024 : douta= 'd0 ;endcaseend endmodulemodule rom_cose( /产生cos信号模块addra,clka,douta);inputclka;input9:0addra;output15:0douta;regsigned15:0douta;always (posedge clka) begin case(addra)10'd 0 : douta=16'd100 ;10'd 1 : douta=16'd100 ;10'd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论