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

上传人:jian****018 文档编号:8928014 上传时间:2020-04-02 格式:DOC 页数:14 大小:687.50KB
返回 下载 相关 举报
VHDL课程设计-函数信号发生器.doc_第1页
第1页 / 共14页
VHDL课程设计-函数信号发生器.doc_第2页
第2页 / 共14页
VHDL课程设计-函数信号发生器.doc_第3页
第3页 / 共14页
点击查看更多>>
资源描述
学生姓名: 学 号: 专 业: 年级班级: 课程名称: 可编程数字系统设计 实验项目: VHDL设计一信号发生器 试验时间: 2014年5月24日 指导老师: 一、实验目的:熟悉EDA工具,掌握用VHDL语言进行数字系统设计的基本方法和流程,提高工程实践能力 二、设计任务设计信号发生器,用VHDL语言描述,用QuartusII工具编译和综合,并在实验板上调试并实现所要求功能和技术指标,撰写实验报告,最后提交验收并答辩。题目一:设计正弦波发生器题目二:设计锯齿波发生器题目三:设计三角波发生器三、功能要求与技术指标基本功能:(1 )模拟输出:由于FPGA上无D/A转换模块,因此设计中必须包含PWM发生模块,PWM输出后经过RC低通波电路转换为电压幅值正比于占空比的模拟电压。滤波电路需自行设计。(2)可以通过按键设定波形的频率,频率可以显示在数码管上。(3)按钮开关输入须消抖处理。在完成以上功能的前提下,可增加其它一些实用的功能。要求:1、每个同学必须完成基本功能,在完成基本功能的前提下可自由发挥。2、实验报告主要内容包含:设计原理、系统分析、程序设计、仿真/实验结果(例如波形图和实验板运行时的照片)、结论或分析、使用说明 等,在最后附上主要源程序。3、程序代码结构清晰,可读性强,关键语句应注释。四、设计原理:原理图:原理图(PS:RESTA按键已被删除)cntpwm_outpwmclkSMGDENCHTFILTRIGHTANMUA按键信号消抖模块计数键模块移复位键模块选频模块数码管模块(动态扫描)(频率计算)PWM模块(正弦波数据存储)(分频比较)cnt信号发生器的原理框图信号发生器的基本工作原理:1、利用ROM、数组或使用CASE语句将计算的正弦波采样的占空比数据存储。由分频器将FPGA上的晶振进行分频所得的时钟信号作为计数时钟。最后进行利用比较的方式得到占空比可调的脉冲波。同时,分频器的分频系数可由键盘和数码管配合的显示数值进行运算反馈回PWM模块,达到频率可调的目的。此外,另设一输出接至LED2,无法测量波形的情况下,利用呼吸灯的效果可检测PWM模块的完成与频率可调的成功性。2、键盘设移位复位键,数码管计数键与频率传送键。同时设立消抖计数值,当按键按下以后进行计数,在按键退出后,停止计数,取最后一次计数作为按键信号完成按键消抖。按下移位复位键,数码管位选下一位,同时示数复位清零,并且循环移位,当按完4次按键后,数码管全部清零。按下数码管计数键,数码管计数,按一次计一次,采用十进制循环计数。按下频率传送键,将数码管所显示的数值作为频率传送到PWM模块,设频率理论值范围10hz99990hz。3、用于按键显示的数码管计数的计数采用十进制。设定的计数值由四位数码管动态显示,并且被设定的位选数码管.点亮,表明该数码管被选中。同时通电后,需利用移位复位功能将数码管清零。五、系统分析:1、根据原理图与原理框图: 系统电路可分成4个主干模块:PWM模块、按键消抖模块、按键设定模块、数码管模块。 PWM:通过对正弦波采样存储并利用时钟分频再进行比较获得PWM波,同时分频系数由按键与数码管陪和共同反馈运算结果进行分频。按键消抖:按键按下是会产生不稳定,设定何时的计数时间,再取按键拔起后获得的最后一次计数作为按键信号。 按键设定:按键计数,按下后数码管进行计数。移位复位,按下后数码管位选再移位与复位下一位数码管。频率传送,将数码管示数作为频率传送到PWM模块。数码管:动态扫描,频率值显示在数码管上 。2、说明:数码管显示不稳定,使用前先用移位复位键将示数清零。测六、程序设计: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_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 num_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_logic;-按键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_按键输入有效时间进行计数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; 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 cout1COMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMCOMnull; 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按键消抖 constant 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 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 (CNTFILT)-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 (key2filt=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 (clk100khz,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)+(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 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; 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。但这样产生的误差在不断调频中发现误差越来越大。最后决定设计计算调频公式进行调频,如: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、由于通过公式运算出得频率通常不是实际数码管应显示整数,这种方法已经最大化减小调频误差。进一步分析,通常在运算结果为整数情况下,误差最小。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!