EDA课程设计_简易万年历.docx
《EDA课程设计_简易万年历.docx》由会员分享,可在线阅读,更多相关《EDA课程设计_简易万年历.docx(24页珍藏版)》请在冰豆网上搜索。
.
目录
一、设计任务和要求 1
二、总体框图 1
三、选择器件 2
四、功能模块 3
4.1日模块 3
4.2月模块 5
4.3年模块 7
4.4星期模块 8
4.5扫描模块 9
4.6数码管模块 11
4.7三八译码器 12
4.8分频器模块 14
五.总体电路设计图和硬件实现 14
5.1程序仿真电路 14
5.2硬件实现 18
六.设计中存在的问题 21
七、深入研究 21
八、心得体会 21
.
简易万年历的设计
一、设计任务和要求
1.用七个七段数码管显示年的低两位,月,日和星期,并具有闰年判断功能;
2.可以手动调整年,月,日,星期;
3.在QuartusII6.0中编写VHDL程序实现年,月,日星期各模块的功能;
4.编写顶层程序将各模块连接起来实现万年历调时功能。
二、总体框图
图1总体框图
上图为总体设计框图,主要有计数模块、年月日模块、分频模块和扫描译码显示模块组成。
分频模块在外部时钟信号的作用下实现分频后将其分频信号分别输出给计数模块和扫描模块。
在分频信号(日脉冲)作用下计数模块实现计数功能实现年月日计数功能,但其计数功能是在以BCD码形式所记录的。
这就需要扫描电
路去扫描计数模块所输出的时间在500HZ脉冲下经过译码器将其译成共阴数码管所对应的二进制数进行显示,最终显示的为年月日。
外部时间控制信号可控制时间的校验。
三、选择器件
1、PC机一台。
2、CPLD/FPGA适配器板:
标准配置EPF10K10LC84-4接口板,下载接口是数字芯片的下载接口(DIGITALJTAG),主要用于CPLD/FPGA芯片的数据下载。
3、实验箱:
装有七段数码管及蜂鸣器等,七段数码管真值表及字型如下
表1七段数码管真值表
输入
输出
字型
D
C
B
A
F
a
F
b
F
c
F
d
F
e
F
f
F
g
0
0
0
0
1
1
1
1
1
1
0
0
0
0
1
0
1
1
0
0
0
0
0
0
1
0
1
1
0
1
1
0
1
0
0
1
1
1
1
1
1
0
0
1
0
1
0
0
0
1
1
0
0
1
1
0
1
0
1
1
0
1
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
1
1
1
1
1
1
0
0
0
0
1
0
0
0
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
0
1
1
七段数码管字形如下:
图2 数码管字型图
四、功能模块
4.1日模块
1.模块图
2.仿真图
图3日模块图
clk:
输入脉冲;
图4日模块仿真图
pan:
输入月的判断信号,0表示大月为31天,1表示小月30天,2表示平月为28天,3表示闰月为29天;
T1:
日的个位;
T2:
日的十位;
cout:
进位信号,当pan=0的时候T2T1=31时产生进位,cout=1,当pan=1的时候T2T1=30时产生进位信号,cout=1,当pan=2的时候T2T1=28时产生进位,cout=1,当pan=3的时候T2T1=29时产生进位,cout=1。
3.程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTIANIS
PORT(CLK:
INSTD_LOGIC;
pan:
instd_logic_vector(1downto0);
T1,T2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREONEOFTIANIS
SIGNALQ1,Q2:
STD_LOGIC_VECTOR(3DOWNTO0);SIGNALAB:
STD_LOGIC_VECTOR(1DOWNTO0);BEGIN
PROCESS(CLK,pan)BEGIN
IF(CLK'EVENTANDCLK='1')THEN ——检测时钟上升沿
Q1<=Q1+1; ——Q1开始计数
IF(Q1=9)THENQ1<="0000";
Q2<=Q2+1; ——Q1=9时,Q2开
始计数且Q1清零
ENDIF;
--AB<=A&B;
CASEpanISWHEN"00"=>
IF(Q2=3)ANDQ1=1THENQ2<="0000";Q1<="0000";COUT<='1'; ——当pan=00时,
如果Q2=3,Q1=1,Q2清零,Q1从1开始计数并输出进位信号
ELSECOUT<='0';
ENDIF;
WHEN"01"=>
IFQ2=3ANDQ1=0THENQ2<="0000";Q1<="0001";COUT<='1'; ——当pan=01时,
如果Q2=3,Q1=0,Q2清零,Q1从1开始计数并输出进位信号
ELSECOUT<='0';
ENDIF;
WHEN"10"=>
IFQ2=2ANDQ1=8THEN
Q2<="0000";Q1<="0001";COUT<='1'; ——当pan=10时,如果
Q2=2,Q1=9,Q2清零,Q1从1开始计数并输出进位信号
ELSIF Q2=2ANDQ1=9THENQ2<="0000";Q1<="0001";COUT<='1'; ——当pan=11时,
如果Q2=2,Q1=8,Q2清零,Q1从1开始计数并输出进位信号
ELSECOUT<='0';
ENDIF;
WHENOTHERS=>NULL;ENDCASE;
ENDIF;
ENDPROCESS;
T1<=Q1;T2<=Q2;
ENDONE;
4.2月模块
1.模块图
图5月模块图
2.仿真图
clk:
输入脉冲;
图6月模块仿真图
pan:
输出月的判断信号,1、3、5、7、8、10、12为大月输出
pan=00,4、6、9、11为小月输出pan=01,闰年时2月为闰月输出pan=11,否则输出pan=10;
Y1:
月的个位;
Y2:
月的十位;
cout:
进位信号,当Y2Y1等于12时输出cout=1;
run:
输入闰年信号,run=1时表示闰年,run=0时表示不是闰年。
3.程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYyueIS
PORT(CLK,run:
INSTD_LOGIC;COUT:
OUTSTD_LOGIC;
pan:
outstd_logic_vector(1downto0);y1,y2:
outstd_logic_vector(3downto0)
);
END;
ARCHITECTUREONEOFyueIS
SIGNALQ1,Q2:
STD_LOGIC_VECTOR(3DOWNTO0);SIGNALq3:
STD_LOGIC_VECTOR(7DOWNTO0);BEGIN
PROCESS(CLK,run)BEGIN
IF(CLK'EVENTANDCLK='1')THEN ——检测时钟上升沿
Q1<=Q1+1; ——Q1开始计数
IF(Q1=9)THENQ1<="0000";
Q2<=Q2+1; ——Q1=9时,Q2开始计数且Q1清
零
ENDIF;
ifq1=2andq2=1then
q1<="0001";q2<="0000";cout<='1'; ——q1=2,q2=1时,q2清零,q1从1
开始计数并输出进位信号
else
cout<='0';endif;
endif;
q3<=q2&q1;
CASEq3IS
WHEN"00000001"=>pan<="00"; ——当q3为1月时pan=00可知1月为31天
when"00000010"=>ifrun='1'thenpan<="11";elsepan<="10";endif; ——当q3为2月时若输入信号run=1为闰年,则pan=11即2月是29天,否则2月为28天
when"00000011"=>pan<="00"; ——当q3为3月时pan=00可知3月为31天
when"00000100"=>pan<="01"; ——当q3为4月时pan=01可知4月为30天
when"00000101"=>pan<="00"; ——当q3为5月时pan=00可知5月为31天when"00000110"=>pan<="01"; ——当q3为6月时pan=01可知6月为30天when"00000111"=>pan<="00"; ——当q3为7月时pan=00可知7月为31天when"00001000"=>pan<="00"; ——当q3为8月时pan=00可知8月为31天when"00001001"=>pan<="01"; ——当q3为9月时pan=01可知9月为30天when"00010000"=>pan<="00"; ——当q3为10月时pan=00可知10月为31天when"00010001"=>pan<="01"; ——当q3为11月时pan=01可知11月为30天when"00010010"=>pan<="00"; ——当q3为12月时pan=00可知12月为31天whenothers=>pan<="00";
ENDCASE;ENDPROCESS;y1<=Q1;y2<=Q2;ENDONE;
4.3年模块
1.模块图
2.仿真图
图7年模块图
clk:
输入脉冲;N1:
年的个位;N2:
年的十位;
图8年模块仿真图
run:
闰年信