EDA课程设计_简易万年历.docx

上传人:聆听****声音 文档编号:706196 上传时间:2023-04-29 格式:DOCX 页数:24 大小:1.06MB
下载 相关 举报
EDA课程设计_简易万年历.docx_第1页
第1页 / 共24页
EDA课程设计_简易万年历.docx_第2页
第2页 / 共24页
EDA课程设计_简易万年历.docx_第3页
第3页 / 共24页
EDA课程设计_简易万年历.docx_第4页
第4页 / 共24页
EDA课程设计_简易万年历.docx_第5页
第5页 / 共24页
EDA课程设计_简易万年历.docx_第6页
第6页 / 共24页
EDA课程设计_简易万年历.docx_第7页
第7页 / 共24页
EDA课程设计_简易万年历.docx_第8页
第8页 / 共24页
EDA课程设计_简易万年历.docx_第9页
第9页 / 共24页
EDA课程设计_简易万年历.docx_第10页
第10页 / 共24页
EDA课程设计_简易万年历.docx_第11页
第11页 / 共24页
EDA课程设计_简易万年历.docx_第12页
第12页 / 共24页
EDA课程设计_简易万年历.docx_第13页
第13页 / 共24页
EDA课程设计_简易万年历.docx_第14页
第14页 / 共24页
EDA课程设计_简易万年历.docx_第15页
第15页 / 共24页
EDA课程设计_简易万年历.docx_第16页
第16页 / 共24页
EDA课程设计_简易万年历.docx_第17页
第17页 / 共24页
EDA课程设计_简易万年历.docx_第18页
第18页 / 共24页
EDA课程设计_简易万年历.docx_第19页
第19页 / 共24页
EDA课程设计_简易万年历.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

EDA课程设计_简易万年历.docx

《EDA课程设计_简易万年历.docx》由会员分享,可在线阅读,更多相关《EDA课程设计_简易万年历.docx(24页珍藏版)》请在冰点文库上搜索。

EDA课程设计_简易万年历.docx

.

目录

一、设计任务和要求 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:

闰年信号输出,run=1时表示闰年,run=0时表示不是闰年,从N2N1=00

开始,每4年输出一个闰年信号run=1。

3.程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYNIANIS

PORT(CLK:

INSTD_LOGIC;

n1,n2:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);run:

OUTSTD_LOGIC);

END;

ARCHITECTUREONEOFNIANIS

SIGNALQ1,Q2,Q3:

STD_LOGIC_VECTOR(3DOWNTO0);BEGIN

PROCESS(CLK,q1,q2)BEGIN

