您好,欢迎来到微智科技网。
搜索
您的当前位置:首页QPSK的调制原理及设计实现

QPSK的调制原理及设计实现

来源:微智科技网
 QPSK的调制原理及设计实现

1.1 四相绝对移相键控

四相绝对移相调制利用载波的四种不同相位来表征数字信息。由于每一种载波相位代表两个比特信息,故每个四进制码元又被称为双比元。我们把组成双比元的前一信息比特用a代表,后一信息比特用b代表。双比元中两个信息比特ab通常是按格雷码(即反射码)排列的,它与载波相位的关系如表1.1-1所示。矢量关系如图1.1-1所示。图(a)表示A方式时QPSK信号的矢量图,图(b)表示 B式时QPSK信号的矢量图。四相调制信号在用式(1.1.1)表示时,相位在(0、2)内等间隔地取四种可能相位。由于正弦和余弦函数的互补特性,对应于φk的四种取值,譬如45°、135°、225°、315°,其幅度a与b值有两种取值,即2/2。此时,式1.1.1恰好表示两个正交的二相调制信号的合成。

eo(t)=Σg(t-kTs)cos(ωct+ψk)

=Σakg(t-kTs)cosωct-Σbkg(t-kTs)sinωct 式1.1.1

表1-1 双比元与载波相位的关系

双比元 a b 0 0 1 0 1 1 0 1

载波相位(φk)

a方式 b方式 0° 225° 90° 135° 180° 45° 270° 315°

由于四相绝对移相调制可以看作两个正交的二相绝对移相调制的合成,故两者的功率谱密度分布规律相同。

图1.1.1 QPSK信号的矢量图

根据上面的讨论,我们不难得出QPSK信号的调制方法可以分为调相法和相位选择法两种。 (1)调相法。用调相法产生QPSK信号的组成方框图如图1.1.2(a)所示。图中,串并变换器将输入的二进制序列依次分为两个并行的双极性序列。设两个序列中的二进制数字分别为a和b,每一对ab称为一个双比元。双极性的a和b脉冲通过两个平衡调制器分别对同相载波及正交载波进行二相调制,得到图1.1.2(b)中虚线矢量。将两路输出叠加,即得如图1.1.2(b)中实线所示的四相移相信号。

图1.1.2 调相法的组成方框图

(2)相位选择法。用相位选择法产生QPSK信号的组成方框图如图1.1.3所示。图中,四相载波发生器分别送出调相所需的四种不同相位的载波。按照串/并变换器输出的双比元的不同,逻辑选相电路输出相应相位的载波。例如,双比元ab为11时,输出相位为45°的载波;ab为01时,输出相位为135°的载波等。

图1.1.3 相位选择法的组成方框图

1.2 QPSK全数字调制器的CPLD设计实现

全数字QPSK调制解调器与一般QPSK调制器的主要的不同点是全数字QPSK调制器所有部件都采用数字方式实现。以下是按照调制的整个流程来讲述各个部件的CPLD的实现。

QPSK调制系统原理:以晶体振荡产生的高频信息脉冲作为系统的基准时钟,一路经过50分频作为M序列的输入,另一路经过8分频作为八进制计数器和滤波器的输入。经过一个八进制计数器产生八个点,作为载波的八个采样点,通过编程产生八个离散化的载波信号。以M序列作为要调制的基带信号,经数据分离,生成I路和Q路;将I、Q两路信号送入差分编码器,生成两路差分码信号I′和Q′;接着经过选择器后分别选种两路载波,I′路来控制余弦波的输出,Q′路来控制正弦波的输出;然后把选种的两路载波通过一个加法器相加,通过加法器输出QPSK调制信号,我们可以直接从逻辑分析仪上观测。

图1.2.1 QPSK调制框图

图1.2.1为QPSK调制框图。晶振则作为CPLD的外围电路,其余在CPLD芯片内部实现。

1.2.1 信源——伪随机序列(M序列)的产生

随机噪声首先作为有损通信质量的因素受到人们的重视,但是有时候也需要获得随机噪声,以实现高可靠的保密通信。然而,利用随机噪声的最大困难是它难以产生和重复处理,60年代伪随机噪声的出现解决了这一困难。伪随机噪声具有类似于随机噪声的一些统计特性,同时又便于重复产生和重复处理。目前应用的伪随机序列噪声都是由数字电路产生的周期序列得到的。本设计中由M

序列作为基带信号,它是伪随机序列的一种,也是最长线性反馈移存器序列的简称,是由带线性反馈的移存器产生的周期最长的一种序列。M序列是由它的本原多项式产生的,本原多项式的一般方程式为:

