VHDL课程设计-函数信号发生器Word版_第1页
VHDL课程设计-函数信号发生器Word版_第2页
VHDL课程设计-函数信号发生器Word版_第3页
VHDL课程设计-函数信号发生器Word版_第4页
VHDL课程设计-函数信号发生器Word版_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

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

2、由于FPGA上无D/A转换模块,因此设计中必须包含PWM发生模块,PWM输出后经过RC低通波电路转换为电压幅值正比于占空比的模拟电压。滤波电路需自行设计。(2)可以通过按键设定波形的频率,频率可以显示在数码管上。(3)按钮开关输入须消抖处理。在完成以上功能的前提下,可增加其它一些实用的功能。要求:1、每个同学必须完成基本功能,在完成基本功能的前提下可自由发挥。2、实验报告主要内容包含:设计原理、系统分析、程序设计、仿真/实验结果(例如波形图和实验板运行时的照片)、结论或分析、使用说明 等,在最后附上主要源程序。3、程序代码结构清晰,可读性强,关键语句应注释。四、设计原理:原理图:原理图(PS:

3、RESTA按键已被删除)cntpwm_outpwmclkSMGDENCHTFILTRIGHTANMUA按键信号消抖模块计数键模块移复位键模块选频模块数码管模块(动态扫描)(频率计算)PWM模块(正弦波数据存储)(分频比较)cnt信号发生器的原理框图信号发生器的基本工作原理:1、利用ROM、数组或使用CASE语句将计算的正弦波采样的占空比数据存储。由分频器将FPGA上的晶振进行分频所得的时钟信号作为计数时钟。最后进行利用比较的方式得到占空比可调的脉冲波。同时,分频器的分频系数可由键盘和数码管配合的显示数值进行运算反馈回PWM模块,达到频率可调的目的。此外,另设一输出接至LED2,无法测量波形的情

4、况下,利用呼吸灯的效果可检测PWM模块的完成与频率可调的成功性。2、键盘设移位复位键,数码管计数键与频率传送键。同时设立消抖计数值,当按键按下以后进行计数,在按键退出后,停止计数,取最后一次计数作为按键信号完成按键消抖。按下移位复位键,数码管位选下一位,同时示数复位清零,并且循环移位,当按完4次按键后,数码管全部清零。按下数码管计数键,数码管计数,按一次计一次,采用十进制循环计数。按下频率传送键,将数码管所显示的数值作为频率传送到PWM模块,设频率理论值范围10hz99990hz。3、用于按键显示的数码管计数的计数采用十进制。设定的计数值由四位数码管动态显示,并且被设定的位选数码管.点亮,表明

5、该数码管被选中。同时通电后,需利用移位复位功能将数码管清零。五、系统分析:1、根据原理图与原理框图: 系统电路可分成4个主干模块:PWM模块、按键消抖模块、按键设定模块、数码管模块。 PWM:通过对正弦波采样存储并利用时钟分频再进行比较获得PWM波,同时分频系数由按键与数码管陪和共同反馈运算结果进行分频。按键消抖:按键按下是会产生不稳定,设定何时的计数时间,再取按键拔起后获得的最后一次计数作为按键信号。 按键设定:按键计数,按下后数码管进行计数。移位复位,按下后数码管位选再移位与复位下一位数码管。频率传送,将数码管示数作为频率传送到PWM模块。数码管:动态扫描,频率值显示在数码管上 。2、说明

6、:数码管显示不稳定,使用前先用移位复位键将示数清零。测六、程序设计:LIBRARY IEEE;USE IEEE. STD_LOGIC_1164.ALL;USE IEEE. STD_LOGIC_UNSIGNED.ALL;USE IEEE.NUMERIC_STD.ALL;ENTITY zxb_mao ISPORT(CLK :IN STD_LOGIC;RIGHTA:IN STD_LOGIC;-右移输入键CNTFILT:IN STD_LOGIC;-频率选择键RESTA :IN STD_LOGIC;-复位输入键NUMA:IN STD_LOGIC;-按键计数输入键PWM:OUT STD_LOGIC;PWM

7、_LED :OUT STD_LOGIC;-LED亮灯SMG:OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -数码管的段数据DEN:OUT STD_LOGIC_VECTOR (3 DOWNTO 0); -数码管的选通信号 END zxb_mao;ARCHITECTURE syn OF zxb_mao ISsignal a,b,c,d:integer range 0 to 9;-输入数signal cnt:integer range 0 to 50000000;-调频频信号signal num :integer range 0 to 9; -数码管显示计数signal nu

8、m_1 :integer range 0 to 3;-数码管位移数signal count:integer range 0 to 50000000;-晶振分频计数signal count_key:integer range 0 to 2499;-键盘扫描分频signal clkcnt:std_logic;-可调分频时钟signal cout1:integer range 0 to 255;signal COM:integer range 0 to 255;-采样数据signal tmp:std_logic_vector(5 downto 0);signal key1filt : std_log

9、ic;-按键NUMA消抖后得到的信号signal key1cnt: integer range 0 to 50000000; -用于对NUMA按键输入有效时间进行计数signal key2filt : std_logic;-按键RIGHTA消抖后得到的信号signal key2cnt: Integer range 0 to 50000000; -用于对RIGHT_按键输入有效时间进行计数signal key3filt : std_logic;-按键CNTFILT消抖后得到的信号signal key3cnt: integer range 0 to 50000000; -用于对LIFT_按键输入有

10、效时间进行计数signal count1:integer range 0 to 500000000;signal cout2:std_logic_vector(3 downto 0);signal clk1hz:std_logic;signal clk100khz:std_logic;BEGIN- -PWM模块 PROCESS(CLK)variable tmp :integer; -时钟分频实现频率可调 BEGIN tmp:=tmp; IF rISing_edge(CLK) THEN IF count=cnt then count=0; CLKCNT=1;ELSE count=count+1;

11、 CLKCNT=0; END IF; END IF;END PROCESS;PROCESS(CLKCNT) BEGIN IF rISing_edge(CLKCNT) THEN IF cout1=255 THEN cout1=0; tmp=tmp+1; IF tmp=111111 then tmp=000000; END IF; ELSE cout1COMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCO

12、MCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMnull; end case;END PROCESS;PROCESS(CLK) BEGIN IF rISing_edge(CLK) THEN IF cout1 COM THEN -比较计数采样PWM PWM =0; PWM_LED =0;-LED实现PWM检测 ELSE PWM =1; PWM_LED =1;-LED实现PWM检测 END IF; END IF; END PROCESS;- -按键消抖模块PROCESS (NUMA)-NUMA按键消抖 const

13、ant N :integer := 5000000;-消抖时间,对于50Mhz的基准时钟,这相当于0.1SBEGIN IF CLKevent and CLK = 1 THENIF NUMA = 0 THEN -当key1 输入低电平,即按键按下IF key1cnt /= N THEN -一直计数到Nkey1cnt = key1cnt + 1;END IF;IF key1cnt = N-1 THEN -最后一个计数时输出key1filt脉冲 key1filt = 1;ELSEkey1filt = 0;END IF;ELSE -若key1 输入高电平,表明按键被释放key1cnt = 0;END

14、IF;END IF;END PROCESS;PROCESS (RIGHTA)-RIGHTA按键消抖 constant N :integer := 5000000;BEGIN IF CLKevent and CLK = 1 THENIF RIGHTA= 0 THEN IF key2cnt /= N THEN key2cnt = key2cnt + 1;END IF;IF key2cnt = N-1 THEN key2filt = 1;ELSEkey2filt = 0;END IF;ELSE key2cnt = 0;END IF;END IF;END PROCESS;PROCESS (CNTFIL

15、T)-CNTFILT按键消抖 constant N :integer := 5000000;BEGIN IF CLKevent and CLK = 1 THENIF CNTFILT = 0 THEN IF key3cnt /= N THEN key3cnt = key3cnt + 1;END IF;IF key3cnt = N-1 THEN key3filt = 1;ELSEkey3filt = 0;END IF;ELSE key3cnt = 0;END IF;END IF;END PROCESS;-四进制计数移动模块RIGHTAPROCESS (key2filt)BEGINIF (key2f

16、ilt=1) THEN -按键RIGHTA经消抖处理后IF num_1 = 3 THEN num_1 = 0;ELSEnum_1 = num_1 + 1;END IF;END IF;END PROCESS;-十进制计数模块NUMA,RIGHT_,LIFT_PROCESS(CLK) BEGIN IF rISing_edge(CLK) THEN IF count_key=249 THEN count_key=0; clk100khz=1; ELSE count_key=count_key+1; clk100khz=0; END IF; END IF;END PROCESS;PROCESS (clk

17、100khz,key1filt,key2filt)BEGINIF CLKevent and CLK = 1 THENIF key2filt=1THEN-复位与移位复位num = 0 after 50ns;ELSE IF (key1filt = 1) THEN -按键NUMA 经消抖处理后IF num = 9 THEN num = 0;ELSEnum a b c d NULL; END CASE;END PROCESS;- -按键选定频率模块PROCESS(key3filt) BEGINIF key3filt=1THEN cnt = 50000000/(a*1000+1)+(b*100+1)+(

18、c*10+1)+(d*1+1)*256*64); -实现频率可调END IF;END PROCESS;- -数码管动态扫描频率及显示模块PROCESS(CLK) BEGIN IF rISing_edge(CLK) THEN IF count1=24999 THEN count1=0; clk1hz=1; ELSE count1=count1+1; clk1hz=0; END IF; END IF; END PROCESS; PROCESS(clk1hz) BEGIN IF rISing_edge(clk1hz) THEN IF cout2=1000 THEN cout2=0000; ELSE

19、cout2=cout2+1; END IF; END IF; END PROCESS; PROCESS(clk1hz) BEGIN IF cout2=0000 THEN DEN SMG SMG SMG SMG SMG SMG SMG SMG SMG SMG NULL; END CASE; END IF; IF num_1=0 and cout2=0001 THEN SMG=01111111; DEN=0111;END IF; IF cout2=0010 THEN DEN SMG SMG SMG SMG SMG SMG SMG SMG SMG SMG NULL; END CASE; END IF

20、; IF num_1=1 and cout2=0011 THEN SMG=01111111; DEN=1011; END IF; IF cout2=0100 THEN DEN SMG SMG SMG SMG SMG SMG SMG SMG SMG SMG NULL;END CASE;END IF;IF num_1=2 and cout2=0101 THENSMG=01111111;DEN=1101;END IF;IF cout2=0110 THEN DEN SMG SMG SMG SMG SMG SMG SMG SMG SMG SMG NULL; END CASE; END IF; IF num_1=3 and cout2=0111 THEN DEN=1110; SMG=01111111;END IF;END PROCESS;-END syn;管脚图:七、实验结果在不断调试并改正错误之后得到能正确运行的程序原本计划是以计算的固定数值进行反馈调频,如a*2+b*15+c*139+d*381。但这样产生的误差在不断调频中发现误

温馨提示

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

评论

0/150

提交评论