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

下载本文档

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

文档简介

1、基于 FPGA的 16QAM调制解 调器的实现 组员: 目录 摘要 3 一、QAM调制原理3 二、QAM 的解调原理4 三、16QAM调制器的实现5 1 系统总体框图5 2 时钟分频6 3 串并转换6 4 差分编码和星座映射6 5 DDS 和线性加法器7 四、QAM 解调模块设计7 1 低通滤波器模块设计7 2 采样判决模块设计8 五、16QAM调制器的仿真结果9 四、附录12 1 顶层模块12 2 时钟分频模块13 3 串并转换模块14 4 差分模块和星座映射模块15 5 DDS 和加法器模块17 6 testbench 源程序22 7 用 matlab 进行频谱分析23 摘要 QAM(Qu

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

3、各系统组成模块分 析与仿真之后提出基于 FPGA 的 16QAM 调制与解调的总体设计方案。最后用 Verilog 语言编写程序完成了整个系统的仿真,并对编好的程序其进行了编译调 试。文中详细介绍了载波恢复、正交相干解调、 FIR 低通滤波器和采样判决的基 本原理和设计方法。 关键词: 正交相干解调,混频, FPGA,QAM QAM调制原理 1) 2) 正交幅度调制 (QAM)是一种把数字信息包含在载波的振幅和相位中的数字调 制方式,也是 ASK和PSK的结合。式 (1) 表示了QAM信号,它还可用式 (2) 来表示在 QAM中是如何结合幅度和相位调制的。 S(t) IkjCos(wct) Q

4、K Sin(wct) S(t) Acos(wt ) 16QAM信号的产生有两种基本方法: 正交调幅法是用两路正交的四电平振幅 键控信号叠加而成; 四相叠加法是用两路独立的四相移相键控信号叠加而成。 其 中,16QAM正交调幅法的调制方框图如图 1 所示。输入的二进制数据经过串一并 变换分别进入 a1、a2、 b1 和 b2,4 个信道:每个信道的数据速率降为原来的 1 4。24 电平转换器产生一个四电平的 PAM信号,每个 24 电平转换器的输 出有 2 种量值和 2 种相位。两个 PAM信号分别调制同相和正交载波, 每一个调制 器有 4 种可能的输出,经线性加法器合并产生 16QAM信号。

5、图1 16QAM调制原理图 每路 PAM信号的量值和相位由输入的二进制数据及其比特分配模式星 座图决定。 16QAM星座图通常有自然码逻辑和 Gray 码逻辑 2 种比特模式。因为Gray 码可以消除相邻点间符号差错中的 2 比特误差,即可减小相同符号差错率 中的误比特率, IEEE8021la 和 HiperLAN2 标准中所有的星座都是 Gray码的。 本文在设计 16QAM的时候,采用图 2的 Gray模式进行编码,图中 4个比特位从 左至右的顺序为 blb2ala2 。 Q .10 .11 I .01 00 01 00 11 10 图 2 16QAM星座图的 Gray 码逻辑模式 QA

6、M 的解调原理 解调实质上是调制的逆过程,在理想情况下, MQAM 信号的频带利用率为 log 2 M (b / s / Hz) ,目前,对 QAM 信号的解调方法很多, 其主要方法有以下三种: 模拟相干解调、数字相干解调、全数字解调 4 。 本文采用数字相干解调法对 QAM 进行解调,原理如图 2.1.3 所示: QAM 信 号 图 2.1.3 QAM 解调器框图 在接收端接收到的调制信号分别和两路相互正交的载波信号相乘, 化简之后 相同信号的表达式为: I(t) Y(t )cos wt (Am cowst Bm switn )wct os 2 11 Amc os 2w t 22 Bm si

7、 n 2w t (2-6) 正交信号表达式为: Q(t) Y ( t)sin wt (Am c owst Bm switn )wtsi n 12Bm Bmc os 2w t + 2 mA si nw2t (2-7) 其中 Am Amc g (t ) , Bm Amsg(t),Y(t) Am coswt Bm sin wt ,w 2 f ,经 过解调得到同相与正交两路相互独立的多电平基带信号, 然后把多电平基带信号 经过低通滤波器滤去高频载波之后得到直流分量为 Am/2和 Bm /2 ,再进行采样判 决、L-2 值电平转换和并 /串转换还原出基带信号。此处 L 4 时为 16QAM 相干 解调。

