EDA课程设计方案数字时钟.docx

上传人:b****6 文档编号:7720961 上传时间:2023-01-26 格式:DOCX 页数:16 大小:376.75KB
下载 相关 举报
EDA课程设计方案数字时钟.docx_第1页
第1页 / 共16页
EDA课程设计方案数字时钟.docx_第2页
第2页 / 共16页
EDA课程设计方案数字时钟.docx_第3页
第3页 / 共16页
EDA课程设计方案数字时钟.docx_第4页
第4页 / 共16页
EDA课程设计方案数字时钟.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

EDA课程设计方案数字时钟.docx

《EDA课程设计方案数字时钟.docx》由会员分享,可在线阅读,更多相关《EDA课程设计方案数字时钟.docx(16页珍藏版)》请在冰豆网上搜索。

EDA课程设计方案数字时钟.docx

EDA课程设计方案数字时钟

HefeiUniversity

EDA课程设计报告

设计题目:

数字时钟设计

专业:

自动化

(2)班

姓名:

李宏灶

学号:

0805070110

指导老师:

康南生

前言

随着基于PLD的EDA技术的发展和应用领域的扩大和深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益提高。

作为现在的大学生应熟练掌握这门技术,为以后的发展打下良好的基础,本实验设计是应用QuartusII环境及VHDL语言设计一个时间可调的数字时钟。

使自己熟练使用QuartusII环境来进行设计,掌握VHDL语言的设计方法。

要注重理论与实践之间的不同,培养自己的实践能力!

目录

一、课程设计任务及要求3

1.1实验目的3

1.2功能设计4

二、整体设计思想4

2.1性能指标及功能设计4

2.2总体方框图5

三、详细设计5

3.1数字钟的基本工作原理:

5

3.1.1时基T产生电路5

3.1.2调时、调分信号的产生5

3.1.3计数显示电路6

3.2设计思路6

3.3设计步骤7

3.3.1工程建立及存盘7

3.3.2工程工程的编译7

3.3.3目标芯片的选择8

3.3.4时序仿真9

3.3.5引脚锁定11

3.3.6硬件测试12

3.3.7实验结果13

四、设计总结13

五、附录14

5.1VHDL源程序14

5.2配置符号图18

一、课程设计任务及要求

1.1实验目的

1)掌握VHDL语言的基本运用

2)掌握QuartusII的简单操作并会使用EDA实验箱

3)掌握一个基本EDA课程设计的操作

1.2功能设计

1)有时、分、秒计数显示功能,小时为24进制,分钟和秒为60进制以24小时循环计时

2)设置复位、清零等功能

3)有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间

4)时钟计数显示时有LED灯显示;

二、整体设计思想

2.1性能指标及功能设计

1)时、分、秒计时器

时计时器为一个24进制计数器,分、秒计时器均为60进制计数器。

当秒计时器接受到一个秒脉冲时,秒计数器开始从1计数到60,此时秒显示器将显示00、01、02、...、59、00;每当秒计数器数到00时,就会产生一个脉冲输出送至分计时器,此时分计数器数值在原有基础上加1,其显示器将显示00、01、02、...、59、00;每当分计数器数到00时,就会产生一个脉冲输出送至时计时器,此时时计数器数值在原有基础上加1,其显示器将显示00、01、02、...、23、00。

即当数字钟运行到23点59分59秒时,当秒计时器在接受一个秒脉冲,数字钟将自动显示00点00分00秒。

2)校时电路

当开关拨至校时档时,电子钟秒计时工作,通过时、分校时开关分别对时、分进行校对,开关每按1次,与开关对应的时或分计数器加1,当调至需要的时与分时,拨动reset开关,电子钟从设置的时间开始往后计时。

2.2总体方框图

三、详细设计

3.1数字钟的基本工作原理:

3.1.1时基T产生电路

数字钟以其显示时间的直观性、走时准确性作为一种计时工具,数字钟的基本组成部分离不开计数器,在控制逻辑电路的控制下完成预定的各项功能。

由晶振产生的频率非常稳定的脉冲,经整形、稳定电路后,产生一个频率为1Hz的、非常稳定的计数时钟脉冲。

3.1.2调时、调分信号的产生

由计数器的计数过程可知,正常计数时,当秒计数器(60进制)计数到59时,再来一个脉冲,则秒计数器清零,重新开始新一轮的计数,而进位则作为分计数器的计数脉冲,使分计数器计数加1。

现在我们把电路稍做变动:

把秒计数器的进位脉冲和一个频率为2Hz的脉冲信号同时接到一个2选1数据选择器的两个数据输入端,而位选信号则接一个脉冲按键开关,当按键开关不按下去时(即为0),则数据选择器将秒计数器的进位脉冲送到分计数器,此时,数字钟正常工作;当按键开关按下去时(即为1),则数据选择器将另外一个2Hz的信号作为分计数器的计数脉冲,使其计数频率加快,当达到正确时间时,松开按键开关,从而达到调时的目的。

调节小时的时间也一样的实现。

3.1.3计数显示电路

由计数部分、数据选择器、译码器组成,是时钟的关键部分。

1、计数部分:

由两个60进制计数器和一个24进制计数器组成,其中60进制计数器可用6进制计数器和10进制计数器构成;24进制的小时计数同样可用6进制计数器和10进制计数器得到:

当计数器计数到24时,“2”和“4”同时进行清零,则可实现24进制计数。

2、数据选择器:

84输入14输出的多路数据选择器,因为本实验用到了8个数码管(有两个用来产生隔离符号‘—’)。

3、译码器:

七段译码器。

译码器必须能译出‘—’,由实验二中译码器真值表可得:

字母F的8421BCD码为“1111”,译码后为“1000111”,现在如果只译出‘—’,即字母F的中间一横,则译码后应为“0000001”,这样,在数码管上显示的就为‘—’。

3.2设计思路

根据系统设计要求,系统设计采用自顶向下设计方法,由时钟分频部分、计时部分、按键部分调时部分和显示部分五个部分组成。

这些模块都放在一个顶层文件中。

1)时钟计数:

首先下载程序进行复位清零操作,电子钟从00:

00:

00计时开始。

sethour可以调整时钟的小时部分,setmin可以调整分钟,步进为1。

由于电子钟的最小计时单位是1s,因此提供给系统的内部的时钟频率应该大于1Hz,这里取100Hz。

CLK端连接外部10Hz的时钟输入信号clk。

对clk进行计数,当clk=10时,秒加1,当秒加到60时,分加1;当分加到60时,时加1;当时加到24时,全部清0,从新计时。

用6位数码管分别显示“时”、“分”、“秒”,通过OUTPUT(6DOWNTO0)上的信号来点亮指定的LED七段显示数码管。

2)时间设置:

手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。

我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。

3)清零功能:

reset为复位键,低电平时实现清零功能,高电平时正常计数。

可以根据我们自己任意时间的复位。

3.3设计步骤

3.3.1工程建立及存盘

1.打开QuartusⅡ,单击“File”菜单,选择File→NewProjectWizard,对话框如下:

分别输入工程的工作路径、工程名和实体名,单击Finish。

2.单击“File”菜单,选择New,弹出小对话框,双击“VHDLFile",即选中了文本编辑方式。

在出现的“Vhdl1.vhd”文本编辑窗中键入VHDL程序,输入完毕后,选择File→SaveAs,即出现“SaveAs”对话框。

选择自己建立好的存放本文件的目录,然后在文件名框中键入文件名,按“Save”按钮。

3.建立工程工程,在保存VHDL文件时会弹出是否建立工程的小窗口,点击“Yes”确定。

即出现建立工程工程的导航窗口,点击“Next”,最后在出现的屏幕中分别键入新工程的工作路径、工程名和实体名。

注意,原理图输入设计方法中,存盘的原理图文件名可以是任意的,但VHDL程序文本存盘的文件名必须与文件的实体名一致,输入后,单击“Finish”按钮。

3.3.2工程工程的编译

单击工具条上的编译符号开始编译,并随着进度不断变化屏幕,编译完成后的屏幕如图所示:

3.3.3目标芯片的选择

选择菜单Assignments选项的下拉菜单中选择器件Device…,如图所示:

在弹出的对话框中的Family(器件序列栏)对应的序列名,EP1C3对应的是Cyclone系列。

在AvailableDevices里选择EP1C3T144-C8(有时需要把Showadvanceddevices的勾消去,以便显示出所有速度级别的器件)。

注意:

所选器件必须与目标板的器件型号完全一致。

在图中,单击“DeviceandPinOptions…”,在弹出的“DeviceandPinOptions…”窗口中,单击“UnusedPins”标签。

选择“Asoutputdrivinganunspecifiedsignal”(由于学习机的“FPGA”具有很多功能,为了避免使用引脚对其它器件造成影响,保证本系统可靠工作,将未使用引脚设定为输出不定状态)后,单击确定后,无误后单击“OK”。

3.3.4时序仿真

建立波形文件:

选择File→New,在New窗中选中“OtherFile”标签。

在出现的屏幕中选择“VectorWaveformFile”项出现一新的屏幕。

在出现的新屏幕中,双击“Name”下方的空白处,弹出“InsertNodorBus”对话框,单击该对话框的“NodeFinder……”。

在屏幕中的Filter中选择Pins,单击“List”。

而后,单击“>>”,所有输入/输出都被拷贝到右边的一侧,这些正是我们希望的各个引脚,也可以只选其中的的一部分,根据实际情况决定。

然后单击屏幕右上脚的“OK”。

在出现的小屏幕上单击“OK”。

设定仿真时间宽度。

选择Edit→Endtime…选项,在Endtime选择窗中选择适当的仿真时间域,以便有足够长的观察时间。

波形文件存盘。

选择File→Saveas选项,直接存盘即可。

运行仿真器。

在菜单中选择项,直到出现,仿真结束。

未曾编辑的仿真波形

仿真波形

3.3.5引脚锁定

将设计编程下载进选定的目标器件中,如EPF10K10,作进一步的硬件测试,将设计的所有输入输出引脚分别与目标器件的EPF10K10的部分引脚相接,操作如下:

1.选择Assignments→AssignmentsEditor,即进入AssignmentsEditor编辑器。

在Category栏选择Pin,或直接单击右上侧的Pin按钮。

2.双击TO栏的《new》,在出现的的下拉栏中选择对应的端口信号名(如D[0]);然后双击对应的栏的《new》,在出现的下拉栏中选择对应的端口信号名的期间引脚号。

3.最后存储这些引脚锁定信息后,必须再编译(启动)一次,才能将引脚锁定信息编译进编程下载文件中。

此后就可以准备将编译好的SOF文件下载到实验系统的FPGA中去了。

引脚锁定

3.3.6硬件测试

1.首先将下载线把计算机的打印机口与目标板(如开发板或实验板)连接好,打开电源,选择模式7。

2.打开编辑窗和配置文件。

选择,弹出一个编辑窗。

在Mode栏中选择JTAG,并在选项下的小方框打勾。

注意核对下载文件路径与文件名。

如果文件没有出现或者出错,单击左Addfile侧按钮,手动选择配置文件clock.sof。

3.最后单击下载标符Start,即进入对目标器件FPGA的配置下载操作。

当Progress显示100%,以及在底部的处理栏中出现ConfigurationSucceeded时,表示编程成功,如图所示。

注意,如果必要时,可再次单击Start,直至编程成功。

4.下载完成后,通过硬件测试进一步确定设计是否达到所有的技术指标,如未达到,可逐步检查,哪部分出现问题。

如果是代码出现问题,须修改代码;若是时序波形图有问题,须重新设置。

3.3.7实验结果

实验箱使用模式7,键8为复位按键,键8为1时正常工作。

键4设置小时,键7设置分钟。

下载成功后,按下键8,及使六个LED复位清零,显示数秒的自动计时,可以通过4键设置小时数,7键设置分钟数。

当秒数满60则进一位,分钟数满60进一位,当显示为23:

59:

59时,秒数在加一则显示00:

00:

00,之后从新计时。

四、设计总结

通过这次课程设计,我进一步加深了对电子设计自动化的了解。

并进一步熟练了对QuartusII软件的操作。

在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足。

通过与同学探讨和请教老师,终于把问题都解决了,并加深了对数字时钟原理和设计思路的了解。

同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。

做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。

最后参照每个模块把输入和输出引脚设定,运用我们所学的VHDL语言进行编程。

总之,通过这次的设计,进一步了解了EDA技术,收获很大,对软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

在此,也感谢康老师的悉心指导,使自己学到了很多东西!

五、附录

5.1VHDL源程序

Alert模块

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。

--speak<=count1(0)。

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。

Hour模块

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。

Minute模块

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。

Second模块

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。

5.2配置符号图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1