⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpdpsk.vhd

📁 FSK/PSK调制顶层文件
💻 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 + -