首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]求fsk 调制解调的vhdl设计原理

[求助]求fsk 调制解调的vhdl设计原理

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

qq: 8405 64831 msn: winovs@live.cn

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

这个版主不太冷 =========================== 我的中电网博客:http://blog.chinaecnet.com/u/20/index.htm

start开始解调信号如何产生呢?

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

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

qq: 8405 64831 msn: winovs@live.cn
port(clk :in std_logic; --系统时钟
base_input : in std_logic; --基带信号
start :in std_logic; --开始调制信号
fsk_output : out std_logic); --调制信号
其中编程方式采用同步时序设计,clk为同步时钟。
这个版主不太冷 =========================== 我的中电网博客:http://blog.chinaecnet.com/u/20/index.htm
返回列表