DDS信号发生器电路设计说明书.docx

上传人:b****5 文档编号:14822327 上传时间:2023-06-27 格式:DOCX 页数:30 大小:722.72KB
下载 相关 举报
DDS信号发生器电路设计说明书.docx_第1页
第1页 / 共30页
DDS信号发生器电路设计说明书.docx_第2页
第2页 / 共30页
DDS信号发生器电路设计说明书.docx_第3页
第3页 / 共30页
DDS信号发生器电路设计说明书.docx_第4页
第4页 / 共30页
DDS信号发生器电路设计说明书.docx_第5页
第5页 / 共30页
DDS信号发生器电路设计说明书.docx_第6页
第6页 / 共30页
DDS信号发生器电路设计说明书.docx_第7页
第7页 / 共30页
DDS信号发生器电路设计说明书.docx_第8页
第8页 / 共30页
DDS信号发生器电路设计说明书.docx_第9页
第9页 / 共30页
DDS信号发生器电路设计说明书.docx_第10页
第10页 / 共30页
DDS信号发生器电路设计说明书.docx_第11页
第11页 / 共30页
DDS信号发生器电路设计说明书.docx_第12页
第12页 / 共30页
DDS信号发生器电路设计说明书.docx_第13页
第13页 / 共30页
DDS信号发生器电路设计说明书.docx_第14页
第14页 / 共30页
DDS信号发生器电路设计说明书.docx_第15页
第15页 / 共30页
DDS信号发生器电路设计说明书.docx_第16页
第16页 / 共30页
DDS信号发生器电路设计说明书.docx_第17页
第17页 / 共30页
DDS信号发生器电路设计说明书.docx_第18页
第18页 / 共30页
DDS信号发生器电路设计说明书.docx_第19页
第19页 / 共30页
DDS信号发生器电路设计说明书.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

DDS信号发生器电路设计说明书.docx

《DDS信号发生器电路设计说明书.docx》由会员分享,可在线阅读,更多相关《DDS信号发生器电路设计说明书.docx(30页珍藏版)》请在冰点文库上搜索。

DDS信号发生器电路设计说明书.docx

DDS信号发生器电路设计说明书

 

北京信息科技大学

自动化学院

实验报告

 

课程名称综合电子设计

实验名称DDS信号发生器电路设计

实验仪器DE2开发板,QuartusⅡ,示波器等

专业自动化

班级/学号自控0901/

学生姓名

实验日期2012-4-16~2012-4-27

实验地点小营校区实验室1-7-102

成绩

 

一、实验目的

1.1.了解电子电路设计的一般方法、根据题目要求选择设计方案。

1.2.根据理论计算分析,查阅相关资料和手册,选择电子元器件。

1.3.学会使用电子设计自动化软件对电路进行设计、分析、验证。

利用可编程逻辑器件实现电路的设计、仿真、下载。

1.4.熟练使用常用电子仪器(示波器、万用表、信号发生器等)对电路进行测试。

1.5.写出符合要求的课程设计报告。

二、实验设备

DE2开发板、QuartusII9.1(32-Bit)、示波器、PC机等

三、实验内容:

Ø基本内容:

(1).了解FPGA器件工作原理及DE2开发板结构

(2).学习QUARTUS软件电路设计及仿真下载方法;

(3).利用DDS技术完成正弦波信号发生器电路设计。

(4).基本要求:

信号频率输出范围50HZ~100KHZ,步长0.5HZ或50HZ,频率可调。

(5).用QUARTUS软件进行仿真分析且下载验证。

Ø扩展内容:

(1).增加脉冲信号或三角波信号的输出;

(2).频率步长分为1HZ、10HZ、100HZ、1KHZ、10KHZ多档位调整;

(3).输出波形幅度可调;

(4).完成在数码管上数字频率显示功能;

(5).自扩展功能……

1

2

3

3.1DDS简介

直接数字合成(DirectDigitalSynthesis,DDS)是一种应用数字技术来实现产生信号波形的方法。

