Board logo

标题: [求助]求fsk 调制解调的vhdl设计原理 [打印本页]

作者: winovs    时间: 2008-1-23 21:12     标题: [求助]求fsk 调制解调的vhdl设计原理

哪位大侠能否提供帮忙!先谢谢了。


作者: caopengly    时间: 2008-1-24 12:31

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编辑过]


作者: winovs    时间: 2008-1-24 15:21     标题: start开始解调信号如何产生呢?

非常感谢斑竹!有个问题想请教您,

上面的调制解调采用的是同步传输方式,start是同步信号对吧?


作者: caopengly    时间: 2008-1-24 17:27

port(clk :in std_logic; --系统时钟
base_input : in std_logic; --基带信号
start :in std_logic; --开始调制信号
fsk_output : out std_logic); --调制信号
其中编程方式采用同步时序设计,clk为同步时钟。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0