IF(CLK'EVENTANDCLK='1')THEN ——检测时钟上升沿

Q1<=Q1+1;q3<=q3+1;

IF(Q1=9)THENQ1<="0000";

Q2<=Q2+1; ——Q1=9时,Q2开始计数且Q1清零

ENDIF;

ifq3=3thenq3<="0000";run<='1';elserun<='0';

endif;

ifq2=9andq1=9thenq1<="0000";q2<="0000";endif;

endif;

ENDPROCESS;n1<=Q1;n2<=Q2;ENDONE;

4.4星期模块

1.模块图

图9星期模块图

2.仿真图

clk:

输入脉冲;

图10星期模块仿真图

q1:

从1到7变化;

3.程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;entityxingqiis

port(clk:

instd_logic;

q1:

outstd_logic_vector(3downto0));endxingqi;

architectureoneofxingqiis

signalcq1:

std_logic_vector(3downto0);begin

process(clk)begin

ifclk'eventandclk='1'then ——检测时钟上升沿

cq1<=cq1+1; ——Q1开始计数

ifcq1=7thencq1<="0001";endif;

endif;

endprocess;q1<=cq1;end;

4.5扫描模块

1.模块图

图11扫描模块

该模块的功能是对输入信号依次进行扫描显示,产生对数码管的选择信

号。

reset为复位信号低电平有效。

时钟信号clk1为1ns脉冲信号,依次扫描星期年月日输出,但速度十分快,可以看作是同时输出。

daout输出依次是星期年月日输出,每位输出都为BCD码,sel为BCD码。

2.仿真图

图12扫描模块仿真图

3.程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;

ENTITYseltimeISPORT(

clk1,reset:

INSTD_LOGIC;

NIAN1,NIAN2,yue1,yue2,TIAN1,TIAN2:

INSTD_LOGIC_VECTOR(3downto0);

xingqi:

INSTD_LOGIC_VECTOR(3downto0);daout:

OUTSTD_LOGIC_VECTOR(3downto0);sel:

OUTSTD_LOGIC_VECTOR(2downto0));

ENDseltime;

ARCHITECTUREfunOFseltimeIS

--SIGNALcount:

STD_LOGIC_VECTOR(2downto0);SIGNALcount:

STD_LOGIC_VECTOR(2downto0);BEGIN

sel<=count;process(clk1,reset)

begin

if(reset='0')then ——复位信号有效,输出为零

count<="000";

elsif(clk1'eventandclk1='1')then ——检测时钟上升沿

if(count>="110")thencount<="000";

else

count<=count+1;endif;

endif;

casecountis

when"000"=>daout<=TIAN1(3downto0); ——分别存储年月日星期

when"001"=>daout<=TIAN2(3downto0);when"010"=>daout<=yue1(3downto0);when"011"=>daout<=yue2(3downto0);when"100"=>daout<=NIAN1(3downto0);when"101"=>daout<=NIAN2(3downto0);whenothers=>daout<=xingqi(3downto0);

--daout(1downto0)<=xingqi(3downto0);

endcase;endprocess;

endfun;

4.6数码管模块

1.模块图

图13数码管模块

该模块的功能是将输入BCD码数转换为七段数码管需要的数据。

将num中的BCD码编译到共阴数码管,显示为具有年月日的简易万年历。

表2数码管真值表

num

led

0000

1111110

0001

0110000

0010

1101101

0011

1111001

0100

0110011

0101

1011011

0110

1011111

0111

1110000

1000

1111111

1001

1111011

1010

1110111

1011

0011111

1100

1001110

1101

0111101

1110

1001111

1111

1000111

2.仿真图

图14数码管模块仿真图

3.程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdeledIS

PORT(num:

IN std_logic_vector(3downto0);led:

OUT std_logic_vector(6downto0));

ENDdeled;

ARCHITECTUREfunOFdeledISBEGIN

led<="1111110"whennum="0000"else"0110000"whennum="0001"else"1101101"whennum="0010"else"1111001"whennum="0011"else"0110011"whennum="0100"else"1011011"whennum="0101"else"1011111"whennum="0110"else"1110000"whennum="0111"else"1111111"whennum="1000"else"1111011"whennum="1001"else

"1000111"whennum="1111";

ENDfun;

4.7三八译码器

1.模块图

图15三八译码器模块图

该模块的功能是将输入BCD码数转换为七段数码管需要的数据,将seltime

中的BCD码编译到共阴数码管,显示为具有年月日功能的简易万年历。

2.仿真图

图16 三八译码器仿真图

表3三八译码器真值表

sel

q

0

11111110

1

11111101

2

11111011

3

11110111

4

11101111

5

11011111

6

10111111

others

11111111

3.程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdecode3_8IS

PORT(SEL:

INSTD_LOGIC_VECTOR(2downto0);Q:

OUTSTD_LOGIC_VECTOR(7downto0)

);

ENDdecode3_8;

ARCHITECTUREaOFdecode3_8ISBEGIN

Q<="11111110"whensel=0else"11111101"whensel=1else

"11111011"whensel=2else"11110111"whensel=3else"11101111"whensel=4else"11011111"whensel=5else"10111111"whensel=6else"11111111";

ENDa;

4.8分频器模块

1.模块图

图17分频器模块图

该模块实现的功能是分频,clk_in输入一个100MHZ的脉冲信号,经过分频器后得到一个1HZ的秒脉冲的脉冲信号。

其中是为扫描模块提供时钟信号。

2.程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdiv_clkISPORT(clk_in:

INSTD_LOGIC;

div_out:

OUTSTD_LOGIC);ENDdiv_clk;

ARCHITECTUREaOFdiv_clkISSIGNALfre_N:

integerrange0to10;SIGNALclk_tmp:

std_logic;

BEGIN

div_out<=clk_tmp;process(clk_in)begin

iffalling_edge(clk_in)theniffre_N>=9then

fre_N<=0;clk_tmp<=notclk_tmp;

else

fre_N<=fre_N+1;

endif;

endif;endprocess;

ENDa;

五.总体电路设计图和硬件实现

5.1程序仿真电路

1.总电路图

图18 总仿真电路图

100MHZ脉冲作为天计数信号输入使天计数,通过pan判断大小月及制计数,满进制后进位,进位信号作为月信号时钟使月以十二进制计数,满十二后进位,进位信号作为年时钟使年计数。

同时100MHZ脉冲还作为星期的计数信号,使星期以七进制循环。

扫描电路有时间信号进来后在1000MHZ时钟下进行快速扫描,经过译码器和七段数码管显示时间。

2.仿真图

图19总体仿真

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2