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

📄 dds_vhdl.vhd

📁 函数发生器代码
💻 VHD
字号:
--主程序
--程序名
library ieee;
use ieee.std_logic_1164.all;
entity frqload is 
  port(num:in std_logic_vector(3 downto 0);
    q:out integer range 0 to 312);
end frqload;
architecture a of frqload is   
begin  
 process(num)    
  begin 
case num is
when "0001"=>q<=312;
when "0010"=>q<=155;
when "0011"=>q<=104;
when "0100"=>q<=78;
when "0101"=>q<=63;
when "0110"=>q<=52;
when "0111"=>q<=45;
when "1000"=>q<=39;
when "1001"=>q<=35;
when "1010"=>q<=31;
 when others=>null;
        end case;
    end process;      
end a;
--分频模块
--程序名frq_div.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity frq_div is  
   Port (a:in integer range 0 to 312;
           clk: in std_logic;
           q: out std_logic);
end frq_div;
architecture a of frq_div is 
begin
 process(clk)
variable b,d:std_logic;  
variable num:integer range 0 to 312;
 begin
  if clk'event and clk='1' then
if b='0'then
num:=a-1;
b:='1';
else
if num=1 then
b:='0';
d:=not d;
else 
  num:=num-1;
end if;
end if;
end if;
q<=not d;
    end process;
end a;
--三角波信号发生模块
--程序名:delta_gen.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity delta_gen is
    port(clk,reset:in std_logic;
   q:out std_logic_vector(7 downto 0));
end delta_gen;
architecture a of delta_gen is
begin
process(clk,reset)
variable num:std_logic_vector(7 downto 0);
variable ff:std_logic;
begin
 if reset='0'then
   num:="00000000";
elsif clk'event and clk='1'then 
 if  ff='0'then 
  if num="11111000"then
   num:="11111111";
ff:='1';
else
num:=num+8;
end if;
else
 if num="00000111"then
  num :="00000000";
   ff:='0';
   else
    num:=num-8;
   end if;
 end if;
end if;
q<=num;
end process; 
end a;
--方波信号发生模块
--程序名:stuare-gen.vhd 
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY square_gen IS
        PORT
    (
        clk, clr : IN STD_LOGIC;
               q : OUT integer range 0 to 255
    );
END square_gen;
ARCHITECTURE a OF square_gen IS
    SIGNAL ff : bit;
BEGIN
process(clk,clr)
variable num:integer range 0 to 512;
begin
    if clr='0'then
    ff<='0';
ELSIF clk'event and clk='1' then

    if num<512 then 
    num:=num+1;
ELSE
    num:=0;
    ff<= not ff;
END IF;
END IF;
END process;
process_label:
PROCESS (clk,ff)
    
BEGIN
    IF clk'event and clk='1' then 
      if ff='1' then
    q<=255;
ELSE
    q<=0;
    
END IF;
END IF;
END PROCESS;
end a;
--正弦波信号发生模块
--程序名:sin_gen.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY sin_gen is
        PORT
    (
        clk, clr : IN   STD_LOGIC;
        d : OUT integer range 0 to 255
    );
END sin_gen;
ARCHITECTURE a OF sin_gen IS
    
BEGIN
    
PROCESS (clk,clr)
    VARIABLE num:integer range 0 to 63;
    
BEGIN
    IF clr='0' then
    d<=0;
ELSIF clk'event and clk='1' then

    if num=63   THEN
    num:=0;
ELSE
    num:=num+1;
END IF;
CASE num iS
WHEN 00=>d<=255;WHEN 01=>d<=254; WHEN 02=>d<=252;

WHEN 03=>d<=249;WHEN 04=>d<=245; WHEN 05=>d<=239;
WHEN 06=>d<=233;WHEN 07=>d<=225; WHEN 08=>d<=217;
WHEN 09=>d<=207;WHEN 10=>d<=197; WHEN 11=>d<=186;
WHEN 12=>d<=174;WHEN 13=>d<=162; WHEN 14=>d<=150;
WHEN 15=>d<=137;WHEN 16=>d<=124; WHEN 17=>d<=112;
WHEN 18=>d<=99; WHEN 19=>d<=87;   WHEN 20=>d<=75;
WHEN 21=>d<=64; WHEN 22=>d<=53;  WHEN 23=>d<=43;
WHEN 24=>d<=34; WHEN 25=>d<=26;  WHEN 26=>d<=19;
WHEN 27=>d<=13; WHEN 28=>d<=8;   WHEN 29=>d<=4;
WHEN 30=>d<=1;  WHEN 31=>d<=0;   WHEN 32=>d<=0;
WHEN 33=>d<=1;  WHEN 34=>d<=4;   WHEN 35=>d<=8;
WHEN 36=>d<=13; WHEN 37=>d<=19;  WHEN 38=>d<=26;

