CPLD大作业电子时钟进制两种实现方法.docx
《CPLD大作业电子时钟进制两种实现方法.docx》由会员分享,可在线阅读,更多相关《CPLD大作业电子时钟进制两种实现方法.docx(13页珍藏版)》请在冰豆网上搜索。
CPLD大作业电子时钟进制两种实现方法
CPLD大作业报告
——电子时钟设计
姓名:
班级:
控制专研-15
学号:
实验日期:
2015年12月15日
一、实验内容:
1.使用CPLD设计电子钟电路框图,并对主要功能进行解释;
2.设计小时、分、秒处理功能模块的VHDL程序;
二、实验要求:
1.编写小时、分、秒处理功能模块编程。
2.对仿真图形进行分析,对关键处的时序进行解释。
3.每个人的小时、分、秒数都不同。
根据任务布置,本设计的小时、分、秒数分别为24、43、43。
三、模块设计
1.一个模块实现的数字钟设计方案
(1)时钟VHDL源程序
LIBRARYieee;
USEieee.std_logic_1164.all;
ENTITYclk43IS
PORT(
CLRN,LDN,EN,CLK:
INSTD_LOGIC;
Sa,Ma,Ha:
ININTEGERRANGE0TO9;
Sb,Mb:
ININTEGERRANGE0TO4;
Hb:
ININTEGERRANGE0TO2;
QSa,QMa,QHa:
OUTINTEGERRANGE0TO9;
QSb,QMb:
OUTINTEGERRANGE0TO4;
QHb:
OUTINTEGERRANGE0TO2
);
ENDclk43;
ARCHITECTUREaOFclk43IS
BEGIN
PROCESS(CLK)
VARIABLEtmpsa,tmpma,tmpha:
INTEGERRANGE0TO9;
VARIABLEtmpsb,tmpmb:
INTEGERRANGE0TO4;
VARIABLEtmphb:
INTEGERRANGE0TO2;
BEGIN
IFCLRN='0'THEN
tmpsb:
=0;tmpsa:
=0;
tmpmb:
=0;tmpma:
=0;
tmphb:
=0;tmpha:
=0;
ELSE
IF(CLK'eventANDCLK='1')THEN
IFLDN='0'THEN
tmpsa:
=Sa;tmpsb:
=Sb;tmpma:
=Ma;tmpmb:
=Mb;
tmpha:
=Ha;tmphb:
=Hb;
ELSIFEN='1'THEN
IF(tmpsb=4ANDtmpsa=2ANDtmpmb=4ANDtmpma=2)THEN
IF(tmphb=2ANDtmpha=3)THEN
tmpha:
=0;tmphb:
=0;
ELSIFtmpha=9THEN
tmpha:
=0;tmphb:
=tmphb+1;
ELSEtmpha:
=tmpha+1;
ENDIF;
ENDIF;
IF(tmpsb=4ANDtmpsa=2)THEN
IF(tmpmb=4ANDtmpma=2)THEN
tmpmb:
=0;tmpma:
=0;
ELSIFtmpma=9THEN
tmpma:
=0;tmpmb:
=tmpmb+1;
ELSEtmpma:
=tmpma+1;
ENDIF;
ENDIF;
IF(tmpsb=4ANDtmpsa=2)THEN
tmpsa:
=0;tmpsb:
=0;
ELSIFtmpsa=9THEN
tmpsa:
=0;tmpsb:
=tmpsb+1;
ELSEtmpsa:
=tmpsa+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
QSa<=tmpsa;QSb<=tmpsb;
QMa<=tmpma;QMb<=tmpmb;
Qha<=tmpha;Qhb<=tmphb;
ENDPROCESS;
ENDa;
以上程序实现了,用统一化整体模块完成了对时钟的时、分、秒的相应的进制设计。
其中,在时钟模块的功能端“CLRN”、“LDN”、“EN”同时为1时,在“CLK”有一个时钟信号的上升沿时,输出“QSa”自行加1,每到加至43时,自行向分的个位进1,同时秒的十位和个位置为0,分钟和小时的计数功能与之类似。
当“LDN”为0,“CLRN”为1,“EN”为1时,时钟模块实现加载功能。
(2)原理连接图
图1时钟原理接线图
(3)波形仿真
输出端口自下而上分别是:
QSb(秒的十位)、QSa(秒的个位)、QMb(分的十位)、QMa(分的个位)、QHb(时的十位)、QMa(时的个位)。
时钟电路秒的进制仿真图(9s到10s)
时钟电路秒的进制仿真图(43s到1min)
时钟电路秒的进制仿真图(42min:
42s到1h)
时钟电路秒的进制仿真图(23:
42:
42到00:
00:
00)
2.三个模块实现的数字钟设计方案
(1)时钟VHDL源程序
程序1(24进制(时)计数器)
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYcout24_vIS
PORT(
CLRN,LDN,EN,CLK:
INSTD_LOGIC;
Da:
INSTD_LOGIC_VECTOR(3downto0);
Db:
INSTD_LOGIC_VECTOR(2downto0);
Qa:
OUTSTD_LOGIC_VECTOR(3downto0);
Qb:
OUTSTD_LOGIC_VECTOR(2downto0)
);
ENDcout24_v;
ARCHITECTUREaOFcout24_vIS
BEGIN
PROCESS(Clk)
VARIABLEtmpa:
STD_LOGIC_VECTOR(3downto0);
VARIABLEtmpb:
STD_LOGIC_VECTOR(2downto0);
BEGIN
IFCLRN='0'THENtmpb:
="000";tmpa:
="0000";
ELSE
IF(CLK'eventANDCLK='1')THEN
IFLDN='0'THEN
tmpa:
=Da;tmpb:
=Db;
ELSIFEN='1'THEN
IFtmpa="1001"THEN
tmpa:
="0000";tmpb:
=tmpb+1;
ELSIF(tmpb="010"ANDtmpa="0011")THEN
tmpb:
="000";tmpa:
="0000";
ELSEtmpa:
=tmpa+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
Qa<=tmpa;Qb<=tmpb;
ENDPROCESS;
ENDa;
程序2(43进制(分)计数器)
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYcout43_minIS
PORT(
CLRN,LDN,EN,CLK:
INSTD_LOGIC;
Da:
INSTD_LOGIC_VECTOR(3downto0);
Db:
INSTD_LOGIC_VECTOR(2downto0);
BQa:
OUTSTD_LOGIC_VECTOR(3downto0);
BQb:
OUTSTD_LOGIC_VECTOR(2downto0);
BRCO:
OUTSTD_LOGIC
);
ENDcout43_min;
ARCHITECTUREclck_43OFcout43_minIS
BEGIN
PROCESS(Clk)
VARIABLEtmpa:
STD_LOGIC_VECTOR(3downto0);
VARIABLEtmpb:
STD_LOGIC_VECTOR(2downto0);
BEGIN
IFCLRN='0'THENtmpb:
="000";tmpa:
="0000";
ELSEIF(Clk'eventANDClk='1')THEN
IFLDN='0'THENtmpa:
=Da;tmpb:
=Db;
ELSIFEN='1'THEN
IFtmpa="1001"THEN
tmpa:
="0000";tmpb:
=tmpb+1;
ELSIF(tmpb="100"ANDtmpa="0010")THEN
tmpb:
="000";tmpa:
="0000";
ELSEtmpa:
=tmpa+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
BQa<=tmpa;BQb<=tmpb;
IF(tmpb="000"ANDtmpa="0000"ANDEN='1'ANDLDN='1'ANDCLRN='1')THEN
BRCO<='1';
ELSE
BRCO<='0';
ENDIF;
ENDPROCESS;
ENDclck_43;
程序3(43进制(秒)计数器)
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYcout43_secIS
PORT(
CLRN,LDN,EN,CLK:
INSTD_LOGIC;
Da:
INSTD_LOGIC_VECTOR(3downto0);
Db:
INSTD_LOGIC_VECTOR(2downto0);
AQa:
OUTSTD_LOGIC_VECTOR(3downto0);
AQb:
OUTSTD_LOGIC_VECTOR(2downto0);
ARCO:
OUTSTD_LOGIC
);
ENDcout43_sec;
ARCHITECTUREclck_43OFcout43_secIS
BEGIN
PROCESS(Clk)
VARIABLEtmpa:
STD_LOGIC_VECTOR(3downto0);
VARIABLEtmpb:
STD_LOGIC_VECTOR(2downto0);
BEGIN
IFCLRN='0'THENtmpb:
="000";tmpa:
="0000";
ELSEIF(Clk'eventANDClk='1')THEN
IFLDN='0'THENtmpa:
=Da;tmpb:
=Db;
ELSIFEN='1'THEN
IFtmpa="1001"THEN
tmpa:
="0000";tmpb:
=tmpb+1;
ELSIF(tmpb="100"ANDtmpa="0010")THEN
tmpb:
="000";tmpa:
="0000";
ELSEtmpa:
=tmpa+1;
ENDIF;
ENDIF;
ENDIF;
ENDIF;
AQa<=tmpa;AQb<=tmpb;
IF(tmpb="000"ANDtmpa="0000"ANDEN='1'ANDLDN='1'ANDCLRN='1')THEN
ARCO<='1';
ELSE
ARCO<='0';
ENDIF;
ENDPROCESS;
ENDclck_43;
以上程序实现了,用模块化完成了对时钟的时、分、秒的相应的进制设计。
其中,在时钟模块的功能端“CLRN”、“LDN”、“EN”同时为1时,在“CLK”有一个时钟信号的上升沿时,输出“QSa”自行加1,每到加至43时,自行向分的个位进1,同时秒的十位和个位置为0,分钟和小时的计数功能与之类似。
当“LDN”为0,“CLRN”为1,“EN”为1时,时钟模块实现加载功能。
(2)原理连接图
(3)波形仿真
时钟电路时的进制仿真图(43s到1min)
时钟电路时的进制仿真图(42min:
42s到1h)
时钟电路时的进制仿真图(23h:
42min:
42s到00:
00:
00)
从波形图可见当秒针计数器满43秒,有进位;当分针计数器满43分钟,有进位;当小时计数器满24小时,计数器清零,可见,达到了设计要求。