基于VHDL的秒表设计以及在FPGA span3E上运行.docx
- 文档编号:4668411
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:37
- 大小:1.09MB
基于VHDL的秒表设计以及在FPGA span3E上运行.docx
《基于VHDL的秒表设计以及在FPGA span3E上运行.docx》由会员分享,可在线阅读,更多相关《基于VHDL的秒表设计以及在FPGA span3E上运行.docx(37页珍藏版)》请在冰豆网上搜索。
基于VHDL的秒表设计以及在FPGAspan3E上运行
一、实验内容与要求:
设计一个秒表
基本要求:
它具有计时功能。
此秒表有两个按键(reset,start)按下reset键后,秒表清零,按下start键后,开始计时,再次按下start键后,停止计时,用FPGA开发板上的两个七段数码管显示时间(以秒为单位),计时由0到59循环。
高级要求(可选):
实现基本要求的前提下,增加一个按键(select),用于轮流切换两个七段数码管分别显示百分之一秒,秒,分钟。
规格说明:
1.通过按下reset键(异步复位),将秒表清零,准备计时,等检测到start键按下并松开后,开始计时。
如果再次检测到start键按下并松开后,停止计时。
通过不断检测start键,来确定秒表是否开始计时
2.在秒表计时时,七段数码管能够循环的由00…59,00…59…。
3.开始默认两个七段数码管显示秒,在检测到select键按下并松开后,数码管切换到显示分钟,再次检测到select键按下并松开后,数码管切换到显示百分之一秒,当再次检测到select键按下并松开后,数码管切换到重新显示秒。
4.在秒表停止时,数码管依然能够正常切换显示百分之一秒,秒,分钟。
本实验使用FPGA板:
Sparant3EXC3S500E(建project时,需要选择该芯片的型号)。
实验报告要求:
1.报告的格式采用标准的深圳大学设计报告格式。
2.报告中应完包括ASM图,以及VHDL代码,并且代码应该与ASM图相一致.
3.设计报告应包括该电路的VHDL仿真.
4.设计报告应该有FPGA开发的布局布线后结果.
5.报告应该有实验成功的开发板截图.
二、实验内容及过程
1、设计分析
(1)秒表运行内部时钟模块设计
开发板工作频率为66M,所以设计每660000个时钟周期为1个百分之一秒,
百分之一秒由八位的数组msecond表示,加到99,秒加一
秒由八位的数组second表示,加到59,分加一
分由八位的数组minute表示。
最终将具体要显示的数赋给八位的数组out_time,out_time再传递给数码管模块
这里八位的数组msecond,second,minute均以BCD码的方式来表示十进制数,高四位表示十位数,低四位表示个位数
(2)由reset键和start键控制的计时开始、停止、复位几个状态的转换
可用下面的ASM图表示:
是
rst是系统复位信号标志,strt是时钟clock模块是否继续计时的标志
(3)由reset键和select键控制的显示秒、分、百分之一秒的转换
可用下面的ASM图表示:
否
否
(4)两个七段数码管的驱动
由秒表时钟运行产生的时间out_time,作为数据的输入,
高四位数字由led_b0显示,低四位数字由led_b1显示,
对系统时钟进行2^19倍分频,控制led_b0和led_b1的显示,以及对
out_time高四位和低四位的选择,输送到四位的数组reg_data
对reg_data进行译码,得到八位的字符组放在led_seg里
再对led_srck进行8分频,控制led_seg数据逐个赋给led_data
对系统时钟进行64倍的分频,输出移位信号led_srck,移位工作频率约为1M
对led_srck进行32倍分频,输出存储信号led_rck,
使能信号led_oe始终有效
(5)按键去抖动设计
对按键信号使用两个D触发器进行延时2个时钟周期,达到去抖动的目的
对按键信号进行三个时钟周期的延时,来辅助使按键在放开的时候有效
可用下图表示:
当push_B=’1’andflag_push=’0’时,此时表示按键按下去放开后有效
2、VHDL代码的实现
------------------------------------------程序主代码模块--------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entitystopmatch_mainis
port(clk,reset,start,selct:
instd_logic;
led_rck,led_srck:
inoutstd_logic;
led_oe,led_data,led_b0,led_b1:
outstd_logic
);
endstopmatch_main;
architectureBehavioralofstopmatch_mainis
signalout_time:
std_logic_vector(7downto0);
signalrsto:
std_logic;
componentstopmatchis
port(clk,reset,start,selct:
instd_logic;
out_time:
outstd_logic_vector(7downto0);
rsto:
outstd_logic);
endcomponent;
componentdriver_segledis
port(clk,rst:
instd_logic;
input_data:
instd_logic_vector(7downto0);
led_rck,led_srck:
outstd_logic;
led_oe,led_data:
outstd_logic;
led_b0,led_b1:
outstd_logic);
endcomponent;
begin
driver1:
driver_segledportmap(clk,rsto,out_time(7downto0),-----驱动七段数码管模块
led_rck,led_srck,led_oe,led_data,led_b0,led_b1);
stopmatch1:
stopmatchportmap(clk,reset,start,selct,out_time,rsto);------秒表运行模块
endBehavioral;
--------------------------------秒表主模块------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitystopmatchis
port(clk,reset,start,selct:
instd_logic;
out_time:
outstd_logic_vector(7downto0);
rsto:
outstd_logic);
endstopmatch;
architectureBehavioralofstopmatchis
signalminute,second,msecond:
std_logic_vector(7downto0);
typestateis(stop_timing,timing,reset_timing);
signalpresent_state,next_state:
state:
=stop_timing;
typedisplayis(disp_minute,disp_second,disp_msecond);
signalpresent_disp,next_disp:
display:
=disp_second;
signalreset_A,start_A,select_A:
std_logic;
signalreset_B,start_B,select_B:
std_logic;
signalstrt,rst:
std_logic;
signalflag_start,flag_reset,flag_select:
std_logic:
='0';
componentclockis-----------------时钟运行模块-----------------------------
port(clk,rst,strt:
instd_logic;
minute,second,msecond:
inoutstd_logic_vector(7downto0)
);
endcomponent;
componentdffis----------------D触发器模块-----------------------------------
port(clk,push:
instd_logic;
push_B:
outstd_logic);
endcomponent;
begin
start1:
dffportmap(clk,start,start_A);
start2:
dffportmap(clk,start_A,start_B);-------------去除start按键的抖动
reset1:
dffportmap(clk,reset,reset_A);
reset2:
dffportmap(clk,reset_A,reset_B);------------去除reset按键的抖动
select1:
dffportmap(clk,selct,select_A);
select2:
dffportmap(clk,select_A,select_B);------------去除selct按键的抖动
flag1:
dffportmap(clk,start_B,flag_start);----标志start按下后
只在放开后第一个时钟周期有效
flag2:
dffportmap(clk,reset_B,flag_reset);----标志reset按下后
只在放开后第一个时钟周期有效
flag3:
dffportmap(clk,select_B,flag_select);----标志selct按下后
只在放开后第一个时钟周期有效
clock1:
clockportmap(clk,rst,strt,minute,second,msecond);
rsto<=rst;----------系统内部复位信号
process(clk,reset_B)
begin
ifreset_B='1'andflag_reset='0'then
present_state<=reset_timing;
elsif(clk'eventandclk='1')then
present_state<=next_state;
endif;
endprocess;
process(clk,reset_B)
begin
ifreset_B='1'andflag_reset='0'then
present_disp<=disp_second;
elsif(clk'eventandclk='1')then
present_disp<=next_disp;
endif;
endprocess;
process(clk,present_state,start_B,reset_B)
---------由reset键和start键控制的计时开始、停止、复位进程
begin
if(clk'eventandclk='1')then
casepresent_stateis
whenreset_timing=>
rst<='0';
next_state<=stop_timing;
whenstop_timing=>
rst<='1';
strt<='1';
ifstart_B=1'andflag_start='0'then
next_state<=timing;
elsifreset_B='1'andflag_reset='0'then
next_state<=reset_timing;
endif;
whentiming=>
rst<='1';
strt<='0';
ifstart_B='1'andflag_start='0'then
next_state<=stop_timing;
elsifreset_B='1'andflag_reset='0'then
next_state<=reset_timing;
endif;
endcase;
endif;
endprocess;
process(clk,present_disp,select_B,second,minute,msecond)
----------------由reset键和select键控制的显示秒、分、百分之一秒的转换进程
begin
if(clk'eventandclk='1')then
casepresent_dispis
whendisp_second=>
out_time<=second;
if(select_B='0'andflag_select='1')then
next_disp<=disp_minute;
endif;
whendisp_minute=>
out_time<=minute;
if(select_B='0'andflag_select='1')then
next_disp<=disp_msecond;
endif;
whendisp_msecond=>
out_time<=msecond;
if(select_B='0'andflag_select='1')then
next_disp<=disp_second;
endif;
endcase;
endif;
endprocess;
endBehavioral;
----------------------------------时钟运行模块-------------------------***
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityclockis
port(clk,rst,strt:
instd_logic;
minute,second,msecond:
inoutstd_logic_vector(7downto0)
);
endclock;
architectureBehavioralofclockis
componentCTR_59is----模59进制模块
port(clk,inc,rst:
instd_logic;
dout:
outstd_logic_vector(7downto0);
t59:
outstd_logic);
endcomponent;
componentCTR_99is----模99进制模块
port(clk,inc,rst:
instd_logic;
dout:
outstd_logic_vector(7downto0);
t99:
outstd_logic);
endcomponent;
signaldiv100:
integerrange0to660000;
signalincsec,incmin:
std_logic;
signalc99,incs,incm:
std_logic;
begin
msec1:
CTR_99portmap(clk,c99,rst,msecond,incs);
sec1:
CTR_59portmap(clk,incsec,rst,second,incm);
min1:
CTR_59portmap(clk,incmin,rst,minute,open);
incmin<=incsandincmandc99;
incsec<=incsandc99;
c99<='1'whendiv100=660000else'0';
------开发板工作频率为66M,所以设定660000个时钟周期为百分之一秒
process(clk,rst,strt)
begin
ifrst='0'then
div100<=0;
elsifclk'eventandclk='1'then
ifstrt='0'then
ifc99='1'thendiv100<=0;
elsediv100<=div100+1;
endif;
endif;
endif;
endprocess;
endBehavioral;
------------模99进制模块-----------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityCTR_99is
port(clk,inc,rst:
instd_logic;
dout:
outstd_logic_vector(7downto0);
t99:
outstd_logic);
endCTR_99;
architectureBehavioralofCTR_99is
signaldig0,dig1:
std_logic_vector(3downto0);
begin
process(clk,rst,inc)
begin
ifrst='0'thendig0<="0000";dig1<="0000";
elsifclk'eventandclk='1'then
ifinc='1'then
ifdig0="1001"thendig0<="0000";
ifdig1="1001"thendig1<="0000";
elsedig1<=dig1+1;
endif;
elsedig0<=dig0+1;
endif;
endif;
endif;
endprocess;
t99<='1'when(dig1="1001"anddig0="1001")else'0';
dout<=dig1&dig0;
endBehavioral;
----------------------------------------------------------------**
---------------------模59进制模块-------------------------------------------------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityCTR_59is
port(clk,inc,rst:
instd_logic;
dout:
outstd_logic_vector(7downto0);
t59:
outstd_logic);
endCTR_59;
architectureBehavioralofCTR_59is
signaldig0,dig1:
std_logic_vector(3downto0);
begin
process(clk,rst,inc)
begin
ifrst='0'thendig0<="0000";dig1<="0000";
elsifclk'eventandclk='1'then
ifinc='1'then
ifdig0="1001"thendig0<="0000";
ifdig1="0101"thendig1<="0000";
elsedig1<=dig1+1;
endif;
elsedig0<=dig0+1;
endif;
endif;
endif;
endprocess;
t59<='1'when(dig1="0101"anddig0="1001")else'0';
dout<=dig1&dig0;
endBehavioral;
------------------------------D触发器模块-----------------------------------------**
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entitydffis
port(clk,push:
instd_logic;
push_B:
outstd_logic);
enddff;
architectureBehavioralofdffis
begin
process(clk,push)
begin
if(clk'eventandclk='1')then
push_B<=push;
endif;
endprocess;
endBehavioral;
--------------------七段数码管驱动模块-----------------------------------------------****
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydriver_segledis
p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于VHDL的秒表设计以及在FPGA span3E上运行 基于 VHDL 秒表 设计 以及 FPGA span3E 运行