📄 pskfsk.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 + -