特权同学

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

0
阅读(2639)

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

Baidu
map