23ni

f(x)=c0+c1x+c2x+c3x+…+cnx=∑cix 式1.1

由此产生的线性反馈移位寄存器如下:

图1.2.1.1 线性反馈移位寄存器

本设计的m序列用4阶,该m序列是用MAX+PLUSⅡ中的.GDF文件设计的,因为它的生成多项式为4

x+x+1,所以它的m序列产生图为:

图1.2.1.2 4阶m序列产生图

它的clk信号是由晶振32MHz经过50分频后得到的方波,m序列码元速率为32M/50Hz。一般来说,

n

一个n级反馈移存器可能产生的最长周期等于2-1,由此图产生的输入信号为:111000010100110,其原理图如下所示:

图1.2.1.3 4阶m序列原理图

仿真图如下:

图1.2.1.4 4阶m序列仿真图

1.2.2 数据分离器(串/并变换)的实现

当m序列进入时,根据QAM调制原理,数据必须被分成正交的两路:I路和Q路。例如当m序列输入为100110时,经数据分离器后I路输出为101,Q路输出为010,因此数据的周期增加一倍,两路的数据速率都是二分频。且分离后的数据为非归零码。该数据分离器主要由D触发器实现,具体电路图如下所示:

图1.2.2.1 数据分离器原理图

数据分离后仿真结果如下图所示:

图1.2.2.2 数据分离器仿真图

在原理图中,时钟信号clk经过一个D触发器和非门构成的二分频器后得到clk1,用这个时钟把数据的奇数位取出为data1。clk2是clk1经过一个D触发器延时半个周期后得到的,它把数据中的偶数位取出为data2。由于data1和data2为近似归零码,而我们所需要的是非归零码,因此加上后面的电路使数据经过D触发器延时半个周期后的数据与原来的数据相或,得到非归零码的两路数据。

由于数据分离后I路和Q路的时序存在差异,所以在两路的数据输出端各添加一个D触发器,使得两路输出同步。又因为I路比Q路快了半个周期,可以在I路数据的输出端加一个寄存器,可以得到我们所需要的两路数据。

1.2.3 差分编码器的实现

为了消除相位模糊问题,我们采用了差分编码。如果将2PSK系统中的基带码称为绝对码,则差分码正是反映绝对码前后相邻码元1和0相对变化的一种编码,故也称为相对码。设要传输的单极性二进制码an为绝对码,其对应的差分码(相对码)为dn,差分编码规则为:若an≠an-1,则dn=1;若an=an

,则dn=0。显然,数字基带信号的差分编码过程即为绝对码/相对码的变换过程,可满足QPSK信号被调载波相对相位变换的要求。

-1

图1.2.3.1 差分编码电路

将两路数据信号输出分别经过一个差分编码电路就可得到两路编码后的数据信号,其波形仿真图如下图所示:

图1.2.3.2 差分编码后的波形仿真图

1.2.4 数据选择器的实现

选择器的目的是通过输入的两路信号I路和Q路的四种组合来选择四种不同的载波组合。其输入信号为I、Q;输出信号为Q1、Q2、Q3和Q4分别去控制正余弦、负余弦、正正弦和负正弦。选择器每次选种两路信号:正弦和余弦。具体程序参见附录selector.tdf

编码关系见下表1-2所示

表1-2 选择器的编码关系表

I 0 0 1 0

Q 0 1 0 1

Q1(cosθ)

0 0 1 1

Q2(-cosθ)

1 1 0 0

Q3(sinθ)

0 1 0 1

Q4(-sinθ)

1 0 1 0

1.2.5 数字载波的实现

本次实验中我们所需要实现的相位分别为π/4、3π/4、5π/4、7π/4四个数字化载波

sinθ,每个载波用八个抽样点表示。这里采用正余弦、负余弦、正正弦和负正弦通过加法运算获得。具体相位如下表1-3所示:

表1-3 调制相位关系

I 0 0 1 1

由于最终调制信号的输出是√2 sinθ,而且D/A转换的芯片的参考电平是5伏,为了使调制波形能显示得更加清晰,我们考虑把数字化载波的电平扩大三倍,即参考电平是三伏。下面是各数字化载波的抽样、量化、编码。

根据D/A转换的编码规则,对应的量化关系是:5——量化成127。5表示是芯片的电平是5伏;采用8位数字来表示。其中第八位表示符号位:“1”表示正,“0”表示负;后面的七位表示电平的大

7

小:2-1=127,所以5——127。

1.正正弦

