基于VHDL的多功能调制解调器的设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

- - -.. 一、设计功能与要求
调制解调器被人们称为“猫〞,它是在发送端通过调制将数字信号转换为模拟信号,而在接收端通过解调再将模拟信号转换为数字信号的一种装置。

这篇报告将通过这学期所学习的VHDL的相关知识设计一个多功能的调制解调器,下面是设计要求:
1、实现二进制振幅键控(2ASK)的调制与解调;
2、实现二进制频移键控(2FSK)的调制与解调;
3、实现二进制相位键控(2PSK)的调制与解调。

二、设计思路
1、2ASK调制与解调
A k,经过基带信号
〔1〕、2ASK调制器原理图如图1、图2所示,输入随机信号序列{}形成器,产生波形序列,然后通过惩罚器进展频谱搬移,并使用带通滤波器来滤除高频
u ASK。

谐波和低频干扰,最终输出振幅键控信号)(t
〔2〕、2ASK解调器以包络解调为例来说明,原理图如图3所示,其中分频器对时钟信号进展分频得到与发射端数字载波一样的数字载波信号;存放器在时钟上升沿到来时把数字ASK信号存入存放器;计数器利用分频输出的载波信号作为计数器的时钟信号,在其上升沿到来时,对存放器中的ASK载波个数进展计数,当计数值大于3时,输出位1,否则为0;判决器则以数字载波为判决时钟,对计数器输出信号进展抽样判决,并输出解调后的基带信号。

2、2FSK调制与解调
〔1〕、2FSK调制器的原理图如图4所示,信号通过2个独立的分频器产生不同频率的载波信号,然后通过选通开关选择不同频率的高频信号,从而实现2FSK调制。

〔2〕、2FSK与2ASK解调相似,也是由分频器、存放器、计数器和判决器构成,其构造构图如图5所示:
3、2PSK调制与解调
相位键控分为绝对调相〔CPSK〕与相对调相〔DPSK〕两种。

CPSK是利用载波的不同相位去直接传送数字信息的一种方式;DPSK则是利用载波相位的相对变化来传送数字信号,即利用前后码之间载波相位的变化表示数字基带信号。

〔1〕CPSK调制与解调
CPSK调制器构造图如图6所示。

计数器对外部时钟信号进展分频与计数,并输出两路相位不同的数字载波信号;2选1开关在基带信号的控制下,对两路载波信号进展选择,输出信号即为CPSK信号。

CPSK解调器的构造图如图7所示,计数器q输出与发射端同步的0相数字载波;将计数器输出的0相载波与数字CPSK信号中的载波进展与运算,当两比拟信号在判决时刻都为1时,输出为1,否则输出为0,从而实现解调。

〔2〕、DPSK调制与解调
DPSK调制器的构造图如图8所示,CPSK调制器,计数器,异或门和存放器共同完成绝对码到相对码的变换功能。

DPSK解调器关键则是实现相对码到绝对码的转换,其构造图如图9所示,DPSK解调采用CPSK解调器与相对码到绝对码转换电路即可实现,其中,相对码到绝对码的转换是以在以计数器输出信号为时钟控制下完成的。

三、原理图说明
1、顶层模块的原理图
利用选择译码器输出矢量的每一位分别作为调制解调器的工作使能输入信号,从而实现不同条件下多种调制解调方式间的选择,对于PSK调制与解调以CPSK为例来输入原理图。

2、利用仿真程序生成2ASK调制器的RTL视图及电路符号
3、利用仿真程序生成2ASK解调器的RTL视图及电路图
4、利用仿真程序生成2FSK调制器的RTL视图及电路图
5、利用仿真程序生成2FSK解调器的RTL视图及电路图
6、利用仿真程序生成2CPSK调制器的RTL视图及电路图
7、利用仿真程序生成2CPSK解调器的RTL视图及电路图
8、利用仿真程序生成2DPSK调制器绝对码转换为相对码的
RTL视图及电路图
9、利用仿真程序生成2DPSK解调器相对码转换为绝对码的
RTL视图及电路图
四、 VHDL源代码的实现
1、选择译码器的程序
library ieee;
use ieee.std_logic_1164.all;
entity selecter is
port(
sel:in std_logic_vector(2 downto 0);
Q:out std_logic_VECTOR(5 downto 0)
);
end selecter;
architecture rtl of selecter is
begin
process(sel)
begin
case sel is
when "000" => Q<="000001";
when "001" => Q<="000010";
when "010" => Q<="000100";
when "011" => Q<="001000";
when "100" => Q<="010000";
when "101" => Q<="100000";
when others=>null;
end case;
end process;
end rtl;
2、2ASK调制器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_ASK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开场调制信号
* :in std_logic; --基带信号
y :out std_logic); --调制信号
end PL_ASK;
architecture behav of PL_ASK is
signal q:integer range 0 to 3; --分频计数器
signal f :std_logic; --载波信号
begin
process(clk)
begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q<=1 then f<='1';q<=q+1; --改变q后面数字的大小,就可以改变载波信号的占空比
elsif q=3 then f<='0';q<=0; --改变q后面数字的大小,就可以改变载波信号的频率
else f<='0';q<=q+1;
end if;
end if;
end process;
y<=* and f; --对基带码进展调制
end behav;
3、2ASK解调器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_ASK2 is
port(clk :in std_logic; --系统时钟
start :in std_logic; --同步信号
* :in std_logic; --调制信号
y :out std_logic); --基带信号
end PL_ASK2;
architecture behav of PL_ASK2 is
signal q:integer range 0 to 11; --计数器
signal **:std_logic; --存放*信号
signal m:integer range 0 to 5; --计**的脉冲数
begin
process(clk) --对系统时钟进展q分频,
begin
if clk'event and clk='1' then **<=*; --clk上升沿时,把*信号赋给中间信号** if start='0' then q<=0; --if语句完成q的循环计数
elsif q=11 then q<=0;
else q<=q+1;
end if;
end if;
end process;
process(**,q) --此进程完成ASK解调
begin
if q=11 then m<=0; --m计数器清零
elsif q=10 then
if m<=3 then y<='0'; --if语句通过对m大小,来判决y输出的电平 else y<='1';
end if;
elsif **'event and **='1'then m<=m+1; --计**信号的脉冲个数
end if;
end process;
end behav;
4、2FSK调制器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_FSK is
port(
clk:in std_logic; --系统时钟
start:in std_logic; --开场调制信号
*:in std_logic; --基带信号
y:out std_logic --调制信号
);
end PL_FSK;
architecture rtl of PL_FSK is
signal q1:integer range 0 to 11; --载波信号f1的分频计数器
signal q2:integer range 0 to 3; --载波信号f2的分频计数器
signal f1,f2:std_logic; --载波信号f1,f2
begin
process(clk) --此进程通过对系统时钟clk的分频,得到载波f1
begin
if clk'event and clk='1' then
if start='0' then q1<=0;
elsif q1<=5 then
f1<='1';
q1<=q1+1; --改变q1后面的数字可以改变载波f1的占空比 elsif q1=11 then
f1<='0';
q1<=0; --改变q1后面的数字可以改变载波f1的频率
else
f1<='0';
q1<=q1+1;
end if;
end if;
end process;
process(clk) --此进程通过对系统时钟clk的分频,得到载波f2
begin
if clk'event and clk='1' then
if start='0' then q2<=0;
elsif q2<=0 then
f2<='1';
q2<=q2+1; --改变q2后面的数字可以改变载波f2的占空比 elsif q2<=1 then
f2<='0';
q2<=0; --改变q2后面的数字可以改变载波f2的频率
else
f2<='0';
q2<=q2+1;
end if;
end if;
end process;
process(clk,*) --此进程完成对基带信号的FSK调制
begin
if clk'event and clk='1' then
if *='0' then
y<=f1; --当输入的基带信号*=’0’时,输出的调制信号y为f1 else
y<=f2; --当输入的基带信号*=’1’时,输出的调制信号y为f2 end if;
end if;
end process;
end rtl;
5、2FSK解调器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_FSK2 is
port(
clk:in std_logic; --系统时钟
start:in std_logic; --同步信号
*:in std_logic; --调制信号
y:out std_logic --基带信号
);
end PL_FSK2;
architecture behav of PL_FSK2 is
signal q:integer range 0 to 11; --分频计数器
signal m:integer range 0 to 5; --计数器
signal **:std_logic; --存放器
begin
process(clk) --对系统时钟进展q分频
begin
if clk'event and clk='1' then
**<=*; --在clk信号上升沿时,*信号对中间信号**赋值
if start='0' then
q<=0; --if语句完成Q的循环计数
elsif q=11 then
q<=0;
else
q<=q+1;
end if;
end if;
end process;
process(q,**) --此进程完成FSK解调
begin
if q=11 then
m<=0; --m计数器清零
elsif q=10 then
if m<=3 then
y<='0'; --if语句通过对m大小,来判决y输出的电平
else
y<='1';
end if;
elsif **'event and **='1' then
m<=m+1;
end if;
end process;
end behav;
6、2CPSK调制器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_CPSK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开场调制信号
* :in std_logic; --基带信号
y :out std_logic); --已调制输出信号
end PL_CPSK;
architecture behav of PL_CPSK is
signal q:std_logic_vector(1 downto 0); --2位计数器
signal f1,f2:std_logic; --载波信号
begin
process(clk) --此进程主要是产生两重载波信号f1,f2 begin
if clk'event and clk='1' then
if start='0' then q<="00";
elsif q<="01" then f1<='1';f2<='0';q<=q+1;
elsif q="11" then f1<='0';f2<='1';q<="00";
else f1<='0';f2<='1';q<=q+1;
end if;
end if;
end process;
process(clk,*) --此进程完成对基带信号*的调制begin
if clk'event and clk='1' then --上升沿触发
if q(0)='1' then
if *='1' then y<=f1; --基带信号*为‘1’时,输出信号y为f1 else y<=f2; --基带信号*为‘0’时,输出信号y为f2
end if;
end if;
end if;
end process;
end behav;
7、2CPSK解调器的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_CPSK2 is
port(clk :in std_logic; --系统时钟
start :in std_logic; --同步信号
* :in std_logic; --调制信号
y :out std_logic); --基带信号
end PL_CPSK2;
architecture behav of PL_CPSK2 is
signal q:integer range 0 to 3;
begin
process(clk) --此进程完成对CPSK调制信号的解调begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q=0 then q<=q+1; --在q=0时,根据输入信号*的电平来进展判决
if *='1' then y<='1';
else y<='0';
end if;
elsif q=3 then q<=0;
else q<=q+1;
end if;
end if;
end process;
end behav;
8、2DPSK调制器绝对码转换为相对码的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_DPSK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开场转换信号
* :in std_logic; --绝对码输入信号
y :out std_logic); --相对码输出信号
end PL_DPSK;
architecture behav of PL_DPSK is
signal q:integer range 0 to 3; --分频器
signal **:std_logic; --中间存放信号
begin
process(clk,*) --此进程完成绝对码到相对码的转换
begin
if clk'event and clk='1' then
if start='0' then q<=0; **<='0';
elsif q=0 then q<=1; **<=** *or *;y<=** *or *; --输入信号与前一个输出信号进展异或
elsif q=3 then q<=0;
else q<=q+1;
end if;
end if;
end process;
end behav;
9、2DPSK解调器相对码转换为绝对码的程序
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_DPSK2 is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开场转换信号
* :in std_logic; --相对码输入信号
y :out std_logic); --绝对码输出信号
end PL_DPSK2;
architecture behav of PL_DPSK2 is
signal q:integer range 0 to 3; --分频
signal **:std_logic; --存放相对码
begin
process(clk,*) --此进程完成相对码到绝对码的转换
begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q=0 then q<=1;
elsif q=3 then q<=0; y<=** *or *; **<=*; --输入信号*与前一输入信号**进展
异或
else q<=q+1;
end if;
end if;
end process;
end behav;
五、仿真结果与说明
1、选择译码器的仿真波形如下列图所示
对应于不同的输入选择信号,输出信号的特定输出高电平,其余为低电平。

2、2ASK调制器的仿真波形如下列图所示
当start信号为高电平时,进展ASK调制;载波信号f通过系统时钟进展4分频获得。

3、2ASK解调器的仿真波形如下列图所示
当start信号为高电平时,进展ASK解调;在q=11时,m清零;根据m的大小,进展对输出基带信号y的电平的判决;在q为其他时,m计**的脉冲数;输出的基带信号y滞后输入的调制信号*十个时钟周期。

4、2FSK调制器的仿真波形如下列图所示
当start信号为高电平时,进展FSK调制;载波f1,f2分别是通过对clk信号进展12分频和2分频得到的;基带码长是载波信号f1的两个周期,载波信号f2的六个周期;输出的调制信号则在时间上滞后于载波信号一个时钟周期,滞后于输入时钟脉冲两个周期。

5、2FSK解调器的仿真波形如下列图所示
当start信号为高电平时,进展FSK解调;当q=11时,m清零;当q=10时,根据m的大小,进展对输出基带信号y的电平判决;当q为其他值是,计数器m记下**的脉冲数;输出信号y滞后于输入信号*十个时钟周期。

6、2CPSK调制器的仿真波形如下列图所示
当start信号为高电平时,进展CPSK调制;载波信号f1、f2是通过输入时钟脉冲clk 分频得到的,且滞后输入时钟一个时钟周期;调制输出信号y滞后载波一个时钟周期,滞后输入时钟两个时钟周期。

7、2CPSK解调器的仿真波形如下列图所示
当start信号为高电平时,进展CPSK解调;当q=0时,根据*的电平来进展判决;输出信号y滞后输入信号*一个时钟周期。

8、2DPSK调制器绝对码转换为相对码的仿真波形如下列图所示
当q=0时,输出信号y是输入信号*与中间存放信号**异或,输出信号y滞后于输入信
-
号*一个时钟周期。

9、2DPSK解调器相对码转换为绝对码的仿真波形如下列图所示
当q=3时,输出信号y是信号*与**的异或;输出信号y滞后于输入信号* 一个基带码长即4个输入时钟周期。

. z。

相关文档
最新文档