EDA 课程设计
- 格式:doc
- 大小:430.50 KB
- 文档页数:16
《电子系统设计自动化》课程设计报告学院:机电工程学院题目:数字时钟电路设计课程:《电子系统设计自动化》课程设计专业班级:电信10级2 班学生姓名:刘星秦玉杰王艳艳学号: 1004101035 1004101036 1004101038完成日期:2013年 12 月 27 日目录摘要 (4)一课程设计的任务和基本要求1.1目的和任务 (4)1.2功能要求 (4)1.3总体框图 (4)1.4设计原理 (5)1.5性能描述及功能设计 (5)二设计方案2.1 顶层实体描述 (6)2.2模块自顶向下的分解 (7)2.3模块描述 (7)2.4顶层电路图 (8)三方案实现3.1各模块仿真及描述 (8)3.2顶层电路仿真及描述 (10)四硬件测试及说明 (10)五心得体会 (11)参考文献 (11)六附录6.1源程序 (12)摘要:EDA(Electronic Design Automation)电子设计自动化,就是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成用软件方式设计的电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。
本次实习利用QuartusII为设计软件、VHDL为硬件描述语言,结合所学的数字电路的知识设计一个24时多功能数字钟,具有正常时、分、秒计时,动态显示,清零、快速校时校分、整点报时、花样显示等功能。
利用硬件描述语言VHDL对设计系统的各个子模块进行逻辑描述,采用模块化的设计思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑分割、逻辑综合优化、逻辑布线、逻辑仿真,最终将设计的软件系统下载设计实验系统,对设计的系统进行硬件测试。
一、课程设计基本要求和任务《EDA课程设计》是继《模拟电子技术基础》、《数字电子技术基础》课程后,电信专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分。
1.1 目的和任务(1)通过课程设计使学生能熟练掌握一种EDA软件(QUARTUSII)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程,为以后进行工程实际问题的研究打下设计基础。
(2)通过课程设计使学生能利用EDA软件(QUARTUSII)进行至少一个电子技术综合问题的设计,设计输入可采用图形输入法或VHDL硬件描述语言输入法。
(3)通过课程设计使学生初步具有分析、寻找和排除电子电路中常见故障的能力。
(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。
1.2 功能要求:(1)具有时、分、秒计数显示功能,以24小时循环计时。
(2)时钟计数显示时有LED灯的花样显示。
(3)具有调节小时、分钟、秒及清零的功能。
(4)具有整点报时功能。
1.3 总体方框图:本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟均是采用6进制和10进制的组合。
1.4 设计原理:数字钟电路设计要求所设计电路就有以下功能:时、分、秒计时显示,清零,时、分调节,整点报时及花样显示。
分、秒计时原理相似,可以采用60进制BCD码计数器进计时;小时采用24进制BCD码进行计时;在设计时采用试验电路箱上的模式7电路,不需要进行译码电路的设计;所设计电路具有驱动扬声器和花样显示的LED灯信号产生。
试验箱模式7的电路如图一所示:图一模式七实验电路图1.5 性能指标及功能设计:(1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
(2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字数字钟具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
(3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
(4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
(5) LED灯在时钟显示时有花样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
二、设计方案2.1 顶层实体描述前面已经完成了电子时钟电路的各个组成部分的设计,下面把这些组成部分组装起来,形成完整的总体设计。
该电子时钟的命名为clock,其外部端口如图七所示。
各个输入/输出端口的作用如下:(1) clk为外部时钟信号,其频率为1Hz,reset为异步清零信号.(2) sethour和setmin分别为调时调分脉冲输入信号,当en_set为高电平时,每来一个sethour脉冲或setmin脉冲,时、分输出将分别加1;(3)second[6...0]为秒的个位和十位BCD码输出,min[6…0]为分钟的个位和十位BCD码输出,hour[6...0]为小时的个位和十位BCD码输出,它们最终中用来驱动七段数码管,lamp[2...0]为花样显示输出信号,speak为整点报时扬声器驱动信号2.2 模块划分自顶向下分解2.3 模块描述时钟计时模块完成时、分、秒计数,及清零、调节时和分钟的功能。
时、分、秒计数的原理相同,均为BCD码输出的计数器,其中分和秒均为六十进制BCD码计数器,小时为二十四进制BCD码计数器。
设计一个具有异步清零和设置输出功能的六十进制BCD码计数器,再设计一个具有异步清零和设置输出功能的二十四进制计数器,然后将它们通过一定的组合构成时钟计时模块。
各个输入/输出端口的作用为:(1) clk为计时时钟信号,reset为异步清零信号;(2) sethour为小时设置信号,setmin为分钟设置信号;(3) daout[5…0]为小时的BCD码输出, daout[6...0]为秒和分钟的BCD码输出,enmin和enhour为使能输出信号。
(4)在时钟整点的时候产生扬声器驱动信号和花样显示信号。
由时钟计时模块中分钟的进行信号进行控制。
当contr_en为高电平时,将输入信号clk送到输出端speak用于驱动扬声器,同时在clk的控制下,输出端lamp[2..0]进行循环移位,从而控制LED灯进行花样显示。
输出控制模块有扬声器控制器和花样显示控制器两个子模块组成2.4 顶层电路图顶层文件是由四个模块组成,分别是时、分、秒计数器和报警的VHDL语言封装而成。
经过锁定引脚再重新编译获得如下顶层原理电路图:三、方案实现3.1 各模块仿真及描述(1)秒计数器模块仿真图:将标准秒信号送入”秒计数器”,秒计数器采用60进制计数器,每累计60秒发出一个分脉冲信号,该信号将作为分计数器的时钟脉冲,daout代表秒输出。
(2)分计数器电路仿真图:也采用60进制计数器,每累计60分钟,发出一个时脉冲信号,该信号将被送到时计数器,daout端口代表分钟输出(3)小时计数器电路仿真图:时计数器采用12进制计时器,可实现对24小时累计。
每累计12小时,发出一个脉冲信号。
3.2 顶层电路仿真及描述实现了数字钟的设计,仿真结果满足设计要求。
四、硬件测试及说明进行硬件验证时,采用试验箱上的模式七电路图,如前面的图一所示。
七段数码管1和2做为秒计时输出,4和5做为分钟计时输出,7和8做为小时计时输出,八个发光管D1、D2和D3用做花样显示,键8为清零输入信号reset,键7和键4分别用做调时sethour和调分setmin,时钟信号clk由试验箱内部提供。
硬件验证前进行引脚的配置,单击“Assignments”菜单下的“Assignment Editor”命令,再在弹出的引脚配置器中进行引脚配置,引脚配置结果如图引脚配置完成后再进行一次全程编译,无误则可以下载到试验箱上进行硬件测试。
硬件验证的方法如下:选择实验模式7;时钟脉冲clk与clock0(1024Hz)信号相连;键8和键5均为低电平,时钟正常计时,数码管1和2显示秒,数码管4和5显示分钟,数码管7和8显示小时;键8为高电平时,时钟清零;键5为高电平时,按下键7和键4进行调时调分操作;当时钟为整点的时候,三个发光二极管进行循环移位操作,同时扬声器发声。
五、心得体会经过源程序的编辑、逻辑综合、逻辑适配、编程下载成功后,在EDA实验开发系统进行硬件验证时却发现实验结果不正确,扬声器无法发声。
经检查,自己设计的管脚文件有错。
将管脚锁定文件修改后,重新进行逻辑适配、编程下载成功后,实验结果仍然不正确,百思不得其解。
无奈之下,决定重头开始排查每一步的细节,确定各个模块的功能完全实现并且顶层模块功能正确。
修改之后,重新进行逻辑适配、编程下载验证,实验结果完全正确。
这次EDA课程设计历时两个星期,在整整两个星期的日子里,不仅巩固了以前所学过的知识,而且学到了很多书本上学不到的知识,同时锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,对未来有了更多的信心。
这次课程设计,进一步加深了我对EDA的了解,使我对QuartusII的基本操作有所了解,使我对应用软件的方法设计硬件系统有了更加浓厚的兴趣。
通过这次课程设计,我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合,从实践中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中,我遇到许多问题,毕竟是第一次应用VHDL进行硬件电路系统的设计,许多EDA的知识还没有充分的掌握,遇到困难也是在所难免的,同时发现了自己的不足之处:学习知识表面化,没有深入了解它们的原理。
总的来说,这次设计的数字时钟电路还是比较成功的,尽管在设计中遇到了很多问题,最后在老师的辛勤指导、同学的帮助和自己不断思考下,终于迎刃而解,有点小小的成就感,觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。
最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!参考文献[1] 崔健明.《电子电工EDA仿真技术》高等教育出版社 2000年[2] 卢杰,赖毅.《VHDL与数字电路设计》科学出版社 2001年[3] 潘松,黄继业.《EDA技术实用教程》科学出版社 2002年[4] 朱运利.《EDA技术应用》电子工业出版社 2004年[5] 张明.《VHDL实用教程》电子科技大学出版社 1999年[6] 彭介华.《电子技术课程设计与指导》高等教育出版 1997年六、附录6.1 源程序1、秒计数器模块的VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY second ISPORT( clk,reset,setmin:STD_LOGIC;enmin:OUT STD_LOGIC;daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY second; ARCHITECTURE fun OF second ISSIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL enmin_1,enmin_2:STD_LOGIC; --enmin_1为59秒时的进位信号BEGIN --enmin_2由clk调制后的手动调分脉冲信号串daout<=count;enmin_2<=(setmin and clk); --setmin为手动调分控制信号,高电平有效enmin<=(enmin_1 or enmin_2); --enmin为向分进位信号PROCESS(clk,reset,setmin)BEGINIF(reset='0')THEN count<="0000000"; --若reset为0,则异步清零ELSIF(clk 'event and clk='1')then --否则,若clk上升沿到IF(count(3 downto 0)="1001")then --若个位计时恰好到"1001"即9 IF(count<16#60#)then --又若count小于16#60#,即60H IF(count="1011001")then --又若已到59D enmin_1<='1';count<="0000000"; --则置进位为1及count复0 ELSE --未到59Dcount<=count+7; --则加7,而+7=+1+6,即作"加6校正" END IF;ELSE --若count不小于16#60#(即count等于或大于16#60#)count<="0000000"; --count复0END IF; --END IF(count<16#60#)ELSIF(count<16#60#)then --若个位计数未到"1001"则转此句再判count<=count+1; --若count<16#60#则count加1 enmin_1<='0'after 100 ns; --没有发生进位ELSE --否则,若count不小于16#60# count<="0000000"; --则count复0 END IF; --END IF(count(3 DOWNTO 0)="1001")END IF; --END IF(reset='0')END PROCESS;END fun;2、分计数器模块的VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY minute ISPORT(clk,clk1,reset,sethour:IN STD_LOGIC;enhour:OUT STD_LOGIC;daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY minute ;ARCHITECTURE fun OF minute ISSIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);SIGNAL enhour_1, enhour_2: STD_LOGIC; --enmin_1为59分时的进位信号BEGIN --enmin_2由clk调制后的手动调时脉冲信号串daout<=count;enhour_2<= (sethour and clk1); --sethour为手动调时控制信号,高电平有效enhour<= (enhour_1 or enhour_2);PROCESS(clk,reset,sethour)BEGINIF(reset='0') THEN --若reset为0,则异步清零count<="0000000";ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到IF(count (3 DOWNTO 0) ="1001")THEN --若个位计时恰好到"1001"即9 IF(count <16#60#) THEN --又若count小于16#60#,即60 IF(count="1011001") THEN --又若已到59D enhour_1<='1'; --则置进位为1 count<="0000000"; --count复0 ELSEcount<=count+7; --若count未到59D,则加7,即作"加6校正" END IF; --使前面的16#60#的个位转变为8421BCD的容量ELSEcount<="0000000"; --count复0(有此句,则对无效状态电路可自启动)END IF; --END IF(count<16#60#)ELSIF (count <16#60#) THENcount<=count+1; --若count<16#60#则count加1 enhour_1<='0' after 100 ns; --没有发生进位ELSEcount<="0000000"; --否则,若count不小于16#60# count复0 END IF; --END IF(count(3 DOWNTO 0)="1001")END IF; --END IF(reset='0')END process;END fun;3、时计数器模块的VHDL语言:LIBRARY IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY hour ISPORT(clk,reset:IN STD_LOGIC;daout:out STD_LOGIC_VECTOR(5 DOWNTO 0));END ENTITY hour;ARCHITECTURE fun OF hour ISSIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGINdaout<=count;PROCESS(clk,reset)BEGINIF(reset='0')THEN count<="000000"; --若reset=0,则异步清零ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到IF(count(3 DOWNTO 0)="1001")THEN -若个位计时恰好到"1001"即9 IF(count<16#23#)THEN --23进制count<=count+7; --若到23D则elsecount<="000000"; --复0 END IF;ELSIF (count<16#23#)THEN --若未到23D,则count进1 count<=count+1;ELSE --否则清零count<="000000";END IF; --END IF(count(3 DOWNTO 0)="1001")END IF; --END IF(reset='0')END PROCESS;END fun;4、报警模块的VHDL语言:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY alert ISPORT(clk:IN STD_LOGIC;dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);speak:OUT STD_LOGIC;lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END alert;ARCHITECTURE fun OF alert ISSIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINspeaker:PROCESS(clk)BEGIN--speak<=count1(1);IF(clk'event and clk='1')THENIF(dain="0000000")THENspeak<=count1(1);IF(count1>="10")THENcount1<="00"; --count1为三进制加法计数器ELSEcount1<=count1+1;END IF ;END IF ;END IF ;END PROCESS speaker;lamper:PROCESS(clk)BEGINIF(rising_edge(clk))THENIF(count<="10")THENIF(count="00")THENlamp<="001"; --循环点亮三只灯ELSIF(count="01")THENlamp<="010";ELSIF(count="10")THENlamp<="100";END IF;count<=count+1;ELSEcount<="00";END IF;END IF;END PROCESS lamper;END fun;。