南京邮电大学VHDL设计报告数字时钟设计数码管学号滚动显示Word格式.docx
《南京邮电大学VHDL设计报告数字时钟设计数码管学号滚动显示Word格式.docx》由会员分享,可在线阅读,更多相关《南京邮电大学VHDL设计报告数字时钟设计数码管学号滚动显示Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
3.2小组成员
(程序设计)
(调试及改进)
3.3课题内容
要求学生设计一个时钟,并输出到数码管显示时,分,秒。
3.4方案设计
3.4.1设计思路:
选用6组数码管,分别显示小时数的十位、个位,分钟数的十位、个位,秒数的十位、个位。
选用6个计数器来分别产生这6位数。
因此需设计3个模10计数器来产生小时、分钟、秒的个位上的0~9,2个模6计数器来产生分钟、秒的十位上的0~5,1个模3计数器来产生时钟的十位上的0~2。
采用外部时钟作为秒钟的计数时钟,然后上一级的进位信号作为下一级的时钟信号。
各位上计数上产生的数字通过译码显示在7段数码管上。
3.4.2系统原理图
秒个位译码显示
秒十位译码显示
分个位译码显示
分十位译码显示
时个位译码显示
时十位
译码显示
3.4.3各模块算法框图
(a)符号说明
(1)hou1:
小时数十位
(2)hou2:
小时数个位
(3)min1:
分钟数十位
(4)min2:
分钟数个位
(5)sec1:
秒数十位
(6)sec2:
秒数个位
(b)各模块算法框图
(1)秒钟计数器部分:
(2)分钟计数器部分:
(3)时针计数器部分:
3.5设计实现
时序仿真图及分析:
仿真波形部分图形如上所示。
Led1~led6分别对应hou1~sec2,在该波形中,第一个clk周期内led6管显示4,下一个clk上升沿时,led6变成5,接下来随着clk上升沿,led6依次显示6、7、8、9,在此期间,led5始终显示1,当第6个clk上升沿来临时,led5变成2,同时led6从9变成0。
此部分波形表示时钟从00:
00:
14一直计数到00:
26。
符合课题要求。
实验
(二)
3.1综合题课题名称
数码管学号滚动显示
(调试及改进)
要求学生在六个数码管滚动显示自己的学号(六位),每隔一定时间循环移位一次,学号为奇数则左移,学号为偶数则右移。
间隔时间可由开关选择1秒、2秒、3秒、4秒。
3.4方案设计:
(1)利用动态扫描数码管及人眼的视觉暂留效应,通过引入一个高频时钟来做扫描时钟,同时分频该时钟,产生1Hz分频,即产生出1秒时钟。
(2)设置一个移位时间计数器,来表征移位时间,利用之前产生的1Hz分频的计数操作,来产生不同的移位时间,即1s、2s、3s、4s,同时进行标记位移位操作。
(3)设置一个动态扫描变量,每个扫描时钟上升沿时,该变量进行移位操作,扫描0到flag(flag小于等于5),完成数码管的动态扫描。
(4)设置另一个标记位变量flag1,当flag等于5时,flag1取代flag,来表征当前扫描最前端。
随后定义变量j,j=(flag1-cnt)mod6,完成flag=5之后的循环移位操作。
3.4.2系统原理图:
1hz
J=(flag1-cnt)mod6
3.5各模块算法:
3.5.1符号说明:
(1)Count:
计数变量
(2)Mtcnt:
移位时间计数信号
(3)Flag:
标记位(0~5)
(4)Flag1:
标记位(可以大于5)
(5)Cnt:
扫描位
(6)Dire:
方向选择信号
3.5.2各模块算法框图
(1)1Hz分频
NY
(2)移位操作
1Hz
(3)动态扫描
20Hz
(4)扫描显示
3.6设计特点
利用高频扫描信号带来的视觉暂留来实现动态扫描,通过标记位与移位的同步操作及扫描位的逐次跟踪,实现动态扫描,达到循环效果。
3.7时序仿真图及分析:
设置dire=0,mode=00,即每一秒数字右移,部分仿真波形图如下:
如图,图中第2个clk(20Hz)上升沿来临时,clk1s(1Hz)迎来上升沿,flag和flag1分别加一,由4变成5,表明当前标记到第6个数码管,scan信号从001000到000001到100000再到001000,实现循环选管,从seg7信号可以看出,当前数码管显示010606。
如图,5.47s时clk1s上升沿来临,和上图clk1s上升沿来临时相隔1s,符合仿真时设置mode=00,即1s移位操作。
随着clk1s上升沿来临,flag不变,仍为5,作为循环扫描的标记位,flag1加一,变成6。
此时,scan从000010变成000001变成100000再变成000010,循环选管。
当前数码管显示401063。
和上图相比,学号010634时隔1s向右移位一次,变为601060,符合题目要求。
如需实现左移操作,只要设dire=1即可。
如需实现2s、3s、4s移位操作,只需设mode=01、10、11即可。
四、实验总结
这次设计,由于理论知识的不足,一开始的时候有些手忙脚乱,不知从何入手,在查阅了许多资料后有了一定的了解,实验的设计也慢慢有了雏形。
这次实验设计,使我掌握了用硬件描述语言进行高速集成电路设计的基本技能。
通过设计程序与实际仿真,熟悉了QuartusⅡ的设计与仿真环境。
VHDL语言与其他语言语法类似,但是执行方式存在很大的不同,各进程间并发执行是这门语言的一大特色。
这次实验结束了,在这次实践中除了学会一些技能之外,还深切的体会到人与人之间相互协调合作、交流思想是十分重要的。
在今后的工作中,我一定要戒骄戒躁,态度端正,要永远记住并深刻执行一句话:
态度决定一切。
通过这次毕业设计我明白学习是一个长期积累的过程,在往后的工作、生活中都应该不断的学习,努力提高自己的知道层次和综合素质。
附录一:
源程序(实验一)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityshizhongis
port(clk:
instd_logic;
led1:
outstd_logic_vector(6downto0);
led2:
led3:
led4:
led5:
led6:
outstd_logic_vector(6downto0));
endshizhong;
architecturemainofshizhongis
signalhou1:
std_logic_vector(3downto0);
signalhou2:
signalmin1:
signalmin2:
signalsec1:
signalsec2:
begin
-------------------------------------------------
h110:
process(clk,hou2,min1,min2,sec1,sec2)
ifclk'
eventandclk='
1'
then
if(hou1="
0010"
andhou2="
0011"
)and(min1="
0101"
andmin2="
1001"
)and(sec1="
andsec2="
)then
hou1<
="
0000"
;
elsif(hou2="
and(min1="
))then
=hou1+1;
endif;
endprocessh110;
-----------------------------------------------
h220:
process(clk,min1,min2,sec1,sec2,hou1)
hou2<
elsifhou2="
elsif((min1="
=hou2+1;
endprocessh220;
m110:
process(clk,min2,sec1,sec2)
if(min1="
)then
min1<
elsif(min2="
and(sec1="
))then
=min1+1;
endprocessm110;
----------------------------------------------
m220:
process(clk,sec1,sec2)
ifmin2="
)then
min2<
elsif(sec1="
=min2+1;
endprocessm220;
---------------------------------------------
s110:
process(clk)
if(sec1="
sec1<
elseifsec2="
then
=sec1+1;
endprocesss110;
--------------------------------------------
s220:
ifsec2="
sec2<
elsesec2<
=sec2+1;
endprocesss220;
-------------------------------------------
disp:
process(hou1,hou2,min1,min2,sec1,sec2)
casehou1is
when"
=>
LED1<
0111111"
0001"
0000110"
1011011"
whenothers=>
1000000"
endcase;
casehou2is
LED2<
1001111"
0100"
1100110"
1101101"
0110"
1111101"
0111"
0000111"
1000"
1111111"
1101111"
whenothers=>
casemin1is
LED3<
casemin2is
LED4<
casesec1is
LED5<
casesec2is
LED6<
endprocessdisp;
------------------------------------------
endmain;
附录二
源程序(实验二):
----------------------------------------------------------------
entitynumberis
port(clk:
---------------------------------------------------时钟信号,20Hz
mode:
instd_logic_vector(1downto0);
--------------------------控制信号,用于选择模式
dire:
---------------------------------------------方向信号,1为向左,0为向右
seg7:
-------------------------7段显示控制信号(abcdefg)
scan:
outstd_logic_vector(5downto0));
----------------------数码管地址选择信号
endnumber;
architecturemainofnumberis
signalmtcnt:
integerrange0to3;
-----------------------------------------移位时间计数器
signalflag:
integerrange0to5;
-------------------------------------------位置标记
signalflag1:
integerrange0to255;
signalcnt:
signaldata:
integerrange0to9;
signalclk1s:
std_logic;
---------------------------------------------------------------------------------1Hz分频,即1s
variablecount:
ifcount=9thenclk1s<
=notclk1s;
count:
=0;
elsecount:
=count+1;
endif;
endprocess;
------------------------------------------------------------------------模式选择
casemodeis
when"
00"
mtcnt<
01"
=1;
10"
=2;
11"
=3;
whenothers=>
null;
endcase;
------------------------------------------------------------------------------移位标记
process(clk1s)
ifclk1s'
eventandclk1s='
ifcount=mtcntthen
ifflag<
5then
flag<
=flag+1;
endif;
flag1<
=flag1+1;
----------------------------------------------------------------------------------数码管动态扫描计数
ifcnt=flagthen
cnt<
else
cnt<
=cnt+1;
----------------------------------------------------------------------------------数码管动态扫描
process(cnt,dire,flag1)
variablej:
integerrange0to6;
j:
=(flag1-cnt)mod6;
casedireis
when'
----------------------------------------------------------------左移
casecntis
when0=>
scan<
000001"
when1=>
000010"
when2=>
000100"
when3=>
001000"
when4=>
s