FPGA课程设计基于VHDL的2FSK的信号发生器.docx

上传人:b****4 文档编号:4210051 上传时间:2022-11-28 格式:DOCX 页数:12 大小:365.18KB
下载 相关 举报
FPGA课程设计基于VHDL的2FSK的信号发生器.docx_第1页
第1页 / 共12页
FPGA课程设计基于VHDL的2FSK的信号发生器.docx_第2页
第2页 / 共12页
FPGA课程设计基于VHDL的2FSK的信号发生器.docx_第3页
第3页 / 共12页
FPGA课程设计基于VHDL的2FSK的信号发生器.docx_第4页
第4页 / 共12页
FPGA课程设计基于VHDL的2FSK的信号发生器.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

FPGA课程设计基于VHDL的2FSK的信号发生器.docx

《FPGA课程设计基于VHDL的2FSK的信号发生器.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计基于VHDL的2FSK的信号发生器.docx(12页珍藏版)》请在冰豆网上搜索。

FPGA课程设计基于VHDL的2FSK的信号发生器.docx

FPGA课程设计基于VHDL的2FSK的信号发生器

《FPGA原理及应用》结课论文

 

题目基于VHDL的2FSK的信号发生器

 

专业名称

通信工程

班级学号

学生姓名

提交时间

2012年12月13日

 

设计题目:

基于VHDL的2FSK的信号发生器

一、设计实验条件

QuartusII开发环境

二、设计目标

1.通过练习,能够较为熟练的运用QuartusII软件,同时对VHDL语言掌握更加熟悉;

2.基于QuartusII开发环境,利用VHDL硬件描述语言,自上而下地逐层完成相应的描述、综合、优化、仿真与验证,直到生成器件2FSK信号发生器;

三、设计报告的内容

1.前言(绪论)(设计的目的、意义等)

2.设计主体(原理、步骤、程序或原理图、结果等)

3.对仿真结果进行分析

4.参考资料

 

一.前言

在通信领域中,为了传送信息,一般都将原始的信号进行某种变换变成适合于通信传输的信号形式。

在数字通信系统中,一般将原始信号(图像、声音等)经过量化编码变成二进制码流,称为基带信号。

但数字基带信号一般不适合于直接传输。

例如,通过公共电话网络传输数字信号时,由于电话网络的带宽为4kHz以下,因此数字信号不能直接在其上传输。

此时可将数字信号进行调制,2FSK即为一种常用的数字调制方式。

2FSK,即二进制频移键控方法简单,易于实现,解调不需恢复本地载波,支持异步传输,抗噪声和抗衰落性能也较强。

因此2FSK调制技术在通信行业得到了广泛的应用,并且主要适用于低、中速数据传输。

由于微电子技术的迅猛发展,使得VHDL的性能指标,例如规模、功能、时间等性能也越来越好。

VHDL在数字系统设计中占据了越来越重要的位置。

而随着器件的发展,开发环境也进一步得到优化。

VHDL程序的设计可用Altera公司的QuartusII软件开发系统来实现,它为用户提供了良好的开发环境,包含有丰富的库资源,很容易实现各种电路设计,它支持多种输入方式,并有极强的仿真系统。

故利用FPGA这一新的技术手段来研究数字调制技术有重要的现实意义。

设计采用FPGA现场可编程技术,运用自顶向下的设计思想设计2FSK信号发生器。

避免了硬件电路的焊接与调试,而且由于FPGA的I/O端口丰富,内部逻辑可随意更改,使得2FSK信号发生器的实现较为方便。

 

二.设计主体

1、2FSK信号产生原理

数字频率调制又称频移键控(FSK),二进制频移键控记作2FSK。

数字频移键控是用载波的频率来传送数字消息,即用所传送的数字消息控制载波的频率。

2FSK信号便是符号“1”对应于载频

,而符号“0”对应于载频

(与

不同的另一载频)的已调波形,而且

之间的改变是瞬间完成的。

2FSK调制的波形如图1示。

从原理上讲,数字调频可用模拟调频法来实现,也可用键控法来实现。

模拟调频法是利用一个矩形脉冲序列对一个载波进行调频,是频移键控通信方式早期采用的实现方法。

