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、程序代码结构清晰,可读性强,关键语句应注释。四、设计原理:原理图:原

3、理图(ps: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模块。数码管:动态扫描,频率值显示在数码管上

6、 。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_log

7、ic;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; -数码管显示计数sig

8、nal 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 : s

9、td_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

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&

11、#39;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 cout1<=cout1+1; end if; end if; end process;process(

12、tmp) -正弦波数据采样存储 begin case conv_integer(tmp) is when 00=>com<=255; when 01=>com<=254; when 02=>com<=252; when 03=>com<=249; when 04=>com<=245; when 05=>com<=239; when 06=>com<=233; when 07=>com<=225; when 08=>com<=217; when 09=>com<=207; wh

13、en 10=>com<=197; when 11=>com<=186; when 12=>com<=174; when 13=>com<=162; when 14=>com<=150; when 15=>com<=137; when 16=>com<=124; when 17=>com<=112; when 18=>com<=99; when 19=>com<=87; when 20=>com<=75; when 21=>com<=64; when 2

14、2=>com<=53; when 23=>com<=43; when 24=>com<=34; when 25=>com<=26; when 26=>com<=19; when 27=>com<=13; when 28=>com<=8; when 29=>com<=4; when 30=>com<=1; when 31=>com<=0; when 63=>com<=255; when 62=>com<=254; when 61=>com<=

15、252; when 60=>com<=249; when 59=>com<=245; when 58=>com<=239; when 57=>com<=233; when 56=>com<=225; when 55=>com<=217; when 54=>com<=207; when 53=>com<=197; when 52=>com<=186; when 51=>com<=174; when 50=>com<=162; when 49=>com<=

16、150; when 48=>com<=137; when 47=>com<=124; when 46=>com<=112; when 45=>com<= 99; when 44=>com<=87; when 43=>com<=75; when 42=>com<=64; when 41=>com<= 53; when 40=>com<=43; when 39=>com<=34; when 38=>com<=26; when 37=>com<= 19; w

17、hen 36=>com<=13; when 35=>com<=8; when 34=>com<=4; when 33=>com<= 1; when 32=>com<=0;when others=>null; 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 pw

18、m <='1' pwm_led <='1'-led实现pwm检测 end if; end if; end process;- -按键消抖模块process (numa)-numa按键消抖 constant n :integer := 5000000;-消抖时间,对于50mhz的基准时钟,这相当于0.1sbegin if clk'event and clk = '1' thenif numa = '0' then -当key1 输入低电平,即按键按下if key1cnt /= n then -一直计数到nkey1

19、cnt <= 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 clk'event and clk = '1

20、' 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 clk

21、9;event 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 (key2fil

22、t='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<=&

23、#39;0' end if; end if;end process;process (clk100khz,key1filt,key2filt)beginif clk'event and clk = '1' thenif key2filt='1'then-复位与移位复位num <= 0 after 50ns;else if (key1filt = '1') then -按键numa 经消抖处理后if num = 9 then num <= 0;elsenum <= num + 1;end if;end if;end

24、 if;end if;end process;- -输入寄存模块process(num,num_1) begincase num_1 iswhen 0 => a <= num; when 1 => b <= num; when 2 => c <= num; when 3 => d <= num; when others =>null; end case;end process;- -按键选定频率模块process(key3filt) beginif key3filt='1'then cnt <= 50000000/(a

25、*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_

26、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<="0111"case a iswhen 0 => smg <= "11000000" - 0when 1 => smg <= "11111001&

27、quot; - 1when 2 => smg <= "10100100" - 2when 3 => smg <= "10110000" - 3when 4 => smg <= "10011001" - 4when 5 => smg <= "10010010" - 5 when 6 => smg <= "10000010" - 6when 7 => smg <= "11111000" - 7when 8 =

28、> smg <= "10000000" - 8when 9 => smg <= "10010000" - 9when others =>null; end case; end if; if num_1=0 and cout2="0001" then smg<="01111111" den<="0111"end if; if cout2="0010" then den<="1011"case b iswhen

29、0 => smg <= "11000000" - 0when 1 => smg <= "11111001" - 1when 2 => smg <= "10100100" - 2when 3 => smg <= "10110000" - 3when 4 => smg <= "10011001" - 4when 5 => smg <= "10010010" - 5 when 6 => smg <=

30、 "10000010" - 6when 7 => smg <= "11111000" - 7when 8 => smg <= "10000000" - 8when 9 => smg <= "10010000" - 9when others =>null; end case; end if; if num_1=1 and cout2="0011" then smg<="01111111" den<="1011&qu

31、ot; end if; if cout2="0100" then den<="1101"case c iswhen 0 => smg <= "11000000" - 0when 1 => smg <= "11111001" - 1when 2 => smg <= "10100100" - 2when 3 => smg <= "10110000" - 3when 4 => smg <= "1001100

32、1" - 4when 5 => smg <= "10010010" - 5when 6 => smg <= "10000010" - 6when 7 => smg <= "11111000" - 7when 8 => smg <= "10000000" - 8when 9 => smg <= "10010000" - 9when others =>null;end case;end if;if num_1=2 and c

33、out2="0101" thensmg<="01111111"den<="1101"end if;if cout2="0110" then den<="1110"case d iswhen 0 => smg <= "11000000" - 0when 1 => smg <= "11111001" - 1when 2 => smg <= "10100100" - 2when 3 => smg <= "10110000" - 3when 4 => smg <= "10011001" - 4when 5 => smg <= "10010010" - 5when 6 =>

温馨提示

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

评论

0/150

提交评论