8、 三、16QAM调制器的实现 系统输入数据速率为 100 Kbs;系统正交调制载波频率为 1 MHz。调制 部分主要由 Ahera 公司推出的 Cyclone 系列器件 EPlC6Q240C8实现该器件完成 对输入数据串并变换、 差分编码、星座影射等。设计 EDA工具为 Ahera集成设计 软件 Quartus II 72 版本;硬件描述 Verilog HDL语言完成逻辑设计。本系统 还用到仿真工具 Matlab ,搭建 16QAM调制器的 simulink 模块,采用示波器观看 波形。 1 系统总体框图 16QAM调制器的实现主要包括时钟模块、串并变换模块、查分编码模块、星 座映射、 DD

9、S模块、加法器模块。系统总体框图如下: 输入 1bit 5 (cA) (dB) 图 3 系统总体框图 系统顶层设计如下: 2 时钟分频 时钟分频模块 clk 利用 N 分频器对 10MHz系统时钟信号进行 N分频,以产生 调制器模块所需的工作时钟。 N 分频器是由模 N2 计数器实现的,分频输出信 号模 N2 可自动取反, 以产生占空比为 1:1 的时钟信号。 由于信号源产生的基 带信号为 1bit 串行数据,其速率为 100 kbps ,经并串转换后的 4 bit 并行数据 速率为 400 kbps,所以,本设计还采用了 100 分频器和 400分频器。另外将 10Mhz 直接送入到 DDS

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

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

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

13、以通过 FFT 来计算卷积,从而极大提高运算效率。这些优 点使得 FIR 滤波器得到广泛应用 9。 FIR滤波器只存在 N个抽头h(n),N 也被称为滤波器的阶数, 则滤波器的输 出可以通过卷积的形式表示为: (3-5) N1 y(n) x(n)* h(n) h(k)x(n k) i0 FIR 滤波器实现的基本方法是用一个有限级数的傅里叶变换去逼近所要求的 滤波器响应, 基本设计方法可以分为窗口法和频率采样法两种。 本次设计选用窗 口法设计 FIR 滤波器,其设计步骤如下: 确定数字滤波器的性能要求:截止频率 Fc ,滤波器单位脉冲响应长度 N 根据性能要求,合理选择单位脉冲响应 h(n) 的

14、奇偶对称性,从而确定理想 频率响应 Hd(ej ) 的幅频特性和相频特性。 得到单位脉冲响应 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 ,重复上述设计过程,以得到满意结果。 其中,选取的窗函数为布莱克曼窗: 2 n4 n w(n) 0.42 0.5cos( ) 0.08cos()RN (n)

15、(3-6) N 1N 1 由于整个设计中,基带信号频率不超过 200Hz,载波频率 5MHz ,因此设置 滤波器截止频率 Fc 300Hz ,阶数 N 32,采样频率为 FPGA 时钟频率 50M, 采用 Quartus II 软件的 IP core 进行设计。 2 采样判决模块设计 采样判决模块采用的是门限的思路设计, 即当输入电平的二进制数值处于某 门限范围之内时,将此电平值判断为此门限范围内的某一特定值。由于 16QAM 的 I、Q 两路中任意一路都载有 4种电平值,因此设计三个电平门限值,将 8 位 总线数值区间分成 4 等份,然后将时钟信号进行分频, 每间隔特定时间段就对输 入信号进

16、行采样和判决。流程图如图 3.2.1。 采样取值 N Y Y Y 电平值 4 图 3.2.1 采样判决设计流程图 五、16QAM调制器的仿真结果 1 使用 Quartus 自带仿真器仿真,其总体仿真图如下: 图 5 16QAM 调制器的 quartus 仿真 2 将程序导入到 modelsim 中,通过编写 testbench ,得到如下仿真结果: 图 6 16QAM 调制器的 modeldsim 仿真 3 使用 MATLAB中 simulink 库文件搭建一个 16QAM调制系统: 图 7 16QAM 调制系统在 MATLAB 中的仿真实现 观察最后的两个示波器,首先是没有加入噪声的波形,显

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