2FSK键控法则是利用受矩形脉冲序列控制的开关电路对两个不同的独立频率源进行选通。

键控法的特点是转换速度快、波形好、稳定度高且易于实现,故应用广泛。

2FSK信号的产生方法如图1所示。

图中

为代表信息的二进制矩形脉冲序列,

即使2FSK信号。

图12FSK产生方法

2、设计原理及原理图

由于FSK为模拟信号,而FPGA只能产生数字信号,因此需对正弦信号采样并经模数变换来得到所需的FSK信号。

本例由FPGA产生正弦信号的采样值。

FSK信号发生器框图如图2所示,整个系统共分为分频器、m序列产生器、跳变检测、2:

1数据选择器、正弦波信号产生器和DAC数模变换器等6部分,其中前5部分由FPGA器件完成。

图22FSK调制信号发生器框图

(1).分频器

本实例中数据速率为1.2kHz,要求产生1.2kHz和2.4kHz两个正弦信号。

对正弦信号每周期取100个采样点,因此要求能产生3个时钟信号:

1.2kHz(数据速率)、120kHz(产生1.2kHz正弦信号的输入时钟)和240kHz(产生2.4kHz正弦信号的输入时钟)。

基准时钟由一个12MHz的晶振提供。

设计中要求一个50分频(产生240kHz信号),再2分频(产生120kHz信号)和100分频(产生1.2kHz信号),共有三个分频值。

(2).m序列产生器

m序列是伪随机序列的一种,它的显著特点是:

随机特性,预先可确定性,循环特性。

正因为这些特性,使得m序列产生器在通信领域得到了广泛的应用。

这里用一种带有两个反馈抽头的3级反馈移位寄存器,得到一串“1110010”循环序列,并采取措施防止进入全“0”状态。

通过更换时钟频率可以方便地改变输入码元的速率。

m序列产生器的电路结构如图3所示。

图3m序列产生器

m序列产生器电路结构

(3).跳变检测

将跳变检测引入正弦波的产生中,可以使每次基带码元上升沿或下降沿到来时,对应输出波形位于正弦波形的sin0处。

引入跳变检测主要是为了便于观察,确保示波器上显示为一个连续的波形。

基带信号的跳变检测可以有很多方法,图4为一种便于在可编程逻辑器件中实现的方案。

图4信号跳变检测电路

(4).2:

1数据选择器

2:

1数据选择器用于选择正弦波产生器的两个输入时钟。

一个时钟的频率为120kHz,此时正弦波产生器产生一个1.2kHz的正弦波,代表数字信号“0”;另一个时钟的频率为240kHz,此时产生一个2.4kHz的正弦波信号,代表数字信号“1”。

(5).正弦信号的产生

用数字电路和DAC变换器可以产生要求的模拟信号。

根据抽样定理可知,当用模拟信号最大频率两倍以上的速率对该模拟信号采样时,便可将原模拟信号不失真地恢复出来。

本例要求得到的是两个不同频率的正弦信号,实验中对正弦波每个周期采样100个点,即采样速率为原正弦信号频率的100倍,因此完全可以在接收端将原正弦信号不失真地恢复出来,从而可以在接收端对FSK信号正确地解调。

经DAC转换后,可以在示波器上观察到比较理想的波形。

本设计中每个采样点采用8位量化编码,即8位分辨率。

采样点的个数与分辨率的大小主要取决于CPLD/FPGA器件的容量,其中分辨率的高低还与DAC的位数有关。

实验表明,采用8位分辨率和每周期100个采样点可以达到相当不错的效果。

具体的正弦信号产生器可以用状态机来实现。

按前面的设计思路,本实现方案共需100个状态,分别为s1~s100。

同时设计一个异步复位端,保证当每个“1”或“0”到来时其调制信号正好位于坐标原点,即sin0处。

状态机共有8位输出(Q7~Q0),经DAC变换为模拟信号输出。

为得到一个纯正弦波形,应在DAC的输出端加上一个低通滤波器,由于本设计仅观察FSK信号,因此省去了低通滤波器。

本设计中,数字基带信号与FSK调制信号的对应关系为“0”对应1.2kHz,“1”对应2.4kHz,此二载波的频率可以方便地通过软件修改。

3、对仿真结果进行分析