把正正弦信号抽样成八个采样点:0、π/4、π/2、3π/4、π、5π/4、3π/2、7π/4 它们的正弦值分别为:0、 0.707、 1、 0.707、 0、 -0.707、 -1、 -0.707 把它们扩大三倍后是:0、 2.121、 3、 2.121、 0、 -2.121、 -3、 -2.121 把它们量化后是: 0、 54、 76、54、 0、 -54、 -76、-54 把它们编码后分别为:10000000、 10110110、 11001100、 10110110、

10000000、 01001010、 00110100、 01001010

正正弦的最终实现是通过AHDL语言编程和图形编辑器实现的。首先用AHDL语言实现正正弦表(程序见附录sinlist.tdf),同时用AHDL语言实现一个八进制带使能端的计数器(程序参见附录

Q 0 1 0 1

cosθ 0 0 1 1

-cosθ 1 1 0 0

sinθ 0 1 0 1

-sinθ 1 0 1 0

代表的相位 -cosθ-sinθ→225º -cosθ+sinθ→315º cosθ-sinθ →135º cosθ+sinθ →45º

counter8.tdf)。把计数器输入的八个记数点分别对应载波的八个采样点,输出是各个采样点所对应的编码值,其输入端再接一个使能端(ean),即当使能端输入为高电平时,其正弦波发生器才能输出载波信号,否则输出为0,原理图如下所示:

图1.2.5.1 正正弦载波发生器原理图

2.负正弦

把负正弦信号抽样成八个采样点:0、π/4、π/2、3π/4、π、5π/4、3π/2、7π/4 它们的正弦值分别为:0、 -0.707、 -1、 -0.707、 0、 0.707、 1、 0.707 把它们扩大三倍后是:0、 -2.121、 -3、 -2.121、 0、 2.121、 3、 2.121 把它们量化后是: 0、 -54、 -76、-54、 0、 54、 76、54 把它们编码后分别为:10000000、 01001010、 00110100、 01001010、

10000000、 10110110、 11001100、 10110110

负正弦的最终实现是通过AHDL语言编程和图形编辑器实现的。首先用AHDL语言实现负正弦表(程序见附录_sinlist.tdf),同时用AHDL语言实现一个八进制带使能端的计数器(程序参见附录counter8.tdf)。把计数器输入的八个记数点分别对应载波的八个采样点,输出是各个采样点所对应的编码值,其输入端再接一个使能端(ean),即当使能端输入为高电平时,其负正弦载波发生器才能输出载波信号,否则输出为0,原理图如下图所示:

图1.2.5.2 负正弦载波发生器原理图

3.正余弦

把正余弦信号抽样成八个采样点:0、π/4、π/2、3π/4、π、5π/4、3π/2、7π/4 它们的余弦值分别为:1、 0.707、 0、 -0.707、 -1、 -0.707、 0、 0.707 把它们扩大三倍后是:3、 2.121、 0、 -2.121、 -3、 -2.121、 0、 2.121 把它们量化后是: 76、 54、 0、 -54、 -76、 -54、 0、 54 把它们编码后分别为:11001100、 10110110、 10000000、 01001010、

00110100、 01001010、 10000000、 10110110

正余弦的最终实现是通过AHDL语言编程和图形编辑器实现的。首先用AHDL语言实现正余弦表(程序见附录coslist.tdf),同时用AHDL语言实现一个八进制带使能端的计数器(程序参见附录counter8.tdf)。把计数器输入的八个记数点分别对应载波的八个采样点,输出是各个采样点所对应的编码值,其输入端再接一个使能端(ean),即当使能端输入为高电平时,其余弦波发生器才能输出载波信号,否则输出为0,原理图如下所示:

图1.2.5.3 正余弦载波发生器

4.负余弦

把负余弦信号抽样成八个采样点:0、π/4、π/2、3π/4、π、5π/4、3π/2、7π/4 它们的余弦值分别为:-1、 -0.707、 0、 0.707、 1、 0.707、 0、 -0.707 把它们扩大三倍后是:-3、 -2.121、 0、 2.121、 3、 2.121、 0、 -2.121 把它们量化后是: -76、 -54、 0、 54、 76、 54、 0、 -54 把它们编码后分别为:00110100、 01001010、 10000000、 10110110、

11001100、 10110110、 10000000、 01001010

负余弦的最终实现是通过AHDL语言编程和图形编辑器实现的。首先用AHDL语言实现负余弦表(程序见附录_coslist.tdf),同时用AHDL语言实现一个八进制带使能端的计数器(程序参见附录counter8.tdf)。把计数器输入的八个记数点分别对应载波的八个采样点,输出是各个采样点所对应的编码值,其输入端再接一个使能端(ean),即当使能端输入为高电平时,其负余弦波发生器才能输出载波信号,否则输出为0,原理图如下所示:

