admin管理员组

文章数量:1530845

2024年7月12日发(作者:)

- - -..

一、 设计功能与要求

调制解调器被人们称为“猫〞,它是在发送端通过调制将数字信号转换为模拟信号,

而在接收端通过解调再将模拟信号转换为数字信号的一种装置。这篇报告将通过这学期

所学习的VHDL的相关知识设计一个多功能的调制解调器,下面是设计要求:

1、 实现二进制振幅键控(2ASK)的调制与解调;

2、 实现二进制频移键控(2FSK)的调制与解调;

3、 实现二进制相位键控(2PSK)的调制与解调。

二、 设计思路

1、2ASK调制与解调

〔1〕、2ASK调制器原理图如图1、图2所示,输入随机信号序列

A

,经过基带信号

k

形成器,产生波形序列,然后通过惩罚器进展频谱搬移,并使用带通滤波器来滤除高频

谐波和低频干扰,最终输出振幅键控信号

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、

3、

4、

5、

6、

7、

8、

利用仿真程序生成2ASK调制器的RTL视图及电路符号

利用仿真程序生成2ASK解调器的RTL视图及电路图

利用仿真程序生成2FSK调制器的RTL视图及电路图

利用仿真程序生成2FSK解调器的RTL视图及电路图

利用仿真程序生成2CPSK调制器的RTL视图及电路图

利用仿真程序生成2CPSK解调器的RTL视图及电路图

利用仿真程序生成2DPSK调制器绝对码转换为相对码的

RTL视图及电路图

9、 利用仿真程序生成2DPSK解调器相对码转换为绝对码的

RTL视图及电路图

四、 VHDL源代码的实现

1、选择译码器的程序

library ieee;

use _logic_;

entity selecter is

port(

sel:in std_logic_vector(2 downto 0);

Q:out std_logic_VECTOR(5 downto 0)

. z

-

);

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 _logic_;

use _logic_;

use _logic_;

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;

. z

-

end process;

y<=* and f; --对基带码进展调制

end behav;

3、2ASK解调器的程序

library ieee;

use _logic_;

use _logic_;

use _logic_;

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 _logic_;

. z

-

use _logic_;

use _logic_;

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;

. z

-

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 _logic_;

use _logic_;

use _logic_;

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;

. z

-

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 _logic_;

use _logic_;

use _logic_;

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,*) --此进程完成对基带信号*的调制

. z

-

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 _logic_;

use _logic_;

use _logic_;

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 _logic_;

. z

-

use _logic_;

use _logic_;

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 _logic_;

use _logic_;

use _logic_;

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;

. z

-

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调制器绝对码转换为相对码的仿真波形如下列图所示

. z

-

当q=0时,输出信号y是输入信号*与中间存放信号**异或,输出信号y滞后于输入信

号*一个时钟周期。

9、2DPSK解调器相对码转换为绝对码的仿真波形如下列图所示

当q=3时,输出信号y是信号*与**的异或;输出信号y滞后于输入信号* 一个基带码

长即4个输入时钟周期。

. z

本文标签: 信号载波输出调制进展