基于VHDL的数字钟设计.docx
- 文档编号:10538418
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:22
- 大小:2.22MB
基于VHDL的数字钟设计.docx
《基于VHDL的数字钟设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字钟设计.docx(22页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字钟设计
工业经济职业技术学院
毕业论文(设计)
题目:
基于VHDL的数字钟设计
系别:
电子信息技术系
专业:
电子信息工程技术
学号:
201254427
学生:
王翀
指导教师:
王俊
职称:
二〇一四年五月月十三日
【摘要】
20世纪90年代,国际上电子和计算机技术较为先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,
【关键词】
数字钟EDAVHDL语言
摘要:
.........................................................................................................................1
关键词:
………………...........................................................................................1
绪论………………………………………………………………………………....3
1.设计目的..............................................................................................................4
2.设计容...............................................................................................................4
3.设计原理...............................................................................................................4
3.1数字钟的基本工作原理…………………………………………….….………4
3.2数字钟设计的电路原理图……………………………..………………………6.
4.单元模块的设计………………………………………………………………….6
4.1秒计数器的模块………………………………………………………….……..6
4.2分计数器的模块…………………………..…………………………….............8
4.3时计数器的模块……………………………………..……………………...…10
4.4整点报时器模块…………………………………………………………….....12
4.5调时调分模块………………………..………………………………….……..13
4.6LED显示译码器模块…………………………………………..………..…..15
5.仿真结果………………………………………………………………………..17.
结语.........................................................................................................................17
参考文献...............................................................................................................18
绪论
EDA是电子设计自动化(ElcctronicDesignAutomation)的缩写,是90年代初从CAD(计算机辅助设备),CAM(计算机辅助制造),CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
EDA技术是以计算机为工具,根据硬件描述语言HDL完成的设计文件,自动的完成逻辑编译,化简,分割,综合及优化,布局布线,仿真以及对特定目标芯片的适配编译和编程下载等工作,这种将设计实体外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的。
其优点是:
与其它硬件描述语言相比,VHDL具有更强的行为描述能力,从而解决了他成为系统设计领域最佳的硬件描述语言,强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证;VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能和可行性,及时可对设计进行。
它的计时周期为24小时,显示满刻度为24时59分59秒,另外还具有校时功能和闹钟功能。
总的程序由几个各具不同功能的单元模块程序拼接而成,
其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。
并且使用QUARTUSII软件进行电路波形仿真,下载到EDA实验箱进行验证。
1.设计目的
1)熟练地运用数字系统的设计方法进行数字系统设计;
2)能进行较复杂的数字系统设计;
3)按要求设计一个数字钟。
2.设计容
1)要求显示秒、分、时,显示格式如下:
图显示格式
2)可清零、可调时,具有整点报时功能。
3.设计原理
3.1数字钟的基本工作原理:
数字钟以其显示时间的直观性、走时准确性作为一种计时工具,数字钟的基本组成部分离不开计数器,
在控制逻辑电路的控制下完成预定的各项功能。
数字钟的基本原理方框图:
数字钟实现原理框图
1)时钟计数:
完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:
手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:
reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
5)LED灯在时钟显示时有花样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:
小时采用
数字时钟控制单元时调整分调整使能端信号CLK信号时显示分显示秒显示24进制60进制60进制LED显示整点报时花样显示
24进制,而分钟均是采用6进制和10进制的组合。
3.2数字钟设计的电路原理图
24进制数字钟的电路图
4.单元模块的设计
4.1.秒计数器模块
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYsecondIS
PORT(
clk,reset,setmin:
INSTD_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秒时的进位信号
BEGINdaout<=count;----enmin_2由clk调制后的手动调分脉冲信号串
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
elsecount<=count+7;----未到59D,则加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
endif;
endif;
endprocess;
endfun
编译过程:
仿真图如下:
4.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;
BEGIN
daout<=count;
enhour_2<=(sethourandclk1);
enhour<=(enhour_1orenhour_2);
process(clk,reset,sethour)
begin
if(reset='0')then
count<="0000000";----若reset=0,则异步清零
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;
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;
endprocess;
ENDfun;
编译过程:
仿真图如下:
4.3.时计数器模块
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYhourIS
PORT(
clk,reset:
INSTD_LOGIC;
daout:
outstd_logic_vector(5downto0));
ENDentityhour;
ARCHITECTUREfunOFhourISSIGNALcount:
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;
endprocess;
ENDfun;
编译过程:
仿真图如下:
4.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
signalcoun:
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
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(coun<="10")then
if(coun="00")then
lamp<="001";----循环点亮三只灯
elsif(coun="01")then
lamp<="010";
elsif(coun="10")then
lamp<="100";
endif;
coun<=coun+1;
else
coun<="00";
endif;
endif;
endprocesslamper;
ENDfun;
编译过程:
仿真图如下:
4.5.调时调分模块
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
ENTITYseltimeIS
PORT(
clk1,reset:
INSTD_LOGIC;
sec,min:
INSTD_LOGIC_VECTOR(6downto0);
hour:
instd_logic_vector(5downto0);
daout:
OUTSTD_LOGIC_vector(3downto0);
dp:
OUTstd_LOGIC;
sel:
outstd_logic_vector(2downto0));
ENDseltime;
ARCHITECTUREfunOFseltimeIS
SIGNALcount:
STD_LOGIC_vector(2downto0);
BEGINsel<=count;
process(clk1,reset)
begin
if(reset='0')then
count<="000";
elsif(clk1'eventandclk1='1')then
if(count>="101")then
count<="000";
else
count<=count+1;
endif;
endif;
casecountis
when"000"=>daout<=sec(3downto0);dp<='0';
when"001"=>daout(3)<='0';daout(2downto0)<=sec(6downto4);dp<='0';
when"010"=>daout<=min(3downto0);dp<='1';
when"011"=>daout(3)<='0';daout(2downto0)<=min(6downto4);dp<='0';
when"100"=>daout<=hour(3downto0);dp<='1';
whenothers=>daout(3downto2)<="00";
daout(1downto0)<=hour(5downto4);dp<='0';
endcase;
endprocess;
endfun;
编译过程:
仿真图如下:
4.6.LED显示译码器模块
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdeledIS
PORT(num:
INstd_logic_vector(3downto0);
led:
OUTstd_logic_vector(6downto0));
enddeled;
ARCHITECTUREfunOFdeledIS
BEGIN
led<="1111110"whennum="0000"else
"0110000"whennum="0001"else
"1101101"whennum="0010"else
"1111001"whennum="0011"else
"0110011"whennum="0100"else
"1011011"whennum="0101"else
"1011111"whennum="0110"else
"1110000"whennum="0111"else
"1111111"whennum="1000"else
"1111011"whennum="1001"else
"1110111"whennum="1010"else
"0011111"whennum="1011"else
"1001110"whennum="1100"else
"0111101"whennum="1101"else
"1001111"whennum="1110"else
"1000111"whennum="1111";
ENDfun;
编译过程:
仿真图如下:
5.仿真结果
下图是最后仿真的结果,但是总是无法选中芯片,都是000,得不到正确的结果。
可能的原因是FPGA的时钟输出为20MHZ,经过分频器得到1KHZ和1HZ的频率需要多次的计数,由于计数值太大无法得到正确的仿真结果。
数字钟仿真波形
6.结语
本次试验的数字时钟能只够显示时间,其它功能如闹铃、调时、分、秒都能在此基础上进一步的实现,由于时间有限只能调试到这里。
经过努力,简易电子时钟的设计基本上算是完成了,在整个设计中,我最大的体会就是:
难!
我们在本次的课程设计中,发现了很多问题,同时做起来也很难不顺手,看着简单的电路,要动手把它设计出来实非易事,主要原因是我们没有经常动手设计电路,这就要求我们在以后的学习中,应该注意到这一点,更重要的是我们要学会把从书本上学到的知识和实际电路联系起来,这不论对我们以后的学习还是就业,都会起到很大的促进和帮助,我相信,通过这次的课程设计,在下一阶段的学习中我们会更加努力,力争把这门课学好学精。
同时通过本次课程设计,巩固了我们以前学过的专业知识,通过这次的程序设计,使我们对数字系统结构也有了更进一步的了解与认识,同时对数据库软件EDA技术,VHDL语言等系列知识都有了一定的了解与认识。
使用EDA技术开发页面的能力也有了提高,也使我们把理论与实践从正真意义上结合了起来,考验了我们的动手能力,查阅相关资料的能力,还有组织材料的能力。
通过此次实践,我们从中可以找出自己知识的不足与欠缺,以便我们在日后的学习中得以改进与提高。
经过本次设计使我们对所学习到的知识得以进一步实践,这将对我们走出校园走向社会走向工作岗位奠定坚实的基础。
最后感老师对我们的指导,以及同学们对我的帮助,使得实验能够顺利完成!
参考文献
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)