--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":不输出(恒为低电平)
-- DAOUT : out std_logic_vector(7 downto 0); --8位DA输出模拟信号,直通方式,如需时钟控制则要修改
DAOUTX: out std_logic_vector(7 downto 0);
DAOUTY: out std_logic_vector(7 downto 0)
);
end;
architecture DDS of DDS is
signal ACC:std_logic_vector(ACCWidth-1 downto 0):=(others =>'0');
signal DAOUT:std_logic_vector(7 downto 0);
begin
process(CLK,STEP)
begin
if(CLK'event and CLK='1') then
ACC<=ACC+STEP;
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";
评论0