在之前介绍了2ASK的解调方式是非相干解调。下面介绍相干解调,但用2PSK来进一步说明。
相干解调的思路很简单,就是把调制信号乘以载波,再通过低通滤波器,经判决脉冲输出。和之前一样,需要确认几个参数。
本示例时钟为50M,基带信号1M,载波4M,在仿真时解调时用的载波是和调制用的一样。为了恢复原来信号,判决脉冲也为1M。至于判决门限,由于相乘之后,正负都有,且正的部分对应1,负的部分对应0,所以自然地,判决门限应该为0。但由于负数表示为最高位是1,我们不能简单通过判断大于0来表示,因为所有的数据都大于0。因此我们只用判断最高位,若最高为为0,则说明是正数,则判为1,若最高位为1,则说明是负数,判为0。
先给出2PSK的调制,还是利用2选1开关。
module choose(
input [7:0]data_in,
input sel,
output [7:0]data_out
);
reg[7:0]daout;
always @(sel)
begin
if(sel)
daout <= data_in;
else
daout <= ~data_in;
end
assign data_out = daout;
endmodule
2PSK解调
module demod_psk(
input clk,
input clk_in,
input [7:0]sin,
input [7:0]data_in,
output [13:0]fir_dout,
output bit_data,
output bit_sync
);
//例化乘法器模块
wire[15:0]lpm_out;
lpm_sin lpm_sin_inst(
.dataa(data_in),
.datab(sin),
.result(lpm_out)
);
//例化FIR模块
wire source_valid;
wire [1:0] source_error;
wire [27:0]source_out;
My_fir U0(
.clk (clk),
.reset_n (1'b1),
.ast_sink_data (lpm_out[15:8]),
.ast_sink_valid (1'b1),
.ast_sink_error (2'd0),
.ast_source_data (source_out),
.ast_source_valid (source_valid),
.ast_source_error (source_error)
);
assign fir_dout = source_out[24:11];
wire demod = (fir_dout[13] == 1'b0) ? 1'b1 : 1'b0;
wire sync;//同步脉冲
assign sync = clk_in;
reg data_out;
always @(posedge sync)
begin
data_out <= demod;
end
assign bit_data = data_out;
assign bit_sync = sync;
endmodule
用Singal Tap仿真结果图
最后附上整个仿真文件代码,感兴趣者自行下载。
链接:https://pan.baidu.com/s/1ojijiwqUCqdx5oOIsNALgw
提取码:lb4o