8.10 FSK調制與解調VHDL程序 1. FSK調制VHDL程序 --文件名:PL_FSK --功能:基于VHDL硬件描述語言,對基帶信號進行FSK調制 --最后修改日期: library ieee; use ieee.std_logic_arith.all; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity PL_FSK is port(clk :in std_logic; --系統(tǒng)時鐘 start :in std_logic; --開始調制信號 x :in std_logic; --基帶信號 y :out std_logic); --調制信號 end PL_FSK; architecture behav of PL_FSK is signal q1:integer range 0 to 11; --載波信號f1的分頻計數(shù)器 signal q2:integer range 0 to 3; --載波信號f2的分頻計數(shù)器 signal f1,f2:std_logic; --載波信號f1,f2 begin process(clk) --此進程通過對系統(tǒng)時鐘clk的分頻,得到載波f1 begin if clk'event and clk='1' then if start='0' then q1<=0; elsif q1<=5 then f1<='1';q1<=q1+1; --改變q1后面的數(shù)字可以改變,載波f1的占空比 elsif q1=11 then f1<='0';q1<=0; --改變q1后面的數(shù)字可以改變,載波f1的頻率 else f1<='0';q1<=q1+1; end if; end if; end process; process(clk) --此進程通過對系統(tǒng)時鐘clk的分頻,得到載波f2 begin if clk'event and clk='1' then if start='0' then q2<=0; elsif q2<=0 then f2<='1';q2<=q2+1; --改變q2后面的數(shù)字可以改變,載波f2的占空比 elsif q2=1 then f2<='0';q2<=0; --改變q2后面的數(shù)字可以改變,載波f2的頻率 else f2<='0';q2<=q2+1; end if; end if; end process; process(clk,x) --此進程完成對基帶信號的FSK調制 begin if clk'event and clk='1' then if x='0' then y<=f1; --當輸入的基帶信號x=‘0’時,輸出的調制信號y為f1 else y<=f2; --當輸入的基帶信號x=‘1’時,輸出的調制信號y為f2 end if; end if; end process; end behav; 1. FSK解調VHDL程序 --文件名:PL_FSK2 --功能:基于VHDL硬件描述語言,對FSK調制信號進行解調 --最后修改日期: library ieee; use ieee.std_logic_arith.all; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity PL_FSK2 is port(clk :in std_logic; --系統(tǒng)時鐘 start :in std_logic; --同步信號 x :in std_logic; --調制信號 y :out std_logic); --基帶信號 end PL_FSK2; architecture behav of PL_FSK2 is signal q:integer range 0 to 11; --分頻計數(shù)器 signal xx:std_logic; --寄存器 signal m:integer range 0 to 5; --計數(shù)器 begin process(clk) --對系統(tǒng)時鐘進行q分頻 begin if clk'event and clk='1' then xx<=x; --在clk信上升沿時,x信號對中間信號xx賦值 if start='0' then q<=0; --if語句完成Q的循環(huán)計數(shù) elsif q=11 then q<=0; else q<=q+1; end if; end if; end process; process(xx,q) --此進程完成FSK解調 begin if q=11 then m<=0; --m計數(shù)器清零 elsif q=10 then if m<=3 then y<='0'; --if語句通過對m大小,來判決y輸出的電平 else y<='1'; end if; elsif xx'event and xx='1'then m<=m+1; --計xx信號的脈沖個數(shù) end if; end process; end behav
|