特权同学

基于FPGA的多进制振幅键控(MASK)

0
阅读(4089)

ASK--又称幅移键控法。载波幅度是随着调制信号而变化的。其 最简单的形式是,载波在二进制调制信号控制下通断,这种方式还可称作通-断键控或开关键控(OOK) 。

MASK,又称多进制数字调制法。在二进制数字调制中每个符号只能表示0和1(+1或-1)。但在许多实际的数字传输系统中却往往采用多进制的数字调制方式。与二进制数字调制系统相比,多进制 数字调制系统具有如下两个特点:第一:在相同的信道码源调制中,每个符号可以携带log2M比特信息,因此,当信道频带受限时可以使信息传输率增加,提高了频带利用率。但由此付出的代价是增加信号功率和实现上的复杂性。第二,在相同的信息速率下,由于多进制方式的信道传输速率可以比二进制的低,因而多进制信号码源的持续时间要比二进制的宽。加宽码元 宽度,就会增加信号码元的能量,也能减小由于信道特性引起的码间干扰的影响等。

 

以下是2ASK的调制波形:

由仿真波形可以看到,发送的码元依次为10 11 01 00 01 11 00 10 10 11,从调制后波形看一看到,输出的波形与发送的码元相对应。11时振幅最大,00时振 幅最小(为零)。

 

Verilog代码:

 

//顶层模块

module mask_top(clk,rst,en,maskout,rdymask);

input clk;

input rst;

input en;

output[15:0] maskout;

output rdymask;

 

wire coen;//基带信号发送使能,高有效

wire[1:0] codein;//发送2bit基带码元

wire[15:0] sin_out,cos_out;

wire ce;//正余弦发生器使能信号

wire[15:0] pha;//正弦发生器相位

wire clk_80;//主时钟的40分频信号

wire rdy;

 

clkfenpinclkfenpin(clk,rst,clk_80);

codesource          codesource(clk_80,rst,en,codein,coen);

phase    phase(clk,rst,coen,pha,ce);

cos        cos(pha,clk,ce,cos_out,sin_out,rdy); //调用了ISE的IP Core生成正弦函数

mask     mask(clk,rst,codein,sin_out,rdy,maskout,rdymask);

 

endmodule

 

 

//时钟80分频 模块

module clkfenpin(clk,rst,clk_80);

input clk;

input rst;

output clk_80;

 

reg[5:0] num;

reg clk_80;

 

always @ (posedge clk)

begin

       if(rst) begin num <= 6'd0; clk_80 <= 0; end

       else

       begin

              num <= num+1;

              if(num==6'd39) begin num <= 6'd0; clk_80 <=~clk_80; end

       end

end

 

endmodule

 

 

//基带码元产生模块

module codesource(clk,rst,en,codein,coen);

input clk;

input rst;

input en;

output[1:0] codein;//发送2bit基带码元

output coen;

 

reg coen;

reg[1:0] codein;

reg[15:0] source;//从高到低连续发送该16bit码元信号(两个码元为一组发送)

reg[3:0] num;

 

always @ (posedge clk or posedge rst)

begin

       if(rst)

       begin

              source <= 16'b1011010001110010;

              codein <= 1'bx;

              num <= 4'b1111;

              coen <= 0;

       end

       else if(en)

       begin

              coen <= 1;

              codein <= {source[num],source[num-1]};

              num <= num-2;

       end

       else

       begin

              source <= 16'b1011010001110010;

              codein <= 1'bx;

              num <= 4'b1111;

              coen <= 0;

       end

end

 

endmodule

 

 

//相位变化模块

module phase(clk,rst,coen,pha,ce);

input clk;

input rst;

input coen;

output ce;

output[15:0] pha;

 

reg ce;

reg[15:0] pha;

 

always @ (posedge clk)

begin

       if(rst) begin pha <= 16'h9b80; ce <= 0; end

       else if(coen)

       begin

              ce <= 1;

              pha <= pha+16'h0506;

              if((pha<16'h8000)&&(pha>16'h6087)) begin pha <= 16'h9b80; end

       end

       else begin pha <= 16'h9b80; ce <= 0; end

end

 

endmodule

 

 

//调制模块

module mask(clk,rst,codein,sin_out,rdy,maskout,rdymask);

input clk;

input rst;

input rdy;

input[1:0] codein;

input[15:0] sin_out;

output[15:0] maskout;

output rdymask;

 

reg[1:0] code0,code;

reg rdymask;

reg[15:0] maskout;

 

always @ (posedge clk)

begin

       if(rst) begin maskout <= 16'dx; rdymask <= 0; end

       else if(rdy)

       begin

              rdymask <= 1;

              case(code)

                     2'b00: maskout <= 16'h0000;

                     2'b01: maskout <= {sin_out[15],sin_out[15],sin_out[15:2]};

                     2'b10: maskout <= {sin_out[15],sin_out[15:1]};

                     2'b11: maskout <= {sin_out[15],sin_out[15],sin_out[15:2]}+{sin_out[15],sin_out[15:1]};

                     default maskout <= 16'dx;

                     endcase

       end

       else rdymask <= 0;

 

       code0 <= codein;

       code <= code0;

end

 

endmodule