基于VHDL的数字电子钟系统设计.docx
《基于VHDL的数字电子钟系统设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字电子钟系统设计.docx(35页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字电子钟系统设计
集成电路软件设计
基于VHDL的数字电子钟系统设计
实验地点实验时间2012.12.19
学院信息工程学院班级
姓名学号
成绩指导老师
2012年12月19日
数字电子钟的设计
一、设计项目
基于VHDL的数字电子钟系统设计
二、设计要求
1、采用自顶向下的设计思想;
2、使用本学期学习的设计语言VHDL和集成电路设计软件实现;
三、设计任务(设计指标)
1、设计数字电子钟的基本功能:
年、月、日、时以24小时制显示,月日为阳历显示,起始时间为:
2012年11月26日14:
00;
2、支持闹铃功能;
3、随时校时功能;
4、闰年提醒;
5、中国传统节假日提醒。
四、设计思想
电子时钟是电子设计中用来显示时间和年月日的一种装置。
是采用自顶向下的设计方法,将数字电子时钟分成五个子模块和一个顶层模块,然后将各个子模块再细化成为更小的功能块,直到最后能用vhdl语言进行描述为止。
当各个模块都描述完成并仿真确认无误后,再采用元件例化,将各个元件一层一层的例化连接起来,直到最后完成系统设计。
五、设计原理
数字钟是一个将“时”,“年”,“月”,“日”显示于人的视觉器官的计时装置。
它的计时周期分别为24小时,365天(非闰年),12个月,31天显示满刻度为2030年12月31日23时,另外应有闹钟报时、闰年提醒,中国传统节假日提醒等附加功能。
因此,该数字钟电路主要由“时”,“日”,“年”,“月”,计数器、闹钟报时电路和转换器组成,其中年月日是以万年的整体形式体现。
时信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“时计数器”,“时计数器”采用24进制计数器,每累计24小时发出一个“分脉冲”信号,该信号将作为“万年历计数器”的时钟脉冲。
万年历的年月日的输出端一方面输出显示,另一方面输入到闹钟中当作闹钟中的比较时间当输入的信息与设定好的一致时,响铃信号触发。
并在万年历中制作出当有闰年或是中国传统节假日的时候发出高平的信号进行提醒。
六、设计方案
设计中使用的时元件例化和进程结合的方案。
每个元件主要采用进程语句实现,在每个进程主要使用了if_else、if_eslif_elsif_----_else、case以及赋值语句,实现了模块化设计,使得整个程序一目了然。
整个电子钟的顶层设计实体为dzz(电子时钟)模块,其下又分为:
fenpin(分频)、shi(时脉冲)、万年历(年月日)、zhuanhuan(过渡转换)和naozhong(闹钟)五个模块。
。
需要注意的是,在年月日模块中的日期模块对于2月份要按照平年闰年的情况分别处理。
在年月日的模块中对于闰年和中国传统节假日的提醒也是分别处理的。
7、各模块实现
(一)分频模块
分频器电路将20MHZ的高频方波信号经20M次分频后得到1Hz的方波信号供秒计数器进行计数。
分频器实际上也就是计数器。
而本实验的计时模块、闹钟模块需要1hz、100hz的时钟信号,故需要加以分频实现所需信号。
分频电路的模块化示意图如下:
(分频器的顶层连接图)
(分频器顶层文件的元件图)
分频器的子模块10分频的网表文件
(网表文件)
(10分频元件图)
分频模块的仿真波形图
(2)计时模块
由时计数器组成了最基本的数字钟计时电路,二十四进制计数器和满位之后的进位信号组合构成。
其模块化电路示意图如下:
其中preset为使能端高电平有效,co为溢出信号,当时计数到24点的时候会在co处触发一个上升沿时钟供后面的万年历使用,保证使其工作。
计时模块的仿真波形图:
H_in为校时输入端
(3)万年历模块
万年历的模块由年、月、日的整型计数形式组合而成,其中年是由2012计数到2030,月是一年12个月的计数,日的计数分为闰年和平年大月和小月的计数部分,当为闰年时2月份的天数为29,当为大月时日的计数为31,当为小月时日的计数为30,。
由于需要显示年、月、日、星期、闰年,故本模块需要有判断是否闰年电路,闰年以及非闰年对应的月天数的译码电路,12进制BCD计数器(用来月循环计数),100进制BCD计数(用来年循环计数),故先画出万年历的模块图如下,然后逐模块设计实现。
其模块的电路示意图如下:
(网表文件)
Preset为使能端,clk接在小时模块的co端口,data、month、year分别为日、月、年的输出,co为中国传统节假日的提醒信号端,连接在外面的chuantong端口,tixing就是为闰年的提醒信号端口,起始的信号都为0当满足条件是则变为1可接在扬声器上。
万年历模块的仿真波形图:
D_in、m_in、y_in分别为日月年的校时输入端口,jiaoshi为校时控制端口
其子模块日的仿真波形图为:
其子模块月的仿真波形图为:
其子模块年的仿真波形图为:
(4)闹钟模块
闹钟模块是由实时的小时模块和万年历模块时钟输入和手动设定的时、日、月、年模块组合成的满足当实时的时间与手动设定的时间相等时,闹钟就会输出一个使能信号使得扬声器发出声音。
其模块化的电路示意图如下:
(闹钟网表文件)
Preset为使能端口,高电平有效,hour、data、month、year为实时输入的时钟信号,shi、ri、yue、nian为外界输入的对于闹钟响铃时间的设定端口,music为响铃的使能端口。
(5)过渡模块
过渡模块是为了方便当万年历输出端口要为两个电路框图所使用的时候方便连接顶层文件中的中间信号,从而做到万年历中的时钟信号既可以连接到闹钟模块中,也可以连接到外部模块中显示出来。
其模块化电路的示意图如下:
其中preset为使能信号,hour、data、month、year为时钟输入的信号,连接中间信号。
Shi、ri、yue、nian为输出的时钟信号用于外部显示的作用。
也就是说当输入端输入什么信号的时候,输出端就会输出相同的信号。
(6)顶层模块(dzz模块)
顶层模块是由前面的五个模块共同例化形成的,其模块化的电路示意图如下:
A为时钟信号clk,vcc为接高电平,接在所有的preset端口,当电源连接时,数字之中开始工作,当断电的时候电子时钟不工作,vcc_m接在闹钟的控制端口中,及闹钟的开关,当开关未开时即vcc_m=’0’时闹钟不工作,当为’1’时闹钟正常工作,当闹钟响时调到低电平闹钟也停止工作。
Naozhong_out为闹钟工作输出口,runnian为闰年提醒端口,chuantong为中国传统节假日的提醒端口,hour_out、data_out、month_out、year_out为时钟的显示在外部的端口。
电子钟的仿真波形文件如下:
八、设计结果
由上面的仿真波形图可知,本次实验基本上完成了实验设计任务的要求数字电子钟的基本功能:
年、月、日、时以24小时制显示,月日为阳历显示,起始时间为:
2012年11月26日14:
00;支持闹铃功能;闰年提醒;中国传统节假日提醒。
本次实验的数字电子钟的初值为2012年11月26日14时,闹钟的设定时间是2013年1月1日1时,犹如上图的波形所表现出来的一样。
九、论文结论
在本次的设计实验过程中出现很多的问题如编程时,经常导致语法错误,如:
“;”没有写上,变量类型没有预先标明,前后变量名字由于缺少一个或多一个字母而导致出错。
所以在写程序的时候应该对照错误,认真检查程序,看哪个地方的标点,变量没有写上或标明。
再者在进行编译或波形仿真时,经常得到的不是预想中的结果。
而且往往得不出错误在哪里,编译的过程并没有错误但是结果却是错的,于是将就将需要编译或进行仿真的实体文件置顶,经检错无误后,进行波形仿真,在仿真之前合理设置仿真结束时间和信号周期,就可以了。
在控制时间的显示的时候,由于变量太多多发现不能完全的控制住变量,导致仿真波形的是时候出现了高阻的状态,所以在顶层文件下应该减少变量,仔细推敲,合理命名。
虽然只是一个小设计,我却也从中学到了不少设计流程和一些相关问题。
设计是一个十分严谨的过程,容不得随意和马虎。
要想快速而高效地完成一项设计,必须先有一个清晰明了的设计思路,设想好一个整体框架,然后在此基础上,逐渐将各个部分功能进行完善。
在设计的过程中,也曾遇到不少困难,但正所谓坚持就是胜利,要想取得成功,必须要有努力付出,这样所取得的结果才更有意义。
附件(代码清单)
10分频模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpin10is
port(clk:
instd_logic;----输入时钟信号
clk_out:
bufferstd_logic);----输出时钟信号
endfenpin10;
architecturertloffenpin10is
signalcnt:
std_logic_vector(3downto0);----定义计数器模值
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(cnt="0100")then
clk_out<=notclk_out;
cnt<="0000";
else
cnt<=cnt+'1';
endif;
endif;
endprocess;
endrtl;
分频器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;----?
?
1Khz?
?
?
?
clk_1hz,clk_100hz:
bufferstd_logic);----?
?
?
1hz?
100hz?
?
endfenpin;
architecturertloffenpinis
signalclk_10hz:
std_logic;
componentfenpin10is--?
?
10?
?
?
?
?
?
?
?
?
?
?
?
port(clk_in:
instd_logic;
clk_out:
bufferstd_logic);
endcomponent;
begin
u0:
fenpin10
portmap(clk_in=>clk,----?
?
?
?
clk_out=>clk_100hz);----?
?
?
?
u1:
fenpin10
portmap(clk_in=>clk_100hz,----?
?
?
?
clk_out=>clk_10hz);----?
?
?
?
u2:
fenpin10
portmap(clk_in=>clk_10hz,----?
?
?
?
clk_out=>clk_1hz);----?
?
?
?
endrtl;
分频器模块testbench文件
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYtestbenchIS
ENDtestbench;
ARCHITECTUREaOFtestbenchIS
signalclk_1hz:
std_logic;
signalclk_100hz:
std_logic;
SIGNALclk:
std_logic:
='1';
COMPONENTfenpin
port(clk:
instd_logic;
clk_1hz,clk_100hz:
bufferstd_logic);
ENDCOMPONENT;
BEGIN
process
begin
waitfor50ns;
clk<=notclk;
endprocess;
test:
fenpin
PORTMAP(
clk=>clk,
clk_1hz=>clk_1hz,
clk_100hz=>clk_100hz
);
ENDa;
时模块
libraryieee;
useieee.std_logic_1164.all;
entityshiis
port(clk:
instd_logic;
preset:
instd_logic;
jiaoshi:
instd_logic;
h_in:
inintegerrange0to23;
hour:
outintegerrange0to23;
co:
outstd_logic);
endshi;
architectureaofshiis
signals:
integerrange0to23:
=14;
begin
process(clk,preset)
begin
ifpreset='0'thens<=14;
elsif(clk'eventandclk='1')then
ifs<23thens<=s+1;
elses<=0;
endif;
ifs=23thenco<='1';
elseco<='0';
ifjiaoshi='1'thens<=h_in;
elsif(clk'eventandclk='1')then
ifs<23thens<=s+1;
elses<=0;
endif;
ifs=23thenco<='1';
elseco<='0';
endif;
endif;
endif;
endif;
endprocess;
hour<=s;
enda;
时模块Testbench文件
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYtestbenchIS
ENDtestbench;
ARCHITECTUREaOFtestbenchIS
SIGNALhour:
integer:
=14;
signaljiaoshi:
std_logic:
='0';
signalh_in:
integer:
=14;
signalco:
std_logic:
='0';
SIGNALpreset:
std_logic:
='0';
SIGNALclk:
std_logic:
='1';
COMPONENTshi
port(clk:
instd_logic;
preset:
instd_logic;
jiaoshi:
instd_logic;
h_in:
inintegerrange0to23;
hour:
outintegerrange0to23;
co:
outstd_logic);
ENDCOMPONENT;
BEGIN
process
begin
waitfor50ns;
clk<=notclk;
endprocess;
process
begin
waitfor2000ns;
jiaoshi<=notjiaoshi;
endprocess;
preset<='1'after20ns;
test:
shi
PORTMAP(
jiaoshi=>jiaoshi,
h_in=>h_in,
clk=>clk,
preset=>preset,
co=>co,
hour=>hour);
ENDa;
万年历模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitywannianliis
port(preset:
instd_logic;
clk:
instd_logic;
jiaoshi:
instd_logic;
d_in:
inintegerrange1to31;
m_in:
inintegerrange1to12;
y_in:
inintegerrange2012to2030;
data:
outintegerrange1to31;
month:
outintegerrange1to12;
year:
outintegerrange2012to2030;
tixing:
outstd_logic;
co:
outstd_logic);
endwannianli;
architectureaofwannianliis
signalyue:
integerrange1to12:
=11;
signalnian:
integerrange2012to2030:
=2012;
signalri:
integerrange1to31:
=26;
signalqm:
integerrange28to31;
begin
process(yue,nian)
begin
caseyueis
when1=>qm<=31;
when2=>
if(((nianmod4)=0and(nianmod100)/=0)or(nianmod400)=0)thenqm<=29;
elseqm<=28;
endif;
when3=>qm<=31;
when4=>qm<=30;
when5=>qm<=31;
when6=>qm<=30;
when7=>qm<=31;
when8=>qm<=31;
when9=>qm<=30;
when10=>qm<=31;
when11=>qm<=30;
when12=>qm<=31;
whenothers=>null;
endcase;
endprocess;
process(clk,preset)
begin
ifpreset='0'then
yue<=11;
nian<=2012;
ri<=26;
else
if(((nianmod4)=0and(nianmod100)/=0)or(nianmod400)=0)thentixing<='1';
elsetixing<='0';
endif;
if((yue=5andri=1)or(yue=10andri=1)
or(yue=1andri=1)or(yue=8andri=15)or(yue=1andri=15))thenco<='1';
elseco<='0';
endif;
ifclk'eventandclk='1'then
if(ri=qm)thenri<=1;
if(yue=12)thenyue<=1;nian<=nian+1;
elseyue<=yue+1;
endif;
elsif(riifjiaoshi='1'then
ri<=d_in;yue<=m_in;nian<=y_in;
elsifclk'eventandclk='1'then
if(ri=qm)thenri<=1;
if(yue=12)thenyue<=1;nian<=nian+1;
elseyue<=yue+1;
endif;
elsif(riendif;
endif;
endif;
endif;
endif;
endprocess;
month<=yue;
year<=nian;
data<=ri;
enda;
万年历testbench文件
LIBRARYieee;
USEieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
ENTITYtestbenchIS
ENDtestbench;
ARCHITECTUREaOFtestbenchIS
SIGNALpreset:
std_logic:
='0';
SIGNALclk:
std_logic:
='1';
signalco:
std_logic;
SIGNALtixing:
std_logic;
signaljiaoshi:
std_logic:
='1';
SIGNALd_in:
integerrange1to31:
=2;
SIGNALm_in:
integerrange1to12:
=2;
SIGNALy_in:
integerrange2012to2030:
=2013;
signalyue:
integerrange1to12:
=11;
signalnian:
integerrange2012to2030:
=2012;
signalri:
integerrange1to31:
=26;
COMPONENTwannianli
port(preset:
instd_logic;
clk:
instd_logic;
jiaoshi:
instd_logic:
='1';
d_in:
inintegerrange1to31;
m_in:
inintegerrange1to12;
y_in:
inintegerrange2012to2030;
data:
outintegerrange1to31;
month:
outintegerrange1to12;
year:
outintegerrange2012to2030;
tixing:
outstd_logic;
co:
outstd_logic);
ENDCOMPONENT;
BEGIN
process
begin
waitfor50ns;
clk<=notclk;
endprocess;
process
begin
jiaoshi<=notjiaoshi;
waitfor3