2FSK的总体波形如图5所示,其中CLOCK为正弦波发生器时钟MODE表示0:

2FSK;1:

2PSK,CLK120为用于产生一个1.2KHz的正弦波信号,CLK240为用于产生一个2.4KHz的正弦波信号,VALUE为正弦波的采样点峰值,M_MODE为输出m序列。

图52FSK仿真波形图

下图6所示为产生的2FSK波形,可以明显地看到在M_MODE跳变前后VALUE的码元宽度相差一倍,实现了2FSK的频率变化来传递数字信息,即120KHz表示信号“0”,240KHz表示信号“1”。

图62FSK仿真波形图

下图3-6可以看出传递信号“1”的波形密度明显比传递信号“0”的波形密度高。

图72FSK仿真波形图

2FSK的信号传递频率从下图8中可以看出为240KHz,信号“1”和“0”的跳变是通过相位的改变来实现的。

图82FSK仿真波形图

4、具体程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.all;

USEIEEE.std_logic_unsigned.all;

USEIEEE.std_logic_arith.all;

ENTITYPSKFSKIS

PORT(CLOCK:

INSTD_LOGIC;--正弦波发生器时钟

MODE:

INSTD_LOGIC;--0:

FSK;1:

PSK

CLK240:

bufferSTD_LOGIC;--用于产生一个2.4KHz的正弦波信号

CLK120:

bufferSTD_LOGIC;--用于产生一个1.2KHz的正弦波信号

VALUE:

outstd_logic_vector(7DOWNTO0);--正弦波的采样点峰值

M_CODE:

BUFFERSTD_LOGIC);--输出m序列

ENDPSKFSK;

ARCHITECTUREPSKFSK_ARCHOFPSKFSKIS

SIGNALCOUNT100:

INTEGERRANGE0TO99;--记录100个状态

SIGNALCOUNT50:

INTEGERRANGE0TO49;--记录50个状态

SIGNALCOUNT:

INTEGERRANGE1TO10;--记录10个状态,实现12M分频到240KHz得到CLK240时钟信号

SIGNALSINCLK,CODERATE:

STD_LOGIC;--正弦波信号的频率以及随机序列的编码速率

SIGNALTEMP,JUMP_HIGH,JUMP_LOW:

STD_LOGIC;--0,1跳变标志

SIGNALM:

std_logic_vector(2DOWNTO0);--m序列

BEGIN

PROCESS(CLOCK)--分频为240KHz的CLK240信号

BEGIN

