基于VHDL的数字钟的设计.docx
- 文档编号:24212317
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:68
- 大小:1.06MB
基于VHDL的数字钟的设计.docx
《基于VHDL的数字钟的设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字钟的设计.docx(68页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字钟的设计
课程设计报告
设计题目:
用VHDL语言实现数字钟的设计
班级:
电子1101
学号:
20113078
姓名:
李玉珍
指导教师:
李世平、李宁
设计时间:
2014年1月
摘要
随着IT行业的不断发展EDA技术在很多行业得到了广泛的应用,在很多大学也开设了相应的课程,但只有理论知识不足以应对实际项目的开发,不足以胜任更加庞大的系统开发。
本次课程设计旨在提高学生的实际动手能力和解决问题的能力。
本次课程设计主要使用实验室提供的XiLinx公司的ISE14.2作为编写程序和仿真的平台来实现数字钟的设计。
该项目的实际设计中,就整体框架的设计,软件的开发,仿真等过程进行了一一验证。
在数字钟的设计中应用了元件例化的整体思路实现,实现过程可分为分频模块,时分秒计数模块,时分秒置数模块,年月日计数模块,年月日置数模块,整点报时模块,时间显示切换模块等。
用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第8个脉冲到来后预置结束,正常工作,显示的是时分秒。
tn为高电平时,upd0有脉冲到达时,预置位加1.否则减1.
关键词:
数字钟,ISE平台,元件例化
摘要······························································2
1、课程设计目的···················································4
2、课程设计内容及要求············································4
2.1设计任务要求················································4
2.2提高的内容及要求············································4
3、VHDL程序设计···················································5
3.1设计方案····················································5
3.1.1分频模块··············································5
3.1.2时分秒计数模块········································6
3.1.3时分秒置数模块·······································7
3.1.4年月日计数模块········································8
3.1.5年月日置数模块········································9
3.1.6选择器模块···········································10
3.1.7时间显示模块·········································12
3.1.8整点报时模块·········································13
3.1.9元件例化模块·········································14
4、仿真与分析······················································16
4.1分频模块仿真波形···········································16
4.2时分秒计数模块仿真波形·····································17
4.3时分秒置数模块仿真波形·····································17
4.4年月日计数模块仿真波形·····································18
4.5年月日置数模块仿真波形·····································18
4.6整点报时模块的仿真波形·····································19
5、设计结果························································19
6、课程设计总结,包括.收获、体会和建议·····························19
7、参考文献························································21
1、课程设计目的
(1)VHDL程序设计、输入——在ise平台上用VHDL描述系统的功能
(2)逻辑综合——将源程序编译后,为设计系统选择一个电路实现方案,按照这个方案进行逻辑综合和优化,生成1个电路网表文件
(3)功能仿真——检查自己的设计是否达到和完成要求的逻辑功能
(4)设计实现——布局、布线及配置,最后生成可以写到芯片中的目标文件
(5)时序仿真——是适配到选定的芯片后进行的仿真,它模拟芯片的实际动作,仿真时间模型严格将门级延时计算在内,可以分析出竞争与冒险,时序仿真验证过的电路与实际电路基本上已致。
2、课程设计内容及要求
2.1设计任务
设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第8个脉冲到来后预置结束,正常工作,显示的是时分秒。
tn为高电平时,setup有脉冲到达时,预置位加1.否则减1。
2.2提高的内容及要求
(1)可以采用与教材上不同的设计方法完成以上基本内容。
(2)可以在基本内容的基础上增加其它功能。
3、VHDL程序设计
3.1设计方案
VHDL数字钟的设计可采用多种设计方法,各个设计方法各有其优缺点。
一,采用一个结构体,多个进程的设计方法。
其优点是速度快,但是一个结构体,各个进程的逻辑关系比较复杂,而且代码的可读性,可移植性较差。
二,状态机的设计方法,状态机结构简单,当各个状态之间的转换不易处理。
三,元件例化的设计方法,元件例化使各个模块之间分得更加有层次,易于读,缺点有可能使各个模块之间存在逻辑关系的冲突。
本课程设计,主要采用了元件例化的设计方法实现。
3.1.1分频模块
直接将实验箱的频率用于数字钟的计数,可能会导致错误,实验箱直接给出的1hz频率可能不够稳定,故需要将1khz的频率输出进行1000分频。
本模块直接采用单进程实现设计,本模块还包括一个置数脉冲的设置upd0,upd0按下一次lock加1,lock为000时显示时分秒,为001时显示年月日,为010对年进行置数,为011对月进行置数,为100对日进行置数,为101对时进行置数,为110对分进行置数,为111对秒进行置数,lock,也连接着后面四个计数,置数,模块的lock,以进行模块显示的选择。
fclk设置的周期为5ns,在2.5us处实现1000分频,1000分频后的f_clk连接时分秒,年月日计数模块的计数时钟,置数时钟则直接输入,连接两个置数模块。
以下程序是实体部分
entityfenpinis
port(upd0:
instd_logic;
clk:
instd_logic;
f_clk:
outstd_logic;
lock:
outstd_logic_vector(2downto0)
);
endfenpin;
RTL图如下:
3.1.2时分秒计数模块
时分秒可选用多进程或者单进程的方法,多进程速度快,但是结构复杂。
故本设计选用单进程方法。
当秒计数到59时向分进位,分计到59且秒为59时向时进位,当计到23时59分59秒时向天进位,同时对时分秒进行清零。
程序中主要使用了ifelsifendif;的语句。
最后验证表明此设计方法可实现题目要求的功能。
以下是程序的实体部分
entitys_m_houris
port(
clk0:
instd_logic;--clk0工作时钟,clk1预置脉冲
lock:
instd_logic_vector(2downto0);--工作模式选择
s0,s1:
outstd_logic_vector(3downto0);
m0,m1:
outstd_logic_vector(3downto0);
h0,h1:
outstd_logic_vector(3downto0);
co:
outstd_logic;--_vector(2downto0);--hour产生进位
en:
instd_logic;
co1:
outstd_logic----整小时b报时输出
);
ends_m_hour;
RTL图如下:
3.1.3时分秒置数模块
时分秒置数模块不同于计数模块,置数模块我选用了另一个置数时钟,也可以说是置数脉冲。
时分秒置数有使能端口en(高有效),置数使能端口tn,通过tn(tn=0时置数是减1模式,tn=1时是加1模式)判定是加1还是减1。
当输入长度为三位的lock为101时对时进行置数,当lock为110时对分进行置数,当lock为111时对秒进行置数。
时分秒的置数实现方式可有多种方法,可用状态机,多进程和单进程等方法实现,相比于别的设计方法,单进程的设计方法易于实现,没有复杂的对应关系,而且本功能的实现不许过于复杂的逻辑关系。
本设计使用了单进程内部使用嵌套的ifelsifendif语句实现预期的功能。
以下是该功能的输入输出端口:
entitys_m_yuz1is
port(
clk1:
instd_logic;--clk0工作时钟,clk1预置脉冲
lock:
instd_logic_vector(2downto0);
s0,s1:
outstd_logic_vector(3downto0);
m0,m1:
outstd_logic_vector(3downto0);
h0,h1:
outstd_logic_vector(3downto0);
tn:
instd_logic;--tn=1预置数加1,tn=0预置数减1
en:
instd_logic
);
ends_m_yuz1;
RTL图如下:
3.1.4年月日计数模块
年月日的计数模块与时分秒的计数模块稍有不同,年月日需要考虑闰年2月份的情况,闰年到来时2月份为29天,其他情况2月份为28天。
考虑闰年相对应的闰月的情况,就会出现不同的年份对应的2月的天数的不同,其他的可将1,3,5,7,8,10,12归成一类,这几个月每个月的天数是31天,而4,6,9,11这几个月又归为一类,每个月有30天,二月分为特殊的一类,闰年有29天,非闰年为28天。
对瑞年的判断,由于数码管只能显示年的十位和个位,前两位默认为20,故只要后两位能被4整除即是闰年。
这样我们就可以把所有的闰年的情况列出来:
00,04,08,20,24,28,40,44,48,60,64,68,80,84,88,12,14,32,34,52,54,72,74,92,94。
用VHDL语言表述为:
((yea1="0000"ORyea1="0010"ORyea1="0100"ORyea1="0110"ORyea1="01000")AND(yea0="0000"ORyea0="0100"ORyea0="01000"))OR((yea1="0001"ORyea1="0011"ORyea1="0101"ORyea1="0111"ORyea1="1001")AND(yea0="0010"ORyea0="0110"))。
同时模块内部设计了进位脉冲,当计满12个月时向年产生进位,年数加1。
以下是实体部分:
entitydaymony1is
port(
clk0:
instd_logic;
da0,da1:
outstd_logic_vector(3downto0);
mo0,mo1:
outstd_logic_vector(3downto0);
ya0,ya1:
outstd_logic_vector(3downto0);
en:
instd_logic;---en接上一个模块小时的进位
lock:
instd_logic_vector(2downto0)
);
enddaymony1;
RTL图如下:
3.1.5年月日置数模块
年月日置数模块不同于时分秒的置数模块,在年月日的置数模块中我们需要考虑闰年相对应的闰月的情况,具体和上一模块年月日计数模块原理一样。
En使能端,高有效。
tn为置数模式的选择控制端,tn=1时置数处于加1模式,tn=0置数处于减1模式,lock为置数对象的选择。
Lock=010时对年进行置数,lock=011时对月进行置数,lock=100时对天进行置数。
本设计对于本模块使用了单进程,内部使用了ifelsifendif;语句实现预期的功能。
以下是该置数模块的实体部分:
entityyuzhisis
port(
clk1,tn:
instd_logic;
da0,da1:
outstd_logic_vector(3downto0);
mo0,mo1:
outstd_logic_vector(3downto0);
ya0,ya1:
outstd_logic_vector(3downto0);
en:
instd_logic;
lock:
instd_logic_vector(2downto0)
);
endyuzhis;
RTl图如下:
3.1.6选择器模块
为了使时分秒计数模块、时分秒置数模块、年月日计数模块、年月日置数模块能够更好与时间显示切换模块相连接,需要增加两个选择器进行辅助,不然24个端口会引起资源不够的警告。
两个选择器先分别对时分秒计数模块和时分秒置数模块、年月日计数模块和年月日置数模块进行选择,再与时间显示切换模块相连接。
端口如下:
entityxuanze1is
port(
en:
instd_logic;
lock:
instd_logic_vector(2downto0);--工作模式选择
a0:
instd_logic_vector(3downto0);
a1:
instd_logic_vector(3downto0);--s
b0:
instd_logic_vector(3downto0);
b1:
instd_logic_vector(3downto0);--m
c0:
instd_logic_vector(3downto0);
c1:
instd_logic_vector(3downto0);----h
d0:
instd_logic_vector(3downto0);
d1:
instd_logic_vector(3downto0);--s
e0:
instd_logic_vector(3downto0);
e1:
instd_logic_vector(3downto0);---m
f0:
instd_logic_vector(3downto0);
f1:
instd_logic_vector(3downto0);---h
s0,s1:
outstd_logic_vector(3downto0);
m0,m1:
outstd_logic_vector(3downto0);
h0,h1:
outstd_logic_vector(3downto0)
);
endxuanze1;
RTl图如下:
3.1.7时间显示模块
时间显示模块连接于上一模块两个选择器,选择器模块已经通过lock的不同值进行选择了一次,在这一模块再次通过lock的不同值,对要显示的模块进行选择。
当lock="000",lock="101",lock="110",lock="111",显示模块显示选择器1上的内容,当其他情况下,显示模块显示选择器2上的内容。
各部分端口如下:
entitytime_showis
PORT
(
en:
INSTD_LOGIC;
lock:
INSTD_LOGIC_VECTOR(2DOWNTO0);--显示切换义马管具体显示就不写了只解决显示切换模块
S_s0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_s1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_m0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_m1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_h0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_h1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_da0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_da1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_mo0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_mo1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_ya0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
S_ya1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
aH_Year:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
aH_Year1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
aM_Mon:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
aM_Mon1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
aS_Day:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
aS_Day1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
endtime_show;
RTL图如下所示:
3.1.8整点报时模块
整点报时模块,相连与上一模块是时分秒计数模块,每当分计数到59时,输出一个高电平,进行报时,持续时间为60S。
各部分端口如下:
entitybaoshiis
Port(
flk:
instd_logic;
Alarm:
outstd_logic);----输出的报时信号
endbaoshi;
RTL图如下:
.1.9元件例化模块
该模块将分立的所有模块连接起来,运用端口映射的方式,将各个模块通过相应的信号线相连,这也是一个容易出现问题的地方,很容易造成连接失败。
clk为实验箱频率输入,tn直接与各个两个置数端口的tn相连,set为输入脉冲,直接与分频模块的upd0相连,同时分频模块的lock对其进行计数。
以下是实体部分:
ENTITYdigital_clockIS
PORT
(setup:
INSTD_LOGIC;--预置脉冲手动
set:
INSTD_LOGIC;----upd0选择工作模式
clk:
INSTD_LOGIC;----输入1Khz脉冲1000分频产生1hz脉冲
tn:
INSTD_LOGIC;----相当于题目要求中的up为高时预置+1为低时-1
en:
INSTD_LOGIC;-----使能
H_Year:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
H_Year1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
M_Mon:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
M_Mon1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
S_Day:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
S_Day1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
speak:
OUTSTD_LOGIC---整点报时输出持续1分钟
);
ENDdigital_clock;
RTL图如下:
内部具体结构如下:
4、仿真与分析
4.1分频模块仿真波形
f_clk是时钟clk经1000分频后输出,lock是对upd0的计数。
4.2时分秒计数模块仿真波形
co1是整小时时输出的高电平,co为时分秒模块的进位输出。
分钟对小时进位。
4.3时分秒置数模块仿真波形
对时置数。
以加置数为例,下同。
对分置数。
对秒置数。
4.4年月日计数模块仿真波形
年月日计数模块。
闰年,2月29天。
非闰年,2月28天。
4.5年月日置数模块仿真波形
Lock=010,对年进行置数,可以置数到99。
Lock=011,对月进行置数,满12时,返回1月份。
Lock=100,对日进行置数。
非闰年,2月份置数28天。
闰年,2月份置数29天。
4.6整点报时模块的仿真波形
每给该模块一个高电平,输出一个高电平,持续60s。
5、器件编程下载及设计结果
由于实验室的设备有限,因此器件下载的步骤未进行。
6、课程设计总结,包括.收获、体会和建议
这次数字钟的课程设计在实验室进行了整整两天,前期也进行了大量的准备,查阅一些相关书籍和一些以前的成功设计的数字钟文档,并且也事先动手编写了几个模块的程序,感觉用VHDL语言编写程序设计一些系统还是十分有意思,真正自己动手实现一些功能要比单纯的学习一些语法的理论知识来的更加的有意义,在实验中我们可以学习到课本上学不到的知识,同时也更加的有趣味性,不是那么的乏味,加深了对EDA这门课程的理解与应用。
当然在数字钟的编写与仿真中也遇到了许多的问题,但也正是这些问题给我带来了很大的收获。
先说说我采用的是模块化的设计方法,这种方法为我带来了很大的便利,使我的设计思路十分的清晰,当程序在仿
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 数字 设计