基于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仿真的整个调制解调图
在这里插入图片描述
最后附上整个仿真文件,感兴趣者自行下载。
链接:https://pan.baidu.com/s/16X2rdpoueLVAZ_iJkR2grw
提取码:0vza

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

  • 13
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,我会尽力回答你的问题。首先,2ASK解调是一种解调方式,它可以将ASK调制的信号还原为数字信号。现在我们将使用Quartus来实现这种解调方式。 以下是一个简单的2ASK解调电路的Quartus代码示例: 1. 创建一个新的工程,选择适合的FPGA器件。 2. 在工程中添加一个新的Verilog文件。例如,我们可以使用以下代码来实现一个基本的2ASK解调器: ``` module ask_demodulator( input clk, input carrier, input modulated, output demodulated ); reg last_carrier; reg last_modulated; always @(posedge clk) begin if(carrier != last_carrier) begin if(carrier == 1'b1) begin if(last_modulated == 1'b1) begin demodulated <= 1'b1; end else begin demodulated <= 1'b0; end end else begin demodulated <= 1'b0; end end last_carrier <= carrier; last_modulated <= modulated; end endmodule ``` 在这个代码中,我们定义了一个Verilog模块ask_demodulator。该模块有四个端口:输入时钟信号clk、输入载波信号carrier、输入ASK调制信号modulated,以及输出解调后的数字信号demodulated。 在always块中,我们检查载波信号的变化,并根据上一次ASK调制信号的值来设置解调后的数字信号。如果载波信号为1,我们检查上一个时钟周期的调制信号。如果它是1,则输出数字信号1,否则输出数字信号0。如果载波信号不是1,则输出数字信号0。 3. 编译并下载到FPGA器件中,然后使用示波器等仪器对解调后的信号进行验证。 当然,这只是一个简单的示例,实际上在实际应用中,2ASK解调器的实现可能更加复杂。但是,这个Quartus代码可以作为一个基础来帮助你开始实现你自己的2ASK解调器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值