图1.2.5.4 负余弦载波发生器

1.2.6 加法器的实现即调制信号的产生

我们把选择器的四路输出Q1、Q2、Q3、Q4分别接正余弦、负余弦、正正弦、负正弦的使能端,控制各个载波发生器的输出。再把选中的两路输出的载波相加,即可输出我们所需要的QPSK调制信号8比元的输出信号。加法器设计的顶层框图如下图1.2.6.1所示:

图1.2.6.1 加法器顶层框图

此外,因为每一路输出均为8位,所以当两路信号相加时可能产生溢出。而且我们所用的是八个载波点,在产生四种相位的载波时没有产生溢出的情况,且两路信号都是有符号的所以符号位是必须要考虑的。

例如:

(1)0.9239-0.3827=0.5412,扩大三倍后为1.6236,量化成42,编码为10101010。而0.9239的编码值为11000111,-0.3827的编码值为01100011,两者相加后为11000111+01100011=100101010。 因为输出值为8位,所以第一位1被省略,结果最终输出为00101010,变成了负值。但是实际正确的输出值应为10101010为正值,故第一位符号位溢出,所以我们只要把第一位取反就可以了。

(2)-0.3827-0.9239= -1.3066,扩大三倍后为-3.9198,量化成-100,编码为00011100。而-0.3827的编码值为01100011,-0.9239的编码值为00111001,两者相加后为01100011+00111001=10011100。其中首位符号位由原来的“0”变成了“1”,故第一位符号位溢出,根据上面的原则我们只要把第一位取反就可以了。

该加法器的最终实现是通过AHDL语言编程实现,具体程序参见附录adder.tdf。下面是该加法器的波形仿真图:

图1.2.6.2 加法器波形仿真图

上图中c[7..0]表示余弦表八个抽样点的值,_c[7..0]表示负余弦表的八个抽样点的值,s[7..0]则表示正弦表的八个抽样点,_s[7..0]表示负正弦表的八个抽样点的值,它们通过加法器相加分别产生四种不同相位的载波。

2、系统模块图、硬件配置及调试

在本章中我们将详细介绍可编程芯片ACEX 1K系列中的EP1K30TC144-3及其外围电路,管脚配置、实现电路和整个系统的调试过程。

2.1 系统模块图

2.1.1 QPSK全数字调制的系统模块图

图2.1.1 全数字QPSK调制系统

该全数字QPSK调制系统的原理与具体实现请参见本文的第一部分。

2.2 波形仿真图

2.2.1 QPSK调制系统的波形仿真图

其中下图所示的mxl为产生的伪随机序列码元,I、Q分别为伪随机序列中分离出来的两路数字信号,Id和Qd则为I、Q经过差分编码后的数字信号,用来控制载波的工作情况,产生不同相位的正弦波,而mod[7..0]则为最终四相位调制波形的输出。

图2.2.1 QPSK全数字调制系统波形仿真图

附录 程 序

一、调制部分的相关模块源程序

1.五十分频器(50fp.tdf) include\"lpm_counter\"; constant

width = ceil(log2(25));

subdesign 50fp (

base_clk :input; base :output; )

variable

