1、电子电路课程设计DDS信号发生器电路设计一、 实验目的掌握DDS的原理以及如何在FPGA上实现,初步了解VHDL。 要求信号频率输出范围为50HZ10KHZ,频率可调,步长为50HZ,频率稳定度10-3 ; 正弦波和脉冲波输出幅度可调,调整范围100mV3V; 信号源输出负载为600,输出幅度100mV3V可调。二、 实验仪器PC机、DE2开发板、Quartus三、 实验内容利用DE2实验开发装置,在给定电源电压条件下,完成正弦波信号发生器电路设计。1、 技术指标 信号频率输出范围50HZ10KHZ,频率可调。不仅调整,步长0.5HZ或50HZ; 频率稳定度10-3;2、发挥部分 增加脉冲信号
2、的输出,信号频率输出范围50HZ10KHZ; 脉冲信号占空比可调,调整范围2%98%; 正弦或脉冲频率步长调整可分为1HZ、10HZ、100HZ、1KHZ; 正弦波和脉冲波输出幅度可调,调整范围100mV3V; 完成在数码管上数字频率显示功能; 信号源输出负载为600,输出幅度100mV3V可调。四、 实验过程直接数字合成DDS是一种新的频率合成技术和信号产生的方法,是通过对相位的运算进行频率合成的。它的主要理论依据是时域抽样定理。它具有超高速的频率转换时间,极高的频率分辨率和较低的相位噪声,在频率改变时,DDS能够保持相位的连续,因此很容易实现频率、相位和幅度调制。直接数字频率合成器是从相位
3、概念出发直接合成所需波形。一个直接数字频率合成器由相位累加器、波形存储ROM、D/A转换器和低通滤波器(LPF)构成。相位累加器在时钟信号fclk的控制下以步长K作累加,输出的N为二进制码作为波形ROM的地址,对波形ROM进行寻址,波形ROM输出D位幅度码经过D/A转换器变成阶梯波,再经过低通滤波器平滑后就可以得到合成的信号波形。1、 相位累加器相位累加器的位数N是决定DDS系统指标的重要参数之一。信号的输出频率f0=(K * fclk)/2N ,其中K为频率控制字,fclk 为时钟信号,N为累加器对波形存储器ROM部分的地址输出(ADDRESS)。相位累加器是由N位加法器和N位寄存器级联构成
4、的。寄存器是将加法器在每一个时钟作用后产生的相位数据锁存起来的,并将这些数据反馈到加法器的输入端,使加法器在下一个时钟作用时继续与频率控制字进行相加。每来一个时钟脉冲fclk时,加法器将频率控制字与寄存器输出的相位累加数据相加,然后又把相加的结果送至寄存器的数据输入端。这样相位累加器在时钟作用下进行累加。当相位累加器累加满量时就会产生一次溢出,完成一个周期性动作。实验中定步长为50HZ,采用两级分频,累加器的位长都为20,因为这样才能满足实验要求的频率稳定度为10-3 。设第一级、第二级的频率控制字分别为K1、K2。由式子f0=(K * fclk)/M,其中K=K1*K2,M=2N*2N,N=
5、20,f0=50HZ,fclk=50MHZ,则得K=1099511.627776,则令K1=10995,K2=100,误差足够小。频率控制字模块:第一级频率控制字K1=10995,定义名为k10995。 频率控制字是用VHDL语言汇编出来的,它的VHDL源代码是:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity k10995 is Port( data0:out std_logic_vector(19 downto 0)
6、; end k10995; architecture a of k10995 is begin data0=00000010101011110011;end a;汇编语言的前四行是VHDL汇编语言的典型语句,编写这些语句才能使用VHDL语言,第四行的“entity k10995”是对实体k10995说明的,Port后的语句是限制实体长度,即从控制字一共接出20根线,从0至19。“end k10995”是结束对k10995的定义。接下来是结构体语句,a为结构体,k10995为实体名,从begin开始是对实体进行功能描述的,因为这里的控制字为10995,则将10995转化为二进制数表示为10101
7、011110011,但是已定义实体长度为20,则在功能描述时应在10101011110011前补0,使其为20位二进制数,“end a”结束语句。第二级频率控制字K2=100,定义名为k100。VHDL源代码为:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity k100 is Port( data0:out std_logic_vector(19 downto 0); end k100; architecture a o
8、f k100 is begin data0=00000000000001100100; end a;设计出的第一级分频模块:第一级分频仿真出的波形图为:放大后的波形为:测得Tclk=95.82ns-98.81ns=0.01ns,T1=92.01ns-91.06ns=0.95ns则第一级输出fout1=50000000*(0.01/0.95)=526315.7894737HZ第二级分频模块:第二级分频仿真波形图:T2=324.57ns-219.71ns=104.86ns则最后验证测算得fout=(0.01/0.95)*(0.01/104.86)*50000000=50.1922363HZ与所要得
9、到的步进50HZ大致相等,验证成功。在分频前设计的步进模块:步进部分另设了一个时钟信号,该信号是按键脉冲,当手动给一个信号时,加法器与寄存器反馈回来的相位累加相加,然后将结果作为分频部分第二级累加器的输入进行运算,使最后输出能够以50HZ步进。、预分频模块:2、 正弦ROM查找表波形存储器把存储在相位累加器中的抽样值转换成正弦波幅度的数字量函数,可理解为相位到幅度的转换。它的输入是相位调制器输出的高M位(而并非全部N位)值,将其作为正弦ROM查找表的地址值;查询表把输入的地址相位信息映射成正弦波幅度信号;输出送往DAC,转化为模拟信号。所以可在给定的时间上确定输出的波形幅值。ROM存储器模块:
10、 ROM取从累加器出来20位线的高八位,所以ROM表中的数据应该是从0255,一共28(256)个数。构成ROM中初始化波形数据文件的格式有两种:Memory Initialization File(.mif)格式和Hexadecimal(Intel-Format) File(.hex)格式。实验中数据表文件应用的是.mif格式。先将ROM表以文本文档形式存储,然后转换为.mif格式。ROM表.mif文件数据:导入.mif文件后,分析并附管脚:测试ROM,得到正弦波:当频率较小时所观察到的波形:当不断地按按键脉冲,使频率不断增大,这时所观察到的波形图为:正弦波-方波转换模块:(实现了正弦波与方
11、波的任意转换)模块中的“switch”元件是实现正弦波向方波转换的关键,该元件是用VHDL编写的,它只接从ROM引出的那八位线中一根。它的VHDL源代码是:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity switch is Port ( x:in std_logic; data0:out std_logic_vector(7 downto 0) ); end switch;architecture a1 of switch i
12、sbegindata0(7)=x;data0(6)=x;data0(5)=x;data0(4)=x;data0(3)=x;data0(2)=x;data0(1)=x;data0(0)=x;end a1;在switch后接的是一个参数化多路复用器,当sel给脉冲有高电平时,则lpm_mux_x选择data1x7.0,此时是从ROM输出直接引进的输入,这时最后结果输出的是正弦波;如果sel是低电平,则复用器选择的是data0x7.0,此时是从switch引进的输出,这时的输入已经经过了正弦波向方波的转换,所以这时的最后输出是方波。频率较小时所得到的方波波形:增加频率到较大时得到的方波波形图:3、D
13、/A转换器 D/A转换器是将数字信号转换为模拟信号,实验中是将合成的正弦数字量转换成模拟量。波形ROM输出D位幅度码S(n)经过D/A转换器变成阶梯波S(t)。D/A模块中采用DAC0832,下图为DAC0832的管脚图:/CS片选信号,低有效;与允许输入锁存ILE信号和起来可对/WR1是否起作用进行控制;ILE:允许输入锁存,高电平有效;/WR1:写信号1,输入,低电平有效。它用来将微机数据总线送回的数字输入锁存于输入寄存器中。在/WR1有效时, /CS和 ILE必须同时有效。/WR2:写信号2,低电平有效。该信号用以将所存于输入寄存器中的数据传送到8位DAC寄存器中锁存起来。在/WR2有效
14、时,/XFER同时须有效。/XFER:传送控制信号。用来控制/WR2,选通DAC寄存器。 DI0-DI7:8位数字量输入。DI0为最低位。IO1:DAC电流输出1。IO2: DAC电流输出2。Rfb:反馈电阻,固化在芯片内。作为外部运算放大器的分路反馈电阻,为DAC提供电压输出信号,并与R-2R电阻网络相匹配。VREF:基准电压输入。通过它将外加高精度电压源和芯片内R-2R组成的T型网络相连接。VCC:数字电源电压。AGND:模拟地。模拟电路地接地端,应始终与数字电路地端一点相接。DGND:数字地。0832结构框图:0832与LF356构成D/A转换部分。LF356管脚图:在LF356的1与5
15、管脚间接一个25K的电位器,6管脚与0832的9管脚相连,2、3管脚分别接0832的11、12输出管脚,4、7管脚分别接15V。在0832的8管脚接一个稳定输入信号的电路,使VREF稳定5V输出。稳定输入电压电路部分由一个10K的电阻与一个10K的电位器串联然后与稳压管LM336并联。LM336的内部构造图解:LM336中间管脚为正,右管脚为负,左管脚为可调端。实验中,搭完这部分电路后需要进行检测。给电路板加上15V,5V电压和接地。然后将0832的DI0至DI7全接1,再用万用表测0832的8管脚即VREF是否为5V,这是根据VO=-VREF*(D0*2n+D1*2n-1+Dn*20)/2n
16、+1。如果测得为5V则D/A转换部分完成;若不等于5V,则需调稳定电压输入部分的10K电位器,直至VREF等于5V。此部分电路图为:4、 低通滤波器 对D/A转换器输出的阶梯波S(t)进行频谱分析可知, S(t)中除了主频外fo外,输出主频fo ,必须在D /A转换器的输出端接截止频率为fc /2的低通滤波器。低通滤波采用典型的低通二阶滤波,电路图为:电路中的R1、R2均为10K,R选用的是82K的电阻电路搭完后应检测低通滤波性能是否良好。将滤波器与上一级的D/A转换部分断开,单给一个信号,这是需要用到信号发生器与示波器。当所给信号频率成倍增加时,所观察到的波形峰峰值应是不断衰减减小的。5、
17、集成运放电路(该部分由自己设计,发挥部分) 该部分要求:正弦波和脉冲波输出幅度可调,调整范围100mV3V。所设计的电路及元件参数如图:R选用的是10K的电阻,Rf选用的是50K的电位器与500的电阻串联,因为没有规格为500的电阻,则选用的两个1K的电阻并联。调节电位器,得到最低电压为120mV,最高电压为9.2V。将电路搭完后与前面的滤波及D/A转换部分连起来。电路为:6、检测整个电路将电源加上,将ROM定义的data7至data0管脚分别与DAC0832的DI7至DI0相连。需用到DE2开发板,使用之前需附好所有管脚及编译。编译成功:先检测从D/A转换器出来的波形:然后检测从低通滤波器出
18、来的波形:最后检测从放大出来的波形,并不断增加步进观察波形的变化:步进增加50HZ:步进再增加50HZ:接着增加:五、实验扩展扩展一:信号源输出负载为600,输出幅度100mV3V可调。先调节电路电压为6V,然后在运放电路的输出端与地之间接了一个电阻箱,电阻箱先以99999.9的阻值接入电路,然后一点一点不断地减小阻值,直到从示波器上所观察到的波形出现扭曲时,记下此时的阻值。记下实验结果为203。扩展二:正弦或脉冲频率步长调整可分为2HZ、20HZ、200HZ、2KHZ。这个部分是为了改变步进的值,同样用了之前的步进模块,只是频率控制字发生改变。K=2:K=20:K=200:K=2000:8位
19、总线的2线1线多路复用器的使用是为了选择步进值的,当选择000时,步进则为2000;选择001时,步进为200;选择010时,步进为20;选择011时,步进为2;选择100时,步进为之前的值50。这就完成了步进的选择变换。k2的VHDL源代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity kb2 is Port( data0:out std_logic_vector(19 downto 0); end kb2; ar
20、chitecture a of kb2 is begin data0=00000000000000000010;end a;k20的VHDL源代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity kb20 is Port( data0:out std_logic_vector(19 downto 0); end kb20; architecture a of kb20 is begin data0=0000000000
21、0000010100;end a;k200的 VHDL源代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity kb200 is Port( data0:out std_logic_vector(19 downto 0); end kb200; architecture a of kb200 is begin data0=00000000000011001000;end a;k2000的VHDL源代码:library I
22、EEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity kb2000 is Port( data0:out std_logic_vector(19 downto 0); end kb2000; architecture a of kb2000 is begin data0=00000000011111010000;end a;最后的附管脚图:六、问题与改进1.在第二级累加部分,第二级的输出频率始终看不到,一直为一条直线。我们分析原因,可能是所给
23、脉冲的时间太短,out_2还来不及输出,始终信号就已经结束了,后来增加仿真时间后观察到所要的波形了。2.在用VHDL编出k100后,双击k100模块出现的不是VHDL源代码,后来发现是源代码文件没有放在指定的文件里,而且源代码命名与k100命名不一致。改正后再双击k100得出的是其VHDL源代码。3.在模拟部分,检测时出现的波形不是自己想要的,这一主要原因基本上是电路没搭稳,或者芯片烧坏等问题,所以以后在模拟这块需要十分谨慎,严谨搭错管脚,或者导线没插好。4.搭完运放电路检测时出现的波形总是虚的,而且不平稳,起初以为是滤波部分没有搭好,便重新检查滤波,但滤波出来的结果非常好;然后又返回去检查D
24、/A转换部分,也是所要的结果。最后整体检查时发现,电源的一根地线没插,插好地线后再检测便得到了想要的波形。七、心得体会在这次持续两周的课程设计中,我学到了很多。当刚接到这个课题时感觉压力很大,怀疑两周之内没法完成这个任务。虽然之前接触过一点Quartus软件,但还不能完全熟练地使用,而且课题中需要的不仅仅是软件方面的东西,也需要硬件方面的东西,需要自己搭板子,而硬件则往往是最容易出问题的,因为有一些客观上的因素。VHDL语言之前也是从未接触过,现在稍微了解了一点。最大的收获是对于DDS系统的了解,特别是了解到它每一个模块的作用,巩固了上学期所学的数字电路逻辑设计与模拟电路。实验中,每个模块设计
25、完成后都要进行编译,编译通过后得出DDS信号源总体设计框图,再次对DDS信号源总体设计框图进行编译并进行引脚锁定。在编译通过的情况下,完成仿真波形。全程编译通过后下载到DE2板上,嵌入式逻辑分析仪signaltap 可以方便地把实际检测的信号通过JTAG口回送到计算机进行显示和分析。这次课设我们是以小组形式进行的,在实验中遇到问题我们需要共同来分析问题找出问题。在设计过程中,不能急躁,要细心,出现错误不得气馁,要耐心谨慎的去分析发现错误所在并改正错误,最终完成设计的全过程。这次的课程设计,我学会了很多,对VHDL语言,VHDL程序的设计流程,FPGA软件的使用以及DDS原理和与其对应的rom表的应用。这不仅复习了已经学过的专业知识,也接触到了一些新鲜东西,更重要的是我们在实验中寻找到了乐趣,还有学习的方法和与人相处合作的重要,收获良多。八、参考文献1李春云.电工电子实验教程(修订版).北京工业出版社.2009年出版2童诗白.模拟电子技术基础(第4版).北京高教出版社.2006年出版- 29 -