多功能秒表计数器Word文件下载.docx
- 文档编号:21763697
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:13
- 大小:339.16KB
多功能秒表计数器Word文件下载.docx
《多功能秒表计数器Word文件下载.docx》由会员分享,可在线阅读,更多相关《多功能秒表计数器Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
3.开始默认两个七段数码管显示秒,在检测到select键按下并松开后,数码管切换到显示百分之一秒,当再次检测到select键按下并松开后,数码管切换到重新显示秒。
4.在秒表停止时,数码管依然能够正常切换显示秒,百分之一秒。
5.本实验使用FPGA开发板:
Nexys2或Nexys3或旧板(建project时,需要选择该芯片的型号)。
实验内容:
A.VHDL程序代码
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityCounteris
Generic(N:
integer:
=250000);
Port(clk,reset,start,sel:
instd_logic;
ANO:
outstd_logic_vector(3downto0);
digit:
outstd_logic_vector(7downto0));
endCounter;
architectureBehavioralofCounteris
signalClk_1hz:
std_logic:
='
0'
;
signalClk_1Hhz:
signalClk_1Khz:
signaldigit3:
integerrange0to10:
=0;
signaldigit2:
signaldigit1:
signaldigit0:
signalR_flag:
signalS_flag:
signalX_flag:
begin
-------------------分频器-------------------process(clk)
variablecount0:
integerrange0to25000000:
variablecount1:
variablecount2:
begin
if(clk'
eventandclk='
1'
)then
count0:
=count0+1;
count1:
=count1+1;
count2:
=count2+1;
----------------频率_秒----------------
if(count0=24999999)then
Clk_1hz<
=notClk_1hz;
count0:
=0;
endif;
----------------频率_秒----------------
--------------频率_白分秒---------------
if(count1=249999)then
Clk_1Hhz<
=notClk_1Hhz;
--------------频率_白分秒---------------
--------------频率_数码管---------------
if(count2=24999)then
Clk_1Khz<
=notClk_1Khz;
endif;
endprocess;
-------------------分频器-------------------
----------------reset按键-------------------
process(clk,reset)
variablecount:
begin
)then
if(reset='
)then--消抖处理
if(count=N)thencount:
elsecount:
=count+1;
if(count=N-1)then--消抖处理
if(reset='
)thenR_flag<
=1;
elseR_flag<
=0;
----------------start按键-------------------
process(clk,start)
if(start'
eventandstart='
S_flag<
=S_flag+1;
if(S_flag=2)thenS_flag<
---------------select按键-------------------
process(clk,sel)
if(sel'
eventandsel='
X_flag<
=X_flag+1;
if(X_flag=1)thenX_flag<
-----------------按键处理-------------------
process(clk,Clk_1Hhz)
variableModel:
=1;
begin
if(R_flag=1)thenModel:
=1;
elsif(S_flag=0)thenModel:
=2;
elsif(S_flag=1)thenModel:
=3;
if(Clk_1Hhz'
eventandClk_1Hhz='
caseModelis
when1=>
digit3<
digit2<
digit1<
digit0<
TANO:
="
0111"
Temp:
=digit3;
elsif(D_flag=2)then
D_flag:
1011"
=digit2;
elsif(D_flag=1)then
1101"
=digit1;
elsif(D_flag=0)then
1110"
=digit0;
elsif(X_flag=1)then
if(D_flag=3)then
1111"
when2=>
when3=>
=digit0+1;
if(digit0=9)then
digit0<
digit1<
=digit1+1;
if(digit1=9)then
digit1<
digit2<
=digit2+1;
if(digit2=9)then
digit3<
=digit3+1;
if(digit3=9)then
endif;
whenothers=>
NULL;
endcase;
--------------数码管显示处理----------------
process(Clk_1Khz)
variableTdigit:
std_logic_vector(7downto0):
="
00000011"
variableD_flag:
integerrange0to3:
variableTANO:
std_logic_vector(3downto0):
0011"
variableTemp:
if(Clk_1Khz'
eventandClk_1Khz='
if(X_flag=0)then
caseTempis
when0=>
Tdigit:
10011111"
00100101"
00001101"
when4=>
10011001"
when5=>
01001001"
when6=>
01000001"
when7=>
00011111"
when8=>
00000001"
when9=>
00001001"
ANO<
=TANO;
digit<
=Tdigit;
endBehavioral;
B.VHDL测试代码。
LIBRARYieee;
USEieee.std_logic_1164.ALL;
ENTITYTestIS
ENDTest;
ARCHITECTUREbehaviorOFTestIS
--ComponentDeclarationfortheUnitUnderTest(UUT)
COMPONENTCounter
PORT(
clk:
INstd_logic;
reset:
--Inputs
signalclk:
std_logic:
='
signalreset:
signalstart:
signalsel:
--Outputs
signalANO:
std_logic_vector(3downto0);
signaldigit:
std_logic_vector(7downto0);
--perioddefinitions
constantclk_period:
time:
=10ns;
constantreset_period:
=500ns;
constantstart_period:
=1000ns;
constantsel_period:
=1500ns;
BEGIN
--InstantiatetheUnitUnderTest(UUT)
uut:
CounterPORTMAP(
clk=>
clk,
reset=>
reset,
start=>
start,
sel=>
sel,
ANO=>
ANO,
digit=>
digit
);
--Clockprocessdefinitions
clk_process:
process
clk<
waitforclk_period/2;
--resetprocessdefinitions
reset_process:
start:
sel:
ANO:
OUTstd_logic_vector(3downto0);
digit:
OUTstd_logic_vector(7downto0)
ENDCOMPONENT;
reset<
waitforreset_period/2;
--startprocessdefinitions
start_process:
start<
waitforstart_period/2;
--selprocessdefinitions
sel_process:
sel<
waitforsel_period/2;
--Stimulusprocess
stim_proc:
process
--holdresetstatefor100ns.
waitfor100ns;
waitforclk_period*10;
--insertstimulushere
wait;
END;
综合后的仿真波形:
仿真波形
布局布线后的仿真波形:
实验图片:
---
ASM图
实验过程分析:
一、代码分析
I.时钟分频器分析。
秒表共用到两个时钟频率:
100hz和1000hz。
FPGA板子上提供的是50Mhz的时钟频率,采用分频器的
思想可将其分为100hz和1000hz,供时钟计数和数码管扫描使用。
II.按键标志分析。
对“复位键”,“开始_停止键”,“选择键”进行状态标志,以便在另一个Process中对标志进行处理。
III.按键处理分析。
对于按键标志的状态进行处理,分别列出不同状态下的Model值,再采用case语句进行条件分析,并
作出不同的功能操作。
IV.数码管显示处理分析。
采用1000hz的频率对数码管进行扫描输出,其中包括对“选择键”的判断,即数码管以两位显示,还
是以四位显示。
V.按键消抖分析。
通过计数延时的方法进行按键消抖操作。
2、仿真分析与实验结果对照
通过仿真图像的分析以及实验结果的对照,满足了设计的要求,做到了通过按下reset键,将秒表清零,准备计时,等检测到start键按下并松开后,开始计时。
在秒表计时时,七段数码管能够循环的由00…99,00…99…。
开始默认两个七段数码管显示秒,在检测到select键按下并松开后,数码管切换到显示百分之一秒,当再次检测到select键按下并松开后,数码管切换到重新显示秒。
在秒表停止时,数码管依然能够正常切换显示秒,百分之一秒。
实验心得总结:
通过这一次的实验,设计秒表程序的规模明显比之前的要大很多,也要难好多。
这个过程,我采用了控制变量法不断对自己的猜想不断进行验证,并且学会了多process进程的使用,包括process之间的关系,process之间的信号传递等等。
另一点则是对数码管的位选,段选有了更透彻的理解以及按键如何实现消抖操作,使其系统更加稳定。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 秒表 计数器
![提示](https://static.bdocx.com/images/bang_tan.gif)