[毕业设计精品]EDA自动值更器课程设计.doc
一 绪论1 在信息产业中EDA产生的影响随着大规模集成电路技术和计算机技术的不断发展,在涉及通信、国防、航天、医学、工业自动化、计算机应用、仪器仪表等领域的电子系统设计工作中,EDA技术的含量正以惊人的速度上升;电子类的高新技术项目的开发也逾益依赖于EDA技术的应用。即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。2 中国国内EDA发展情况从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用文泛、工具多样、软件功能强大。 中国EDA市场已渐趋成熟,不过大部分设计工程师面向的是PC主板和小型ASIC领域,仅有小部分(约11%)的设计人员工发复杂的片上系统器件。为了与台湾和美国的设计工程师形成更有力的竞争,中国的设计队伍有必要购入一些最新的EDA技术。 在信息通信领域,要优先发展高速宽带信息网、深亚微米集成电路、新型元器件、计算机及软件技术、第三代移动通信技术、信息管理、信息安全技术,积极开拓以数字技术、网络技术为基础的新一代信息产品,发展新兴产业,培育新的经济增长点。要大力推进制造业信息化,积极开展计算机辅助设计(CAD)、计算机辅助工程(CAE)、计算机辅助工艺(CAPP)、计算机机辅助制造(CAM)、产品数据管理(PDM)、制造资源计划(MRPII)及企业资源管理(ERP)等。有条件的企业可开展“网络制造”,便于合作设计、合作制造,参与国内和国际竞争。开展“数控化”工程和“数字化”工程。自动化仪表的技术发展趋势的测试技术、控制技术与计算机技术、通信技术进一步融合,形成测量、控制、通信与计算机(M3C)结构。在ASIC和PLD设计方面,向超高速、高密度、低功耗、低电压方向发展。3 课程设计目的(1)加深对VHDL语言设计的理解。(2)通过对自动值更器的设计加深对EDA课程的理解(3)熟悉MAX+PLUS II仿真软件的工作方法及应用技术4 课题设计内容 本次课程设计的主要目的旨在通过独立完成一个 “自动值更器”的设计,达到对EDA技术的熟练掌握,提升对EDA技术及应用课程所学内容的掌握和应用。1、计数24小时的时钟 2、六位数码管显示“时分秒” 3、五个功能键(1) Timer 从其它状态放回时钟状态(2) Alarm 切换到定时时间的设定(3) Set 按一下,跳到下一个设置区(4) Down 按一下,所设置区的数字减1(5) Up 按一下,所设置区的数字加14、带有定时功能;5、键盘的设定值要求在LED上显示。一 设计的总体方案流程图:本自动值更器由三个模块组成:(1)时间显示:24小时制显示时间:小时用8与7数码管,分钟用5与4位数码管,秒由2与1位数码管表示,小时与分钟之间、分钟与秒之间用3和6位数码管显示“”,总计八位七段数码显示管。此模式下显示当前时间。(2)校时模式:将time键置于0,运用功能键set键对八位数码管进行选择,并由功能键up键进行+1与down键进行-1操作,通过此4个功能键进行校时设置。Set->数码管7-> Set->数码管6-> Set->数码管5-> Set->数码管4-> Set->数码管3-> Set->数码管2-> Set->数码管1Up->+1;down->-1;(3)定时设定模式:将time键置于1,设定模式与校时时设定一样,运用功能键set键对八位数码管进行选择,并由功能键up键进行+1与down键进行-1操作,通过此4个功能键进行校时设置。Set->数码管7-> Set->数码管6-> Set->数码管5-> Set->数码管4-> Set->数码管3-> Set->数码管2-> Set->数码管1Up->+1;down->-1;二 设计的详细原理此多自动值更器是由多个模块组成,各个模块实现各自不同的作用,综合起来,便是自动值更器。1、主要模块如下:(1)输入一个250KHZ的方波信号(2)计时模块:将time键置于0,用软件设计,当脉冲累计2500000次时secondl自动+1,以此类推,可得出数字时钟,并用8位7段对各时间进行显示。输入:250KHz脉冲,控制键time等输出:秒、分、小时(3)校时模块:将time键置于0, 运用功能键set键对八位数码管进行选择,并由功能键up键进行+1与down键进行-1操作,通过此4个功能键进行校时设置。输入:time状态转换键,set数码管选定键,up+1键,down-1键输出:设定后的 秒,分,小时 (4)设定定时模块: 与校时操作类似,只是先将time键置于1, 再运用功能键set键对八位数码管进行选择,并由功能键up键进行+1与down键进行-1操作,通过此4个功能键进行校时设置输入:time状态转换键,set数码管选定键,up+1键,down-1键输出:所定的时间 秒,分,小时(5)整点蜂鸣报时运用软件进行设置,当minuteH与minuteL均为零时,蜂鸣器响,也就是没次整点时,蜂鸣器自动响一分钟,如果想设置响的时间,可以手动改即可。并且可以手动按下功能键naozhong,这样就可以手动关闭蜂鸣器。输入:naozhong关闭蜂鸣器键输出:蜂鸣器发出蜂鸣声2、功能概述 输入一个250KHZ的方波信号,运用VHDL语言对其进行编译,用计数器对方波信号进行技术,当 cnt=2500000时,secondl自动+1,不断进行累加,可以达到实现数字钟自动计时功能。并且此自动值更器设有5个功能键,(1)time键控制显示状态,可以选择时钟状态与定时状态的转换(2)naozhong键可以手动关闭蜂鸣器(3) set键可以选择需要改变的数码管,以便进行调时与设定定时时间(4)up键对对应的数据进行+1操作(5)down键对对应的数据进行-1操作。通过次5个功能键,便可实现自动值更器,拥有计时/校时功能,设定定时功能,自动值更功能。四 设计的步骤和过程1 计时模块:if clk_1k'event and clk_1k = '1' then cnt:=cnt+1; ct:=ct+1; if ct=1000 then - 1 秒计时。 ct:=0; secondL:=secondL+1;if secondL=10 then - 10 秒计时。 secondL:=0; secondH:=secondH+1; end if; if secondH=6 then - 1 分钟计时。 secondH:=0; minuteL:=minuteL+1; end if; if minuteL=10 then - 10 分钟计时。 minuteL:=0; minuteH:=minuteH+1; end if;if minuteH=6 then - 1 小计时时。 minuteH:=0; hourL:=hourL+1; end if; if hourL=10 then - 10 小时计时。 hourL:=0; hourH:=hourH+1; end if; if hourH=2 and hourL =4 then - 24 小时计时 hourH:=0; hourL:=0; end if; 次模块的主要作用是完成24小时的即时显示。2校时模块if clk'event and clk = '1' thend<=set;k<=up;p<=downif time='0' thenif ( d='0' and set='1')then stat<=stat+1; end if;case stat iswhen 1 => if(k='0' and up='1')then hourH<=hourH+1; elsif( p='0' and down='1')then hourH<= hourH-1; end if; when 2 => if( k='0' and up='1')then hourL<= hourL+1; elsif( p='0' and down='1')then hourL<= hourL-1;end if; when 3 => if(k='0' and up='1')then minuteH<= minuteH +1; elsif( p='0' and down='1')then minuteH<= minuteH -1; end if; when 4 => if( k='0' and up='1')then minuteL<= minuteL+1; elsif( p='0' and down='1')then minuteL<= minuteL-1; end if;when 5=> if(k='0' and up='1')then secondH<= secondH +1; elsif(p='0' and down='1')then secondH<= secondH-1; end if; when 6 => if( k='0' and up='1')then secondL<= secondL +1; elsif( p='0' and down='1')then secondL<= secondL-1; end if;when others=>null;end case;end if;此模块的主要功能是进行时钟初始时间的设置。3、设定定时模块: if clk'event and clk = '1' thend<=set;k<=up;p<=down;if time='1' thenif ( d='0' and set='1')then stat<=stat+1; end if;case stat iswhen 1 => if(k='0' and up='1')then alarm_hourH<= alarm_hourH+1; elsif( p='0' and down='1')then alarm_hourH<= alarm_hourH-1; end if; when 2 => if( k='0' and up='1')then alarm_hourL<= alarm_hourL+1; elsif( p='0' and down='1')then alarm_hourL<= alarm_hourL-1;end if; when 3 => if(k='0' and up='1')then alarm_minuteH<= alarm_minuteH +1; elsif( p='0' and down='1')then alarm_minuteH<= alarm_minuteH -1; end if; when 4 => if( k='0' and up='1')then alarm_minuteL<= alarm_minuteL+1; elsif( p='0' and down='1')then alarm_minuteL<= alarm_minuteL-1; end if;when 5=> if(k='0' and up='1')then alarm_secondH<= alarm_secondH +1; elsif(p='0' and down='1')then alarm_secondH<=alarm_secondH-1; end if; when 6 => if( k='0' and up='1')then alarm_secondL<= alarm_secondL +1; elsif( p='0' and down='1')then alarm_secondL<= alarm_secondL-1; end if;when others=>null;end case;end if;此模块完成闹钟的设定。4、显示模块设计if (time='0') thenahourH<=hourH;ahourL<=hourL;aminuteH<=minuteH;aminuteL<=minuteL;asecondH<=secondH;asecondL<=secondL;elsif(time='1')thenahourH<=alarm_hourH;ahourL<= alarm_hourL;aminuteH<= alarm_minuteH;aminuteL<= alarm_minuteL;asecondH<= alarm_secondH;asecondL<= alarm_secondL;end if;case cnt is - To display the time. when 0 => L<="000" - Enable the leftmost display. case ahourH is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when others => null; end case; when 1 => L<="001" - Enable the second display. case ahourL is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when 6 => dled<=X"BE"-6 when 7 => dled<=X"E0"-7 when 8 => dled<=X"FE"-8 when 9 => dled<=X"F6"-9 when others => null; end case; when 2 => L<="010" - Enable the third display. dled<=X"01" - Blanked. when 3 => L<="011" - Enable the fourth display. case aminuteH is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when others => null; end case; when 4 => L<="100" - Enable the fifth display. case aminuteL is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when 6 => dled<=X"BE"-6 when 7 => dled<=X"E0"-7 when 8 => dled<=X"FE"-8 when 9 => dled<=X"F6"-9 when others => null; end case; when 5 => L<="101" - Enable the sixth display. dled<=X"01" - Blanked. when 6 => L<="110" - Enable the seventh display. case asecondH is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when others => null; end case; when 7 => L<="111" - Enable the rightmost display case asecondL is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when 6 => dled<=X"BE"-6 when 7 => dled<=X"E0"-7 when 8 => dled<=X"FE"-8 when 9 => dled<=X"F6"-9 when others => null; end case; end case;此模块实现数字钟的显示及定时时间设定值的显示。五、蜂鸣器模块设计 if (hourH = alarm_hourH) and (hourL= alarm_hourL) and (minuteH = alarm_minuteH) and (minuteL = alarm_minuteL) or (minuteH=0)and(minuteL=0) )then sound<='1'end if;if (naozhong='1')thensound<='0' end if;此模块实现闹钟蜂鸣以及整点蜂鸣报时。四、设计的仿真和运行结果(1)将time键置于0,输入clk信号,可以得到时钟输出波形为:此时时钟自动计时,并且将计时数据传送至显示管显示。如上图asecond=second;(2)将time键置于0,输入clk信号,并将set改为20分频信号,up与down信号交叉为1,得到时钟输出波形为:如图所示此时时间不是正常变化,因为有手动设置进行up(+1)操作和down(-1)操作,并且将时间由数码管显示。(3)将time键置于1,则显示闹钟初始调节状态:此时secondl,secondH,minuteL,minuteH,hourL,hourH不受影响,均自动计时,但是并不由数码管进行显示,此时显示的是闹钟初定时间,这时均为0。由于set变化,stat 顺序发生变化。(4)将time置于1,并可以改变set键进行数码管选择,并用up(+1)操作和down(-1)操作,进行闹钟的初步设定。 此时可以得到时钟的初步设定。(5)外部硬件的链接方法如图(6)时钟显示如下图时钟图如上闹钟初定时间如上图五 课程设计的心得体会EDA的课程设计持续了两周,但我却觉得仿佛还是当日,真是挥指之间,时光已匆匆流逝。在这整整两个星期的日子里,我感受到了既是成功做出一个模块的欢喜,也是修改那无限errors时的忧愁,可以说是无数次的苦尽甘来,换来了最后的成功。本身我就对动手的实验相当有兴趣,这次能够拥有两周的课程设计时间,我甚是欣慰。从第一天开始知道我的多功能时钟课题开始,我就第一时间跑去图书馆借资料,回去反复研究,从看懂程序开始入手。虽然开始有些棘手,但我觉得特别的兴奋,我不把困难当成拦路虎,反而成为我前进的动力,遇到困难不会就翻书,找不到就问同学,再不行就上网搜,实在不行再问老师,总之想尽一切办法找到解决方案。可是事与愿违,我的设计总是出那么一点点的小问题,有时候编译只出现1个error ,但一改就成了20 个errors了,真是让人哭笑不得,望天兴叹呀!经过两三天的基础训练,我终于能够完整的看懂程序。首先我将老师给我们基本的时钟程序进行编译,封锁引脚,然后在硬件上得到正确的数码管显示。通过这个最基本的操作,我将大体流程映入脑海,可以举一反三,再困难的程序也不怕。整点报时自然是最简单的,我首先就加到程序内部,其次我在网上找到了闹钟程序,因为跟要求差距过大,所以我先读懂程序,然后根据自己理解,一步步的加进初始的时钟程序。这个看似很简单的过程,却整整费了4天的时间,期间错误百出。我先是运用了多个process,进行模块化的处理,通过这里面出现的问题我才知道敏感参数列表是不能乱设置的,single是全局变量,而variable只能在一个process中使用等等。后来慢慢理解了其中的原委,发现我的程序竟如此之长,我决定要大量的删减,于是我又把多个process改成了一个,看似好像我是又回到了出发点,但我觉得这绝对是一次质的飞跃,是我能够依照我的想法自由变换程序的映照。当我自认为要成功的时候,我却遇到了一个相当棘手的问题,此时error显示unkown problem internal error:”widthe mismatch in relation opreator”in ebuildbinaryop an line 1347 of file,虽然只有一个问题,但这个问题却无法定位,以至于我找了很久都没找到。那几天我心里很压抑,明明对的程序,为什么就出现这样的问题,让我真的很头疼,差点绝望放弃。直至周二,我决定从新回到起点,再写一次,一个模块一个模块往里加。终于在我不倦的努力下,我找出了错误的语句,并用其他语句替换了它,然后轻松地加入比较简单的校时模块、蜂鸣模块。终于在周四之前将程序顺利的完成,本想再将秒表加进来,但看到程序比较繁琐,就此作罢。看到最后程序的各个模块正确的运行,心情真是无法言语通过这次独立的课程设计,我学到了很多书本上学不到的东西,尤其是在改正错误的时候,我能更加深入的了解VHDL语言的精妙之处。比如同一个process下不能使用不同信号进行event跳变,single与variable之间的差别等等等等。通过这一次一次的亲身体验,我仿佛发生了一次洗礼,经过了一个质的飞跃。现在的我已经基本能看懂VHDL程序,改正其中出现的错误。 希望以后能多多进行这样的实习,让自己的能力越来越高。参考书目:1 阎石 主编,数字电子技术基础,高等教育出版社,19982 谭会生等主编,EDA技术及应用,西安电子科技大学出版社,20013 廖裕评等主编,CPLD数字电路设计使用MAX+plus入门篇,清华大学出版社,20014 冯涛等主编,可编程逻辑器件开发技术:MAX+plus入门与提高,人民邮电出版社,20025 杨崇志,特殊新型电子元件手册,辽宁科学技术出版社,19996 彭介华,电子技术课程设计指导高等教育出版社.2000年出版.7 Mark Zwolinski, Digital System Design with VHDL, 电子工业出版社,20028 Alan B. Marcovitz Introduction to logic Design, 电子工业出版社,2002附录1:总程序如下:library IEEE;use IEEE.std_logic_1164.all;entity timer isport(clk : in std_logic; - System clock input port(250KHz). naozhong:in std_logic; L : out std_logic_vector(2 downto 0); - 8 seven-segment displays selection ports. dled: out std_logic_vector(7 downto 0); - Digits display ports. time:in std_logic; sound: out std_logic; clk_1:in std_logic; clk_2:in std_logic; clk_3:in std_logic);end timer;architecture display of timer is signal cnt: integer range 0 to 7; - 8 seven-segment displays seletion counter. signal ct:integer range 0 to 250000 ; - 1 second generator counter. signal hourH,ahourH,alarm_hourH: integer range 0 to 2; signal minuteH,secondH,aminuteH,asecondH,alarm_minuteH,alarm_secondH: integer range 0 to 6; signal hourL,minuteL,secondL,ahourL,aminuteL,asecondL,alarm_hourL,alarm_minuteL,alarm_secondL: integer range 0 to 10;signal set : integer range 0 to 7;signal d,k,p: std_logic; begin process (clk) begin if clk'event and clk = '1' then sound<='1' cnt<=cnt+1; ct<=ct+1; if ct=250000 then - 1 second ct<=0; secondL<=secondL+1; end if; if secondL=10 then - 10 seconds secondL<=0; secondH<=secondH+1; end if; if secondH=6 then - 60 seconds(1 minute) secondH<=0; minuteL<=minuteL+1; end if; if minuteL=10 then - 10 minutes minuteL<=0; minuteH<=minuteH+1; end if; if minuteH=6 then - 60 minutes(1 hour) minuteH<=0; hourL<=hourL+1; end if; if hourL=10 then - 10 hours hourL<=0; hourH<=hourH+1; end if; if hourH=2 and hourL =4 then - 24 hours hourH<=0; hourL<=0; end if; if (time='0') thenahourH<=hourH;ahourL<=hourL;aminuteH<=minuteH;aminuteL<=minuteL;asecondH<=secondH;asecondL<=secondL;elsif(time='1')thenahourH<=alarm_hourH;ahourL<= alarm_hourL;aminuteH<= alarm_minuteH;aminuteL<= alarm_minuteL;asecondH<= alarm_secondH;asecondL<= alarm_secondL;end if;case cnt is - To display the time. when 0 => L<="000" - Enable the leftmost display. case ahourH is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when others => null; end case; when 1 => L<="001" - Enable the second display. case ahourL is when 0 => dled<=X"FC"-0 when 1 => dled<=X"60"-1 when 2 => dled<=X"DA"-2 when 3 => dled<=X"F2"-3 when 4 => dled<=X"66"-4 when 5 => dled<=X"B6"-5 when 6 => dled<=X"BE"-6 when 7 => dled<=X"E0"-7 when 8 => dled<=X"FE"-8 when 9 => dled<=X"F6"-9 when others => null; end case; when 2 => L<="010" - Enable the third display. dled<=X"01" - Blanked. when 3 => L<="011" - Enable the fourth dis