1、实验目的
✧验证fsk调制原理
✧用cpld实现m序列的fsk调制
2、实验仪器
✧JH5001(Ⅲ)通信原理基础实验箱
✧电脑
3、实验原理
3.1 fsk调制原理
fsk是frequency shift keying的缩写,意为频率键控。对于二进制频率键控2fsk来讲,调制信号的1码对应于频率为f1的正弦波,0码对应于频率为f2的正弦波,最后将两种频率的正弦波拼接后输出。fsk调制原理框图如下所示:
图表 1 fsk调制原理框图
如上图所示,两个振荡器(硬件电路)分别产生两种不同频率的正弦波,调制信号二进制信息分成两路,一路直接对正弦波f1进行调制,另外一路经过倒相后对正弦波f2进行调制,最后将两个调制后的信号相加输出,得到2fsk信号。
3.2 程序流程
要求根据输入的时钟信号(14.336MHz)产生一个m序列(8KHz),并产生两个不同频率的正弦波,两个正弦波信号的频率分别为16KHz和32KHz,再对该m序列进行fsk调制,最后将fsk调制信号输出。cpld需要完成的任务是生成m序列和两个正弦波(数字信号),并进行fsk调制,生成的数字信号要经过AD7528实现DA转换,经过滤波器实现波形整形,才能得到平滑的fsk信号。
1、正弦波信号产生
首先,我们对一个正弦波进行16点采样,可以得到16个采样值,将这16个采样值分别转换为8位无符号2进制数表示如下:
176 | 218 | 245 | 255 | 245 | 218 | 176 | 128 |
10110000 | 11011010 | 11110101 | 11111111 | 11110101 | 11011010 | 10110000 | 11011010 |
79 | 37 | 10 | 0 | 10 | 37 | 79 | 127 |
01001111 | 00100101 | 00001010 | 00000000 | 00001010 | 00100101 | 01001111 | 01111111 |
设采样频率为。对于16点采样,程序设计中,每一个的上升沿,输出一个采样值。这样,得到的信号的周期是采样周期的16倍,相应的,输出信号频率是采样频率的十六分之一。同理,8点采样得到信号的频率为的八分之一。根据上面的分析,可以计算出的值为16KHz*16=256KHz。16点采样得到16KHz信号sin1,8点采样得到32KHz信号sin2。
2、fsk调制
得到m序列之后,需要判断码型为0或1。如果是0,输出sin1信号,如果是1,输出sin2信号。为了保证输出数据的灵敏性,需要将判决语句放在always@(posedge clk_c)下(clk_c是采样触发信号)而不是放在m序列触发信号下。
4、quartus编程、仿真及下载
1、 码型变换源程序分析
/*===================================================================*|
|*========================m序列的fsk调制============================*|
|*================m序列8KHz,f116KHz,f232KHz=====================*|
|*===================================================================*/
//输入时钟信号clk为14.336MHz,输出[7:0]数字调制信号D和m序列
module fsk(clk,D,m);
input clk;
output reg [7:0] D;
output reg m;
reg clk_m; //m序列时钟,8HKz
reg clk_c; //采样信号,256KHz
reg [7:0] sin1; //正弦波信号
reg [7:0] sin2;
reg [3:0] a; //m序列移位寄存器
reg [3:0] count; //采样计数
reg [9:0] num1; //计数用,用来产生m序列时钟
reg [8:0] num2; //计数用,用来产生采样时钟
initial
begin
count=0;
end
//产生m序列时钟信号clk_m,14.336M/8K=1792
//所以num1从0计数到(1792/2-1)5,clk_m取反。
always@(posedge clk)
begin
if(num1==5)
begin
clk_m<=~clk_m;
num1<=0;
end
else
num1<=num1+4'b1;
end
//产生采样信号clk_c,14.336M/256K=56
//所以num2从0计数到(56/2-1)27,clk_c取反
always@(posedge clk)
begin
if(num2==27)
begin
clk_c<=~clk_c;
num2<=0;
end
else
num2<=num2+4'b1;
end
//m序列产生
always@(posedge clk_m)
begin
if(a==0)
a<=~a; //m序列移位寄存器初值不能为全0
else
begin
a[0]<=a[1];
a[1]<=a[2];
a[2]<=a[3];
a[3]<=a[0]^a[3];
m<=a[0];
end
end
//产生两个频率的正弦信号
always@(posedge clk_c)
begin
//16为一个来回,循环输出count对应的采样值
if(count==15)
begin
count<=0;
end
else
begin
count<=count+6'b1;
end
//sin1,count0~count15,分别取16个采样值
//sin2,count0~count7,分别取8个采样值,上述16个采样值每隔一个取一个
//sin2,count8~count15=count0~count7
case (count)
0:
begin
sin1=8'b10110000;//176
sin2=8'b10110000;//176
end
1:
begin
sin1=8'b11011010;//218
sin2=8'b11110101;//245
end
2:
begin
sin1=8'b11110101;//245
sin2=8'b11110101;//245
end
3:
begin
sin1=8'b11111111;//256
sin2=8'b10110000;//176
end
4:
begin
sin1=8'b11110101;//245
sin2=8'b01001111;//79
end
5:
begin
sin1=8'b11011010;//218
sin2=8'b00001010;//10
end
6:
begin
sin1=8'b10110000;//176
sin2=8'b00001010;//10
end
7:
begin
sin1=8'b10000000;//128
sin2=8'b01001111;//79
end
8:
begin
sin1=8'b01001111;//79
sin2=8'b10110000;//176
end
9://1
begin
sin1=8'b00100101;//37
sin2=8'b11110101;//245
end
10://2
begin
sin1=8'b00001010;//10
sin2=8'b11110101;//245
end
11://3
begin
sin1=8'b00000000;//0
sin2=8'b10110000;//176
end
12://4
begin
sin1=8'b00001010;//10
sin2=8'b01001111;//79
end
13://5
begin
sin1=8'b00100101;//37
sin2=8'b00001010;//10
end
14://6
begin
sin1=8'b01001111;//79
sin2=8'b00001010;//10
end
15://7
begin
sin1=8'b01111111;//127
sin2=8'b01001111;//79
end
endcase
//fsk判决输出
if (m==1)
D=sin1;
else
D=sin2;
end
endmodule
2、 quartus仿真
先对源程序进行编译,编译通过后,建立wave文件,对输出进行仿真。仿真之前,先将end time设置为1ms,这样,就可以得到m序列和cmi码的周期性波形。
仿真得到的输出波形如下图所示:
图表 4 quartus仿真波形
在上图中,可以完整的看到m序列的一个周期,共有15位,对应的cmi编码信号与m序列相比,有一定时间的延时。1码对应得00或11交替显示,0码时钟对应于01。程序成功!