?? fpdpsk.vhd
字號:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
entity fpdpsk is
port(clock:in STD_LOGIC;
mode:in STD_LOGIC;
data:out STD_LOGIC_vector(7 downto 0)
);
end fpdpsk;
architecture fpdpsk_arch of fpdpsk is
signal count100:std_logic_vector(6 downto 0); --100計數
signal count50:std_logic_vector(5 downto 0); --50計數
signal code:std_logic;
signal serial_clk:std_logic; --串行時鐘
signal load_clk:std_logic; --10分頻
signal load_clk1:std_logic;
signal count:std_logic_vector(3 downto 0);
signal value:std_logic_vector(7 downto 0);
signal sinclk,coderate:std_logic;
signal temp,jump_high,jump_low:std_logic;
signal m:std_logic_vector(2 downto 0);
begin
process(clock)
begin
if(clock'event and clock='1') then
count<=count+'1';
if(count<"1010") then --10分頻
load_clk<='1';
else load_clk<='0';
end if;
end if;
end process;
serial_clk<=clock and load_clk;
process(serial_clk)
begin
if(serial_clk'event and serial_clk='1') then
data<=value; --串行位
end if;
end process;
process(load_clk)
begin
if(load_clk'event and load_clk='1') then
load_clk1<=not load_clk1; --倒相
end if;
end process;
process(load_clk1) --10分頻
begin
if(load_clk1'event and load_clk1='1') then
if(count50="110001") then
count50<="000000";
coderate<=not coderate;
else count50<=count50+'1';
end if;
end if;
end process;
------------------------- m序列產生器-------------------
m_sequence_form:
process(coderate) --兩個反饋抽頭
begin
if(coderate'event and coderate='1') then
m(0)<=m(1);
m(1)<=m(2);
end if;
end process;
process(coderate) --"1110010"循環序列
begin
if(coderate'event and coderate='1') then
m(2)<=(m(1) xor m(0)) or (not (m(0) or m(1) or m(2)));
end if;
end process;
code<=m(0);
------------------------- 多路選擇器-------------------
process(mode,load_clk1,load_clk,code)
begin
if(mode='0' and code='0')
then
sinclk<=load_clk1; --頻率選擇
else
sinclk<=load_clk;
end if;
end process;
jump_high<=(not temp) and code;
jump_low<=(not code) and temp;
------------------------- 正弦波產生器-------------------
process(sinclk)
begin
if(sinclk'event and sinclk='1') then
temp<=code;
if((count100="1100011") or (jump_high='1'))
then count100<="0000000";
else if((jump_low='1') and (mode='1'))
then count100<="0110010";
else count100<=count100+'1';
end if;
end if;
end if;
end process;
process(count100) --狀態機方式
begin
case count100 is
when"0000000"=>
value<="01111111";
when"0000001"=>
value<="10000111";
when"0000010"=>
value<="10001111";
when"0000011"=>
value<="10010111";
when"0000100"=>
value<="10011111";
when"0000101"=>
value<="10100110";
when"0000110"=>
value<="10101110";
when"0000111"=>
value<="10110101";
when"0001000"=>
value<="10111100";
when"0001001"=>
value<="11000011";
when"0001010"=>
value<="11001010";
when"0001011"=>
value<="11010000";
when"0001100"=>
value<="11010110";
when"0001101"=>
value<="11011100";
when"0001110"=>
value<="11100001";
when"0001111"=>
value<="11100110";
when"0010000"=>
value<="11101011";
when"0010001"=>
value<="11101111";
when"0010010"=>
value<="11110010";
when"0010011"=> --第20個狀態
value<="11110110";
when"0010100"=>
value<="11111000";
when"0010101"=>
value<="11111010";
when"0010110"=>
value<="11111100";
when"0010111"=>
value<="11111101";
when"0011000"=>
value<="11111110";
when"0011001"=>
value<="11111111";
when"0011010"=>
value<="11111110";
when"0011011"=>
value<="11111101";
when"0011100"=>
value<="11111100";
when"0011101"=>
value<="11111010";
when"0011110"=>
value<="11111000";
when"0011111"=>
value<="11110110";
when"0100000"=>
value<="11110010";
when"0100001"=>
value<="11101111";
when"0100010"=>
value<="11101011";
when"0100011"=>
value<="11100110";
when"0100100"=>
value<="11100001";
when"0100101"=>
value<="11011100";
when"0100110"=>
value<="11010110";
when"0100111"=> --第40個狀態
value<="11010000";
when"0101000"=>
value<="11001010";
when"0101001"=>
value<="11000011";
when"0101010"=>
value<="10111100";
when"0101011"=>
value<="10110101";
when"0101100"=>
value<="10101110";
when"0101101"=>
value<="10100110";
when"0101110"=>
value<="10011111";
when"0101111"=>
value<="10010111";
when"0110000"=>
value<="10001111";
when"0110001"=>
value<="10000111";
when"0110010"=>
value<="01111111";
when"0110011"=>
value<="01110111";
when"0110100"=>
value<="01101111";
when"0110101"=>
value<="01100111";
when"0110110"=>
value<="01011111";
when"0110111"=>
value<="01011000";
when"0111000"=>
value<="01010000";
when"0111001"=>
value<="01001001";
when"0111010"=>
value<="01000010";
when"0111011"=> --第60個狀態
value<="00111011";
when"0111100"=>
value<="00110100";
when"0111101"=>
value<="00101110";
when"0111110"=>
value<="00101000";
when"0111111"=>
value<="00100010";
when"1000000"=>
value<="00011101";
when"1000001"=>
value<="00011000";
when"1000010"=>
value<="00010011";
when"1000011"=>
value<="00001111";
when"1000100"=>
value<="00001100";
when"1000101"=>
value<="00001000";
when"1000110"=>
value<="00000110";
when"1000111"=>
value<="00000100";
when"1001000"=>
value<="00000010";
when"1001001"=>
value<="00000001";
when"1001010"=>
value<="00000000";
when"1001011"=>
value<="00000000";
when"1001100"=>
value<="00000000";
when"1001101"=>
value<="00000001";
when"1001110"=>
value<="00000010";
when"1001111"=> --第80個狀態
value<="00000100";
when"1010000"=>
value<="00000110";
when"1010001"=>
value<="00001000";
when"1010010"=>
value<="00001100";
when"1010011"=>
value<="00001111";
when"1010100"=>
value<="00010011";
when"1010101"=>
value<="00011000";
when"1010110"=>
value<="00011101";
when"1010111"=>
value<="00100010";
when"1011000"=>
value<="00101000";
when"1011001"=>
value<="00101110";
when"1011010"=>
value<="00110100";
when"1011011"=>
value<="00111011";
when"1011100"=>
value<="01000010";
when"1011101"=>
value<="01001001";
when"1011110"=>
value<="01010000";
when"1011111"=>
value<="01011000";
when"1100000"=>
value<="01011111";
when"1100001"=>
value<="01100111";
when"1100010"=>
value<="01101111";
when"1100011"=> --第100個狀態
value<="01110111";
when
others=>null;
end case;
end process;
end fpdpsk_arch;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -