基于CPLD的VHDL语言数字钟含秒表设计Word文档下载推荐.docx
《基于CPLD的VHDL语言数字钟含秒表设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于CPLD的VHDL语言数字钟含秒表设计Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
数码管显示位选信号SEL0/1/2等三个信号。
2.内部功能模块主要有:
Fenp分频模块:
主要是整点报时用的1kH与500Hz的脉冲信号,这里的输入信号是1KHz信号,所以只要一个二分频即可;
时间基准采用1Hz输入信号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用硬件频率信号。
实现带有100进制进位和清零功能,暂定等功能的微秒模块MINSECONDB输入为1Hz脉冲和低电平的清零信号CLR与暂定信号STOP,输出微秒个位、十位及进位信号CO(虽然没有实现进位功能,但还是编写了这个端口,只是在连线时悬空)。
实现60进制带有进位和清零功能的秒计数模块SECOND,输入为1Hz脉冲和低电平有效的清零信号CLR,输出秒个位、时位及进位信号CO。
实现60进制带有进位和置数功能的分计数模块MINUTE,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位及进位信号CO。
实现24进制的时计数模块HOUR,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位。
实现分时复用功能模块SELTIME,输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和显示控制信号SEL。
实现整点报时功能模块ALERT,输入为分/秒信号,输出为高频声控Q1K和Q500。
实现译码显示功能模块DISPLAY,输入为D,输出为Q
三、设计框图
四、模块说明(含程序代码)
1.分频模块
采用原理图输入方式实现2分频与1000分频,但这里并没有用到1000分频,因为后来考虑到精度问题,将千分频用直接输入了。
程序如图:
利用三个7490进行硬
件分频
!
2.微秒模块
采用VHDL语言输入方式,以时钟clk,清零信号clr以及暂停信号STOP为进程敏感变量,程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityMINSECONDbis
port(clk,clrm,stop:
instd_logic;
----时钟/清零信号
secm1,secm0:
outstd_logic_vector(3downto0);
----秒高位/低位
co:
outstd_logic);
-------输出/进位信号
endMINSECONDb;
architectureSECofMINSECONDbis
signalclk1,DOUT2:
std_logic;
begin
process(clk,clrm)
variablecnt1,cnt0:
std_logic_vector(3downto0);
---计数
VARIABLECOUNT2:
INTEGERRANGE0TO10;
IFCLK'
EVENTANDCLK='
1'
THEN
IFCOUNT2>
=0ANDCOUNT2<
10THEN
COUNT2:
=COUNT2+1;
ELSECOUNT2:
=0;
DOUT2<
=NOTDOUT2;
ENDIF;
ifclrm='
then----当clr为1时,高低位均为0
cnt1:
="
0000"
;
cnt0:
elsifclk'
eventandclk='
then
ifstop='
cnt0:
=cnt0;
cnt1:
=cnt1;
endif;
ifcnt1="
1001"
andcnt0="
1000"
then----当记数为98(实际是经过59个记时脉冲)
co<
='
----进位
----低位为9
elsifcnt0<
"
then----小于9时
=cnt0+1;
----计数
--elsifcnt0="
--clk1<
=notclk1;
else
ifcnt1<
then----高位小于9时
=cnt1+1;
0'
endif;
secm1<
secm0<
endprocess;
endSEC;
3.秒模块程序清单
entitySECONDis
port(clk,clr:
sec1,sec0:
endSECOND;
architectureSECofSECONDis
process(clk,clr)
ifclr='
then----当ckr为1时,高低位均为0
0101"
then----当记数为58(实际是经过59个记时脉冲)
then----高位小于5时
sec1<
sec0<
4.分模块程序清单
libraryieee;
entityMINUTEis
port(clk,en:
min1,min0:
endMINUTE;
architectureMINofMINUTEis
process(clk)
ifclk'
ifen='
min1<
min0<
endMIN;
5.时模块程序清单
entityHOURis
----输入时钟/高电平有效的使能信号
h1,h0:
outstd_logic_vector(3downto0));
----时高位/低位
endHOUR;
architecturehour_arcofHOURis
----记数
then---上升沿触发
then---同时“使能”为1
0010"
0011"
----高位/低位同时为0时
then----低位小于9时,低位记数累加
-----高位记数累加
h1<
h0<
endhour_arc;
6.动态扫描模块
useieee.std_logic_arith.all;
entitySELTIMEis
port(
clk:
------扫描时钟
secm1,secm0,sec1,sec0,min1,min0,h1,h0:
instd_logic_vector(3downto0);
-----分别为秒个位/时位;
分个位/
daout:
----------------输出
sel:
outstd_logic_vector(2downto0));
-----位选信号
endSELTIME;
architecturefunofSELTIMEis
signalcount:
std_logic_vector(2downto0);
----计数信号
sel<
=count;
process(clk)
begin
if(clk'
)then
if(count>
111"
count<
000"
else
=count+1;
casecountis
when"
=>
daout<
=secm0;
----秒个位
110"
=secm1;
----秒十位
101"
=sec0;
----分个位
100"
=sec1;
----分十位
011"
=min0;
----时个位
010"
=min1;
----时十位
001"
=h0;
whenothers=>
=h1;
endcase;
endprocess;
endfun;
7.报时模块
entityALERTis
port(m1,m0,s1,s0:
------输入秒、分高/低位信号
------高频声控制
q500,qlk:
----低频声控制
endALERT;
architecturesss_arcofALERTis
ifclk'
ifm1="
andm0="
ands1="
then----当秒高位为5,低位为9时且分高位为5
ifs0="
0001"
ors0="
0111"
then---当分的低位为1或3或5或7时
q500<
----低频输出为1
----否则输出为0
ifm1="
ands0="
then---当秒高位为5,低位为9时且分高位为5,----分低位为9时,也就是“59分59秒”的时候“报时”
qlk<
-----高频输出为1
endsss_arc;
显示模块
entityDISPLAYis
port(d:
----连接seltime扫描部分d信号
q:
outstd_logic_vector(6downto0));
----输出段选信号(电平)
endDISPLAY;
architecturedisp_areofDISPLAYis
process(d)
casedis
=>
q<
0111111"
--显示0
0000110"
--显示1
1011011"
--显示2
1001111"
--显示3
0100"
1100110"
--显示4
1101101"
--显示5
0110"
1111101"
--显示6
0100111"
--显示7
1111111"
--显示8
1101111"
--显示9
endcase;
enddisp_are;
8.顶层文件(原理图输入)
********************************************************************
数字钟设计模块与程序(不含秒表)
*********************************************************************
1.分频模块(原理图输入)
2.秒模块程序
3.分模块程序
4.时模块程序
5.扫描模块程序
sec1,sec0,min1,min0,h1,h0:
=min0;
=min1;