WHEN 39=>d<=34; WHEN 40=>d<=43;  WHEN 41=>d<=53;
WHEN 42=>d<=64; WHEN 43=>d<=75;  WHEN 44=>d<=87;
WHEN 45=>d<=99; WHEN 46=>d<=112; WHEN 47=>d<=124;
WHEN 48=>d<=137;WHEN 49=>d<=150; WHEN 50=>d<=162;
WHEN 51=>d<=174;WHEN 52=>d<=186; WHEN 53=>d<=197;
WHEN 54=>d<=207;WHEN 55=>d<=217; WHEN 56=>d<=225;
WHEN 57=>d<=233;WHEN 58=>d<=239; WHEN 59=>d<=245;
WHEN 60=>d<=249;WHEN 61=>d<=252; WHEN 62=>d<=254;
WHEN 63=>d<=255;            
when others =>null; 
END CASE;
end if ;
end process;
 
END a;
--波形输出选择模块
--程序名:makgrp.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY mkgrp IS
        PORT
    (
        dlt, sqr,sin: IN std_logic;
        dltd,sqrd,sind: in std_logic_vector(7 downto 0);
        q: out std_logic_vector(7 downto 0));
END mkgrp;
ARCHITECTURE a OF mkgrp IS
begin 
process(dlt,dltd,sqr,sqrd,sin,sind)
variable tmp:std_logic_vector(2 downto 0);
variable a,b:std_logic_vector(9 downto 0);
variable c,d,e:std_logic_vector(9 downto 0);
begin
tmp:=dlt&sqr&sin;
case tmp is
WHEN "100"=>q<=dltd;
WHEN "010"=>q<=sqrd;
WHEN "001"=>q<=sind;
when "011"=>a:="00"&sqrd+sind;q<=a(8 downto 1);
when "101"=>a:="00"&dltd+sind;q<=a(8 downto 1);
when "110"=>a:="00"&dltd+sqrd;q<=a(8 downto 1);
when "111"=>a:="00"&dltd+sqrd;
b:=a+sind;
c:="00"&b(9 downto 2);
d:="00"&a(9 downto 2);
e:="00"&a(9 downto 2);
a:=c+d;
b:=a+e;
q<=b(7 downto 0);
when others =>null;
end case; 
end process;
end a;
LIBRARY IEEE;--顶层设计
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY dds_vhdl IS
    PORT
    (
                    -- K :IN std_logic_vector(3 downto 0);
              inclk,VCC : IN    STD_LOGIC;
            F_LOAD : IN std_logic_vector(3 downto 0);
        dlt0, sqr0,sin0: IN std_logic;
                output :out std_logic_vector(7 downto 0)
    );
END dds_vhdl;
ARCHITECTURE struc OF dds_vhdl IS
    COMPONENT frqload
        PORT( num:in std_logic_vector(3 downto 0);
              
               q:out std_logic_vector(8 downto 0) ); --out integer range 0 to 312
           
    END COMPONENT;
    COMPONENT frq_div
        PORT(   a:in STD_LOGIC_VECTOR(8 DOWNTO 0);
              clk: in std_logic;
                q: out std_logic
            );
    END COMPONENT;
    COMPONENT delta_gen
        PORT(  clk,reset:in std_logic;
                       q:out std_logic_vector(7 downto 0)
            );
    END COMPONENT;
    COMPONENT square_gen
        PORT( clk, clr : IN STD_LOGIC;
                     q : out std_logic_vector(7 downto 0));--OUT integer range 0 to 255
            
    END COMPONENT;
    COMPONENT sin_gen
        PORT( clk, clr : IN STD_LOGIC;
                     d : out std_logic_vector(7 downto 0));--OUT integer range 0 to 255
         
    END COMPONENT;
    COMPONENT mkgrp
        PORT(  dlt, sqr,sin: in std_logic;
             dltd,sqrd,sind: in std_logic_vector(7 downto 0);
                          q: out std_logic_vector(7 downto 0));
    END COMPONENT;
      --SIGNAL F_LOAD : std_logic_vector(3 downto 0);
      SIGNAL F_DIV  : std_logic_vector(8 downto 0); --integer range 0 to 312;
      SIGNAL DELx    : std_logic_vector(7 downto 0);
      SIGNAL SQUx    : std_logic_vector(7 downto 0);
      SIGNAL SINx    : std_logic_vector(7 downto 0);
      SIGNAL Q_CLK  : std_logic;
BEGIN
--F_LOAD(3 downto 0)=>K;
U1 : frqload PORT MAP (num=>F_LOAD,Q=>F_DIV);
U2 : frq_div PORT MAP (A=>F_DIV,CLK=>inclk,Q=>Q_CLK);
U3 : delta_gen PORT MAP (CLK=>Q_CLK,RESET=>VCC,Q=>DELx);
U4 : square_gen PORT MAP (CLK=>Q_CLK,CLR=>VCC,Q=>SQUx);
U5 : sin_gen PORT MAP (CLK=>Q_CLK,CLR=>VCC,d=>SINx);
U6 : mkgrp PORT MAP (DLT=>dlt0,SQR=>sqr0,SIN=>sin0,DLTD=>DELx,SQRD=>SQUx,SIND=>SINx,Q=>output);
END struc; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -