《EDA技术及可编程器件应用实训》课程设计报告-基于CPLD技术的数字万年历设计模板Word文档格式.docx
《《EDA技术及可编程器件应用实训》课程设计报告-基于CPLD技术的数字万年历设计模板Word文档格式.docx》由会员分享,可在线阅读,更多相关《《EDA技术及可编程器件应用实训》课程设计报告-基于CPLD技术的数字万年历设计模板Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
并能熟练使用QuartusII开发小中型数字系统,解决调试过程中所遇到的一些问题。
三、设计方法
常见数字百年历具有计时和显示、报时功能。
电路设计中包括分频模块,用于将外部晶振产生的一定周期的时钟信号计数产生1s时钟信号;
60进制的秒、分计数模块;
24进制的时计数模块;
12进制的月计数模块;
通过语言选择的闰年平年天数选择模块;
5选一的调时控制模块;
2选一模式转换模块;
另有显示模块和整点报时信号端口。
1、同步计时六十进制加法器的程序如下。
其中,cout为输出端口信号,
clk为分频模块产生的秒计时信号(时钟信号),q1和q2为秒计数中十进制数所对应的高位和低位信号。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt60isport(clk:
instd_logic;
cout:
outstd_logic;
q1,q2:
outstd_logic_vector(3downto0));
architecturebehavofcnt60isbegin
variablecq1,cq2:
std_logic_vector(3downto0);
begin
ifclk'
eventandclk='
1'
thencq1:
=cq1+1;
ifcq1>
9thencq1:
="
0000"
;
cq2:
=cq2+1;
endif;
ifcq2=6andcq1=0thencq1:
cq2:
cout<
='
elsecout<
0'
endif;
q1<
=cq1;
q2<
=cq2;
endprocess;
end;
所写程序经过仿真的如上图所示。
同理分和秒一样都是六十进制只不过是把程序中q1,q2分别改为分的十位,个位而已,有程序生成六十进制模块图。
如下
该程序在编写过程中应注意IF语句的结束标志ENDIF所对应的是那一部分.
2、同步计时二十四进制加法器的程序如下。
clk为分频模块产生的时计时信号(时钟信号),q1和q2为时计数中十进制数所对应的高位和低位信号。
entitycnt24is
port(clk:
q1:
outstd_logic_vector(3downto0);
q2:
cout:
outstd_logic);
endcnt24
architecturebehavofcnt24isbegin
process(clk)
variablecq1:
std_logic_vector(3downto0);
variablecq2:
ifcq1=4andcq2=2thencq1:
=(others=>
'
);
);
elsecout<
q1<
q2<
end;
程序中实体结束处endcnt24后缺少分号.
程序中IF语句是多层存在,因此应当两次结束,绿色所标注的部分上边缺少end
if;
改正后的程序仿真得到二十四进制模块图如下:
3、天的模块的程序如下。
clk为分频模块产生的天计时信号(时钟信号),cq2和cq1为天计数中十进制数所对应的高位和低位信号,cout为进位位,pan为判断位,判断计到多少天才进位。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtianIS
PORT(pan:
INSTD_LOGIC_VECTOR(1DOWNTO0);
clk:
INSTD_LOGIC;
cq1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
cq2:
cout:
OUTSTD_LOGIC);
END;
ARCHITECTUREbehavOFtianIS
signalcq3,cq4:
STD_LOGIC_VECTOR(3DOWNTO0);
PROCESS(clk)
BEGIN
IFclk'
EVENTandclk='
THENcq3<
=cq3+1;
IFcq3=9THEN cq4<
=cq4+1;
cq3<
ENDIF;
CASEpanIS
WHEN "
00"
=>
IF cq3="
0001"
and cq4="
0011"
THEN
cq4<
ELSEcout<
ENDIF;
01"
THENcq3<
ELSEcout<
10"
1000"
0010"
11"
1001"
WHENothers=>
NULL;
ENDCASE;
cq1<
=cq3;
cq2<
=cq4;
ENDPROCESS;
经过仿真从警告处发现错误所在,程序中进程前缺少BEGIN。
修改后仿真可得天的模块图。
4、月的模块的程序。
clk为分频模块产生的月计时信号(时钟信号),cq2和cq1为月计数中十进制数所对应的高位和低位信号,cout为进位位,run为闰年进位位,pan为输入判断位。
ENTITYyueIS
port(clk:
run:
cout:
OUTSTD_LOGIC;
pan:
OUTSTD_LOGIC_VECTOR(1DOWNTO0);
cq1,cq2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbehavOFyueIS
signalcq5:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(clk)BEGIN
THEN
cq3<
IFcq3=9THENcq4<
IFcq3=2andcq4=1THENcq3<
cq5<
=cq4&
cq3;
CASEcq5IS
WHEN"
00000001"
pan<
——一月WHEN"
00000010"
ifrun='
01'
thenpan<
elsepan<
——二月WHEN"
00000011"
——三月WHEN"
00000100"
——四月WHEN"
00000101"
——五月WHEN"
00000110"
——六月WHEN"
00000111"
——七月WHEN"
00001000"
——八月WHEN"
00001001"
——九月WHEN"
00001010"
——十月WHEN"
00001011"
——十一月WHEN"
00001100"
——十