DDS技术建立在采样定理的基础之上,他首先对产生的信号波形进行采样和量化,然后存入存储器作为待产生信号波形的数据表(即rom)。

在输出信号波形时,从数据表中依次读出数据,产生数字化的信号,再经过D/A转换形成所需要的模拟信号波形(本实验采用AD0832转换芯片)。

根据上述描述,要想改变信号的频率只需要改变扫描rom表的频率即可,而这可以通过改变频率控制字来实现。

要想产生不同类型的信号,只需要让他扫描不同信号对应的rom表即可,而这可以通过制作多个rom表,利用DE2开发板上的相关按键或者开关来产生选通来实现。

相对于其他信号产生技术而言(),具有输出信号的采样频率固定、全数字化、易于控制、可编程、输出相位连续和频率转换时间短等优点。

直接数字频率合成器原理框图

本次设计采用DE2开发板上的固定时钟为50MHz,此时钟经过二次分频后在对rom表进行扫描,产生数字信号,经过D/A转换后即可产生所需模拟信号。

为了达到更好的效果再用低通滤波器进行滤波以去掉各种高频干扰。

如下图:

上图中,需要设计频率控制字、累加器、加法器、正弦查找表、D/A转换电路、低通滤波。

各部分组成及原理如下:

1

2

3

3.1

3.1.1相位累加器与加法器

DDS系统的核心是相位累加器。

相位累加器由N位加法器与N位累加寄存器级联构成,其原理框图下图所示。

每来一个时钟脉冲Fc,N位加法器将频率控制数据K与累加寄存器输出的累加相位数据相加,把相加后的结果Y送至累加寄存器的输入端。

累加寄存器一方面将在上一时钟周期作用后所产生的新的相位数据反馈到加法器的输入端,以使加法器在下一时钟的作用下继续与频率控制数据K相加;另一方面以相加后的结果形成正弦查询表的地址,取出表中与该相位对应的单元中的幅度量化正弦函数值,作为取样地址值送入幅度/相位转换电路。

这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。

相位累加器原理框图

由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位。

当相位累加器加满量时就会产生一次溢出,溢出频率就是DDS输出的信号频率。

相位累加器的最大计数长度与正弦查询表中所存储的相位分隔点数相同,在取样频率(由参考时钟频率决定)不变的情况下,由于相位累加器的相位增量不同,将导致一周期内的取样点数不同,输出信号的频率也相应变化。

如果设定累加器的初始相位,则可以对输出信号进行相位控制。

由采样原理可知,如果使用两个相同的频率合成器,并使其参考时钟相同,同时设定相同的频率控制字、不同的初始相位,那么在原理上就可以实现输出两路具有一定相位差的同频信号。

3.1.2正弦查找表ROM

波形存储器(即,正弦ROM查找表)把存储在相位累加器中的抽样值转换成正弦波幅度的数字量函数,可理解为相位到幅度的转换。

它的输入是相位调制器输出的高M位(而并非全部N位)值,将其作为正弦ROM查找表的地址值;查询表把输入的地址相位信息映射成正弦波幅度信号;输出送往DAC,转化为模拟信号。

3.1.3D/A转换器

D/A转换器的作用是将从rom表中输出的波形采样数据进行转换,产生阶梯波形。

初步将数字量转成模拟量。

3.1.4低通滤波器

用于将D/A转换出来的阶梯信号进行平滑,产生符合一定要求的模拟波形。

3.1.5放大电路

用于将D/A转换出来的信号进行适当的放大,产生需要的信号。

3.1.6二进制代码转换电路

二进制转换电路用于将频率控制字(二进制数)转换成十进制,用于数码管显示。

本次实验采用软件转换的方法,即在设计过程中显示模块采用VHDL语言的CONV_INTEGER()函数进行转换,在利用case语句实现显示。

因而不需要专门的二进制转换电路。

3.1.7数码管显示电路

用于显示输出波形的频率。

由于输出波形的频率和频率控制字直接相关,因而直接将频率控制字进行相应的计算经二进制转十进制后,再译码后,将译码信号直接送至数码显示管即可。

3.2实现方案简述

