全数字2FSK调制解调系统Word文档下载推荐.docx
《全数字2FSK调制解调系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《全数字2FSK调制解调系统Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
2、FSK解调原理
FSK解调总体框图如下:
各部分的对应的波形原理为:
经抽样判决后,得到规整的信码。
3、位同步提取
与HDB3位同步原理相同,略。
五.实验方案
1、设计思路
因FPGA实验板的晶振为32.768M,频率过高,所以要对系统时钟进行分频,设计了一个64分频器。
考虑到接收端的A/D采样工作频率,将输入的时钟又通过了8分频器,然后通过8分频得到载波f1,速率32.768M/64/8/8=8Kbps;
通过16分频得到载波f2,速率32.768M/64/8/16=4Kbps;
通过1024分频得到信码,速率32.768M/64/8/1024=62.5bps;
我们采用5阶伪随机序列。
在调制模块中称为div64模块、div8模块、div16模块、div1024模块和m5模块。
之后,电路中加入两个载波映射表,将两个不同的频率根据D/A转换表映射成不同的载波。
它们分别为f1_zaibo和f2_zaibo模块。
然后通过调制模块mux成为2FSK调制信号。
解调电路采用过零检测的方法,不同的载波对应的零点数不同,过零点数反映了载波变化的不同,也反映了信码的不同。
按设计原理,解调模块包括:
A/D采样模块、将正弦波进行变换的整形模块、微分整流模块、脉冲展宽模块、低通滤波模块和抽样判决模块。
为使解调部分的时钟信号与调制部分同步,加入了位同步dpll模块,控制解调部分的抽样判决时钟。
2、分频器模块
调制模块中共有div64.v、div8.v、div16.v、div1024.v、div128.v等分频器模块,设计如下,供参考。
/////////////////////////////////////////////////////////////////////////////
//64分频器
modulediv32(
clk,
divout);
inputclk;
outputdivout;
reg[5:
0]div;
//采用6bit寄存器
regdivout;
initial
div=0;
always@(posedgeclk)
begin
div=div+1;
//计数器操作
divout=div[5];
//输出最高位
end
endmodule
///////////////////////////////////////////////////////////////////////////////
//8分频器
modulediv128(
reg[2:
//采用3bit寄存器
divout=div[2];
//////////////////////////////////////////////////////////////////////////
//16分频器
reg[3:
//采用4bit寄存器
divout=div[3];
//1024分频器
reg[9:
//采用10bit寄存器
divout=div[9];
//128分频器
reg[6:
//采用7bit寄存器
divout=div[6];
从设计文件来看,输出最高位的“1”和“0”个数相同,因此分频后为占空比为1/2的方波。
3、信号源模块
m序列模块由设计文件m5.v完成,基带信号源由此产生。
设计如下供参考。
//该模块实现5阶伪随机序列信号
modulem5
(clk,
mout);
//端口列表
outputmout;
//端口说明
reg[4:
0]cnt;
regmout;
wire[4:
0]d;
//数据类型定义
assignd[3:
0]=cnt[4:
1];
//赋值语句,将寄存器输出赋值给d触发器输入
assignd[4]=cnt[2]^cnt[0];
//赋值语句,实现生成多项式g(x)=x^5+x^2+1
parametermo=5'
b10000;
//参数定义
if(cnt==0)
cnt=mo;
//避免全零
else
cnt[4:
0]=d[4:
0];
//5阶移位寄存器
mout=cnt[0];
////////////////////////////////////////////////////////////////////////////
4、载波映射表模块
载波映射表由两个模块组成,分别是f1_zaibo.v和f2_zaib0.v,每个模块又调用下面的两个子模块rom16.v和sin16.mif,各个模块设计如下,供参考。
//该模块产生f1载波
modulef1_zaibo(
f1,
out);
inputf1;
output[7:
0]out;
//端口定义
reg[7:
0]count;
0]q1;
initial
count=0;
//初始化
always@(posedgef1)
count=count+1;
out=q1[7:
//4bit计数器,产生rom表地址
rom16
U1(.address(count[3:
0]),
.inclock(f1),
.q(q1));
//调用rom表,产生载波
//////////////////////////////////////////////////////////////////////////////
//该模块产生f2载波
modulef2_zaibo(
f2,
inputf2;
0]q2;
always@(posedgef2)
out=q2[7:
.inclock(f2),
.q(q2));
//rom表,调用载波采样点,一个载波周期采样16个点
modulerom16(
address,
inclock,
q);
input[3:
0]address;
inputinclock;
output[7:
0]q;
lpm_romlpm_rom_component(
.address(address),
.inclock(inclock),
.q(q));
//调用库函数lpm_rom,产生新的元件
defparam//参数重定义
lpm_rom_component.lpm_width=8,//8bit输出数据
lpm_rom_component.lpm_widthad=4,//4bit地址宽度可选择16个样点
lpm_rom_component.lpm_address_control="
REGISTERED"
//任意
lpm_rom_component.lpm_outdata="
UNREGISTERED"
//任意
lpm_rom_component.lpm_file="
sin16.mif"
;
//调用16个样点表,放在//文件sin16.mif中
//正弦表,一个周期16个样点值
DEPTH=16;
%Memorydepthandwidtharerequired%
WIDTH=8;
%Enteradecimalnumber%
ADDRESS_RADIX=DEC;
%Addressandvalueradixesareoptional%
DATA_RADIX=DEC;
%EnterBIN,DEC,HEX,orOCT;
unless%
%otherwisespecified,radixes=HEX%
--Specifyvaluesforaddresses,whichcanbesingleaddressorrange
CONTENT
BEGIN
0:
93779128176218246255246218176128793790;
END;
/////////////////////////////////////////////////////////////////////////
5、调制模块
将m序列信码作控制信号用来选择不同的载波,当m信码为“1”时选择载波f1,当m信码为“0”时,选择载波f2,从而产生调制信号。
该模块用8位2选1数据选择器实现,设计文件为mux.v,供参考。
///////////////////////////////////////////////////////////////////////////
//该模块对载波f1和载波f2进行选择
modulemux(q1,q2,out,m);
input[7:
inputm;
always@(q1orq2)
case({m})
1'
b1:
b0:
//2选1数据选择器
endcase
调制后的信号经D/A转换送到示波器,显示波形如下。
可清楚地看到调制信号波形。
6、A/D采样模块
将D/A输出信号连接到A/D的输入,通过FPGA采样模块转换成数字信号。
该模块由设计文件mx7821.v完成,设计如下供参考。
//该模块完成A/D采样
modulemx7821(clk,
din,
dout,
rd);
0]din;
0]dout;
outputrd;
regrd;
0]cot;
wire[3:
assigncount=cot[3:
//赋值语句
cot=cot+1;
//实现16进制计数器
if(count==0||count==1||count==2||count==3||count==4||count==5||count==6||count==7)
begin
rd=1;
//根据A/D时序图,产生读信号,送给A/D芯片
end
else
rd=0;
if(count>
=12)
dout=din;
//根据A/D时序图,在后4个时钟A/D芯片输出8bit数据
7、正弦波整形模块
该模块的作用是将正弦波整形成矩形,便于处理。
该模块由设计文件zx.v完成,设计如下供参考。
//该模块对输入正弦波信号进行整形
modulezx(a,b);
0]a;
outputb;
regb;
always@(a[7:
0])
case({a[7],a[6]})
2'
b11:
b=1;
b00:
b=0;
b10:
b01:
//按高两位进行判决
8、微分整流模块
该模块的作用是取出输入信号的上升延,从而完成微分整流操作。
该模块由设计文件wf.v完成,设计如下供参考。
//该模块进行微分操作
modulewf(
clk,
rz,
bit);
inputclk;
inputrz;
outputbit;
regbit;
reg[1:
0]pre;
pre[1]=pre[0];
pre[0]=rz;
if(pre==2'
b01)//上升边沿检测,即微分
bit=1;
bit=0;
9、脉冲展宽模块
该模块的作用是将微分后的波形延时一定的脉冲,展宽成接近原始信码的码流。
该模块由设计文件pulse.v完成,设计如下供参考。
//该模块实现脉冲展宽
modulepulse(clk,in,out);
inputin;
outputout;
regout;
reg[15:
0]q;
always@(posedgeclk)
q[15:
1]=q[14:
q[0]=in;
if(q[15:
0]==0)
out=0;
out=1;
//脉冲展宽16个输入时钟周期
10、低通滤波模块
该模块的作用是滤除波形中的毛刺,使处理后的码流更接近原始信码。
低通滤波采用了简便的方法,用做相关运算的方法代替复杂的抽头系数计算。
该模块由设计文件lpf.v完成,设计如下供参考。
//该模块实现低通滤波
modulelpf(clk,in,out);
reg[16:
0]add;
q[16:
1]=q[15:
add=q[0]+q[1]+q[2]+q[3]+q[4]+q[5]+q[6]+q[7]+q[8]+q[9]+q[10]+q[11]+q[12]+q[13]+q[14]+q[15]+q[16];
//做相关运算
if(add<
17)
out=0;
//滤波
out=1;
11、抽样判决模块
该模块的作用是根据恢复的符号时钟,经抽样判决后得到最后的解调信号。
该模块由设计文件pj.v完成,设计如下供参考。
//该模块对输出码元进行判决,得到最后的输出数据
modulepj(clk,in,out);
always@(negedgeclk)
out=in;
//按符号数据输出
12、位同步模块
根据位同步原理框图,分频器模值为N=16,即fb=16fs,N/2为8,因此预置模值为7、8和9。
该模块由设计文件dpll.v完成,设计如下供参考。