基于FPGA的QPSK调制解调电路设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的QPSK调制解调电路设计与实现
数字调制信号又称为键控信号,调制过程可用键控的方法由基带信号对载频信号的振幅、频率及相位进行调制,最基本的方法有3种:正交幅度调制(QAM)、频移键控(FSK)、相移键控(PSK).根据所处理的基带信号的进制不同分为二进制和多进制调制(M进制).多进制数字调制与二进制相比,其频谱利用率更高.其中QPSK(即4PSK)是MPSK(多进制相移键控)中应用最广泛的一种调制方式。
1 QPSK简介
QPSK信号有00、01、10、11四种状态。所以,对输入的二进制序列,首先必须分组,每两位码元一组。然后根据组合情况,用载波的四种相位表征它们。QPSK信号实际上是两路正交双边带信号, 可由图1所示方法产生。
QPSK信号是两个正交的2PSK信号的合成,所以可仿照2PSK信号的相平解调法,用两个正交的相干载波分别检测A和B两个分量,然后还原成串行二进制数字信号,即可完成QPSK信号的解调,解调过程如图2所示。
图1 QPSK 信号调制原理图
图2 QPSK 信号解调原理图
2 QPSK 调制电路的FPGA 实现及仿真 2.1基于FPGA 的QPSK 调制电路方框图
基带信号通过串/并转换器得到2位并行信号,,四选一开关根据该数据,选择载波对应的相位进行输出,即得到调制信号,调制框图如图3所示。
基带信号clk
start
串/并转换四选一开关
分 频
0°90°180°270°
调制信号
FPGA
图3 QPSK 调制电路框图
系统顶层框图如下
图中输入信号clk为调制模块时钟,start为调制模块的使能信号,x为基带信号,y是qpsk调制信号的输出端,carrier【3..0】为4种不同相位的载波,其相位非别为0、90、180、270度,锁相环模块用来进行相位调节,用来模拟通信系统中发送时钟与接收时钟的不同步start1为解调模块的使能信号。y2为解调信号的输出端。
2.2调制电路VHDL程序
程序说明
信号yy 载波相位载波波形载波符号
“00”0°f3
“01”90°f2
“10”180°f1
“11”270°f0
在quartus ii下的仿真结果总体结果如下图所示
局部放大图如下
3 QPSK解调电路的FPGA实现及仿真
3.1 QPSK解调电路方框图
当调制为低电平时,译码器1根据记数器输出值,送入加法器相应的数据。加法器把运算结果送到寄存器,译码器2根据寄存器数据通过译码,输出两位并行信号,该信号再通过并/串转换即可得到解调后的基带信号,调制框图如图4所示。
图4 QPSK解调电路框图
3.2解调电路VHDL程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_MPSK2 is
port(clk :in std_logic; --系统时钟
start :in std_logic; --同步信号
x :in std_logic; --调制信号
y :out std_logic); --基带信号
end PL_MPSK2;
architecture behav of PL_MPSK2 is
signal q:integer range 0 to 7; --计数器
signal xx:std_logic_vector(2 downto 0); --加法器
signal yyy:std_logic_vector(1 downto 0); --2位并行基代信号寄存器
signal yy:std_logic_vector(2 downto 0); --寄存xx数据
begin
process(clk)
begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q=0 then
q<=1;yy<=xx; y<=yyy(0); --把加法计数器的数据送入yy寄存器
if x='0' then
xx<="001"; --调制信号x为低电平时,送入加法器的数据“001”
else
xx<="000";
end if;
elsif q=2 then q<=3;
if x='0' then
xx<=xx+"001"; --调制信号x为低电平时,送入加法器的数据“001”
end if;
elsif q=4 then q<=5; y<=yyy(1);
if x='0' then
xx<=xx+"010"; --调制信号x为低电平时,送入加法器的数据“010”
end if;
elsif q=6 then q<=7;
if x='0' then
xx<=xx+"011"; --调制信号x为低电平时,送入加法器的数据“011”
end if;
else q<=q+1;
end if;
end if;
end process;
process(yy) --此进程根据yy寄存器里的数据进行译码
begin
if clk='1' and clk'event then
if yy="101" then yyy<="00"; --yy寄存器“101”对应基带码“00”
elsif yy="011" then yyy<="01"; --yy寄存器“011”对应基带码“01”
elsif yy="010" then yyy<="10"; --yy寄存器“010”对应基带码“10”