1.2 2ASK调制解调原理方法
1.2.1 2ASK调制原理方法
2ASK信号的产生有两种方法:一种是通过调制信号与载波相乘来实现——相乘电路法;另外一种是通过用调制信号控制开关电路的痛断来选择载波的有无实现的——通-断键控法;
(1)相乘电路法:
b(t)S2ASK (t)coswct
图1-2 二进制振幅键控(2ASK)信号的产生方法之一:相乘电路法 (2)通-断键控法:
开关电路载波发生器S2ASK (t)用b(t)控制电路图1-3 二进制振幅键控(2ASK)信号的产生方法之二:键控法 图1-3中,当基带信号
为高电平时,开关电路如图所示,当基带信号
为低电平时,开关处于断开状态,二进制振幅键控信号状态为零,此时二进制振幅键控信号又常称为通-断键控信号(OOK信号)。
1.2.2 2ASK解调原理方法
2ASK(OOK)信号的解调通常有两种方法:一种是相干解调;另外一种是包络检
6
波的非相干解调。
(1)非相干解调法(包络检波法)
S2ASK (t)带通滤波器包络提取低通滤波r(t)器抽样判决{Dn}器定时脉冲图1-4 二进制振幅键控信号的非相干接收系统方框图
此方案的优点是:不需要提取载波,实现简单。 (2)相干解调法
S2ASK (t)带通滤波器载波coswct低通滤波y(t)器抽样判决{Dn}器定时脉冲图1-5 二进制振幅键控信号的相干接收系统方框图
此方案优点:系统误码率比非相干解调的要低,但相差并不大。
1.3 2ASK调制解调的FPGA的实现与调试
1.3.1 2ASK的FPGA实现方案
2ASK的FPGA的实现在同一种调制解调方案下,可以用不同的实现方法来实现,接着本章就介绍2ASK实现的的各种方法以及介绍本文实现的方法。
1.2ASK调制实现方案
2ASK信号的产生实现比较简单,如图1-6:
7
图1-6 2ASK调制信号的产生框图
输入信号是01信号,通过二选一开关,当信号为零时直接输出0,当信号为一时,使信号和载波相乘,这样就可以产生2ASK调制信号。
载波可以用正弦波,也可以用数字载波。如用正弦波作为载波,则在解调的时候必须用上面原理介绍的解调方法。如选用数字载波,则在解调时只需要通过对一个信号周期内的调制信号进行脉冲计数,便可实现解调。
2. 2ASK解调实现方案
以正弦波为载波的2ASK解调在原理部分已经介绍,在此不再赘述。下面介绍以数字信号为载波的2ASK信号的解调。
1)计数器法解调方案 解调框图如下:
图1-7 以数字信号为载波的2ASK信号解调框图
时钟计数器进行以信号周期为周期的循环计数,为判别模块提供判别时刻,调制信号计数器也是以信号周期为周期的循环计数器,将判别时刻的计数值送入判别模块进行判别,由此实现解调。
2)同步采样解调方案
同步采样法的解调原理框图如下:
8
载波信号DPLL提供采样时刻2ASK调制信号采样判别模块解调输出
图1-8 提取载波同步后调制信号采样的原理框图
解调思想:根据2ASK调制信号的特点,即:在高电平调制的地方有载波,而低电平调制的地方没有载波。所以可以通过载波同步信号采样,即可恢复出调制信号,但是采样时刻要和数据位同步,在这里是通过DPLL数字锁相环实现了与载波的信号锁相后,再利用锁相后信号的下降沿采样调制信号,即可实现了2ASK的解调。
3. 2ASK实现方案的选择
根据前面的分析,可以知道。用数字信号为载波来实现2ASK相对容易很多,原理也简单。传统的以正弦波为载波的2ASK,实现起来可以增进对通信原理的理解。两种实现方法各有各自的优点,本次实验从容易的开始做,因此选用数字载波。
对于2ASK解调方案的选择:
方案一:通过计数器实现解调,整体实现起来比较简单,但其只能实现调制信号为固定长度的解调,使用起来非常局限。
方案二:通过采样解调,整体电路设计比方案一稍难,但是其可以对任何信号进行解调,克服了方案一的缺点。(这里是直接把调制端的载波信号连接到解调模块的)
经过方案比较,两种方案都比较容易在FPGA中实现,但考虑到对通信原理中调制解调原理的理解以及其实用性,这里采用方案二解调。
1.3.2 2ASK调制部分的代码设计
module two_ASK(clk,reset,en,sig_S,out_rdy,carriers,modata);
input clk; input reset; input en;
9
output modata; output carriers;
output sig_S,out_rdy;
reg [1:0] cnt; reg carriers; wire modata; reg sig_S,out_rdy;
reg[2:0] addr; reg[2:0] count;
parameter COUNT=3'd7;
always @(posedge clk) begin:initial_control if(reset) begin
addr<=3'd0; count<=3'd0; end else if(en) begin
count<=count+1;
if(count==COUNT) begin addr<=addr+1; end else addr<=addr; out_rdy<=1; end end
always @(posedge clk) begin:Red_sig if(en)
case(addr) 4'd0:sig_S<=0; 4'd1:sig_S<=0; 4'd2:sig_S<=1; 4'd3:sig_S<=0; 4'd4:sig_S<=0; 4'd5:sig_S<=1; 4'd1:sig_S<=1; 4'd7:sig_S<=1;
10