原创 基于FPGA/CPLD的MSK调制解调的工程应用(上)

2010-12-30 17:41 1950 10 11 分类: 消费电子

为了便于信号发射,提高信道利用率、发射功率效率以及改善通信质量,人们研制出各种通信信号的调制样式。尽管调制样式多种多样,但实质上调制不外乎用调制信号去控制载波的某一个(或几个)参数,使这个参数按照调制信号的规律而变化。调制信号可以分别“寄生”在已调信号的振幅、频率和相位中,相应的调制就是调幅、调频和调相这三大类熟知的调制方式。

MSK信号就是调频这一大类中的一种相位连续的移频键控。其主要特点是包络恒定,带外辐射小,实现较简单,可用于移动通信中的数字传输。

MSK信号具有如下特点:

1)已调制信号的振幅是恒定的;

2)信号的频率偏移严格地等于正负1/4Ts,相应的调制指数h=(f2—f1)Ts=1/2;

3)以载波相位为基准的信号相位在一个码元期间内准确地线性变化正负Π/2;

4)在一个码元期间内,信号应包括四分之一载波周期的整数倍;

5)在码元转换时刻信号的相位是连续的,或者说,信号的波形没有突跳。

MSK调制方式的突出优点是信号具有恒定的振幅及信号的功率谱在主瓣以外衰减较快。然而,在一些通信场合,列如移动通信中,对信号带外辐射功率的限制是十分严格的,比如必须衰减70-80db以上。

GMSK是在MSK调制器之前加入一高斯低通滤波器。也就是说,用高斯低通滤波器作为MSK调制的前置滤波器。之前做过了高斯低通滤波器的FPGA设计。这一节做MSK调制的设计,下一节将把二者连接起来成为一个GMSK调制系统。

第三路信号source是基带码元,第五和第七路信号分别为IQ两路信号,其与分别与余弦和正弦相乘的波形如qsin和pcos所示。

tu1.jpg



产生两路正余弦高频调制信号分别为hsin和hcos,再将它们与原pq两路信号相乘结果如pmux和qmux。

tu2.jpg



将得到的pmux和qmux信号相加,得到的mskout信号即MSK调制的最后输出。

tu3.jpg



Verilog代码如下:

tu4.jpg



module msk_top(clk,rst,rfd,pcos,qsin,hcos,hsin,pmux,qmux,mskout);

input clk; //主时钟信号

input rst; //复位信号

input rfd;

// output[15:0] cos,sin;

output[15:0] pcos,qsin;

// output[15:0] p,q;

output[15:0] hcos,hsin;

output[31:0] pmux,qmux;

output[32:0] mskout;

wire clk_500; //50分频信号

wire clk_50; //500分频信号

wire nd; //差分编码输出标志位

wire rfd; //差分编码启动位

wire[15:0] source; //差分信号

wire[15:0] p,q; //pq两路信号

wire iqen; //pq两路信号输出标志位

wire[15:0] phase_in; //输入相位

wire ce; //cos和sin工作使能信号

wire csrdy; //cos和sin输出使能信号

wire pqsrdy; //pcos和qsin输出使能信号

wire[15:0] cos,sin; //正余弦发生信号

wire[15:0] pcos,qsin;//输出的I、Q两路信号

wire[15:0] phase_h; //高频相位

wire rdyhigh; //高频相位产生模块输出使能信号

wire[15:0] hcos,hsin;//高频正余弦输出

wire[31:0] pmux,qmux;//IQ两路信号的的最后输出

wire muxprdy,muxqrdy;//IQ两路信号的输出使能信号

wire[32:0] mskout; //MSK调制输出

wire mskrdy; //MSK调制使出使能信号

clkfen clkfen( .clk(clk), .rst(rst), .clk_500(clk_500), .clk_50(clk_50));

sent_source sent_source( .clk_50(clk_50), .rst(rst), .nd(nd), .rfd(rfd), .source(source) );

pqvalue pqvalue( .clk(clk_50), .rst(rst), .nd(nd), .signal_in(source), .preg(p), .qreg(q), .rdy(iqen));

phase_generate phase_generate( .clk(clk_500), .rst(rst), .en(nd), .phase(phase_in), .rdy(ce) );

cos_sin cos_sin( .phase_in(phase_in), .clk(clk_500), .ce(ce), .x_out(cos), .y_out(sin), .rdy(csrdy));

pcosqsin pcosqsin( .clk(clk), .rst(rst), .en(csrdy), .iqen(iqen), .p(p), .q(q),

.sin(sin), .cos(cos), .qsin(qsin), .pcos(pcos), .rdy(pqsrdy));

highfre highfre( .clk(clk_500), .rst(rst), .en(nd), .phase(phase_h), .rdy(rdyhigh));//高频相位产生模块

hcossin hcossin( .phase_in(phase_h), .clk(clk_500), .ce(rdyhigh), .x_out(hcos), .y_out(hsin), .rdy(hfrdy));

mux muxp( .clk(clk_500), .a(pcos), .b(hcos), .q(pmux), .nd(hfrdy), .rdy(muxprdy));

