基于FPGA的DDS波形发生器
- 格式:pdf
- 大小:81.05 KB
- 文档页数:10
基于FPGA的DDS波形发生器以下是代码:--DDS波形发生器 (Synplify pro 编译通过)--输出频率 Fout = Fclk*2^M/2^N--分辨率 Fclk/2^N--最大输出频率 Fout = Fclk*50%(理论值,抽样定理)--版本1.0 2004/9/29 by JJJlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity DDS isgeneric(ACCWidth : Integer := 16); --相位累加器的长度2^N(2^ACCWidth)port (CLK: in std_logic; --系统时钟 FClk-- STEP: in std_logic_vector(ACCWidth-1 downto 0); --步进,即相位累加器的累加增量,控制输出频率 2^M 频率控制字CHOICE: in std_logic_vector(1 downto 0); --波形选择信号 "00":正弦; "01":三角波; "10":方波; "11":不输出(恒为低电平)Key : in std_logic;DAOUT : out std_logic_vector(7 downto 0) --8位DA输出模拟信号,直通方式,如需时钟控制则要修改);end;architecture DDS of DDS issignal ACC:std_logic_vector(ACCWidth-1 downto 0):=(others=>'0');signal KEYADD:std_logic_vector(ACCWidth-1 downto0):="0000000011111111";beginprocess(CLK)--,STEP)beginif(CLK'event and CLK='1') thenACC<=ACC+KEYADD;end if;end process;process(key)beginif(key'event and key='1') thenKEY<=KEYADD+1;end if;end process;process(CHOICE,ACC)begincase CHOICE iswhen "00"=> --正弦case ACC(ACCWidth-1 downto ACCWidth-8) is when "00000000" => DAOUT <= "10000000"; when "00000001" => DAOUT <= "10000011"; when "00000010" => DAOUT <= "10000110"; when "00000011" => DAOUT <= "10001001"; when "00000100" => DAOUT <= "10001101"; when "00000101" => DAOUT <= "10010000"; when "00000110" => DAOUT <= "10010011"; when "00000111" => DAOUT <= "10010110"; when "00001000" => DAOUT <= "10011001"; when "00001001" => DAOUT <= "10011100"; when "00001010" => DAOUT <= "10011111"; when "00001011" => DAOUT <= "10100010"; when "00001100" => DAOUT <= "10100101"; when "00001101" => DAOUT <= "10101000"; when "00001110" => DAOUT <= "10101011"; when "00001111" => DAOUT <= "10101110"; when "00010000" => DAOUT <= "10110001"; when "00010001" => DAOUT <= "10110100"; when "00010010" => DAOUT <= "10110111"; when "00010011" => DAOUT <= "10111010"; when "00010100" => DAOUT <= "10111100";when "00010110" => DAOUT <= "11000010"; when "00010111" => DAOUT <= "11000100"; when "00011000" => DAOUT <= "11000111"; when "00011001" => DAOUT <= "11001010"; when "00011010" => DAOUT <= "11001100"; when "00011011" => DAOUT <= "11001111"; when "00011100" => DAOUT <= "11010001"; when "00011101" => DAOUT <= "11010100"; when "00011110" => DAOUT <= "11010110"; when "00011111" => DAOUT <= "11011000"; when "00100000" => DAOUT <= "11011011"; when "00100001" => DAOUT <= "11011101"; when "00100010" => DAOUT <= "11011111"; when "00100011" => DAOUT <= "11100001"; when "00100100" => DAOUT <= "11100011"; when "00100101" => DAOUT <= "11100101"; when "00100110" => DAOUT <= "11100111"; when "00100111" => DAOUT <= "11101001"; when "00101000" => DAOUT <= "11101010"; when "00101001" => DAOUT <= "11101100"; when "00101010" => DAOUT <= "11101110"; when "00101011" => DAOUT <= "11101111"; when "00101100" => DAOUT <= "11110001"; when "00101101" => DAOUT <= "11110010"; when "00101110" => DAOUT <= "11110100"; when "00101111" => DAOUT <= "11110101"; when "00110000" => DAOUT <= "11110110"; when "00110001" => DAOUT <= "11110111"; when "00110010" => DAOUT <= "11111001"; when "00110011" => DAOUT <= "11111010"; when "00110100" => DAOUT <= "11111010"; when "00110101" => DAOUT <= "11111011"; when "00110110" => DAOUT <= "11111100"; when "00110111" => DAOUT <= "11111101"; when "00111000" => DAOUT <= "11111110";when "00111010" => DAOUT <= "11111111"; when "00111011" => DAOUT <= "11111111"; when "00111100" => DAOUT <= "11111111"; when "00111101" => DAOUT <= "11111111"; when "00111110" => DAOUT <= "11111111"; when "00111111" => DAOUT <= "11111111"; when "01000000" => DAOUT <= "11111111"; when "01000001" => DAOUT <= "11111111"; when "01000010" => DAOUT <= "11111111"; when "01000011" => DAOUT <= "11111111"; when "01000100" => DAOUT <= "11111111"; when "01000101" => DAOUT <= "11111111"; when "01000110" => DAOUT <= "11111111"; when "01000111" => DAOUT <= "11111110"; when "01001000" => DAOUT <= "11111110"; when "01001001" => DAOUT <= "11111101"; when "01001010" => DAOUT <= "11111100"; when "01001011" => DAOUT <= "11111011"; when "01001100" => DAOUT <= "11111010"; when "01001101" => DAOUT <= "11111010"; when "01001110" => DAOUT <= "11111001"; when "01001111" => DAOUT <= "11110111"; when "01010000" => DAOUT <= "11110110"; when "01010001" => DAOUT <= "11110101"; when "01010010" => DAOUT <= "11110100"; when "01010011" => DAOUT <= "11110010"; when "01010100" => DAOUT <= "11110001"; when "01010101" => DAOUT <= "11101111"; when "01010110" => DAOUT <= "11101110"; when "01010111" => DAOUT <= "11101100"; when "01011000" => DAOUT <= "11101010"; when "01011001" => DAOUT <= "11101001"; when "01011010" => DAOUT <= "11100111"; when "01011011" => DAOUT <= "11100101"; when "01011100" => DAOUT <= "11100011";when "01011110" => DAOUT <= "11011111"; when "01011111" => DAOUT <= "11011101"; when "01100000" => DAOUT <= "11011011"; when "01100001" => DAOUT <= "11011000"; when "01100010" => DAOUT <= "11010110"; when "01100011" => DAOUT <= "11010100"; when "01100100" => DAOUT <= "11010001"; when "01100101" => DAOUT <= "11001111"; when "01100110" => DAOUT <= "11001100"; when "01100111" => DAOUT <= "11001010"; when "01101000" => DAOUT <= "11000111"; when "01101001" => DAOUT <= "11000100"; when "01101010" => DAOUT <= "11000010"; when "01101011" => DAOUT <= "10111111"; when "01101100" => DAOUT <= "10111100"; when "01101101" => DAOUT <= "10111010"; when "01101110" => DAOUT <= "10110111"; when "01101111" => DAOUT <= "10110100"; when "01110000" => DAOUT <= "10110001"; when "01110001" => DAOUT <= "10101110"; when "01110010" => DAOUT <= "10101011"; when "01110011" => DAOUT <= "10101000"; when "01110100" => DAOUT <= "10100101"; when "01110101" => DAOUT <= "10100010"; when "01110110" => DAOUT <= "10011111"; when "01110111" => DAOUT <= "10011100"; when "01111000" => DAOUT <= "10011001"; when "01111001" => DAOUT <= "10010110"; when "01111010" => DAOUT <= "10010011"; when "01111011" => DAOUT <= "10010000"; when "01111100" => DAOUT <= "10001101"; when "01111101" => DAOUT <= "10001001"; when "01111110" => DAOUT <= "10000110"; when "01111111" => DAOUT <= "10000011"; when "10000000" => DAOUT <= "10000000";when "10000010" => DAOUT <= "01111010"; when "10000011" => DAOUT <= "01110111"; when "10000100" => DAOUT <= "01110011"; when "10000101" => DAOUT <= "01110000"; when "10000110" => DAOUT <= "01101101"; when "10000111" => DAOUT <= "01101010"; when "10001000" => DAOUT <= "01100111"; when "10001001" => DAOUT <= "01100100"; when "10001010" => DAOUT <= "01100001"; when "10001011" => DAOUT <= "01011110"; when "10001100" => DAOUT <= "01011011"; when "10001101" => DAOUT <= "01011000"; when "10001110" => DAOUT <= "01010101"; when "10001111" => DAOUT <= "01010010"; when "10010000" => DAOUT <= "01001111"; when "10010001" => DAOUT <= "01001100"; when "10010010" => DAOUT <= "01001001"; when "10010011" => DAOUT <= "01000110"; when "10010100" => DAOUT <= "01000100"; when "10010101" => DAOUT <= "01000001"; when "10010110" => DAOUT <= "00111110"; when "10010111" => DAOUT <= "00111100"; when "10011000" => DAOUT <= "00111001"; when "10011001" => DAOUT <= "00110110"; when "10011010" => DAOUT <= "00110100"; when "10011011" => DAOUT <= "00110001"; when "10011100" => DAOUT <= "00101111"; when "10011101" => DAOUT <= "00101100"; when "10011110" => DAOUT <= "00101010"; when "10011111" => DAOUT <= "00101000"; when "10100000" => DAOUT <= "00100101"; when "10100001" => DAOUT <= "00100011"; when "10100010" => DAOUT <= "00100001"; when "10100011" => DAOUT <= "00011111"; when "10100100" => DAOUT <= "00011101";when "10100110" => DAOUT <= "00011001"; when "10100111" => DAOUT <= "00010111"; when "10101000" => DAOUT <= "00010110"; when "10101001" => DAOUT <= "00010100"; when "10101010" => DAOUT <= "00010010"; when "10101011" => DAOUT <= "00010001"; when "10101100" => DAOUT <= "00001111"; when "10101101" => DAOUT <= "00001110"; when "10101110" => DAOUT <= "00001100"; when "10101111" => DAOUT <= "00001011"; when "10110000" => DAOUT <= "00001010"; when "10110001" => DAOUT <= "00001001"; when "10110010" => DAOUT <= "00000111"; when "10110011" => DAOUT <= "00000110"; when "10110100" => DAOUT <= "00000110"; when "10110101" => DAOUT <= "00000101"; when "10110110" => DAOUT <= "00000100"; when "10110111" => DAOUT <= "00000011"; when "10111000" => DAOUT <= "00000010"; when "10111001" => DAOUT <= "00000010"; when "10111010" => DAOUT <= "00000001"; when "10111011" => DAOUT <= "00000001"; when "10111100" => DAOUT <= "00000001"; when "10111101" => DAOUT <= "00000000"; when "10111110" => DAOUT <= "00000000"; when "10111111" => DAOUT <= "00000000"; when "11000000" => DAOUT <= "00000000"; when "11000001" => DAOUT <= "00000000"; when "11000010" => DAOUT <= "00000000"; when "11000011" => DAOUT <= "00000000"; when "11000100" => DAOUT <= "00000001"; when "11000101" => DAOUT <= "00000001"; when "11000110" => DAOUT <= "00000001"; when "11000111" => DAOUT <= "00000010"; when "11001000" => DAOUT <= "00000010";when "11001010" => DAOUT <= "00000100"; when "11001011" => DAOUT <= "00000101"; when "11001100" => DAOUT <= "00000110"; when "11001101" => DAOUT <= "00000110"; when "11001110" => DAOUT <= "00000111"; when "11001111" => DAOUT <= "00001001"; when "11010000" => DAOUT <= "00001010"; when "11010001" => DAOUT <= "00001011"; when "11010010" => DAOUT <= "00001100"; when "11010011" => DAOUT <= "00001110"; when "11010100" => DAOUT <= "00001111"; when "11010101" => DAOUT <= "00010001"; when "11010110" => DAOUT <= "00010010"; when "11010111" => DAOUT <= "00010100"; when "11011000" => DAOUT <= "00010110"; when "11011001" => DAOUT <= "00010111"; when "11011010" => DAOUT <= "00011001"; when "11011011" => DAOUT <= "00011011"; when "11011100" => DAOUT <= "00011101"; when "11011101" => DAOUT <= "00011111"; when "11011110" => DAOUT <= "00100001"; when "11011111" => DAOUT <= "00100011"; when "11100000" => DAOUT <= "00100101"; when "11100001" => DAOUT <= "00101000"; when "11100010" => DAOUT <= "00101010"; when "11100011" => DAOUT <= "00101100"; when "11100100" => DAOUT <= "00101111"; when "11100101" => DAOUT <= "00110001"; when "11100110" => DAOUT <= "00110100"; when "11100111" => DAOUT <= "00110110"; when "11101000" => DAOUT <= "00111001"; when "11101001" => DAOUT <= "00111100"; when "11101010" => DAOUT <= "00111110"; when "11101011" => DAOUT <= "01000001"; when "11101100" => DAOUT <= "01000100";when "11101110" => DAOUT <= "01001001";when "11101111" => DAOUT <= "01001100";when "11110000" => DAOUT <= "01001111";when "11110001" => DAOUT <= "01010010";when "11110010" => DAOUT <= "01010101";when "11110011" => DAOUT <= "01011000";when "11110100" => DAOUT <= "01011011";when "11110101" => DAOUT <= "01011110";when "11110110" => DAOUT <= "01100001";when "11110111" => DAOUT <= "01100100";when "11111000" => DAOUT <= "01100111";when "11111001" => DAOUT <= "01101010";when "11111010" => DAOUT <= "01101101";when "11111011" => DAOUT <= "01110000";when "11111100" => DAOUT <= "01110011";when "11111101" => DAOUT <= "01110111";when "11111110" => DAOUT <= "01111010";when "11111111" => DAOUT <= "01111101";when others => DAOUT <= (others =>'0');end case;when "01"=> --三角波case ACC(ACCWidth-1) iswhen '0' => DAOUT <= ACC(ACCWidth-2 downto ACCWidth-9); --模二加,左移一位when '1' => DAOUT <= ("11111111" - ( ACC(ACCWidth-2 downto ACCWidth-9) ));when others => DAOUT <= (others =>'0');end case;when "10"=> --方波case ACC(ACCWidth-1) iswhen '0' => DAOUT <= (others =>'0');when '1' => DAOUT <= (others =>'1');when others => DAOUT <= (others =>'0');end case ;when "11" => DAOUT <= ACC(ACCWidth-1 downto ACCWidth-8); when others => DAOUT <= (others =>'0');end case;end process;end;。