📄 f50k.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
---------------------------------------------------
entity f50k is
port (
clk : in STD_LOGIC ; --输入时钟
reset: in std_logic; --调制复位端
qout : out std_logic_vector(7 downto 0) --已调输出
);
end f50k;
---------------------------------------------------
architecture behav of f50k is
constant k : integer :=5; --相位增量赋值
signal c0,c1,c2,c3,q : std_logic; --m序列移位寄存器
signal reg,contl : std_logic; --串并转换中间寄存器
signal m,m_reg : std_logic_vector(1 downto 0); --调制信号暂存器
signal a,b : std_logic; --相邻两个码元变化标志信号
signal y1 : std_logic_vector(13 downto 0); --10000分频寄存器
signal y2 : std_logic_vector(4 downto 0); --40分频寄存器
signal clk1,clk2 : std_logic; --分频后的时钟脉冲
BEGIN
----------------------------------------------------
process(clk) --10000分频电路,产生m序列时钟
begin
if clk'event and clk='1' then
if reset='1' then
y1<="01001110000111";
clk1<='0';
else
if y1=4999 then
y1<="00000000000000";
clk1<=not clk1;
else
y1<=y1+1;
clk1<=clk1;
end if;
end if;
end if;
end process;
----------------------------------------------------
process(clk) --20分频电路,产生调制时钟
begin
if clk'event and clk='1' then
if reset='1' then
y2<="01001";
clk2<='0';
else
if y2=9 then
y2<="00000";
clk2<=not clk2;
else
y2<=y2+1;
clk2<=clk2;
end if;
end if;
end if;
end process;
----------------------------------------------------
process(clk1) --m序列产生器"1110010"
begin
if reset='1' then
c3<='1';
c2<='0';
c1<='0';
q<=c3;
else
if clk1'event and clk1='1' then
c1<=(c2 xor c3);
c2<=c1;
c3<=c2;
q<=c3;
end if;
end if;
end process;
-----------------------------------------------------
process(clk1,q) --串并转换电路
begin
if clk1'event and clk1='1' then
if contl='1' then
contl<='0';
m(1)<=reg;
m(0)<=q;
else
contl<='1';
reg<=q;
end if;
end if;
end process;
-----------------------------------------------------
process(clk2) --双比特码元送入暂存器
begin
if clk2'event and clk2='1' then
m_reg<=m;
end if;
end process;
-----------------------------------------------------
process(clk2) --当前码元与上一个码元相比较,产生标志信号
begin
if clk2'event and clk2='1' then
if m=m_reg then
a<='0';
else
a<='1';
end if;
end if;
end process;
-----------------------------------------------------
process(clk2,reset,m) --调制电路
variable temp: integer range -199 to 199;
begin
if reset='1' then
temp:=125;
else
if clk2'event and clk2='1' then
b<=a;
if m="11" and b='1' then
temp:=25-k;
b<='0';
elsif m="01" and b='1' then
temp:=75-k;
b<='0';
elsif m="00" and b='1' then
temp:=125-k;
b<='0';
elsif m="10" and b='1' then
temp:=175-k;
b<='0';
end if;
if (temp+k)>199 then
temp:=temp+k-200;
else
temp:=temp+k;
end if;
end if;
end if;
------------------------------------------------------------
case temp is --正弦查找表,在各相位点给出正弦幅度值
when 0 =>qOUT<= "10000000";
when 1 =>qOUT<= "10000100";
when 2 =>qOUT<= "10001000";
when 3 =>qOUT<= "10001011";
when 4 =>qOUT<= "10001111";
when 5 =>qOUT<= "10010011";
when 6 =>qOUT<= "10010111";
when 7 =>qOUT<= "10011011";
when 8 =>qOUT<= "10011111";
when 9 =>qOUT<= "10100011";
when 10 =>qOUT<= "10100111";
when 11 =>qOUT<= "10101011";
when 12 =>qOUT<= "10101110";
when 13 =>qOUT<= "10110010";
when 14 =>qOUT<= "10110110";
when 15 =>qOUT<= "10111001";
when 16 =>qOUT<= "10111101";
when 17 =>qOUT<= "11000000";
when 18 =>qOUT<= "11000100";
when 19 =>qOUT<= "11000111";
when 20 =>qOUT<= "11001010";
when 21 =>qOUT<= "11001110";
when 22 =>qOUT<= "11010001";
when 23 =>qOUT<= "11010100";
when 24 =>qOUT<= "11010111";
when 25 =>qOUT<= "11011010";--pi/4抽样点
when 26 =>qOUT<= "11011100";
when 27 =>qOUT<= "11011111";
when 28 =>qOUT<= "11100010";
when 29 =>qOUT<= "11100100";
when 30 =>qOUT<= "11100111";
when 31 =>qOUT<= "11101001";
when 32 =>qOUT<= "11101011";
when 33 =>qOUT<= "11101101";
when 34 =>qOUT<= "11101111";
when 35 =>qOUT<= "11110001";
when 36 =>qOUT<= "11110011";
when 37 =>qOUT<= "11110101";
when 38 =>qOUT<= "11110110";
when 39 =>qOUT<= "11110111";
when 40 =>qOUT<= "11111001";
when 41 =>qOUT<= "11111010";
when 42 =>qOUT<= "11111011";
when 43 =>qOUT<= "11111100";
when 44 =>qOUT<= "11111101";
when 45 =>qOUT<= "11111101";
when 46 =>qOUT<= "11111110";
when 47 =>qOUT<= "11111110";
when 48 =>qOUT<= "11111111";
when 49 =>qOUT<= "11111111";
when 50 =>qOUT<= "11111111";--最大值
when 51 =>qOUT<= "11111111";
when 52 =>qOUT<= "11111111";
when 53 =>qOUT<= "11111110";
when 54 =>qOUT<= "11111110";
when 55 =>qOUT<= "11111101";
when 56 =>qOUT<= "11111101";
when 57 =>qOUT<= "11111100";
when 58 =>qOUT<= "11111011";
when 59 =>qOUT<= "11111010";
when 60 =>qOUT<= "11111001";
when 61 =>qOUT<= "11110111";
when 62 =>qOUT<= "11110110";
when 63 =>qOUT<= "11110101";
when 64 =>qOUT<= "11110011";
when 65 =>qOUT<= "11110001";
when 66 =>qOUT<= "11101111";
when 67 =>qOUT<= "11101101";
when 68 =>qOUT<= "11101011";
when 69 =>qOUT<= "11101001";
when 70 =>qOUT<= "11100111";
when 71 =>qOUT<= "11100100";
when 72 =>qOUT<= "11100010";
when 73 =>qOUT<= "11011111";
when 74 =>qOUT<= "11011100";
when 75 =>qOUT<= "11011010";--3pi/4抽样点
when 76 =>qOUT<= "11010111";
when 77 =>qOUT<= "11010100";
when 78 =>qOUT<= "11010001";
when 79 =>qOUT<= "11001110";
when 80 =>qOUT<= "11001010";
when 81 =>qOUT<= "11000111";
when 82 =>qOUT<= "11000100";
when 83 =>qOUT<= "11000000";
when 84 =>qOUT<= "10111101";
when 85 =>qOUT<= "10111001";
when 86 =>qOUT<= "10110110";
when 87 =>qOUT<= "10110010";
when 88 =>qOUT<= "10101110";
when 89 =>qOUT<= "10101011";
when 90 =>qOUT<= "10100111";
when 91 =>qOUT<= "10100011";
when 92 =>qOUT<= "10011111";
when 93 =>qOUT<= "10011011";
when 94 =>qOUT<= "10010111";
when 95 =>qOUT<= "10010011";
when 96 =>qOUT<= "10001111";
when 97 =>qOUT<= "10001011";
when 98 =>qOUT<= "10001000";
when 99 =>qOUT<= "10000100";
when 100 =>qOUT<= "10000000";
when 101 =>qOUT<= "01111011";
when 102 =>qOUT<= "01110111";
when 103 =>qOUT<= "01110100";
when 104 =>qOUT<= "01110000";
when 105 =>qOUT<= "01101100";
when 106 =>qOUT<= "01101000";
when 107 =>qOUT<= "01100100";
when 108 =>qOUT<= "01100000";
when 109 =>qOUT<= "01011100";
when 110 =>qOUT<= "01011000";
when 111 =>qOUT<= "01010100";
when 112 =>qOUT<= "01010001";
when 113 =>qOUT<= "01001101";
when 114 =>qOUT<= "01001001";
when 115 =>qOUT<= "01000110";
when 116 =>qOUT<= "01000010";
when 117 =>qOUT<= "00111111";
when 118 =>qOUT<= "00111011";
when 119 =>qOUT<= "00111000";
when 120 =>qOUT<= "00110101";
when 121 =>qOUT<= "00110001";
when 122 =>qOUT<= "00101110";
when 123 =>qOUT<= "00101011";
when 124 =>qOUT<= "00101000";
when 125 =>qOUT<= "00100101";--5pi/4抽样值
when 126 =>qOUT<= "00100011";
when 127 =>qOUT<= "00100000";
when 128 =>qOUT<= "00011101";
when 129 =>qOUT<= "00011011";
when 130 =>qOUT<= "00011000";
when 131 =>qOUT<= "00010110";
when 132 =>qOUT<= "00010100";
when 133 =>qOUT<= "00010010";
when 134 =>qOUT<= "00010000";
when 135 =>qOUT<= "00001110";
when 136 =>qOUT<= "00001100";
when 137 =>qOUT<= "00001010";
when 138 =>qOUT<= "00001001";
when 139 =>qOUT<= "00001000";
when 140 =>qOUT<= "00000110";
when 141 =>qOUT<= "00000101";
when 142 =>qOUT<= "00000100";
when 143 =>qOUT<= "00000011";
when 144 =>qOUT<= "00000010";
when 145 =>qOUT<= "00000010";
when 146 =>qOUT<= "00000001";
when 147 =>qOUT<= "00000001";
when 148 =>qOUT<= "00000000";
when 149 =>qOUT<= "00000000";
when 150 =>qOUT<= "00000000";--最小值
when 151 =>qOUT<= "00000000";
when 152 =>qOUT<= "00000000";
when 153 =>qOUT<= "00000001";
when 154 =>qOUT<= "00000001";
when 155 =>qOUT<= "00000010";
when 156 =>qOUT<= "00000010";
when 157 =>qOUT<= "00000011";
when 158 =>qOUT<= "00000100";
when 159 =>qOUT<= "00000101";
when 160 =>qOUT<= "00000110";
when 161 =>qOUT<= "00001000";
when 162 =>qOUT<= "00001001";
when 163 =>qOUT<= "00001010";
when 164 =>qOUT<= "00001100";
when 165 =>qOUT<= "00001110";
when 166 =>qOUT<= "00010000";
when 167 =>qOUT<= "00010010";
when 168 =>qOUT<= "00010100";
when 169 =>qOUT<= "00010110";
when 170 =>qOUT<= "00011000";
when 171 =>qOUT<= "00011011";
when 172 =>qOUT<= "00011101";
when 173 =>qOUT<= "00100000";
when 174 =>qOUT<= "00100011";
when 175 =>qOUT<= "00100101";--7pi/4抽样值
when 176 =>qOUT<= "00101000";
when 177 =>qOUT<= "00101011";
when 178 =>qOUT<= "00101110";
when 179 =>qOUT<= "00110001";
when 180 =>qOUT<= "00110101";
when 181 =>qOUT<= "00111000";
when 182 =>qOUT<= "00111011";
when 183 =>qOUT<= "00111111";
when 184 =>qOUT<= "01000010";
when 185 =>qOUT<= "01000110";
when 186 =>qOUT<= "01001001";
when 187 =>qOUT<= "01001101";
when 188 =>qOUT<= "01010001";
when 189 =>qOUT<= "01010100";
when 190 =>qOUT<= "01011000";
when 191 =>qOUT<= "01011100";
when 192 =>qOUT<= "01100000";
when 193 =>qOUT<= "01100100";
when 194 =>qOUT<= "01101000";
when 195 =>qOUT<= "01101100";
when 196 =>qOUT<= "01110000";
when 197 =>qOUT<= "01110100";
when 198 =>qOUT<= "01110111";
when 199 =>qOUT<= "01111011";
when others=>null;
end case;
end process;
end behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -