课 设计题目:基于
程 设 计 报 告
VHDL语言的简易数字钟设计
摘 要
随着电子设计自动化技术(EDA)的进步,数字电路在实际生活当中已经占据了重要的位置。在EDA技术中,最为瞩目的是以现代电子技术为特征的逻辑设计仿真测试技术。该技术的出现,使电子系统设计发生了质的变化。设计速度快、体积小、重量轻、功耗小的集成电路已成为趋势。用VHDL 语言开发的数字电路,大大简化了对工控电路的设计并且减低了成本。
本文介绍了利用VHDL硬件描述语言设计一款多功能数字钟的方法。可以实现显示、预置时分秒,年月日(可以准确显示每月天数,包括对闰年的计算);秒表;整点报时的功能。利用6个7段数码管显示时分秒或年月日。在Quartus II 开发环境下编译仿真了设计的程序。仿真结果表明,该设计方法切实可行,具有一定的借鉴性。
关键词:EDA,VHDL,数字钟,Quartus II
目 录
摘要 一、课程设计目的 2.1 设计内容
二、课程设计内容及要求
I 1 1
1 2.2设计要求 2.3发挥部分 三、VHDL程序设计
3.1整体介绍
1
3.2时钟模块 2 3.3日期模块
3.4整点报时模块 3.5秒表模块 四、仿真与分析
五、器件编程下载及设计结果 六、课程设计总结 七、参考文献 八、附录
1 1 1
2 3 4 5 5 5 6 7
一、课程设计目的
掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法
二、课程设计内容及要求
2.1设计内容
用VHDL语言实现数字钟的设计,要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
2.2设计要求
用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1.
2.3发挥部分
本设计除满足基本要求外,还实现了秒表及整点报时的功能。
三、VHDL程序设计 3.1整体介绍
本设计采用VHDL中元件例化的思想,将数字钟模块化如图1所示
图1
~ 1 ~
本设计顶层实体有6个输入端口,25(6*4+1)个输出端口:输入端口setpin用来切换工作状态、Sset和Srst用来设置秒表、f1000是1000Hz的方波信号,用来分频出所用的时钟信号、upclk和up用来预置数,upclk产生脉冲,up设置增减。输出端口alertt用来输出整点报时信号、其余6组输出端口送进7段数码管显示数字。
顶层实体下划分成7大模块,分别是second_wave时钟模块、h_m_s_time时分秒模块、date日期模块、month_year月,年模块、LED_dispLED显示模块、alert整点报时模块、second_clock秒表模块。本文选取其中重点的部分作介绍。
3.2时钟模块
PROCESS(f1000,cnt)
BEGIN
IF(f1000'EVENT AND f1000='1')THEN IF(cnt=\"111110011\")THEN
ELSE cnt<=cnt+'1';
END IF; END IF;
cnt<=\"000000000\";second_wave<=NOT second_wave;
END PROCESS;
BEGIN
IF(f1000'EVENT AND f1000='1')THEN IF(Scnt=\"0100\")THEN
Scnt<=\"0000\";Ssecond_wave<=NOT Ssecond_wave; ELSE Scnt<=Scnt+1; END IF;
PROCESS(f1000,Scnt)
END IF;
END PROCESS;
cnt为计数器,当cnt=111110011(十进制499)时,在下一个时钟到来后cnt清零并取反,相当于把1000Hz的时钟1000分频成了数字钟需要的1Hz的时钟信号。
Scnt同理,将1000Hz的时钟10分频成了秒表的百分秒位所需的100hz的时钟信号。
3.3日期模块
IF((tempy1='0'AND tempy0=\"00\")OR(tempy1='1'AND tempy0=\"10\"))THEN
IF(date0=\"1001\"AND date1=\"0010\")THEN
ov<='1'; ELSE ov<='0';
~ 2 ~
END IF;
ELSIF(date0=\"1000\"AND date1=\"0010\")THEN
ov<='1';
ELSE ov<='0'; END IF;
本模块重点介绍闰年的算法(tempy1='0'AND tempy0=\"00\")OR(tempy1='1'AND tempy0=\"10\")
tempy1是年高位bcd码的最低位,tempy0是年低位bcd码的低两位,通过列表我们可以发现满足上述代码的年份为闰年,如表1
年高位bcd码 000 001 010 011 100 0 0 0 0 0 年高位十进制数 0 2 4 6 8 年低位bcd码 00 01 10 00 00 00 年低位十进制数 0 4 8 闰年:00、04、08、20、24、28、40、44、48、60、、68、80、84、88 000 001 010 011 100 1 1 1 1 1 1 3 5 7 9 00 01 10 10 2 6 闰年:12、16、32、36、52、56、72、76、92、96 表1
3.4整点报时模块
IF(clk'EVENT AND clk='1')THEN
IF(lock/=\"000\" AND lock/=\"001\")THEN
ov<='0';
~ 3 ~
ELSIF(sec0=\"0000\"AND sec1=\"0000\"AND min0=\"0000\"AND min1=\"0000\")THEN
ov<='1';
ELSIF(sec0=\"1001\"AND sec1=\"0000\"AND min0=\"0000\"AND min1=\"0000\")THEN ov<='0';
END IF; END IF;
当lock不在000和001状态,即数字钟工作在预置状态的时候,输出永远为0,整点报时模块不应在预置时间的状态下工作,当其工作在正常及时的状态下时,每有一个时钟上升沿到来时,检测一次秒和分的状态,此代码设置的为分秒均为00的时候,输出变成1,分位是00秒位为10的时候,输出变回0。即从0分0秒开始报时,至0分10秒结束。也就是说本设计可以通过设置报时起始时间的方式使其在任意时段报时任意时长。
3.5秒表模块
PROCESS(TSclk,Slock,Sclk) BEGIN
IF(Slock=\"10\")THEN
TSclk<=Sclk; ELSE TSclk<='0';
END IF;
END PROCESS;
PROCESS(Sclk,Srst,TSclk) BEGIN
IF (Srst='1')THEN
Smsec0<=\"0000\";Smsec1<=\"0000\";Ssec0<=\"0000\";Ssec1<=\"0000\";Smin0<=\"0000\";Smin1<=\"0ELSIF(TSclk'EVENT AND TSclk='1')THEN
add_year(TSms0,TSms1,Smsec0,Smsec1); addsec_addmin(TSs0,TSs1,Ssec0,Ssec1);
IF(Smsec0=\"1001\" AND Smsec1=\"1001\")THEN END IF;
IF(Smsec0=\"1001\"AND Smsec1=\"1001\" AND Ssec0=\"1001\"AND Ssec1=\"0101\")THEN
addsec_addmin(TSm0,TSm1,Smin0,Smin1);
END IF;
IF(Smsec0=\"1001\"AND Smsec1=\"1001\" AND Ssec0=\"1001\"AND Ssec1=\"0101\"AND
000\";
Smin0=\"1001\"AND Smin1=\"0101\")THEN
Smsec0<=\"0000\";Smsec1<=\"0000\";Ssec0<=\"0000\";Ssec1<=\"0000\";Smin0<=\"0000\";Smin1<=\"0
END IF;
000\";
~ 4 ~
END IF; END PROCESS;
除此段代码外还需要在LED模块添加一段代码
IF (Slock/=\"00\")THEN
a0<=Smsec0;a1<=Smsec1;b0<=Ssec0;b1<=Ssec1;c0<=Smin0;c1<=Smin1; ELSE ……
Slock被设置成2位共4种状态来设置秒表的状态,每按下Sset键时Slock则+1,四种状态分别为00秒表关闭不显示,01显示秒表界面,10秒表开始工作,11秒表暂停。
我们可以通过设置只要Slock不为00,则LED模块显示秒表(所以Slock的级别要高于lock的级别,先判断Slock的状态,再判断lock的状态);只有当Slock为10时,秒表模块才接入100Hz的时钟的方式,来完成这4种状态的设置。 其余部分则与时分秒计时的代码类似,值得一提的是我们发现百分秒的加法过程与work库中‘年’加法完全一致,从而可以直接使用add_year这个过程。
四、仿真与分析
首先要说的是本设计使用的晶振频率为1000Hz,所以时钟要1000分频后才能使用,而在电脑上仿真则不能1000分频,因为这意味着时钟每变化1000次才会有一次变化,这对计算机配置有极高的要求,也是没有必要的,所以在仿真前我们需要稍稍修改代码,注释掉1000分频的部分。
从图2、图3中我们可以看出实现了加减预置功能以及整点报时功能。 图4可以看出实现了秒表显示,开始暂停的功能(图2、3、4见附录)
五、器件编程下载及设计结果
由于实验室没有足够的开发板,我们无法进行这一步骤。
六、课程设计总结
这次课程设计花费了大量的精力,好在是努力没有白费,通过了仿真测试,虽然书上有例程,但也是第一次手打700行的代码,第一次查错花费了好几个小时,但在边读代码边查错的过程中,发现代码并不难,对我来说这个难度刚刚好,可以在书本的例程的帮助下完成设计的情况下,学习例程的设计思路,按自己的
~ 5 ~
想法对其进行改进,增加功能。之后也使我对VHDL语言尤其是元件例化语句有了更深的理解,而这种模块化的设计思路,对其他语言也是大有帮助的。还有一个收获就是熟悉了QuartusII软件,从建立工程,到波形仿真,熟悉了一个VHDL程序最基本的调试过程,尽管Quartus II还有许多功能,但这是一个良好的基础。
通过这次课设,我们也了解了一些以后的工作状态,老板只负责下达任务和验收,中间的一切难题都要靠自己和同学们解决。也进一步明白了理论必须应用于实践的重要性,这些对今后的工作都大有好处;同时,在这过程中遇到的难题也恰恰说明了我们的知识体系还有漏洞,这些都是今后学习需要克服的。在今后的学习中,我也会更多的注意,让自己多上手操作,把理论与实际结合。
七、参考文献
[1]樊永宁,张晓丽. 基于VHDL的多功能数字钟的设计[J]. 工矿自动化,2006,03:92-94.
[2]陈茂源. 基于VHDL语言的数字钟设计[J]. 长江大学学报(自然科学版)理工卷,2008,01:255-257.
[3]田延娟. 基于VHDL的数字电子钟的设计[J]. 科技信息(学术研究),2008,24:436+439.
[4]江翠云. 基于CPLD和VHDL的数字钟的设计[J]. 硅谷,2010,02:17. [5]李彦强,赵淑明. 用VHDL语言实现数字钟设计[J]. 山西电子技术,2014,05:38-39+77.
[6]张文英,邹晴,柴燕. 基于VHDL语言的数字电路设计[J]. 中国仪器仪表,2006,03:95-96.
~ 6 ~
~ 7 ~
八、附录
图2加法预置仿真
图3减法预置仿真
~ 8 ~
图4秒表功能仿真
~ 9 ~
~ 10 ~