基于FPGA的64QAM信号调制模块实现

一、64QAM简介及设计思路

针对于振幅调制的原理可知,其所有信号的幅度值大小是相同的,想要用相位来表示更多的信息,就意味着星座图上相邻信号点的距离减小,则在相同噪声条件下,系统的误码率将增大。如何增加相邻点间的距离这个问题则被提出,容易想到的是增大圆周的半径,即增大信号的幅值,但这往往受到发射功率的限制。

于是想出了另外一种更好的设计思想:在不增加信号功率的基础上,可以通过调整某些点的幅值,重新安排信号点的位置,以增加相邻信号间的距离。即把ASK与PSK结合起来,振幅与相位联合键控的调制方式便被提出了。

针对于64QAM而言,它是将每6个比特映射到一个复数符号上,在星座图上有64个可能的点,每个点对应一个特定的幅度与相位组合。为此,可以先通过DDS产生两个正交的信号,然后将8种不同的幅值组合映射到对应正交信号上,再将两个信号相加,这样,整个64QAM映射及载波调制过程就完成了。

二、实现步骤及仿真结果

整个设计过程分成两个步骤:一个是利用DDS IP产生两个正交信号,另一个就是完成调制的映射过程(在此假设载波的频率为1MHz,数据的速率为100Kbps。),具体步骤如下:

2.1 利用DDS IP核产生正交信号

DDS采用IP Core的形式实现,工作频率为12.5MHz,输出频率为1MHz,配置方式为固定频率输出。

打开vivado,搜索dds compiler ip核,并对其进行配置,配置关键界面如下:

对应的测试以及仿真结果如下图所示,可以发现两个频率为1MHz的正交信号便被很好地产生了。

2.2 映射调制过程

//主要代码如下
//作者qq:1760704041
module qam_64(
   input    clk_12_5M	,//时钟
   input 	[5:0]   DataIn		,//输入
   output 	[12:0] DataOut	//输出16QAM信号
	);

   wire [7:0]    sin;
   wire [7:0]    cos;
   reg 	[3:0]    MULT0_data;//对应1 3 5 7
   reg 	[3:0]    MULT1_data;
   wire [11:0]   MULT0_result;
   wire [11:0]   MULT1_result;
   //dds 涉及到的变量
   wire m_axis_data_tvalid;
   wire [15 : 0] m_axis_data_tdata;
   wire m_axis_phase_tvalid;
   wire [31 : 0] m_axis_phase_tdata;

   assign sin = m_axis_data_tdata[15:8];
   
   assign cos = m_axis_data_tdata[7:0];

   //DDS 产生正弦和余?
   dds_gen dds1_inst(
       .clk_12_5M(clk_12_5M)	,
       .m_axis_data_tvalid(m_axis_data_tvalid) ,
       .m_axis_data_tdata (m_axis_data_tdata) ,
       .m_axis_phase_tvalid(m_axis_phase_tvalid),
       .m_axis_phase_tdata(m_axis_phase_tdata)
       );

   //有符号相乘器
	mult_64 u1_64 (
	  .CLK(clk_12_5M),  // input wire CLK
	  .A(cos),      // input wire [7 : 0] A
	  .B(MULT0_data),      // input wire [3 : 0] B
	  .P(MULT0_result)      // output wire [11 : 0] P
	);

	mult_64 u2_64 (
	  .CLK(clk_12_5M),  // input wire CLK
	  .A(sin),      // input wire [7 : 0] A
	  .B(MULT1_data),      // input wire [3 : 0] B
	  .P(MULT1_result)      // output wire [11 : 0] P
	);

	//有符号加法器
	add_64 add_64 (
	  .A(MULT1_result),      // input wire [11 : 0] A
	  .B(MULT0_result),      // input wire [11 : 0] B
	  .CLK(clk_12_5M),  // input wire CLK
	  .S(DataOut)      // output wire [12 : 0] S
	);

	//格雷码映射
   always @(DataIn)begin
      case (DataIn)
      	//第一个16
         6'b00_0000 :
            begin
               MULT0_data <= 4'b1001;
               MULT1_data <= 4'b1001;
            end
         6'b00_0001 :
            begin
               MULT0_data <= 4'b1001;
               MULT1_data <= 4'b1011;
            end
         6'b00_0011 :
            begin
               MULT0_data <= 4'b1001;
               MULT1_data <= 4'b1101;
            end
 //省略·········

对应仿真波形如下图所示,可以发现64QAM调制被很好地实现了。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值