基于FPGA的2ASK解调仿真

上文实现了2ASK技术的调制,今天我们来讲怎么对调制信号进行解调。

解调无非就两种,相干解调、非相干解调。本着怎么简单怎么来的思路,我们不考虑复杂因素,这里选择非相干解调。

简单来说就是先把调制信号进行整流,负的变成正的,正的保持不变,这样信号都变成在零线以上,只要经过一个低通滤波器,就可以提取该信号的包络。接下来,就是对包络进行判决。这里需要考虑两个问题,判决脉冲怎么确定?判决门限怎么确定?

第一个,我们之前产生的基带信号码元速率为1M,那么要想恢复原来的基带信号,意味着判决脉冲是1M,占空比为1:1。
第二个,我们要用包络进行判决,原本负的变成了正的,而无论正负,都是载波所对应的,也就是基带信号的1,那基带信号对于的0呢,在包络中就是0附近徘徊。因此,我们随便设置一个值,只有比0大就可以当作判决门限。

在该判决脉冲的驱使下,输出由判决门限判决地值,就是我们解调信号。

接下来看代码实现

module demod_ask(
 input clk,
 input clk_in,
 input [7:0]data_in,
 output [13:0]fir_dout,
 output [13:0]mean,
 output bit_data,
 output bit_sync
);

reg[7:0]abs_data;//整流信号

always @(posedge clk)
begin
 if(data_in[7])
  abs_data <= ~data_in;
 else
  abs_data <= data_in;
end

//例化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      (abs_data),
    .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];

assign mean = 14'd1133;//判决门限
wire demod = (fir_dout > mean) ? 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

在Signal Tap仿真的整个调制解调图
基于FPGA的2ASK解调仿真_第1张图片
最后附上整个仿真文件,感兴趣者自行下载。
链接:https://pan.baidu.com/s/16X2rdpoueLVAZ_iJkR2grw
提取码:0vza

参考文献
数字调制解调技术的MATLAB与FPGA实现 Altera Verilog版_杜勇

你可能感兴趣的:(基于FPGA的2ASK解调仿真)