fsk调制解调应该不难。关键是对1和0信号对应的不同频率的波形的产生,下面的程序是通过对clk分频产生的,当然也可以通过dds来产生。仅供参考。 --文件名:fsk_code --功能:对基带信号进行FSK编码调制 --刘福奇最后修改日期:2006.8.16 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fsk_code is port(clk :in std_logic; --系统时钟 base_input : in std_logic; --基带信号 start :in std_logic; --开始调制信号 fsk_output : out std_logic); --调制信号 end fsk_code; architecture behav of fsk_code is signal cntf1:integer range 0 to 11; --载波信号f1的分频计数器 signal cntf2: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 cntf1<=0; elsif cntf1=5 then f1<='1';cntf1<=cntf1+1; --改变q1后面的数字可以改变,载波f1的占空比 elsif cntf1=11 then f1<='0';cntf1<=0; --改变q1后面的数字可以改变,载波f1的频率 else cntf1<=cntf1+1; end if; end if; end process; process(clk) --此进程通过对系统时钟clk的分频,得到载波f2 begin if clk'event and clk='1' then if start='0' then cntf2<=0; elsif cntf2=1 then f2<='1';cntf2<=cntf2+1; --改变q2后面的数字可以改变,载波f2的占空比 elsif cntf2=3 then f2<='0';cntf2<=0; --改变q2后面的数字可以改变,载波f2的频率 else cntf2<=cntf2+1; end if; end if; end process; process(clk) --此进程完成对基带信号的FSK调制 begin if clk'event and clk='1' then if base_input='0' then fsk_output<=f1; --当输入的基带信号base_input='0'时,输出的调制信号fsk_output为f1 else fsk_output<=f2; --当输入的基带信号base_input='1'时,输出的调制信号fsk_output为f2 end if; end if; end process; end behav;
--文件名:fsk_decode --功能:对FSK调制信号进行解调 --刘福奇最后修改日期:2006.8.16 library ieee; use ieee.std_logic_arith.all; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fsk_decode is port(clk :in std_logic; --系统时钟 start :in std_logic; --解调开始信号. fsk_input :in std_logic; --调制信号输入 base_output ut std_logic); --解调后基带信号输出 end fsk_decode; architecture behav of fsk_decode is signal cnt:integer range 0 to 11; --系统时钟计数器. signal data_reg:std_logic; --寄存器 signal rising_cnt:integer range 0 to 6; --FSK信号的上升沿计数器 begin process(clk) --对系统时钟进行cnt分频 begin if clk'event and clk='1' then data_reg <= fsk_input; --在clk信上升沿时,对输入信号进行寄存. if start='0' then cnt<=0; --if语句完成cnt的循环计数 elsif cnt=11 then cnt<=0; else cnt<=cnt+1; end if; end if; end process; process(cnt,rising_cnt,clk) --此进程完成FSK解调 begin if clk'event and clk='1' then if cnt=9 then if rising_cnt>=2 then base_output<='1'; --if语句通过对rising_cnt大小,来判决base_output输出的电平 else base_output<='0'; end if; end if; end if; end process; process(data_reg,cnt) --此进程完成FSK解调 begin if cnt=11 then rising_cnt<=0; --rising_cnt计数器清零 elsif data_reg'event and data_reg = '1' then rising_cnt<=rising_cnt+1; --计data_reg信号的脉冲个数 end if; end process; end behav;
[此贴子已经被作者于2008-1-24 12:39:16编辑过] |