本方案共包括以下几个模块:

两级分频(累加器、锁存器),置数模块,数码管显示模块,rom模块,输出选通模块,D/A转换模块,滤波放大模块。

关于分频、累加器模块:

本方案采用DE2系统的固定时钟fclk=50MHz,在FPGA中,相位累加器和相位调制器都可通过加法器来实现。

如果要实现对幅度的调制则可在正弦查找表后插入一个乘法器来实现。

在用FPGA设计的过程中,整个流程都采用系统时钟fclk产生和控制,所以其各个部分的时序和同步性需要认真对待。

在进行设计的过程中涉及到各参数的计算如下:

由于fc=50MHz,

其中;

而N一旦设计完成后就不能再改变,也就是说M是一个定值,系统的输入时钟也是定值,要想改变系统的输出频率只能改变频率控制字K。

为了准确的表示出输出频率f0我们希望fc/2N为一个定值,也就是说f0和fc是简单的线性关系。

分析上式还可以发现频率控制字K每加1,f0对应的增加fc/2N,也就是说频率的最小步进为fc/2N,亦即此时的输出最小值:

fmin=fc/2N

为了实现的可行性,以及在步进时能够达到一定的要求(最小步进为0.5Hz),我们希望fc/2N=1/2。

此时如果希望步进为50Hz,只需在调整步进时M每次加100即可实现。

而fc=50MHz,此时如果要满足上述要求

N=26.57

这不是一个整数。

也就是说我们无法得到:

fc/2N=1/2

于是我们在第一级分频时给M值为(90071993)10,这样一级分频后输出的频率fc1=220=1048576HZ;这样一级分频完成后,由

在二级的累加器位数只需N+1=21位。

于是改变不同的频率控制字K得到的频率:

f0=1/2K;

置数模块:

严格意义来讲本实验方案中包含两个置数模块,分别用在一二级分频。

由于一级分频得到的是一个固定的频率,也就是说置数值是个固定值,直接在程序中写入。

这个置数功能简单。

另一个置数在二级,实现置不同的数。

置数的方法采用case语句,根据选择的步进幅度,分别为每按一次开关分别加0.5,1,10,100,1000Hz;实现不同方式的置数,见步进的最小值为0.5Hz,满足要求。

数码显示模块:

数码显示模块最重要的一个问题是把K值(二进制)转成十进制,并利用译码程序将K的值显示出来。

需要格外注意的是,由于我们输出的频率f0=1/2K,因而需将K值除以2在送到译码。

将K值(二进制)转成十进制,采用VHDL语言里面的CONV_INTEGER()函数。

由于此函数只能保留整数部分。

而K值可能是奇数也可能是偶数,经过除2之后可能出现小数。

为了保证小数部分也能显示,在译码之前先判断K值的奇偶性(二进制最低位如果为1则为奇数,如果为0则为偶数)。

如果是奇数直接给数码管的小数位(最低位)输出5,如果为偶数输出0。

整数部分是利用求模取余的方式分离出各个位数对应的数值,再送到相应的译码程序即可。

关于译码程序需要注意的是DE2的数码管是共阳极,需要用共阳的七段显示码.

关于rom模块:

rom模块,关键是生成*.mif文件。

生成mif文件也有多种方式:

(1)quartus菜单操作法,

(2)c语言编译法,(3)汇编语言生成法,(4)Mif_Maker2010软件生成等;本方案采用(4)Mif_Maker2010软件生成法,如图:

生成三角波

生成mif文件后选择Tools/MegaWizardPlug‐InManager…菜单生成相应的rom模块,即可。

输出选通模块:

选通模块主要是根据外部给的输入信号,进行相应的判断,输出对应的波形。

用case语句,外部输入采用开关输入(高低电平)。

当然也可以采用按键(脉冲)的方式进行相应的切换。

关于D/A转换模块:

采用AD0832由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

DAC0832的主要特性参数如下:

  *分辨率为8位;

  *电流稳定时间1us;

  *可单缓冲、双缓冲或直接数字输入;

  *只需在满量程下调整其线性度;

  *单一电源供电(+5V~+15V);

