DDS预习报告
0804480106 尤佳
一.实验目的
学习使用FPGA实现直接数字频率合成器(DDS).
二.实验内容
本实验的内容是使用DDS的方法设计一个任意频率的正弦信号发生器,利用Quartus II完成设计、仿真等工作,并进行硬件测试,通过示波器观察输出信号波形.
三.实验要求
1)用QuartusII软件和SmartSOPC实验箱实现DDS的设计;
2)DDS中的波形存储器模块用Altera公司的Cyclone系列FPGA芯片中的ROM实现,ROM结构配置成4096×10类型;
3)具体参数要求:频率控制字K取4位;基准频率fc=1MHz,由实验板上的系统时钟分频得到;
4)系统具有清零和使能的功能;
5)利用实验箱上的D/A转换器件将ROM输出的数字信号转换为模拟信号,能够通过示波器观察到正弦波形;
6)通过开关(实验箱上的Ki)输入DDS的频率和相位控制字,并能用示波器观察加以验证.
四.实验原理
DDS即Direct Digital Synthesizer数字合成器,是一种新型的频率合成技术.具有相对带宽大、频率转换时间短、分辨率高、相位连续性好等优点,很容易实现频率、相位和幅度的数控调制,广泛应用于通讯领域.
DDS的基本结构主要由相位累加器、相位调制器、正弦波数据表(ROM)、D/A转换器构成.相位累加器由N位加法器N位寄存器构成.每来一个CLOCK,加法器就将频率控制字fwrod与累加寄存器输出的累加相位数据相加,相加的结果又反馈送至累加寄存器的数据输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加.这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加.由此,相位累加器在每一个时钟脉冲输入时,把频率控制字累加以此,相
位累加器输出的数据作为波形存储器的相位取样地址,这样就可把存储在波形存储器内的波形抽样值进行找表查出,完成相位到幅值的转换.
由于相位累加器为N位,相当于把正弦信号在相位上的精度定为N位,所以分辨率为1/2N.若系统时钟频率为fc,频率控制字fword为1,则输出频率为fOUT=fC/2N,这个频率相当于"基频".若fword为K,则输出频率为:
fout=K* fC/2N
当系统输入时钟频率fC不变时,输出信号的频率由频率控制字K所决定.由
上式可得:
K=2N*fout/fC
其中,K为频率字,注意K要取整,有时会有误差.
选取ROM的地址时,可以间隔选项,相位寄存器输出的位数D一般取10-16位,这种截取方法称为截断式用法,以减少ROM的容量.D太大会导致ROM容量的成倍上升,而输出精度受D/A位数的限制未有很大改善.
DDS工作流程示意图:
1)频率预置与调节电路
K为相位增量,也叫频率控制字
.DDS的输出频率表达式为fout=K* fC/2N,当K=1
时
,DDS输出最低频率(也即频率分辨率)为fc/2N,而DDS的最高输出频率由
Nyquist采样定理决定,即fc/2,也就是说K
的最大值为2
N-1.因此,只要N足够
大,DDS可以得到很细的频率间隔.要改变DDS的输出频率,只要改变频率控制字K即可.
2)累加器
相位累加器由12位加法器与12位寄存器级联构成.每来一个时钟脉冲,加法器将频率控制字K与寄存器输出的累加相位数据相加,再把相加后的结果送至寄存器的数据输入端.寄存器将加法器的上一个时钟作用后所产生的相位数据反馈
至加法器的输入端,以使加法器在下一个时钟作用下继续与频率控制字进行相加.这样,相位累加器在时钟作用下,进行相位累加.当相位累加器累加满量时就会产生一次溢出,完成一个周期性的动作.累加器原理如下图
:
3)波形存储器
用相位控制模块输出的数据作为波形存储器的取样地址,进行波形的相位-幅值转换,即可在给定的时间上确定输出的波形的抽样幅值.N位的寻址ROM相当于把错误!未找到引用源。的正弦信号离散成具有2N个样值的序列,若波形ROM有D位数据位,则2N个样值的幅值以D位二进制数值固化在ROM中,按照地址的不同可以输出相应相位的正弦信号的幅值.相位-幅值变换原理如下图
:
4)D/A转换器
D/A转换器的作用是把合成的正弦波数字量转换成模拟量.正弦幅度量化序列S(n)经D/A转换后变成了包络为正弦波的阶梯波S(t).需要注意的是,频率合成器对D/A转换器的分辨率有一定的要求,D/A转换器的分辨率越高,合成的正弦波S(t)台阶数就越多,输出的波形的精度也就越高.D/A转换器原理如下图
:
5)低通滤波器
低通滤波器对D/A输出的阶梯波S(t)进行频谱分析,可知S(t)中除主频f0外,还存在分布在fc,2fc……两边±f0处的非谐波分量,幅值包络为辛格函数.因
此,为了取得主频f0,必须在D/A转换器的输出端接入截止频率为fc/2的低通滤
波器.低通滤波器原理如下图:
6)测频电路
测频就是计算1秒钟内脉冲的个数.我们利用计数器和锁存器实现这一功能.由于累加器以频率控制字K为间隔,当累加器满量时就会产生一次溢出,完成一次周期性的动作,这个周期也就是DDS信号的一个频率周期,所以将累加器的最高位作为测频电路技术器的脉冲.
将1HZ的时钟信号二分频,得到0.5Hz.将0.5Hz脉冲送入锁存器的时钟端,0.5Hz反相延时后的脉冲送入计数器的清零端.这样就使计数器在2s的脉冲周期内,1s内清零,1s内计数.由于锁存器的脉冲和计数器的脉冲是反相的,且有一定的延时,所以当锁存器有效脉冲来到时,计数器是清零状态,锁存器就锁存前1s内计数器的计数信号.这样就完成了1s内的脉冲计数,再将锁存器的输出送入译码显示电路,就可以在数码管上显示波形频率了.测频电路原理如下图
:
7)分频与显示电路
分频与显示电路的原理同EDA实验中的分频器和显示器.
五.实验步骤
1)启动Quartus建立一个空白工程,然后命名为dds.qpf.
2)建立ROM宏单元并命名为dds_rom,设置数据个数为4096,数据宽度为十位,初始化数据选择dds_rom.mif文件.
3)建立VHDL源程序文件写出程序代码并保存,进行综合编译,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止.
4)选择目标器件并对相应的引脚进行锁定,将未使用的管教设置为三态输入.
5)将dds_top.bdf设置为顶层实体.对该工程文件进行全程编译处理,若在
编译过程中发现错误,则找出并更正错误,直至编译成功为止.
6)硬件连接、下载程序.
7)用示波器观察输出信号.
*利用VHDL语言设计加法和乘法模块(网上的资料) 加法器语言:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity fulladder is
port(
reset : in std_logic;
clk : in std_logic;
operand1: in std_logic_vector(7 downto 0);
operand2: in std_logic_vector(7 downto 0);
carry : out std_logic;
sum : out std_logic_vector(7 downto 0)
);
end fulladder;
architecture Behavioral of fulladder is
begin
process(reset,clk)
variable sum_t : std_logic_vector(7 downto 0);
variable carry_t: std_logic;
begin
if(reset = '0') then
carry <= '0';
sum <= (others => '0');
elsif(rising_edge(clk)) then
carry_t := '0';
for i in 0 to 7 loop
sum_t(i) := operand1(i) xor operand2(i) xor carry_t;
carry_t := (operand1(i) and operand2(i)) or (carry_t and (operand1(i) or operand2(i)));
end loop;
carry <= carry_t;
sum <= sum_t;
end if;
end process;
end Behavioral;
乘法器VHDL语言:
library ieee;
use ieee.std_logic_1164.all;
entity multi8 is
port(a,b:in std_logic_vector(7 downto 0);
y:out std_logic_vector(15 downto 0));
end entity multi8;
architecture behavioral of multi8 is
begin
behavior:process(a,b) is
variable a_in:std_logic_vector(7 downto 0);
variable b_in:std_logic_vector(7 downto 0);
variable y_out:std_logic_vector(15 downto 0);
variable carry_in,carry:std_logic;
begin
a_in:=a;
b_in:=b;
y_out:=(others=>'0');
for count in 0 to 7 loop
carry:='0';
if(b_in(count)='1') then
for index in 0 to 7 loop
carry_in:=carry;
carry:=(y_out(index+count) and a_in(index))
or (carry_in and (y_out(index+count) xor a_in(index))); y_out(index+count):=y_out(index+count) xor a_in(index) xor carry_in;
end loop;
y_out(count+8):=carry;
end if;
end loop;
y<=y_out;
end process behavior;
end architecture behavioral;
第二篇:基于FPGA的DDS波形发生器的设计开题报告
特别说明
此资料来自豆丁网()
您现在所看到的文档是使用下载器所生成的文档
此文档的原件位于
感谢您的支持
抱米花
/p-47824709.html