基于FPGA的2PSK调制解调仿真

在之前介绍了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