首页 VHDL课程设计函数信号发生器

VHDL课程设计函数信号发生器

举报
开通vip

VHDL课程设计函数信号发生器学生姓名:学号:专业:年级班级:课程名称:可编程数字系统设计实验项目:VHDL设计一信号发生器试验时间:2014年5月24日指导老师:一、实验目的:熟悉EDA工具,掌握用VHDL语言进行数字系统设计的基本方法和流程,提高工程实践能力二、设计任务设计信号发生器,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上调试并实现所要求功能和技术指标,撰写实验报告,最后提交验收并答辩。题目一:设计正弦波发生器题目二:设计锯齿波发生器题目三:设计三角波发生器三、功能要求与技术指标基本功能: (1)模拟输出:由于...

VHDL课程设计函数信号发生器
学生姓名:学号:专业:年级班级:课程名称:可编程数字系统 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 实验项目:VHDL设计一信号发生器试验时间:2014年5月24日指导老师:一、实验目的:熟悉EDA工具,掌握用VHDL语言进行数字系统设计的基本 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 和流程,提高 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 实践能力二、设计任务设计信号发生器,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上调试并实现所要求功能和技术指标,撰写实验报告,最后提交验收并答辩。题目一:设计正弦波发生器题目二:设计锯齿波发生器题目三:设计三角波发生器三、功能要求与技术指标基本功能: (1)模拟输出:由于FPGA上无D/A转换模块,因此设计中必须包含PWM发生模块,PWM输出后经过RC低通波电路转换为电压幅值正比于占空比的模拟电压。滤波电路需自行设计。(2)可以通过按键设定波形的频率,频率可以显示在数码管上。(3)按钮开关输入须消抖处理。在完成以上功能的前提下,可增加其它一些实用的功能。要求:1、每个同学必须完成基本功能,在完成基本功能的前提下可自由发挥。2、实验报告主要内容包含:设计原理、系统 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 、程序设计、仿真/实验结果(例如波形图和实验板运行时的照片)、结论或分析、使用说明等,在最后附上主要源程序。3、程序代码结构清晰,可读性强,关键语句应注释。四、设计原理:原理图:原理图(PS:RESTA按键已被删除)cntpwm_outpwmclkSMGDENCHTFILTRIGHTANMUA按键信号消抖模块计数键模块移复位键模块选频模块数码管模块(动态扫描)(频率计算)PWM模块(正弦波数据存储)(分频比较)cnt信号发生器的原理框图信号发生器的基本工作原理:1、利用ROM、数组或使用CASE语句将计算的正弦波采样的占空比数据存储。由分频器将FPGA上的晶振进行分频所得的时钟信号作为计数时钟。最后进行利用比较的方式得到占空比可调的脉冲波。同时,分频器的分频系数可由键盘和数码管配合的显示数值进行运算反馈回PWM模块,达到频率可调的目的。此外,另设一输出接至LED2,无法测量波形的情况下,利用呼吸灯的效果可检测PWM模块的完成与频率可调的成功性。2、键盘设移位复位键,数码管计数键与频率传送键。同时设立消抖计数值,当按键按下以后进行计数,在按键退出后,停止计数,取最后一次计数作为按键信号完成按键消抖。按下移位复位键,数码管位选下一位,同时示数复位清零,并且循环移位,当按完4次按键后,数码管全部清零。按下数码管计数键,数码管计数,按一次计一次,采用十进制循环计数。按下频率传送键,将数码管所显示的数值作为频率传送到PWM模块,设频率理论值范围10hz~99990hz。3、用于按键显示的数码管计数的计数采用十进制。设定的计数值由四位数码管动态显示,并且被设定的位选数码管‘.’点亮,表明该数码管被选中。同时通电后,需利用移位复位功能将数码管清零。五、系统分析:1、根据原理图与原理框图:系统电路可分成4个主干模块:PWM模块、按键消抖模块、按键设定模块、数码管模块。PWM:通过对正弦波采样存储并利用时钟分频再进行比较获得PWM波,同时分频系数由按键与数码管陪和共同反馈运算结果进行分频。按键消抖:按键按下是会产生不稳定,设定何时的计数时间,再取按键拔起后获得的最后一次计数作为按键信号。按键设定:按键计数,按下后数码管进行计数。移位复位,按下后数码管位选再移位与复位下一位数码管。频率传送,将数码管示数作为频率传送到PWM模块。数码管:动态扫描,频率值显示在数码管上。2、说明:数码管显示不稳定,使用前先用移位复位键将示数清零。测六、程序设计:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.NUMERIC_STD.ALL;ENTITYzxb_maoISPORT(CLK:INSTD_LOGIC;RIGHTA:INSTD_LOGIC;--右移输入键CNTFILT:INSTD_LOGIC;--频率选择键RESTA:INSTD_LOGIC;--复位输入键NUMA:INSTD_LOGIC;--按键计数输入键PWM:OUTSTD_LOGIC;PWM_LED:OUTSTD_LOGIC;--LED亮灯SMG:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--数码管的段数据DEN:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--数码管的选通信号ENDzxb_mao;ARCHITECTUREsynOFzxb_maoISsignala,b,c,d:integerrange0to9;--输入数signalcnt:integerrange0to50000000;--调频频信号signalnum:integerrange0to9;--数码管显示计数signalnum_1:integerrange0to3;--数码管位移数signalcount:integerrange0to50000000;--晶振分频计数signalcount_key:integerrange0to2499;--键盘扫描分频signalclkcnt:std_logic;--可调分频时钟signalcout1:integerrange0to255;signalCOM:integerrange0to255;--采样数据signaltmp:std_logic_vector(5downto0);signalkey1filt:std_logic;--按键NUMA消抖后得到的信号signalkey1cnt:integerrange0to50000000;--用于对NUMA按键输入有效时间进行计数signalkey2filt:std_logic;--按键RIGHTA消抖后得到的信号signalkey2cnt:Integerrange0to50000000;--用于对RIGHT_按键输入有效时间进行计数signalkey3filt:std_logic;--按键CNTFILT消抖后得到的信号signalkey3cnt:integerrange0to50000000;--用于对LIFT_按键输入有效时间进行计数signalcount1:integerrange0to500000000;signalcout2:std_logic_vector(3downto0);signalclk1hz:std_logic;signalclk100khz:std_logic;BEGIN-----------------------------------PWM模块PROCESS(CLK)variabletmp:integer;--时钟分频实现频率可调BEGINtmp:=tmp;IFrISing_edge(CLK)THENIFcount=cntthencount<=0;CLKCNT<='1';ELSEcount<=count+1;CLKCNT<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(CLKCNT)BEGINIFrISing_edge(CLKCNT)THENIFcout1=255THENcout1<=0;tmp<=tmp+1;IFtmp="111111"thentmp<="000000";ENDIF;ELSEcout1<=cout1+1;ENDIF;ENDIF;ENDPROCESS;process(tmp)--正弦波数据采样存储begincaseconv_integer(tmp)iswhen00=>COM<=255;when01=>COM<=254;when02=>COM<=252;when03=>COM<=249;when04=>COM<=245;when05=>COM<=239;when06=>COM<=233;when07=>COM<=225;when08=>COM<=217;when09=>COM<=207;when10=>COM<=197;when11=>COM<=186;when12=>COM<=174;when13=>COM<=162;when14=>COM<=150;when15=>COM<=137;when16=>COM<=124;when17=>COM<=112;when18=>COM<=99;when19=>COM<=87;when20=>COM<=75;when21=>COM<=64;when22=>COM<=53;when23=>COM<=43;when24=>COM<=34;when25=>COM<=26;when26=>COM<=19;when27=>COM<=13;when28=>COM<=8;when29=>COM<=4;when30=>COM<=1;when31=>COM<=0;when63=>COM<=255;when62=>COM<=254;when61=>COM<=252;when60=>COM<=249;when59=>COM<=245;when58=>COM<=239;when57=>COM<=233;when56=>COM<=225;when55=>COM<=217;when54=>COM<=207;when53=>COM<=197;when52=>COM<=186;when51=>COM<=174;when50=>COM<=162;when49=>COM<=150;when48=>COM<=137;when47=>COM<=124;when46=>COM<=112;when45=>COM<=99;when44=>COM<=87;when43=>COM<=75;when42=>COM<=64;when41=>COM<=53;when40=>COM<=43;when39=>COM<=34;when38=>COM<=26;when37=>COM<=19;when36=>COM<=13;when35=>COM<=8;when34=>COM<=4;when33=>COM<=1;when32=>COM<=0;whenothers=>null;endcase;ENDPROCESS;PROCESS(CLK)BEGINIFrISing_edge(CLK)THENIFcout1>COMTHEN--比较计数采样PWMPWM<='0';PWM_LED<='0';--LED实现PWM检测ELSEPWM<='1';PWM_LED<='1';--LED实现PWM检测ENDIF;ENDIF;ENDPROCESS;------------------------------------按键消抖模块PROCESS(NUMA)--NUMA按键消抖constantN:integer:=5000000;--消抖时间,对于50Mhz的基准时钟,这相当于0.1SBEGINIFCLK'eventandCLK='1'THENIFNUMA='0'THEN--当key1输入低电平,即按键按下IFkey1cnt/=NTHEN--一直计数到Nkey1cnt<=key1cnt+1;ENDIF;IFkey1cnt=N-1THEN--最后一个计数时输出key1filt脉冲key1filt<='1';ELSEkey1filt<='0';ENDIF;ELSE--若key1输入高电平,表明按键被释放key1cnt<=0;ENDIF;ENDIF;ENDPROCESS;PROCESS(RIGHTA)--RIGHTA按键消抖constantN:integer:=5000000;BEGINIFCLK'eventandCLK='1'THENIFRIGHTA='0'THENIFkey2cnt/=NTHENkey2cnt<=key2cnt+1;ENDIF;IFkey2cnt=N-1THENkey2filt<='1';ELSEkey2filt<='0';ENDIF;ELSEkey2cnt<=0;ENDIF;ENDIF;ENDPROCESS;PROCESS(CNTFILT)--CNTFILT按键消抖constantN:integer:=5000000;BEGINIFCLK'eventandCLK='1'THENIFCNTFILT='0'THENIFkey3cnt/=NTHENkey3cnt<=key3cnt+1;ENDIF;IFkey3cnt=N-1THENkey3filt<='1';ELSEkey3filt<='0';ENDIF;ELSEkey3cnt<=0;ENDIF;ENDIF;ENDPROCESS;------------------------------------四进制计数移动模块RIGHTAPROCESS(key2filt)BEGINIF(key2filt='1')THEN--按键RIGHTA经消抖处理后IFnum_1=3THENnum_1<=0;ELSEnum_1<=num_1+1;ENDIF;ENDIF;ENDPROCESS;----------------------------------------十进制计数模块NUMA,RIGHT_,LIFT_PROCESS(CLK)BEGINIFrISing_edge(CLK)THENIFcount_key=249THENcount_key<=0;clk100khz<='1';ELSEcount_key<=count_key+1;clk100khz<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clk100khz,key1filt,key2filt)BEGINIFCLK'eventandCLK='1'THENIFkey2filt='1'THEN--复位与移位复位num<=0after50ns;ELSEIF(key1filt='1')THEN--按键NUMA经消抖处理后IFnum=9THENnum<=0;ELSEnum<=num+1;ENDIF;ENDIF;ENDIF;ENDIF;ENDPROCESS;---------------------------------------输入寄存模块PROCESS(num,num_1)BEGINCASEnum_1ISWHEN0=>a<=num;WHEN1=>b<=num;WHEN2=>c<=num;WHEN3=>d<=num;WHENothers=>NULL;ENDCASE;ENDPROCESS;------------------------------------------------按键选定频率模块PROCESS(key3filt)BEGINIFkey3filt='1'THENcnt<=50000000/(((a*1000+1)+(b*100+1)+(c*10+1)+(d*1+1))*256*64);--实现频率可调ENDIF;ENDPROCESS;------------------------------------------------数码管动态扫描频率及显示模块PROCESS(CLK)BEGINIFrISing_edge(CLK)THENIFcount1=24999THENcount1<=0;clk1hz<='1';ELSEcount1<=count1+1;clk1hz<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clk1hz)BEGINIFrISing_edge(clk1hz)THENIFcout2="1000"THENcout2<="0000";ELSEcout2<=cout2+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(clk1hz)BEGINIFcout2="0000"THENDEN<="0111";CASEaISWHEN0=>SMG<="11000000";--0WHEN1=>SMG<="11111001";--1WHEN2=>SMG<="10100100";--2WHEN3=>SMG<="10110000";--3WHEN4=>SMG<="10011001";--4WHEN5=>SMG<="10010010";--5WHEN6=>SMG<="10000010";--6WHEN7=>SMG<="11111000";--7WHEN8=>SMG<="10000000";--8WHEN9=>SMG<="10010000";--9WHENothers=>NULL;ENDCASE;ENDIF;IFnum_1=0andcout2="0001"THENSMG<="01111111";DEN<="0111";ENDIF;IFcout2="0010"THENDEN<="1011";CASEbISWHEN0=>SMG<="11000000";--0WHEN1=>SMG<="11111001";--1WHEN2=>SMG<="10100100";--2WHEN3=>SMG<="10110000";--3WHEN4=>SMG<="10011001";--4WHEN5=>SMG<="10010010";--5WHEN6=>SMG<="10000010";--6WHEN7=>SMG<="11111000";--7WHEN8=>SMG<="10000000";--8WHEN9=>SMG<="10010000";--9WHENothers=>NULL;ENDCASE;ENDIF;IFnum_1=1andcout2="0011"THENSMG<="01111111";DEN<="1011";ENDIF;IFcout2="0100"THENDEN<="1101";CASEcISWHEN0=>SMG<="11000000";--0WHEN1=>SMG<="11111001";--1WHEN2=>SMG<="10100100";--2WHEN3=>SMG<="10110000";--3WHEN4=>SMG<="10011001";--4WHEN5=>SMG<="10010010";--5WHEN6=>SMG<="10000010";--6WHEN7=>SMG<="11111000";--7WHEN8=>SMG<="10000000";--8WHEN9=>SMG<="10010000";--9WHENothers=>NULL;ENDCASE;ENDIF;IFnum_1=2andcout2="0101"THENSMG<="01111111";DEN<="1101";ENDIF;IFcout2="0110"THENDEN<="1110";CASEdISWHEN0=>SMG<="11000000";--0WHEN1=>SMG<="11111001";--1WHEN2=>SMG<="10100100";--2WHEN3=>SMG<="10110000";--3WHEN4=>SMG<="10011001";--4WHEN5=>SMG<="10010010";--5WHEN6=>SMG<="10000010";--6WHEN7=>SMG<="11111000";--7WHEN8=>SMG<="10000000";--8WHEN9=>SMG<="10010000";--9WHENothers=>NULL;ENDCASE;ENDIF;IFnum_1=3andcout2="0111"THENDEN<="1110";SMG<="01111111";ENDIF;ENDPROCESS;--------------------------------------------ENDsyn;管脚图:七、实验结果在不断调试并改正错误之后得到能正确运行的程序原本计划是以计算的固定数值进行反馈调频,如a*2+b*15+c*139+d*381。但这样产生的误差在不断调频中发现误差越来越大。最后决定设计计算调频公式进行调频,如:50000000/(((a*1000+1)+(b*100+1)+(c*10+1)+(d*1+1))*256*64)。调频后准确度上升,但仍然存在误差,原因在于数码管的示数在程序中是整型,在进行运算后计算结果会导致误差,在反馈回PWM调频的时候和实际频率会产生一定的误差。而在键盘模块,由于程序上存在一定的错误,在通电后仍然会有不稳定的数据显示在数码管上,故我在原来的移位模块上加上复位功能,在每次按键后可将下一位清零并数码管位选移位。在数码管设定一定数值后,按下频率传送键,频率成功反馈回PWM模块。在示波器使用紧张的情况下,我另设PWM_out将输出到LED2上,通过LED2的呼吸灯效果初步确认频率传送是否成功。数码管模块设定,被位选中的数码管其成功显示“.”。八、结论和分析:1、利用VHDL语言设计基于FPGA的信号发生器,首先得弄懂信号发生器设计原理,查阅文献资料,在无D/A的条件下,寻找关于PWM的资料,再通过对VHDL语言的学习之后编程描述理论中的电路,其间翻阅课本查改语句与程序上的错误与警告,最后调试程序过程中不断发现并改正错误,直到程序没有错误或最大化减少错误并能够成功调试得到自己所设想中的结果。2、数据结果在四位八段数码管显示,在实体定义时候必须弄清楚管脚的分配,输出输入应该设什么类型,后接到什么管脚,分清楚高地位和小数点位置。实现译码后显示最后结果的功能。3、由于通过公式运算出得频率通常不是实际数码管应显示整数,这种方法已经最大化减小调频误差。进一步分析,通常在运算结果为整数情况下,误差最小。
本文档为【VHDL课程设计函数信号发生器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
正方体
暂无简介~
格式:doc
大小:715KB
软件:Word
页数:13
分类:
上传时间:2022-05-10
浏览量:3