基于FPGA的多进制振幅键控(MASK)
0赞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