|
以下是代码:
--DDS波形发生器 (Synplify pro 编译通过)
--输出频率 Fout = Fclk*2^M/2^N
--分辨率 Fclk/2^N
--最大输出频率 Fout = Fclk*50%(理论值,抽样定理)
--版本1.0 2004/9/29 by JJJ
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity DDS is
generic(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 is
signal ACC:std_logic_vector(ACCWidth-1 downto 0):=(others =>'0');
signal KEYADD:std_logic_vector(ACCWidth-1 downto 0):="0000000011111111";
begin
process(CLK)--,STEP)
begin
if(CLK'event and CLK='1') then
ACC<=ACC+KEYADD;
end if;
end process;
process(key)
begin
if(key'event and key='1') then
KEY<=KEYADD+1;
end if;
end process;
process(CHOICE,ACC)
begin
case CHOICE is
when "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 "00010101" => DAOUT <= "10111111";
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 "00111001" => 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 "01011101" => DAOUT <= "11100001";
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 "10000001" => DAOUT <= "01111101";
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 "10100101" => DAOUT <= "00011011";
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 "11001001" => DAOUT <= "00000011";
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 "11101101" => DAOUT <= "01000110";
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) is
when '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) is
when '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;
|