IF(CLOCK'EVENTANDCLOCK='1')THEN

IF(COUNT=10)THEN

COUNT<=1;--计数满时计数回复初值

CLK240<=NOTCLK240;--输出时钟翻转一次

ELSIF(COUNT=5)THEN

COUNT<=COUNT+1;

CLK240<=NOTCLK240;--输出时钟翻转一次

ELSECOUNT<=COUNT+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(CLK240)--分频为120KHz的CLK120信号

BEGIN

IF(CLK240'EVENTANDCLK240='1')THEN

CLK120<=NOTCLK120;

ENDIF;

ENDPROCESS;

PROCESS(CLK120)--LOAD_CLK1100分频得到CODERATE码元速率1.2KHz

BEGIN

IF(CLK120'EVENTANDCLK120='1')THEN

IF(COUNT50=49)THEN

COUNT50<=0;

CODERATE<=NOTCODERATE;

ELSECOUNT50<=COUNT50+1;

ENDIF;

ENDIF;

ENDPROCESS;

M_SEQUENCE_FORM:

--产生"1110010"m序列

PROCESS(CODERATE)

BEGIN

IF(CODERATE'EVENTANDCODERATE='1')THEN

M(0)<=M

(1);--实现移位功能

M

(1)<=M

(2);

ENDIF;

ENDPROCESS;

PROCESS(CODERATE)

BEGIN

IF(CODERATE'EVENTANDCODERATE='1')THEN

M

(2)<=(M

(1)XORM(0))OR(NOT(M(0)ORM

(1)ORM

(2)));--逻辑表达式跟上面的移位功能产生m的随机序列“1110010”

ENDIF;

ENDPROCESS;

M_CODE<=M(0);

PROCESS(MODE,CLK240,CLK120,M_CODE)

BEGIN

IF(MODE='0'ANDM_CODE='0')THENSINCLK<=CLK120;

ELSESINCLK<=CLK240;--选择正弦信号波产生器的时钟频率

ENDIF;

ENDPROCESS;

JUMP_HIGH<=(NOTTEMP)ANDM_CODE;--0到1跳变

JUMP_LOW<=(NOTM_CODE)ANDTEMP;--1到0跳变

PROCESS(SINCLK)--2FSK与2PSK对跳变的不同处理

BEGIN

IF(SINCLK'EVENTANDSINCLK='1')THEN

TEMP<=M_CODE;

IF((COUNT100=99)OR(JUMP_HIGH='1'))THENCOUNT100<=0;--波形输出

ELSIF((JUMP_LOW='1')AND(MODE='1'))THENCOUNT100<=50;

ELSECOUNT100<=COUNT100+1;

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(COUNT100)--产生sin周期波形的1个周期内的100个样点值

BEGIN

CASECOUNT100IS

when0=>value<="01111111";

when1=>value<="10000111";

when2=>value<="10001111";

when3=>value<="10010111";

when4=>value<="10011111";

when5=>value<="10100110";

when6=>value<="10101110";

when7=>value<="10110101";

when8=>value<="10111100";

when9=>value<="11000011";

when10=>value<="11001010";

when11=>value<="11010000";

when12=>value<="11010110";

when13=>value<="11011100";

when14=>value<="11100001";

when15=>value<="11100110";

when16=>value<="11101011";

when17=>value<="11101111";

when18=>value<="11110010";

when19=>value<="11110110";

when20=>value<="11111000";

when21=>value<="11111010";

when22=>value<="11111100";

when23=>value<="11111101";

when24=>value<="11111110";

when25=>value<="11111111";

when26=>value<="11111110";

when27=>value<="11111101";

when28=>value<="11111100";

when29=>value<="11111010";

when30=>value<="11111000";

when31=>value<="11110110";

when32=>value<="11110010";

when33=>value<="11101111";

when34=>value<="11101011";

when35=>value<="11100110";

when36=>value<="11100001";

when37=>value<="11011100";

when38=>value<="11010110";

when39=>value<="11010000";

when40=>value<="11001010";

when41=>value<="11000011";

when42=>value<="10111100";

when43=>value<="10110101";

when44=>value<="10101110";

when45=>value<="10100110";

when46=>value<="10011111";

when47=>value<="10010111";

when48=>value<="10001111";

when49=>value<="10000111";

when50=>value<="01111111";

when51=>value<="01110111";

when52=>value<="01101111";

when53=>value<="01100111";

when54=>value<="01011111";

when55=>value<="01011000";

when56=>value<="01010000";

when57=>value<="01001001";

when58=>value<="01000010";

when59=>value<="00111011";

when60=>value<="00110100";

when61=>value<="00101110";

when62=>value<="00101000";

when63=>value<="00100010";

when64=>value<="00011101";

when65=>value<="00011000";

when66=>value<="00010011";

when67=>value<="00001111";

when68=>value<="00001100";

when69=>value<="00001000";

when70=>value<="00000110";

when71=>value<="00000100";

when72=>value<="00000010";

when73=>value<="00000001";

when74=>value<="00000000";

when75=>value<="00000000";

when76=>value<="00000000";

when77=>value<="00000001";

when78=>value<="00000010";

when79=>value<="00000100";

when80=>value<="00000110";

when81=>value<="00001000";

when82=>value<="00001100";

when83=>value<="00001111";

when84=>value<="00010011";

when85=>value<="00011000";

when86=>value<="00011101";

when87=>value<="00100010";

when88=>value<="00101000";

when89=>value<="00101110";

when90=>value<="00110100";

when91=>value<="00111011";

when92=>value<="01000010";

when93=>value<="01001001";

when94=>value<="01010000";

when95=>value<="01011000";

when96=>value<="01011111";

when97=>value<="01100111";

when98=>value<="01101111";

when99=>value<="01110111";

whenothers=>NULL;

ENDCASE;

ENDPROCESS;

ENDPSKFSK_ARCH;

 

5、参考资料

[1]褚振勇,齐亮.FPGA设计及应用[M].西安:

西安电子科技大学出版社,2006.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1