mux2 muxq( .clk(clk_500), .a(qsin), .b(hsin), .q(qmux), .nd(hfrdy), .rdy(muxqrdy));

add add( .clk(clk_500), .rst(rst), .en(muxprdy), .a(pmux), .b(qmux), .sum(mskout), .rdy(mskrdy));

endmodule

module clkfen(clk,rst,clk_500,clk_50);

input clk;

input rst;

output clk_50,clk_500;

reg clk_50,clk_500;

reg[8:0] num;

always @ (posedge clk or posedge rst) begin

if(rst) begin

num <= 9'd0;

clk_500 <= 0;

clk_50 <= 0;

end

else begin

num <= num+1;

// if(num == 9) begin

// num <= 0;

// clk_50 <= ~clk_50;

// end

case (num)

9'd49: clk_500 <= ~clk_500;

9'd99: clk_500 <= ~clk_500;

9'd149: clk_500 <= ~clk_500;

9'd199: clk_500 <= ~clk_500;

9'd249: clk_500 <= ~clk_500;

9'd299: clk_500 <= ~clk_500;

9'd349: clk_500 <= ~clk_500;

9'd399: clk_500 <= ~clk_500;

9'd449: clk_500 <= ~clk_500;

9'd499: begin num <= 0;

clk_500 <= ~clk_500;

clk_50 <= ~clk_50;

end

default: ;

endcase

end

end

endmodule

module sent_source(clk_50,rst,nd,rfd,source);

input clk_50; //50KHz时钟信号

input rst; //复位信号,高电平有效

input rfd;

output[15:0] source; //1bit基带信号,用16bit表示

output nd;

reg[15:0] source;

reg[15:0] scode;

reg[3:0] num;

reg nd;

always @ (posedge clk_50 or posedge rst) begin

if(rst) begin

nd <= 0;

source <= 16'd0;

num <= 4'b1111;

scode <= 16'b1010011010111111; //1011101001101001;

end

else if(rfd) begin

if(scode[num]) begin

source <= 16'h7fff;

end

else begin

source <= 16'h8000;

end

nd <= 1;

num <= num-1;

end

else nd <= 0;

end

endmodule

未完,强制分页:基于FPGA/CPLD的MSK调制解调的工程应用(中)

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1681897 2013-5-15 09:21

受教

kent_rao_738407428 2013-5-14 21:19

大宝小莉,你好!你说得没错。在这个实验中,我们在示波器和信号源两端设置的是相同的阻抗

用户1604852 2013-5-14 18:32

hao

用户1590967 2013-5-14 13:26

楼主这里应该是不是还有个信号发生器和示波器阻抗匹配的问题

用户1586985 2013-5-14 12:20

学习了

用户1610239 2013-5-14 09:29

用户1554175 2013-5-14 09:27

实际电子设备调试时,非常有用

用户1039176 2013-5-14 08:21

呵呵,原来是方法不当引起的纠纷。这也难怪,测量本身就是一门精深的学问。

用户1602177 2013-5-9 16:52

经验搜集中~~

用户1181216 2013-5-9 14:30

好,有同感

相关推荐阅读
用户1587532 2012-12-04 14:56
被忽略的硬件常识
          在特权同学的《都是IO弱上拉惹的祸》一文中,提及了Altera的CPLD在初始化时管脚通常会处于弱上拉状态。在实际示波器采样来看,就表现在上电初 期IO脚会有一个短暂(当时是持...
用户1587532 2012-12-04 14:56
都是IO弱上拉惹的祸
         开发的一款液晶驱动器,接收MCU过来的指令和数据进行图像显示。使用了一片可编程(带使能和PWM调节控制)的背光芯片。在CPLD设计中,上电复位状态将背光使能拉低(关闭),直到MC...
用户1587532 2011-12-29 09:39
四通道波形动态演示效果
 ">http:// http://v.youku.com/v_show/id_XMzM3MDY2NjYw.html   这效果,Cortex-M3可以吗?     ...
用户1587532 2011-12-21 12:54
高速绘图显示,还是FPGA给力
  示波器的效果,曾经以为难于上青天,殊不知咱用FPGA一样能够轻松效仿。目前只是单通道的显示效果,随后送上4通道独立或叠加的波形效果。          感兴趣的朋友不妨去看看他的详细参数:...
用户1587532 2011-10-12 10:23
Keil存储空间自定义分配
Keil存储空间自定义分配          看来Capital-Micro的软件支持包做得还不够到位啊,在51编程环境KeilC中使用Astro II器件光有个Capital Micro D...
用户1587532 2011-09-22 16:38
源同步信号跨时钟域采集的两种方法
源同步信号跨时钟域采集的两种方法            对于数据采集接收的一方而言,所谓源同步信号,即传输待接收的数据和时钟信号均由发送方产生。FPGA应用中,常常需要产生一些源同步接口信...
EE直播间
更多
我要评论
1
10
关闭 站长推荐上一条 /3 下一条