FSK调制与解调
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;