DDS数字频率合成器——EDA课程设计.doc_第1页
DDS数字频率合成器——EDA课程设计.doc_第2页
DDS数字频率合成器——EDA课程设计.doc_第3页
DDS数字频率合成器——EDA课程设计.doc_第4页
DDS数字频率合成器——EDA课程设计.doc_第5页
已阅读5页,还剩15页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

石家庄经济学院信息工程学院电子信息工程专业EDA技术课程设计报告题目: 数字频率合成器 姓 名 学 号 班 级 指导教师 2012年 1 月 12 日要求:1指导教师按照课程设计大纲要求完成学生课程设计指导工作。2课程设计任务书由指导教师照大纲要求填写,内容要全面。3课程设计报告由参加本学生填写。课程设计结束时交指导教师。4指导教师要根据每一位学生课程设计任务完成情况,认真审核设计报告,并在课程设计结束时,给出客观、准确的评语和成绩。5课程设计任务书和报告要语言流畅,图表正确规范。课程设计任务书班级 姓名 学号 课程设计题目 数字频率合成器 课程设计起止日期 2011年12月26日 至 2012年1月13日 实习地点 课程设计内容与要求 数字频率合成器:要求:1、及格:输出正弦波,并显示频率; 2、中:输出频率为1kHz,峰值为5V的正弦波; 3、良:可输出三种波形(正弦波、方波、三角波),可用按键任意切换,并显示波形号(1、2、3),显示频率。 4、优:频率范围10010000Hz,数控频率步进100Hz。 指导教师 2011 年12月26日一、设计原理与技术方法:包括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明;软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。1、 基本原理对于正弦信号f(t) = sin(2f0t),沿其相位轴方向,以等量的相位间隔对其进行相位幅值取样,得到该信号的抽样序列,并将其用M位二进制数表示,当频率控制字改变时,相位增值量发生变化,抽样值的周期随之而改变,从而合成所需的频率。抽样序列通过数模转换器形成量化的正弦波,生成标准的正弦波。其原理图如下: 图 1 在该电路组成上,包括基准时钟fc、频率预制调节电路、相位累加器、波形存储器、DA转换器。频率预制调节电路用M位二进制预制要求输出的频率;相位累加器对代表频率的M位二进制数进行累加运算,产生后面波形存储器所需的查表地址;波形存储器实际上是CPLD芯片的RAM,其中存有所需的波形数据,供查表使用;读出的数据送入DA转换器和低通滤波器平滑输出至示波器观察。该电路的具体工作过程如下:在时钟脉冲fc的控制下,相位累加器频率控制数据K累加,把相加后的结果作为取样地址值送入波形存储器,波形存储器根据这个地址值输出相应的D位二进制波形数据,最后经DA转换器和低通滤波器将波形数据转换成所需要的模拟波形。其中相位累加器在基准时钟的作用下,进行线性相位累加,当相位累加器累加满量时就会产生一次溢出,这样就完成了一个周期,这个周期就是频率合成器信号的频率周期。频率合成器输出的频率与基准时钟频率的关系如下:课程设计报告注:此表可加附页fout=(fclk/2n)*k其中fclk为基准时钟频率,2n为波形存储器地址的字数,N即为相位累加器的位数,K为频率控制字。假定基准时钟为100kHz,累加器为10位,k=2,则fout 100Hz。2、 系统整体架构该系统采用top-down自顶向下设计方法,共分三级:第一级分为三个子系统:1、正弦波发生模块sin; 2、三角波发生模块delta; 3、矩形波发生模块fb;其他辅助模块为:波形选择模块;累加器模块leijia;频率控制字发生模块plkzz;选通器模块mux;基频发生模块base;防抖动模块smooth;整体原理图如下图:第二、三级见个子模块介绍。3、各子模块的设计与仿真(1)、累加器模块其源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity leijia isport (clk,clr,en:in std_logic; k:in std_logic_vector(7 downto 0); sum:out std_logic_vector(9 downto 0);end;architecture arc of leijia issignal temp:std_logic_vector(9 downto 0);signal k_temp:std_logic_vector(9 downto 0);begin K_temp =00 & k; process(clk,clr,en) begin if(clr=1)then temp=0000000000; elsif (clkevent and clk=1)then if(en=1)then temp=temp+k_temp; end if; end if;end process;sum=temp;end;(2)、正弦发生模块其内部图如下:Convertor模块代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity convertor isport(original_addr :in std_logic_vector(9 downto 0);address :out std_logic_vector(7 downto 0);data_convert :out std_logic);end convertor;architecture behave of convertor isbeginprocess(original_addr)beginif(original_addr(8)=1) thenaddress(7 downto 0)=not original_addr(7 downto 0);elseaddress(7 downto 0)=original_addr(7 downto 0);end if;data_convert=original_addr(9);end process;end behave;data_ convertor模块代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity data_convertor isport(rom :in std_logic_vector(7 downto 0);data_convert :in std_logic;data :out std_logic_vector(7 downto 0);end data_convertor;architecture behave of data_convertor isbeginprocess(data_convert,rom)beginif(data_convert=1) thendata(7 downto 0)=not rom(7 downto 0);elsedata(7 downto 0)=rom(7 downto 0);end if;end process;end behave;产生rom初始化文件的c+程序如下:#include#include#includevoid main()double pi=3.141593;double step=pi*2/1024;ofstream outfile;outfile.open(sin.mif);outfile-Maxplus Memory Initiallization Fileendl;outfile-sin.mifendl;outfileWIDTH=8;endl;outfileDEPTH=256;endl;outfileADDRESS_RADIX=HEX;endl;outfileDATA_RADIX=HEX;endlendl;outfileCONTENT BEGINendl;for(int i=0;i256;i+)outfilehexi : hexint(sin(i*step)+1)/2*255+0.5);endl;outfileEND;存储器里存储的是正弦波的1/4波形,当地址的第8位为1时,convertor将地址反相,这样的话当即是从底部进行寻址,即当波形达到顶端时,再从顶部向下走,当地址的第9位为1时,data_convertor将数据反相,即产生向下的波形。如果不采用上述方法,直接寻址时,当频率控制字k=10时,可寻点为25个;为100时,可寻点为2个,这样波形已严重失真,无法达到频率从100到10000的要求,如果采用上述方法,k=10时,可寻点为100个,为100是可寻点为10个,这样的话分辨率已大大提高。三角波模块和方波模块的原理如正弦波,就不在赘述。下面将产生三角波和方波的存储器初始化文件.mif文件的C+程序说明如下:三角波:#include#include#includevoid main()ofstream outfile;outfile.open(sin.mif);outfile-Maxplus Memory Initiallization Fileendl;outfile-sin.mifendl;outfileWIDTH=8;endl;outfileDEPTH=256;endl;outfileADDRESS_RADIX=HEX;endl;outfileDATA_RADIX=HEX;endlendl;outfileCONTENT BEGINendl;for(int i=0;i256;i+)outfilehexi : hexint(i/2+128);endl;outfileEND;方波#include#include#includevoid main()ofstream outfile;outfile.open(sin.mif);outfile-Maxplus Memory Initiallization Fileendl;outfile-sin.mifendl;outfileWIDTH=8;endl;outfileDEPTH=256;endl;outfileADDRESS_RADIX=HEX;endl;outfileDATA_RADIX=HEX;endlendl;outfileCONTENT BEGINendl;for(int i=0;i256;i+)outfilehexi : hexint(FF);endl;outfileEND;(3)波形选择模块:代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count3 isport (chg,clr:in std_logic; q:out std_logic_vector(3 downto 0);end;architecture arc of count3 is signal count:std_logic_vector(3 downto 0);begin process(chg)begin if (clr=1) then count= 0010)then count=0000; else count=count+1; end if;end if;end process;q=count;end;此为一个计数器,通过按键产生上升沿,从而改变计数器输出的数值,从而改变选通器选通的波形。其仿真图如下(4)频率控制字发生模块:其代码如下:library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity plkzz is port ( clr,hun,ten,one :in std_logic ; dis_hun,dis_ten,dis_one:out std_logic_vector(3 downto 0) ; k_count :out std_logic_vector(7 downto 0) ); end ; architecture behave of plkzz is signal temp_hun: std_logic_vector(7 downto 0); signal temp_ten: std_logic_vector(7 downto 0); signal temp_one: std_logic_vector(7 downto 0);signal temp_dis_hun: std_logic_vector(3 downto 0); signal temp_dis_ten: std_logic_vector(3 downto 0);signal temp_dis_one: std_logic_vector(3 downto 0);begin process(hun) begin if(clr=1) then temp_hun0);temp_dis_hun0); elsif(hunevent and hun=1) thenif(temp_dis_hun=1001) then temp_hun=00000000; temp_dis_hun=0000; else temp_hun=temp_hun+01100100; temp_dis_hun=temp_dis_hun+0001; end if;end if;end process; process(ten) begin if(clr=1) then temp_ten0); temp_dis_ten0); elsif(tenevent and ten=1) then if(temp_dis_ten=1001) then temp_ten=00000000; temp_dis_ten=0000; else temp_ten=temp_ten+00001010; temp_dis_ten=temp_dis_ten+0001; end if;end if; end process; process(one) begin if(clr=1) then temp_one0); temp_dis_one0); elsif(oneevent and one=1) then if(temp_dis_one=1001) then temp_one=00000000; temp_dis_one=0000; elsetemp_one=temp_one+00000001; temp_dis_one=temp_dis_one+0001; end if;end if; end process; k_count=temp_hun+temp_ten+temp_one;dis_one=temp_dis_one; dis_ten=temp_dis_ten;dis_hun=01100011)then temp=00000000; q=1; else temp=temp+1; q=0; end if; end if;end process;end;按照设计要求,需要产生基频为100kHz的频率输入累加器,外部输入频率为10MHz,所以,基频产生器为一个100进制的计数器,当计数器达到一百时,产生一个脉冲,这样的话,10MHz被分频成100kHz达到要求。因为计数器原理简单,所以只将代码附上,不在附上波形仿真文件。(6)防抖动模块:其代码如下:library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity smooth is port ( a :in std_logic; scan:in std_logic; b :out std_logic ); end; architecture behave of smooth is signal count : std_logic_vector(4 downto 0); begin process(scan) begin if(scanevent and scan=1) then if(a=1) then count=count+00001; b=count(4) and count(3) and count(2) and count(1) and count(0); else count0); end if; end if; end process; end;其原理为,当按键按下时,模块开始计数,当记满要求值时,产生一个脉冲,这样的话有效地防止了按键抖动的问题,当按键按下不放时,模块有规律的产生脉冲,数值有规律的缓慢改变,这和我们生活中常用的按键是相同的。其波形图如下:二、课程设计工作记录:包括:设计步骤与时间安排、调试步骤与时间安排、课题完成结果说明1、 设计步骤与时间安排12月26号开始选题,题目选定后,从27号开始查找相关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论