*低功耗,20mW。

电路如下图所示。

关于滤波放大模块:

低通滤波电路采用的是二阶低通滤波电路,如下图

放大则采用Op07,其特点:

超低偏移:

150μV最大。

低输入偏置电流:

1.8nA。

低失调电压漂移:

0.5μV/℃。

超稳定,时间:

2μV/month最大高电源电压范围:

±3V至±22V。

3.2

3.2.1程序设计流程图:

两级分频(累加器、锁存器):

此部分直接在quartus中使用MegaWizardPlug‐InManager工具进行宏功能模块的设计的实现方法。

因而不用写程序代码,大大减轻了工作量。

这里面主要是加法器和寄存器(锁存器)构成。

置数模块:

此部分共有两个。

分别是一级分频和二级分频对应的置数.

一级分频置数二级置数

数码管显示模块:

 

输出选通模块:

D/A转换模块,滤波放大模块:

以上两个模块均选用面包板进行搭接,无需程序设计。

D/A0832转换

二阶滤波

电路结构框图

3.2.2系统的顶层逻辑图:

3.2.3FPGA资源利用率

3.3实验仿真结果

3.3

1.

2.

3.

3.1.

3.2.

3.3.

3.3.1.各模块的仿真时序图

置数模块:

选通模块:

3.3.2.在线逻辑分析仪输出:

正弦波输出

方波输出

三角波输出

3.4实验测试结果

3.4

4.

5.

5.1.

5.2.

步进测试

50.5hz51.5hz

61.5hz161.5hz

1000hz

理论频率

如图:

50.5HZ

实测频率

如图:

50.51HZ

误差

(50.51-50.50)/50.5×100%=0.02%

数码管显示数值(步进不同数值,各截图一组)

原始:

步进0.5Hz:

步进1Hz:

步进10Hz:

步进100Hz:

步进1000hz:

在线逻辑分析仪输出

正弦波:

方波:

三角波:

锯齿波:

示波器截图

D/A输出

低通电路输出

放大电路输出

一、

二、

三、

四、问题与改进

3

4

4.1

4.2DDS累加器的位数过高时,示波器无法准确的测出频率。

在实验条件允许的情况下尽可能的选用好的示波器。

4.3DDS频率如果过低的话10Hz一下,示波器无法准确的测量。

采用频率计进行测量,最低可以测量到2Hz。

4.4采用面包板搭接外围电路的好处就是方便,但是接触不好,而且容易产生较大的干扰。

如果能采用焊接的方法来实现可能效果会更好。

4.5外围电路在设计的过程中没有严格要求需要用相关的软件进行仿真。

建议能要求用相关软件mutisim仿真,这样准确度高,而且实现的也比较快。

4.6设计过程中,对于相关概念的理解以及相关设计思路比较重要。

如果时间允许的话,能够进行系统的讲解,这样有助于其后的设计与仿真。

五、实验感言

经过本次综合电子设计,也就是是关于DDS信号发生器电路的设计,我了解电子电路设计的一般方法、根据题目要求选择设计方案。

根据理论计算分析,查阅相关资料和手册,选择电子元器件。

学会了使用电子设计自动化软件对电路进行设计、分析、验证。

利用可编程逻辑器件实现电路的设计、仿真、下载。

另外,熟练使用常用电子仪器(示波器、万用表、信号发生器等)对电路进行测试。

六、参考文献

1

2

3

4

5

6

5

6

6.1

6.2DDS信号发生器电路设计实验指导

6.3VHDLprogrammingbyexample(fourthedition)[美]DouglasL.Perry.杨承恩谭克俊颜德文译。

6.4Vddl设计电子线路.边计年薛宏熙译。

6.5Eda技术实践张彩珍等编。

6.6基于vhdl语言与quartus软件的可编程逻辑器件应用于开发.郑燕郝建国党建华编。

七、附录(程序代码)

1

2

3

4

5

6

7

1.

2.

3.

4.

一级置数

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

Entitym1is