count :lpm_counter with (lpm_modulus = 25, lpm_width = width, lpm_direction = \"up\"); flip :dffe; trigger :node;

begin

count.clock = base_clk;

trigger = (count.q[] == 24); flip.ena = trigger; flip.d = !flip.q; base = flip.q;

flip.clk = base_clk; end;

2.四分频器(4fp.tdf) include\"lpm_counter\";

constant

width = ceil(log2(2));

subdesign 4fp (

base_clk :input; base :output; )

variable

count :lpm_counter with (lpm_modulus = 2, lpm_width = width, lpm_direction = \"up\"); flip :dffe; trigger :node;

begin

count.clock = base_clk;

trigger = (count.q[] == 1);

flip.ena = trigger; flip.d = !flip.q; base = flip.q;

flip.clk = base_clk; end;

3.八进制计数器(counter8.tdf) constant code=B\"111\"; subdesign counter8 (

clk :input;

ena :input=vcc; load,d[3..1] :input=gnd; clr :input=gnd; q[3..1],rco :output; )

variable

count[3..1] :dff; begin

count[].clk=clk; count[].clrn=!clr;

if load then

count[].d=d[]; else

if ena then

count[].d=count[].q+1; else

count[].d=count[].q; end if; end if;

q[]=count[];

rco=(q[]==code); end;

4.数据选择器(selector.tdf) subdesign selector (

I,Q :INPUT; Q1,Q2,Q3,Q4 :OUTPUT; )

begin table

I,Q=> Q1,Q2,Q3,Q4; 0,0=> 0 ,1 ,0 ,1 ; 0,1=> 0 ,1 ,1 ,0 ; 1,0=> 1 ,0 ,0 ,1 ; 1,1=> 1 ,0 ,1 ,0 ; end table; end;

5.负余弦列表(_coslist.tdf) subdesign _coslist (

Q[3..1],ena :input; _c[7..0] :output; )

begin

if ena then table

Q3,Q2,Q1=>_C7,_C6,_C5,_C4,_C3,_C2,_C1,_C0; 0 ,0 ,0 =>0,0,1,1,0,1,0,0; 0 ,0 ,1 =>0,1,0,0,1,0,1,0; 0 ,1 ,0 =>1,0,0,0,0,0,0,0; 0 ,1 ,1 =>1,0,1,1,0,1,1,0; 1 ,0 ,0 =>1,1,0,0,1,1,0,0; 1 ,0 ,1 =>1,0,1,1,0,1,1,0; 1 ,1 ,0 =>1,0,0,0,0,0,0,0; 1 ,1 ,1 =>0,1,0,0,1,0,1,0; end table;

else _C[7..0]=B\"00000000\"; end if; end;

6.正余弦列表(coslist.tdf) subdesign coslist (

Q[3..1],ena :input; C[7..0] :output; )

begin

if ena then table

Q3,Q2,Q1=>C7,C6,C5,C4,C3,C2,C1,C0; 0 ,0 ,0 =>1,1,0,0,1,1,0,0; 0 ,0 ,1 =>1,0,1,1,0,1,1,0; 0 ,1 ,0 =>1,0,0,0,0,0,0,0; 0 ,1 ,1 =>0,1,0,0,1,0,1,0; 1 ,0 ,0 =>0,0,1,1,0,1,0,0; 1 ,0 ,1 =>0,1,0,0,1,0,1,0; 1 ,1 ,0 =>1,0,0,0,0,0,0,0; 1 ,1 ,1 =>1,0,1,1,0,1,1,0; end table;

else C[7..0]=B\"00000000\"; end if; end;

7.负正弦列表(_sinlist.tdf)

subdesign _sinlist (

Q[3..1],ena :input; _S[7..0] :output; )

begin

if ena then table

Q3,Q2,Q1=>_S7,_S6,_S5,_S4,_S3,_S2,_S1,_S0; 0 ,0 ,0 =>1,0,0,0,0,0,0,0; 0 ,0 ,1 =>0,1,0,0,1,0,1,0; 0 ,1 ,0 =>0,0,1,1,0,1,0,0; 0 ,1 ,1 =>0,1,0,0,1,0,1,0; 1 ,0 ,0 =>1,0,0,0,0,0,0,0; 1 ,0 ,1 =>1,0,1,1,0,1,1,0; 1 ,1 ,0 =>1,1,0,0,1,1,0,0; 1 ,1 ,1 =>1,0,1,1,0,1,1,0; end table;

else _S[7..0]=B\"00000000\"; end if; end;

8.正正弦列表(sinlist.tdf) subdesign sinlist (

Q[3..1],ena :input; S[7..0] :output; )

begin

if ena then table

Q3,Q2,Q1=>S7,S6,S5,S4,S3,S2,S1,S0; 0 ,0 ,0 =>1,0,0,0,0,0,0,0; 0 ,0 ,1 =>1,0,1,1,0,1,1,0; 0 ,1 ,0 =>1,1,0,0,1,1,0,0; 0 ,1 ,1 =>1,0,1,1,0,1,1,0; 1 ,0 ,0 =>1,0,0,0,0,0,0,0; 1 ,0 ,1 =>0,1,0,0,1,0,1,0;

1 ,1 ,0 =>0,0,1,1,0,1,0,0; 1 ,1 ,1 =>0,1,0,0,1,0,1,0; end table;

else S[7..0]=B\"00000000\"; end if; end;

9.加法器(adder.tdf) subdesign adder (

C[7..0] :input; _C[7..0] :input; S[7..0] :input; _S[7..0] :input; outa[7..0]:output; out[7..0] :output; )

begin

outa[7..0]=S[7..0]+_S[7..0]+C[7..0]+_C[7..0]; out[7]=!outa[7];

out[6..0]=outa[6..0]; end;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务