18、 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 shiftqam( .clk_in(clk_100), .clk_ou

19、t(clk_dds), .data_in(data_in), .rst(rst), 系统时钟 复位 使能信号 信号输入 信号输出 路对应的量化值 路对应的量化值 12 块的输入时钟 2 时钟分频模块 /10MHz module clk( clk_sys, rst, clk_dds, clk_400, clk_100); /10MHz / 25Kbs /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;

20、assign clk_dds=clk_sys; always (posedge clk_sys or posedge rst) begin if (rst) begin count2=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 end always (posedge clk_100 or posedge rst) begin if (rst) begin count3=

21、0; clk_400=0; end else begin if (count3=1) begin count3=0; clk_400=clk_400; end else begin count3=count3+b1; clk_400= clk_400; end end 13 end endmodule 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; re

22、g 3:0 dout; always (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; 14 写入信号的时钟 输出信号的时钟 输入信号 输出信号 end endmodule 4 差分模块和星座映射模块

23、输入信号 路对应的量化值 路对应的量化值 输出信号 module diff(clk, data_in, / data_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=da

24、ta_in3; assign b=data_in2; assign c=data_in1; assign 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; end end always (posedge clk or posedge rst) begin if (rst) begin preb=0; end else begin d

25、atab = (b=0)? preb : preb; preb = datab; end end 15 always (posedge clk or posedge rst) begin if (rst) begin regi=0; regq=0; end else begin regi=dataa,c; regq=datab,d; end end always (posedge clk ) begin case(regi) b00 : data_out_i=-d2; b01 : data_out_i=-d1; b11 : data_out_i=d1; b10 : data_out_i=d2;

26、 endcase end always (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; endcase end always (posedge clk or posedge rst) begin if(rst) begin data=0; end else begin data=regi,regq; end end endmodule 16 5 DDS 和加法器模块 module add(clk_dds, /

27、输入信号时钟 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 addra=b11001100110011001100110011001; assign dataout= csignal16,csi

28、gnal+ ssignal16,ssignal; always (posedge clk_dds or posedge rst) begin if(rst) begin csignal = 0; ssignal = 0; end else begin case(data) 4b0000: begin /-2cos-2sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b0001: begin / -2cos-sin csignal16:1 = cosine15:0; csi

29、gnal0 = 0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 4b0010: begin / -2cos+2sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b0011: begin / -2cos+sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 4b0100: begin / -c

30、os-2sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16:1 = sine15:0; ssignal0 = 0; end 17 4b0101: begin / -cos-sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 4b0110: begin/ -cos+2sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssign

31、al16:1 = sine15:0; ssignal0 = 0; end 4b0111: begin / -cos+sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 4b1000: begin / 2cos-2sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b1001: begin / 2cos-sin csignal16

32、:1 = cosine15:0; csignal0 = 0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b1010: begin /2cos+2sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b1011: begin / 2cos+sin csignal16:1 = cosine15:0; csignal0 = 0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 4b1100:

33、 begin / cos-2sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b1101: begin / cos-sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16 = sine15; ssignal15:0 = sine15:0; end 18 4b1110: begin / cos+2sin csignal16 = cosine15; csignal15:0 = cosine15

34、:0; ssignal16:1 = sine15:0; ssignal0 = 0; end 4b1111: begin / cos+sin csignal16 = cosine15; csignal15:0 = cosine15:0; ssignal16 = sine15; ssignal15:0 = sine15:0; end default: begin csignal = 0; ssignal = 0; end endcase end end dds ddsqam( .data(addra), .en(en), .reset(rst), .clk(clk_dds), .sine(sine

35、), .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 cose; /余弦信号输出 正弦波产生模块的相位累加器 余弦波产生模块的相位累加器 余弦波的查找表地址 频率控制字 reg 31 : 0 ADD_A; / reg 31 :

36、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 = ADD_B31 : 22; begin if(reset) / 系统初始化时 , 默认的频率控制字为 0 ADD_A = 0; else if(en) ADD

37、_A = data; else ADD_A = ADD_A ; end 19always (posedge clk or posedge reset) begin if(reset) ADD_B = 0; else ADD_B = ADD_B + ADD_A; /ADD_B end always (posedge clk or posedge reset) begin if(reset) cose_DR = 0; else cose_DR = cose_D; end always (posedge clk or posedge reset) begin if(reset) sine_DR =

38、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( / addra, clka, douta); input clka; input 9:0 addra; output 15:0 douta; 为累加的结果 产生 sin 信号模块 reg sig

39、ned15:0 douta; always (posedge clka) begin case(addra) 10d 1 : douta= 16d 1 10d 2 : douta= 16d 1 10d 3 : douta= 16d 2 10d 1021 : douta= -16d2 ; 10d 1022 : douta= -16d1 ; 10d 1023 : douta= -16d1 ; 10d 1024 : douta= d0 ; endcase end endmodule 20 产生 cos 信号模块 module rom_cose( / addra, clka, douta); input cl

温馨提示

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

评论

0/150

提交评论