m基于FPGA的16QAM调制解调通信系统verilog实现,包含testbench,不包含载波同步

目录

1.算法仿真效果

2.算法涉及理论知识概要

3.Verilog核心程序

4.完整算法代码文件


1.算法仿真效果

本系统进行了两个平台的开发,分别是:

Vivado2019.2

Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition

其中Vivado2019.2仿真结果如下:

 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition的测试结果如下:

2.算法涉及理论知识概要

     16QAM全称正交幅度调制是英文Quadrature Amplitude Modulation的缩略语简称,意思是正交幅度调制,是一种数字调制方式。产生的方法有正交调幅法和复合相移法。

16QAM是指包含16种符号的QAM调制方式。
      16QAM 是用两路独立的正交 4ASK 信号叠加而成,4ASK 是用多电平信号去键控载波而得到的信号。它是 2ASK 调制的推广,和 2ASK 相比,这种调制的优点在于信息传输速率高。
正交幅度调制是利用多进制振幅键控(MASK)和正交载波调制相结合产生的。
16 进制的正交振幅调制是一种振幅相位联合键控信号。16QAM 的产生有 2 种方法:
(1)正交调幅法,它是有 2 路正交的四电平振幅键控信号叠加而成;
(2)复合相移法:它是用 2 路独立的四相位移相键控信号叠加而成。
这里采用正交调幅法。

       数字信号是通过FPGA的输出端口生成的。在16QAM调制中,每个符号包含4个比特,因此需要一个4位二进制计数器来生成数字信号。计数器的输出被映射到星座图上的一个点,然后通过数字到模拟转换器(DAC)转换为模拟信号。串/并变换器将速率为Rb的二进制码元序列分为两路,速率为Rb/2.2-4电平变换为Rb/2 的二进制码元序列变成速率为RS=Rb/log216 的 4 个电平信号,4 电平信号与正交载波相乘,完成正交调制,两路信号叠加后产生 16QAM信号.在两路速率为Rb/2 的二进制码元序列中,经 2-4 电平变换器输出为 4 电平信号,即M=16.经 4 电平正交幅度调制和叠加后,输出 16 个信号状态,即 16QAM.
RS=Rb/log216=RB/4.
2. 16QAM 解调原理
       16QAM 信号采取正交相干解调的方法解调,解调器首先对收到的 16QAM 信号进行正交相干解调,一路与 cos ω c t 相乘,一路与 sin ω c t 相乘。然后经过低通滤波器,低通滤波器 LPF 滤除乘法器产生的高频分量,获得有用信号,低通滤波器LPF 输出经抽样判决可恢复出电平信号。

3.Verilog核心程序

`timescale 1ns / 1ns

module TEST;

	reg clk;
	reg rst;
	reg start;

    wire  [3:0] parallel_data;
    wire [15:0]sin;
    wire [15:0]cos;
	wire signed[19:0]  I_com;
	wire signed[19:0]  Q_com;
    wire signed[15:0]I_comcos;
    wire signed[15:0]Q_comsin;
	 

	// DUT
	tops_16QAM_mod  top(
	   .clk(clk),
	   .rst(rst),
	   .start(start),
	   .parallel_data(parallel_data),
	   .sin(sin),
	   .cos(cos),
	   .I_com(I_com),
	   .Q_com(Q_com),
	   .I_comcos(I_comcos),
	   .Q_comsin(Q_comsin)
	   );
	   
	   
wire signed[23:0]I_comcos2;
wire signed[23:0]Q_comsin2;
wire signed[7:0]o_Ifir;
wire signed[7:0]o_Qfir;
wire signed[3:0]o_sdout;
tops_16QAM_demod  top2(
	   .clk(clk),
	   .rst(rst),
	   .start(start),
	   .I_comcos(I_comcos),
	   .Q_comsin(Q_comsin),
	   .I_comcos2(I_comcos2),
	   .Q_comsin2(Q_comsin2),
	   .o_Ifir(o_Ifir),
	   .o_Qfir(o_Qfir),
	   .o_sdout(o_sdout)
	   );  
	   
 
	initial begin
		clk = 0;
		rst = 0;
		start = 1;
		#10;
		rst = 1;
	end
	
	always #5
	clk <= ~clk;
 

endmodule


.............................................................................


wire signed[9:0]mcos;
wire signed[9:0]msin;
NCO_Trans NCO_Trans_u(
                     .i_clk (clk),
					 .i_rst (~rst),  
					 .i_K   (10'd256),
					 .o_cos (mcos),
					 .o_sin (msin) 
	             );
assign cos={mcos,6'd0};
assign sin={msin,6'd0};   	   
 	   
always @(posedge clk or negedge rst)
begin
     if(~rst)
	  begin
	  I_comcos2<={24{1'b0}};	
 	  Q_comsin2<={24{1'b0}};
	  end
else begin
	  I_comcos2<=$signed(I_comcos[14:3])*$signed(cos[15:4]);	
 	  Q_comsin2<=$signed(Q_comsin[14:3])*$signed(sin[15:4]);
     end
end  
    
//RRC
wire signed[31:0]w_Ifir;
wire signed[31:0]w_Qfir;
fiterRRC uut1(
.i_clk  (clk),
.i_rst  (~rst),
.i_din  (I_comcos2[23:8]),
.o_dout (w_Ifir)
);

fiterRRC uut2(
.i_clk  (clk),
.i_rst  (~rst),
.i_din  (Q_comsin2[23:8]),
.o_dout (w_Qfir)
);
    
assign o_Ifir = w_Ifir[19:12];
assign o_Qfir = w_Qfir[19:12];


  reg [15:0]   counter;
  reg         flag_reg;        
  
  always @(posedge clk) begin
    flag_reg = 0;
    if(rst == 0) begin
      counter <= 0;
    end
    else if(counter == 8145) counter <= 0;
    else begin
      if(counter == 8144) begin
        counter <= counter + 1;
        flag_reg = 1;
        end
      else 
      counter <= counter + 1;  
      end 
  end 

parameter D = 20;
  
always @(posedge clk or negedge rst)
begin
     if(~rst)
	  begin
	  o_sdout<={4{1'b0}};	
	  end
else begin
            if(flag_reg == 1'b1)
            begin
                 if(o_Ifir > D & o_Ifir<= 2*D & o_Qfir > D & o_Qfir<= 2*D)
                 o_sdout<=4'b0011;	
                 if(o_Ifir > D & o_Ifir<= 2*D & o_Qfir > 0 & o_Qfir<= D)
                 o_sdout<=4'b0010;	
                 if(o_Ifir > D & o_Ifir<= 2*D & o_Qfir > -D & o_Qfir<= 0)
                 o_sdout<=4'b0111;	
                 if(o_Ifir > D & o_Ifir<= 2*D & o_Qfir > -2*D & o_Qfir<= 
.............................................................................

00_011m

4.完整算法代码文件

V

猜你喜欢

转载自blog.csdn.net/hlayumi1234567/article/details/130604194