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

下载本文档

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

文档简介

1、基于FPGA的16QAM调制器的实现目录一、QAM调制原理4二、16QAM调制器的实现5三、16QAM调制器的仿真结果7四、附录111 顶层模块112 时钟分频模块123 串并转换模块134 差分模块和星座映射模块145 DDS 和加法器模块166 testbench 源程序217 用matlab 进行频谱分析22一、QAM调制原理正交幅度调制(QAM)是一种把数字信息包含在载波的振幅和相位中的数字调制方式,也是ASK和PSK的结合。式(1)表示了QAM信号,它还可用式(2)来表示在QAM中是如何结合幅度和相位调制的。 (1) (2)16QAM信号的产生有两种基本方法:正交调幅法是用两路正交的

2、四电平振幅键控信号叠加而成;四相叠加法是用两路独立的四相移相键控信号叠加而成。其中,16QAM正交调幅法的调制方框图如图1所示。输入的二进制数据经过串一并变换分别进入a1、a2、b1和b2,4个信道:每个信道的数据速率降为原来的14。24电平转换器产生一个四电平的PAM信号,每个24电平转换器的输出有2种量值和2种相位。两个PAM信号分别调制同相和正交载波,每一个调制器有4种可能的输出,经线性加法器合并产生16QAM信号。 图1 16QAM调制原理图每路PAM信号的量值和相位由输入的二进制数据及其比特分配模式星座图决定。16QAM星座图通常有自然码逻辑和Gray码逻辑2种比特模式。因为Gray

3、码可以消除相邻点间符号差错中的2比特误差,即可减小相同符号差错率中的误比特率,IEEE8021la和HiperLAN2标准中所有的星座都是Gray码的。本文在设计16QAM的时候,采用图2的Gray模式进行编码,图中4个比特位从左至右的顺序为blb2ala2。图2 16QAM星座图的Gray码逻辑模式二、16QAM调制器的实现系统输入数据速率为100 Kbs;系统正交调制载波频率为1 MHz。调制部分主要由Ahera公司推出的Cyclone系列器件EPlC6Q240C8实现该器件完成对输入数据串并变换、差分编码、星座影射等。设计EDA工具为Ahera集成设计软件Quartus II 72版本;

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

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

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

7、001, fc=10MHZ, N=32时,可得到输出的正余弦波的频率为1MHz。三、16QAM调制器的仿真结果1 使用Quartus 自带仿真器仿真,其总体仿真图如下:图5 16QAM调制器的quartus仿真2将程序导入到modelsim中,通过编写testbench,得到如下仿真结果:图6 16QAM调制器的modeldsim仿真3 使用MATLAB中simulink库文件搭建一个16QAM调制系统:图7 16QAM调制系统在MATLAB中的仿真实现 观察最后的两个示波器,首先是没有加入噪声的波形,显示如下图8 没有噪声的输出波形让输出信号通过10dB噪声的AWGN 信道后,输出波形如下:

8、图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路对应的量化值 input clk,rst,en; input data_in; output signed17:0 data

9、_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_out(clk_dds), .data_in(dat

10、a_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) );endmodulemodule clk( clk_sys, /10MHz rst, clk_dds, /1

11、0MHz 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<=0; clk_100<=0; end else begin if (count2=49) b

12、egin 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<=0; clk_400<=clk_400; end else begin count3<

13、=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 (posedge clk_in or posedge rst) begin if(rst) begin d

14、out<=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, / 输入信号data_out_i, /I路对应的量化值data_out_q, /Q路对应的量化值rst,data);

15、/输出信号 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 d=data_in0;/assign data=regi,regq;always (posedge c

16、lk 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 <= datab; endend always (posedge clk or posedge rst) beg

17、in 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; 'b10 : data_out_i<='d2; endcaseendalways (pos

18、edge 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 else begin data<=regi,regq; endendendmodule5 DDS

19、 和加法器模块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 addra='b11001100110011001100110011001;assign da

20、taout= 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; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'b000

21、1: 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; end4'b0011: begin / -2cos+sin csignal16:1 <=

22、 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-sin csignal16 <= cosine15; csignal15:0 <= cosi

23、ne15: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 <= cosine15; csignal15:0 <= cosine15:0; ssignal16 <=

24、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; ssignal16:1 <= sine15:0; ssignal0 <= 0; end4'

25、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:0; end4'b1100: begin / cos-2sin csignal16 <=

26、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 / cos+2sin csignal16 <= cosine15; csignal15:0 <

27、;= 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 <= 0;endendcaseendend dds ddsqam( .data(addra), .en

28、(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 cose; /余弦信号输出reg 31 : 0 ADD_A; /正弦波产生模块的相位累加器reg 31 :

29、 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

30、 <= 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 <= 0; else cose_DR <= cose_D;endalways (posedge clk

31、 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( /产生sin信号模块addra,clka,douta);inputclka;input9:0addra;

32、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= &

33、#39;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 2 : douta=16'd100 ;10'd 3 : douta=16'd100 ;10'd 4 : douta=16'd100 ; 10'd 1020 : douta=16'd100 ;10'd 1021 : douta=16'd100 ;10'd 1022 : douta=16

温馨提示

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

评论

0/150

提交评论