数字钟VHDL设计报告.docx
- 文档编号:4233403
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:19
- 大小:718.32KB
数字钟VHDL设计报告.docx
《数字钟VHDL设计报告.docx》由会员分享,可在线阅读,更多相关《数字钟VHDL设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
数字钟VHDL设计报告
设计报告
课程名称在系统编程技术
任课教师
设计题目数字时钟
班级
姓名
学号0705074035
日期2010/6/1
目录
摘要:
1
关键词:
数字钟EDAVHDL语言1
一、设计目的1
二、设计内容1
三、设计原理2
1、数字钟的基本工作原理:
2
2、数字钟设计的电路原理图3
3、VHDL设计3
四、设计仪器、设备4
五、设计步骤5
1、用VHDL程序设计5
步骤1:
为本项设计建立文件夹5
步骤2:
输入设计项目和存盘5
步骤3:
选择目标器件并编译6
步骤4:
时序仿真6
步骤5:
引脚锁定9
步骤6:
编程下载9
2、实验箱显示10
六、总结11
参考文献11
附录:
11
摘要:
人类社会已进入到高度发达的信息化社会。
信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。
电子信息产品随着科学技术的进步,其电子器件和设计方法更新换代的速度日新月异。
实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化(EDA,Electronics Design Automation)技术,EDA技术的发展和推广应用又极大地推动了电子信息产业的发展。
为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的一项先进技术和重要工具。
目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。
EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为24时59分59秒,另外还具有校时功能和闹钟功能。
总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。
并且使用QUARTUS II软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词:
数字钟EDAVHDL语言
一、设计目的
1、熟练地运用数字系统的设计方法进行数字系统设计;
2、能进行较复杂的数字系统设计;
3、按要求设计一个数字钟。
二、设计内容
1、要求显示秒、分、时,显示格式如下:
图2.1显示格式
2、可清零、可调时,具有整点报时功能。
三、设计原理
1、数字钟的基本工作原理:
数字钟以其显示时间的直观性、走时准确性作为一种计时工具,数字钟的基本组成部分离不开计数器,在控制逻辑电路的控制下完成预定的各项功能。
数字钟的基本原理方框图如下:
图3.1数字钟实现原理框图
1)时钟计数:
完成时、分、秒的正确计时并且显示所计的数字;对秒、分
——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:
手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:
reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
5)LED灯在时钟显示时有花样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:
小时采用24进制,而分钟均是采用6进制和10进制的组合。
2、数字钟设计的电路原理图
图3.324进制数字钟的电路图
3、VHDL设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYalertIS
PORT(clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
SIGNALcount:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALcount1:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
speaker:
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN
IF(dain="0000000")THEN
speak<=count1
(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSspeaker;
lamper:
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
ENDIF;
count<=count+1;
ELSE
count<="00";
ENDIF;
ENDIF;
ENDPROCESSlamper;
ENDfun;
注:
详细的VHDL文件见附录
四、设计仪器、设备
PC机一台、GW48教学实验系统一台、下载电缆一根(已接好)
五、设计步骤
1、用VHDL程序设计
步骤1:
为本项设计建立文件夹
任何一项设计都是一项工程,都必须首先为此工程建立一个放置与此工程相关的所有的文件夹,在此文件夹被EDA软件默认为工作库。
一个设计项目可以包含多个设计文件,一般不同的设计项目最好放在不同的文件夹中。
注意:
文件名不能使用中文,且不能带空格。
步骤2:
输入设计项目和存盘
1)打开QUARTUS||,单击“file”菜单,将鼠标移到NewProjectWizard选项单击则显示如下图内容,在其中建立项目名和实体名,项目名和实体必须保持一致,最后点击finish完成
图6.1建立NewProject
2)
在其中点击file→new,选择原理图编辑器,在这里我们建立VHDL文件,点击确定则显示下图情况,可以在里面键入程序,如下图。
图6.2输入程序
步骤3:
选择目标器件并编译
1)在Assign选项的下拉菜单中选择器件选择项Device,如图所示。
在DeviceFamily(器件序列栏)中选定目标器件对应的序列名,EPF10K10对应的是FLEX10K系列。
为了选择EPF10K10LC84-4器件,应将此栏下方标有ShowonlyFastestSpeedGrades的勾消去,以便显示出所有速度级别的器件。
完成器件选择后,按OK键。
注意:
所选器件必须与目标板的器件型号完全一致。
选择CyclonePackage:
TQFPPIN:
144Speedgrade:
8
图6.3选择目标板器件型号
3)输入完程序以后点击工具栏右方一个紫色的三角符号“
”,然后运行程序,如果程序出现错误在改正。
步骤4:
时序仿真
1.建立波形文件:
选择File->New,选择VectorWaveformFile,单击OK。
图6.4建立波形文件
2.选择Edit->EndTime选项,如图6.6所示,设定仿真时间宽度。
图6.5设置仿真时间
3.双击Name下的空白处,弹出InsertNodorBus对话框,单击NodeFinder。
图6.6选择添加结点设置
4.如图6.7所示选定各个选择项。
图6.7选择结点
5.单击OK,完成引脚输入。
图6.8
6.加上输入信号后波形文件存盘。
图6.9波形
7.运行仿真器。
在Processing菜单下选择StartSimulation项,直到Simulatorwassuccessful出现,仿真结束。
完成波形如图所示。
步骤5:
引脚锁定
选择AssignPin\Location\Chip,在跳出的窗口中的NodeName栏中用键盘输入半加器的端口名,如a、b等。
如果输入的端口名正确,在右侧的PinType栏将显示该信号的属性。
输入以后如下图,设定完成以后再运行一次程序。
图6.11引脚锁定
步骤6:
编程下载
1)首先将下载线把计算机的打印机口与目标板(如开发板或实验板)连接好,打开电源
2)下载方式设定。
选择MAX+plusIIProgrammer选项,跳出下图左侧所示的编程器窗口,然后选择OptionsHardwareSetup硬件设置选项,其窗口图中左侧所示。
在其下拉菜单中选ByteBlaster(MV)编程方式。
此编程方式对应计算机的并行口下载通道,“MV”是混合电压的意思,主要指对ALTERA的各类芯核电压(如5V、3.3V、2.5V与1.8V等)的FPGA/CPLD都能由此下载。
此项设置只在初次装软件后第一次编程前进行,设置确定后就不必重复此设置了
图6.12下载编译
最后点击start按钮,进入下载模式,等待下载完成以后在试验箱上进行调试检测是否正确。
2、实验箱显示
(1)任意设置时间,让其从这一时间开始显示
图6.13设置时间
(2)时间显示为24进制,当时间显示到大23:
59:
59后将会从00:
00:
00开始显示
图6.14数字钟为24进制显示
图6.15时间跳变到000000
六、总结
经过几周EDA实验的学习,使我受益匪浅。
这不仅增强了我对EDA设计的兴趣,更掌握了基本的电路设计流程、方法以及技巧。
具备了这些基本知识,为今后的自主学习奠定了良好的基础。
在编写时可以相互借鉴,这样可以节省一定的时间,尤其是24进制的处理上,我们采用了简单的方法即可完成多个功能的顺利实现。
此次设计不足之处是不能进行定时闹钟,这是有待改进的地方,当然我们也可以在闹钟的时候采用音乐提醒,可以和乐曲硬件演奏电路设计相结合,这样数字钟的功能才算是完美。
在设计中还是需要注意一些常见的问题,比如实体名、项目名等,还有在编写VHDL文件时,一些文件名也是需要注意的。
最后感谢査老师对我们的指导,以及同学们对我的帮助,使得实验能够顺利完成!
参考文献
1、沈明山编著,EDA技术及可编程器件应用实训 北京:
科学出版社
2、崔建明主编,电工电子EDA仿真技术 北京:
高等教育出版社,2004
3、李衍编著,EDA技术入门与提高王行 西安:
西安电子科技大学出版社
4、侯继红, 李向东主编,EDA实用技术教程 北京:
中国电力出版社
5、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计 西安:
西安电子科技大学出版
附录:
VHDL设计程序
1、秒
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsecondIS
PORT(clk,reset,setmin:
STD_LOGIC;
enmin:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYsecond;
ARCHITECTUREfunOFsecondIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenmin_1,enmin_2:
STD_LOGIC;--enmin_1为59秒时的进位信号
BEGIN--enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setminandclk);--setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1orenmin_2);--enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THENcount<="0000000";--若reset为0,则异步清零
ELSIF(clk'eventandclk='1')then--否则,若clk上升沿到
IF(count(3downto0)="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--未到59D
count<=count+7;--则加7,而+7=+1+6,即作"加6校正"
ENDIF;
ELSE--若count不小于16#60#(即count等于或大于16#60#)
count<="0000000";--count复0
ENDIF;--ENDIF(count<16#60#)
ELSIF(count<16#60#)then--若个位计数未到"1001"则转此句再判
count<=count+1;--若count<16#60#则count加1
enmin_1<='0'after100ns;--没有发生进位
ELSE--否则,若count不小于16#60#
count<="0000000";--则count复0
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDPROCESS;
ENDfun;
2、分
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYminuteIS
PORT(clk,clk1,reset,sethour:
INSTD_LOGIC;
enhour:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYminute;
ARCHITECTUREfunOFminuteIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenhour_1,enhour_2:
STD_LOGIC;--enmin_1为59分时的进位信号
BEGIN--enmin_2由clk调制后的手动调时脉冲信号串
daout<=count;
enhour_2<=(sethourandclk1);--sethour为手动调时控制信号,高电平有效
enhour<=(enhour_1orenhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0')THEN--若reset为0,则异步清零
count<="0000000";
ELSIF(clk'eventandclk='1')THEN--否则,若clk上升沿到
IF(count(3DOWNTO0)="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
ELSE
count<=count+7;--若count未到59D,则加7,即作"加6校正"
ENDIF;--使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";--count复0(有此句,则对无效状态电路可自启动)
ENDIF;--ENDIF(count<16#60#)
ELSIF(count<16#60#)THEN
count<=count+1;--若count<16#60#则count加1
enhour_1<='0'after100ns;--没有发生进位
ELSE
count<="0000000";--否则,若count不小于16#60#count复0
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDprocess;
ENDfun;
3、时
LIBRARYIEEE;
useIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYhourIS
PORT(clk,reset:
INSTD_LOGIC;
daout:
outSTD_LOGIC_VECTOR(5DOWNTO0));
ENDENTITYhour;
ARCHITECTUREfunOFhourIS
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THENcount<="000000";--若reset=0,则异步清零
ELSIF(clk'eventandclk='1')THEN--否则,若clk上升沿到
IF(count(3DOWNTO0)="1001")THEN--若个位计时恰好到"1001"即9
IF(count<16#23#)THEN--23进制
count<=count+7;--若到23D则
else
count<="000000";--复0
ENDIF;
ELSIF(count<16#23#)THEN--若未到23D,则count进1
count<=count+1;
ELSE--否则清零
count<="000000";
ENDIF;--ENDIF(count(3DOWNTO0)="1001")
ENDIF;--ENDIF(reset='0')
ENDPROCESS;
ENDfun;
4、主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYalertIS
PORT(clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
SIGNALcount:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALcount1:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
speaker:
PROCESS(clk)
BEGIN
--speak<=count1
(1);
IF(clk'eventandclk='1')THEN
IF(dain="0000000")THEN
speak<=count1
(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSspeaker;
lamper:
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
ENDIF;
count<=count+1;
ELSE
count<="00";
ENDIF;
ENDIF;
ENDPROCESSlamper;
ENDfun;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 VHDL 设计 报告