Port(Q:

outstd_logic_vector(31downto0)

);

Endm1;

Architectureaofm1is

begin

Q<="00000101010111100110001110111001";

Enda;

二级置数

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

Entitym2is

Port(clr:

instd_logic;

wei:

instd_logic_vector(3downto0);

up:

instd_logic;

Q:

outstd_logic_vector(20downto0)

);

Endm2;

Architectureaofm2is

signaltmp:

std_logic_vector(20downto0);

begin

process(up,clr)

begin

ifclr='1'thentmp<="000000000000001100100";

elsifup'eventandup='1'then

caseweiis

when"0000"=>tmp<=tmp+"1";

when"0001"=>tmp<=tmp+"10";

when"0010"=>tmp<=tmp+"10100";

when"0100"=>tmp<=tmp+"11001000";

when"1000"=>tmp<=tmp+"11111010000";

whenothers=>null;

endcase;

iftmp>"100111000100000000"ortmp<"000000000000001100100"thentmp<="000000000000001100100";

endif;

endif;

endprocess;

Q<=tmp;

Enda;

显示译码

LIBRARYIEEE;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

useieee.std_logic_arith.all;

ENTITYTURN2_10IS

PORT(in2:

INSTD_LOGIC_VECTOR(20DOWNTO0);

xiao:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

ge:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

shi:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

bai:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

qian:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

wan:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)

);

END;

ARCHITECTUREARTOFTURN2_10IS

signalin2t:

std_logic_vector(20downto0);

signalin2tt:

std_logic_vector(20downto0);

signalout10:

INTEGERRANGE0TO2097151;

signaldata0:

INTEGERRANGE0to9;

signaldata1:

INTEGERRANGE0to9;

signaldata2:

INTEGERRANGE0to9;

signaldata3:

INTEGERRANGE0to9;

signaldata4:

INTEGERRANGE0to9;

signaldata5:

INTEGERRANGE0to9;

BEGIN

in2t<=in2;

data0<=5when(in2and"000000000000000000001")="000000000000000000001"else0;

in2tt<="0"&in2t(20downto1);

out10<=CONV_INTEGER(in2tt);

data5<=out10/10000;

data4<=out10/1000-data5*10;

data3<=out10/100-data5*100-data4*10;

data2<=out10/10-data5*1000-data4*100-data3*10;

data1<=out10mod10;

xiao<="1000000"whendata0=0else

"1111001"whendata0=1else

"0100100"whendata0=2else

"0110000"whendata0=3else

"0011001"whendata0=4else

"0010010"whendata0=5else

"0000010"whendata0=6else

"1111000"whendata0=7else

"0000000"whendata0=8else

"0010000";

ge<="1000000"whendata1=0else

"1111001"whendata1=1else

"0100100"whendata1=2else

"0110000"whendata1=3else

"0011001"whendata1=4else

"0010010"whendata1=5else

"0000010"whendata1=6else

"1111000"whendata1=7else

"0000000"whendata1=8else

"0010000";

shi<="1000000"whendata2=0else

"1111001"whendata2=1else

"0100100"whendata2=2else

"0110000"whendata2=3else

"0011001"whendata2=4else

"0010010"whendata2=5else

"0000010"whendata2=6else

"1111000"whendata2=7else

"0000000"whendata2=8else

"0010000";

bai<="1000000"whendata3=0else

"1111001"whendata3=1else

"0100100"whendata3=2else

"0110000"whendata3=3else

"0011001"whendata3=4else

"0010010"whendata3=5else

"0000010"whendata3=6else

"1111000"whendata3=7else

"0000000"whendata3=8else

"0010000";

qian<="1000000"whendata4=0else

"1111001"whendata4=1else

"0100100"whendata4=2else

"0110000"whendata4=3else

"0011001"whendata4=4else

"0010010"whendata4=5else

"0000010"whendata4=6else

"1111000"whendata4=7else

"0000000"whendata4=8else

"0010000";

wan<="1000000"whendata5=0else

"1111001"whendata5=1else

"0100100"whendata5=2else

"0110000"whendata5=3

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2