正弦信号的输入时钟)。基准时钟由一个12 MHz的晶振提供。设计中要求一个50分频(产生240 kHz信号),再2分频(产生120 kHz信号)和100分频(产生1.2 kHz信号),共有三个分频值。
(2).m序列产生器
m序列是伪随机序列的一种,它的显著特点是:随机特性,预先可确定性,循环特性。正因为这些特性,使得m序列产生器在通信领域得到了广泛的应用。
这里用一种带有两个反馈抽头的3级反馈移位寄存器,得到一串“1110010”循环序列,并采取措施防止进入全“0”状态。通过更换时钟频率可以方便地改变输入码元的速率。m序列产生器的电路结构如图3所示。
或门异或门或非门1.2 kHz时钟信号DCLKQDCLKQDCLKQ
图3 m序列产生器
m序列产生器电路结构 (3).跳变检测
将跳变检测引入正弦波的产生中,可以使每次基带码元上升沿或下降沿到来时,对应输出波形位于正弦波形的sin0处。引入跳变检测主要是为了便于观察,确保示波器上显示为一个连续的波形。
基带信号的跳变检测可以有很多方法,图4为一种便于在可编程逻辑器件中实现的方案。
基带码异或门D时钟信号CLK图4 信号跳变检测电路
跳变输出Q (4).2:1数据选择器
2:1数据选择器用于选择正弦波产生器的两个输入时钟。一个时钟的频率为120 kHz,此时正弦波产生器产生一个1.2 kHz的正弦波,代表数字信号“0”;另一个时钟的频率为240 kHz,此时产生一个2.4 kHz的正弦波信号,代表数字信号“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.2 kHz,“1”对应2.4 kHz,此二载波的频率可以方便地通过软件修改。 3、对仿真结果进行分析
2FSK的总体波形如图5所示,其中CLOCK为正弦波发生器时钟MODE表示0:2FSK;1:2PSK,CLK120为用于产生一个1.2KHz的正弦波信号,CLK240为用于产生一个2.4KHz的正弦波信号,VALUE为正弦波的采样点峰值,M_MODE为输出m序列。
图5 2FSK仿真波形图
下图6所示为产生的2FSK波形,可以明显地看到在M_MODE跳变前后VALUE的码元宽度相差一倍,实现了2FSK的频率变化来传递数字信息,即120KHz表示信号“0”,240KHz表示信号“1”。
图6 2FSK仿真波形图
下图3-6可以看出传递信号“1”的波形密度明显比传递信号“0”的波形密度高。
图7 2FSK仿真波形图
2FSK的信号传递频率从下图8中可以看出为240KHz,信号“1”和“0”的跳变是通过相位的改变来实现的。
图8 2FSK仿真波形图
4、具体程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all; USE IEEE.std_logic_unsigned.all; USE IEEE.std_logic_arith.all; ENTITY PSKFSK IS
PORT(CLOCK:IN STD_LOGIC; --正弦波发生器时钟 MODE:IN STD_LOGIC; --0:FSK;1:PSK
CLK240: buffer STD_LOGIC; --用于产生一个2.4KHz的正弦波信号 CLK120: buffer STD_LOGIC; --用于产生一个1.2KHz的正弦波信号 VALUE: out std_logic_vector (7 DOWNTO 0); --正弦波的采样点峰值 M_CODE:BUFFER STD_LOGIC); --输出m序列 END PSKFSK;
ARCHITECTURE PSKFSK_ARCH OF PSKFSK IS
SIGNAL COUNT100:INTEGER RANGE 0 TO 99; --记录100个状态 SIGNAL COUNT50: INTEGER RANGE 0 TO 49; --记录50个状态
SIGNAL COUNT: INTEGER RANGE 1 TO 10; --记录10个状态,实现12M分频到240KHz得到CLK240时钟信号
SIGNAL SINCLK,CODERATE: STD_LOGIC; --正弦波信号的频率以及随机序列的编码速率
SIGNAL TEMP,JUMP_HIGH,JUMP_LOW: STD_LOGIC; --0,1跳变标志 SIGNAL M: std_logic_vector (2 DOWNTO 0); --m序列 BEGIN
PROCESS(CLOCK) --分频为240KHz的CLK240信号 BEGIN
IF (CLOCK'EVENT AND CLOCK = '1') THEN IF (COUNT = 10) THEN
COUNT<=1; --计数满时计数回复初值 CLK240<=NOT CLK240; --输出时钟翻转一次 ELSIF (COUNT=5) THEN
相关推荐: