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

📄 f50k.vhd

📁 VHDL产生时钟50分频程序
💻 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 + -