FSK调制与解调

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

【实验目的】

1、熟悉fsk调制与解调;

2、熟悉fpga;

3、熟悉编码与解码。

【实验原理】

信道

编码

调制

数模转换

四位一位一位一位

解码

解调

模数转换

五位一位一位

本次实验利用实验板实现了一个fsk通信系统。从按键输入一组四位码元,经过fpga编码后,形成8位码元。在这八位中,前三位固定为110,在解码时用来识别一帧的开头。最后加了一位奇偶校验。这八位在编码后,串行输出到调制部分。调制部分的调制方式是fsk调制。调制完成后,输出到数模转换部分。数模转换与模数转换部分相连,然后输出到解调部分。解调后,输出到解码部分。串行输入的码元被解码后,输出到指示灯。同时输出到指示灯的还有一位,用来指示是否接收到的信号是否有错。

【实验内容】

总框图如下:

1、调制

调制部分框图如下

RAGMO与RAGMO2是两个分频器,代码相似,只是分频数有差别。如下代码中黑体处根据系统需要更改。实际系统中,两个频率为700Hz、300Hz左右。

-- MAX+plus II VHDL Template

-- Clearable loadable enablable counter

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY ragmo IS

PORT

(

clk_input : IN STD_LOGIC;

output : BUFFER STD_LOGIC

);

END ragmo;

ARCHITECTURE a OF ragmo IS

SIGNAL hgame : INTEGER RANGE 0 TO 1023;

BEGIN

PROCESS (clk_input)

BEGIN

IF (clk_input'EVENT AND clk_input='1') THEN

hgame <= hgame + 1;

IF hgame = 1023 THEN

output <= NOT output;

END IF;

END IF;

END PROCESS;

END a;

2、解调

解调部分框图如下

RAGDEMO模块是解调的主要部分,源代码附于后面。该模块对输入信号经过A/D转换后的结果进行检测,记录其过零点并计数,按照调制部分的设置,每8192个时钟内若有大于3个过零点(仅指由负变正的过零点),便认为是高频信号,输出1;反之则输出0。

该电路图的其它部分为芯片ADC0804的接线:CLK接640KHz左右时钟,在实验中以RAGMO0对VCO输出的1.3MHz方波进行2分频得到;8位ADC输出接入上述的解调模块;R\D\ 脚接地,表示可读;INTR脚接W\R\ 脚,构成自激模式工作状态,即每进行完一次转换,就输出一次结果,但结果输出的频率不定。这种方法的优点是转换速度能做到尽可能快,缺点是不易控制。经检验,以信号发生器输入正弦信号,当频率大于540Hz时输出1,小于430Hz时输出0,在中间时闪烁不定。

附:RAGDEMO模块的源代码:

-- MAX+plus II VHDL Template

-- Clearable loadable enablable counter

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY ragdemo IS

PORT

(

adcin : IN INTEGER RANGE 0 TO 255;

clrnin : IN STD_LOGIC;

clkin : IN STD_LOGIC;

demout : OUT STD_LOGIC

);

END ragdemo;

ARCHITECTURE a OF ragdemo IS

SIGNAL countsig : INTEGER RANGE 0 TO 8191;

SIGNAL positsig : STD_LOGIC;

SIGNAL zerosig : INTEGER RANGE 0 TO 15; BEGIN

PROCESS (clkin, clrnin)

BEGIN

IF clrnin = '0' THEN

countsig <= 0;

zerosig<=0;

positsig <='1';

ELSIF (clkin'EVENT AND clkin = '1') THEN

countsig <= countsig + 1;

IF (countsig=8191 AND zerosig>3) THEN

demout<='1';

zerosig<=0;

ELSIF (countsig=8191 AND zerosig<3) THEN

demout<='0';

zerosig<=0;

ELSIF (adcin<128 AND positsig='1') THEN

zerosig <= zerosig+1;

positsig <='0';

ELSIF adcin>129 AND positsig='0' THEN

positsig <='1';

END IF;

END IF;

相关文档
最新文档