相位累加器是整个DDS的核心,它由一个加法器和一个寄存器构成。加法器的一个输入与寄存器输出相连,另一个输入是外部输入的频率控制字。这样,在每个时钟到达时,相位寄存器采样上个时钟周期内相位寄存器的值与频率控制字之和,并作为相位累加器在这一时钟周期的输出。频率控制字决定了相应的相位增量,相位累加器则不断地对该相位增量进行线性累加,当相位累加器加满量时就会产生一次溢出,从而完成一个周期性的动作,这个动作周期即是DDS合成信号的一个频率周期。该模块可使用Altera提供的宏模块LPM_ADD_SUB和LPM_FF生成。
图5 相位累加器
3.3.3波形ROM查找表
波形ROM模块由ROM:1-port宏模块生成,其地址线的位宽为9位,数据线的位宽为8位,即一个周期的波形数据有512个,每个数据占8位,其输出可直接DAC0832。ROM中的MIF数据文件可使用Mif_Maker2010.exe软件生成。
图6 正弦波ROM查找表
图7 三角波ROM查找表
图8 方波ROM查找表
3.3.4三选一输出波形选择器
该波形选择器由两位输入拨码开关控制,用于输出波形的选择。当WS为00时,输出正弦波;当WS为01时,输出方波;当WS为10时,输出三角波;当WS为11时,不输出波形。
图9 三选一输出波形选择器
程序如下:
port (keya,keyb:in std_logic;
d_in1,d_in2,d_in3,:in std_logic_vector(7 downto 0);
d_out:out std_logic_vector( 7 downto 0)); end wav_sel;
architecture behave of wav_sel is
signal key:std_logic_vector(1 downto 0); begin
key<=keya&keyb; with key select
d_out<=d_in1 when \ d_in2 when \ d_in3 when \
\
3.3.5数模转换模块
8位dac的程序及Symbol: library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity dac0832 is port (
clk :in std_logic; WR_n :out std_logic;
datin:in std_logic_vector(7 downto 0); Analog_D:out std_logic_vector(7 downto 0) );
end dac0832;
architecture rt1 of DAC0832 is begin
WR_n <= '0' ;
process (clk ) begin
if clk'event and clk = '1' then Analog_D <= datin; end if;
end process ; end rt1;
图10 数模转换模块
图11系统整体原理图截图
四 软件仿真
4.1方波模块
部分程序如下: port(fclk:in std_logic;
reset:in std_logic;
d_out:out std_logic_vector(7 downto 0)); end fangbo;
architecture arch of fangbo is
signal da:std_logic_vector(7 downto 0); begin
process(da) begin
if da<127 then
d_out<=\ else d_out<=\ end if; end process;
process(fclk,reset,da) begin
if reset='1' then da<=\ else
if fclk'event and fclk='1' then if da=\ da<=\ else
da<=da+1;
4.2三角波模块
部分程序如下:
port (fclk:in std_logic; reset:in std_logic;
d_out : out std_logic_vector(7 downto 0)); end sanjiao;
architecture arch of sanjiao is
signal da : std_logic_vector(7 downto 0); begin