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

📄 pskfsk.vhd

📁 it is a program of FSK AND PSK
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.std_logic_unsigned.all;
USE IEEE.std_logic_arith.all;

ENTITY PSKFSK IS
PORT(CLOCK:IN STD_LOGIC;       --正弦波发生器时钟
     MODE:IN STD_LOGIC;        --0:FSK;1:PSK
     CLK240: buffer STD_LOGIC;     --用于产生一个2.4kHz的正弦波信号
     CLK120: buffer STD_LOGIC;     --用于产生一个1.2kHz的正弦波信号
     VALUE: out std_logic_vector (7 DOWNTO 0);  --正弦波的采样点峰值
     M_CODE:BUFFER STD_LOGIC);   --输出m序列
END PSKFSK;

ARCHITECTURE PSKFSK_ARCH OF PSKFSK IS
  SIGNAL COUNT100:INTEGER RANGE 0 TO 99;   --记录100个状态
  SIGNAL COUNT50: INTEGER RANGE 0 TO 49;   --记录50个状态
  SIGNAL COUNT: INTEGER RANGE 1 TO 10;     --记录10个状态,实现12M分频到240kHz得到CLK240时钟信号
  SIGNAL SINCLK,CODERATE: STD_LOGIC;       --正弦波信号的频率以及随机序列的编码速率
  SIGNAL TEMP,JUMP_HIGH,JUMP_LOW: STD_LOGIC;  --0,1跳变标志
  SIGNAL M: std_logic_vector (2 DOWNTO 0);    --m序列
-------------------------------------------------------------------
-------------------------------------------------------------------
BEGIN
PROCESS(CLOCK)                --分频为240KHz的CLK240信号
   BEGIN
    IF (CLOCK'EVENT AND CLOCK = '1') THEN 
         IF (COUNT = 10) THEN 
            COUNT<=1;             --计数满时计数回复初值
            CLK240<=NOT CLK240;  --输出时钟翻转一次
         ELSIF (COUNT=5) THEN  
               COUNT<=COUNT+1;
               CLK240 <= NOT CLK240;--输出时钟翻转一次
         ELSE COUNT<=COUNT+1;
         END IF;
    END IF;
END PROCESS;

PROCESS(CLK240)                --分频为120KHz的CLK120信号
   BEGIN
    IF (CLK240'EVENT AND CLK240 = '1') THEN 
          CLK120<=NOT CLK120;
    END IF;

END PROCESS;

PROCESS(CLK120)    --LOAD_CLK1 100分频得到CODERATE码元速率1.2kHz
BEGIN
  IF (CLK120'EVENT AND CLK120= '1') THEN
    IF(COUNT50=49) THEN
       COUNT50<=0;
       CODERATE<=NOT CODERATE;
    ELSE COUNT50<=COUNT50+1;
    END IF;
   END IF;
END PROCESS;

M_SEQUENCE_FORM:    --产生"1110010"m序列
PROCESS(CODERATE)
BEGIN
  IF(CODERATE'EVENT AND CODERATE= '1') THEN
    M(0)<=M(1);     --实现移位功能
    M(1)<=M(2);
  END IF;
END PROCESS;

PROCESS(CODERATE)
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)));   --逻辑表达式跟上面的移位功能产生m的随机序列“1110010”
  END IF;
END PROCESS;

M_CODE<=M(0);

PROCESS(MODE,CLK240,CLK120,M_CODE)
BEGIN
  IF (MODE='0' AND M_CODE='0') THEN SINCLK<=CLK120;
  ELSE SINCLK<=CLK240;      --选择正弦信号波产生器的时钟频率
  END IF;
END PROCESS;

JUMP_HIGH<=(NOT TEMP) AND M_CODE;  --0到1跳变
JUMP_LOW<=(NOT M_CODE) AND TEMP;   --1到0跳变

PROCESS(SINCLK)     --2FSK与2PSK对跳变的不同处理
BEGIN
  IF(SINCLK'EVENT AND SINCLK= '1') THEN
   TEMP<=M_CODE;
   IF((COUNT100=99) OR (JUMP_HIGH='1')) THEN COUNT100<=0;   --波形输出
   ELSIF((JUMP_LOW='1') AND (MODE='1')) THEN COUNT100<=50;
   ELSE COUNT100<=COUNT100+1;
   END IF;
  END IF;
END PROCESS;

PROCESS(COUNT100)     --产生sin周期波形的1个周期内的100个样点值
BEGIN
  CASE COUNT100 IS
    when 0=>value<="01111111";  
    when 1=>value<="10000111";
    when 2=>value<="10001111"; 
    when 3=>value<="10010111";
    when 4=>value<="10011111";  
    when 5=>value<="10100110";
    when 6=>value<="10101110";  
    when 7=>value<="10110101";
    when 8=>value<="10111100";  
    when 9=>value<="11000011";
    when 10=>value<="11001010";  
    when 11=>value<="11010000";
    when 12=>value<="11010110";  
    when 13=>value<="11011100";
    when 14=>value<="11100001";  
    when 15=>value<="11100110";
    when 16=>value<="11101011";  
    when 17=>value<="11101111";
    when 18=>value<="11110010";  
    when 19=>value<="11110110";
    when 20=>value<="11111000";  
    when 21=>value<="11111010";
    when 22=>value<="11111100";  
    when 23=>value<="11111101";
    when 24=>value<="11111110";  
    when 25=>value<="11111111";
    when 26=>value<="11111110";  
    when 27=>value<="11111101";
    when 28=>value<="11111100";  
    when 29=>value<="11111010";
    when 30=>value<="11111000";  
    when 31=>value<="11110110";
    when 32=>value<="11110010";  
    when 33=>value<="11101111";
    when 34=>value<="11101011";  
    when 35=>value<="11100110";
    when 36=>value<="11100001";  
    when 37=>value<="11011100";
    when 38=>value<="11010110";  
    when 39=>value<="11010000";
    when 40=>value<="11001010";  
    when 41=>value<="11000011";
    when 42=>value<="10111100";  
    when 43=>value<="10110101";
    when 44=>value<="10101110";  
    when 45=>value<="10100110";
    when 46=>value<="10011111";  
    when 47=>value<="10010111";
    when 48=>value<="10001111";  
    when 49=>value<="10000111";
    when 50=>value<="01111111";  
    when 51=>value<="01110111";
    when 52=>value<="01101111";  
    when 53=>value<="01100111";
    when 54=>value<="01011111";  
    when 55=>value<="01011000";
    when 56=>value<="01010000";  
    when 57=>value<="01001001";
    when 58=>value<="01000010";  
    when 59=>value<="00111011";
    when 60=>value<="00110100";  
    when 61=>value<="00101110";
    when 62=>value<="00101000";  
    when 63=>value<="00100010";
    when 64=>value<="00011101";  
    when 65=>value<="00011000";
    when 66=>value<="00010011";  
    when 67=>value<="00001111";
    when 68=>value<="00001100";  
    when 69=>value<="00001000";
    when 70=>value<="00000110";  
    when 71=>value<="00000100";
    when 72=>value<="00000010";  
    when 73=>value<="00000001";
    when 74=>value<="00000000";  
    when 75=>value<="00000000";
    when 76=>value<="00000000";  
    when 77=>value<="00000001";
    when 78=>value<="00000010";  
    when 79=>value<="00000100";
    when 80=>value<="00000110";  
    when 81=>value<="00001000";
    when 82=>value<="00001100";  
    when 83=>value<="00001111";
    when 84=>value<="00010011";  
    when 85=>value<="00011000";
    when 86=>value<="00011101";  
    when 87=>value<="00100010";
    when 88=>value<="00101000";  
    when 89=>value<="00101110";
    when 90=>value<="00110100";  
    when 91=>value<="00111011";
    when 92=>value<="01000010";  
    when 93=>value<="01001001";
    when 94=>value<="01010000";  
    when 95=>value<="01011000";
    when 96=>value<="01011111";  
    when 97=>value<="01100111";
    when 98=>value<="01101111";  
    when 99=>value<="01110111";
    when others=>NULL;
      END CASE;
END PROCESS;

END PSKFSK_ARCH;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -