




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、实验内容与要求:设计一个秒表基本要求:它具有计时功能。此秒表有两个按键(reset, start)按下reset键后,秒表清零,按下start键后,开始计时,再次按下start键后,停止计时,用FPGA开发板上的两个七段数码管显示时间(以秒为单位),计时由0 到 59 循环。高级要求(可选):实现基本要求的前提下,增加一个按键(select),用于轮流切换两个七段数码管分别显示百分之一秒,秒,分钟。规格说明:1. 通过按下reset键(异步复位),将秒表清零,准备计时,等检测到start键按下并松开后,开始计时。如果再次检测到start键按下并松开后,停止计时。通过不断检测start键,来确定秒表是否开始计时2. 在秒表计时时,七段数码管能够循环的由0059,0059。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显示, 对系统时钟进行219倍 分频,控制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 and flag_push =0 时,此时表示 按键按下去放开后有效 2、VHDL代码的实现-程序主代码模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity stopmatch_main is port(clk,reset,start,selct : instd_logic; led_rck,led_srck:inout std_logic;led_oe,led_data,led_b0,led_b1:out std_logic );end stopmatch_main;architecture Behavioral of stopmatch_main issignal out_time:std_logic_vector(7 downto 0);signal rsto:std_logic;component stopmatch is port(clk,reset,start,selct : instd_logic; out_time:out std_logic_vector(7 downto 0); rsto:out std_logic);end component;component driver_segled is port(clk,rst:in std_logic; input_data:in std_logic_vector(7 downto 0); led_rck,led_srck:out std_logic; led_oe,led_data:out std_logic; led_b0,led_b1:out std_logic);end component;begindriver1:driver_segled port map(clk,rsto,out_time(7 downto 0), -驱动七段数码管模块led_rck,led_srck,led_oe,led_data,led_b0,led_b1);stopmatch1:stopmatch port map(clk,reset,start,selct,out_time,rsto); -秒表运行模块end Behavioral;-秒表主模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity stopmatch is port(clk,reset,start,selct : instd_logic; out_time:out std_logic_vector(7 downto 0); rsto:out std_logic);end stopmatch;architecture Behavioral of stopmatch issignal minute,second,msecond: std_logic_vector(7 downto 0);type state is(stop_timing,timing,reset_timing);signal present_state,next_state :state :=stop_timing;type display is (disp_minute,disp_second,disp_msecond);signal present_disp,next_disp: display :=disp_second;signal reset_A,start_A,select_A: std_logic;signal reset_B,start_B,select_B: std_logic;signal strt ,rst: std_logic;signal flag_start,flag_reset,flag_select:std_logic :=0;component clock is -时钟运行模块- port(clk,rst,strt:in std_logic; minute,second,msecond: inout std_logic_vector(7 downto 0);end component;component dff is -D触发器模块- port(clk,push:in std_logic; push_B:out std_logic);end component;begin start1:dff port map(clk,start,start_A); start2:dff port map(clk,start_A,start_B);-去除start按键的抖动 reset1:dff port map(clk,reset,reset_A); reset2:dff port map(clk,reset_A,reset_B); -去除reset按键的抖动 select1:dff port map(clk,selct,select_A); select2:dff port map(clk,select_A,select_B); -去除selct按键的抖动 flag1:dff port map(clk,start_B,flag_start);-标志start按下后只在放开后第一个时钟周期有效 flag2:dff port map(clk,reset_B,flag_reset); -标志reset按下后只在放开后第一个时钟周期有效 flag3:dff port map(clk,select_B,flag_select); -标志selct按下后只在放开后第一个时钟周期有效 clock1: clock port map(clk,rst,strt,minute,second,msecond); rsto=rst;-系统内部复位信号process(clk,reset_B) begin if reset_B=1 and flag_reset=0 then present_state=reset_timing; elsif(clkevent and clk=1)then present_state=next_state; end if; end process; process(clk,reset_B) begin if reset_B=1 and flag_reset=0 then present_disp=disp_second; elsif(clkevent and clk=1)then present_disp rst=0; next_state rst=1; strt=1; if start_B=1 and flag_start=0 then next_state=timing; elsif reset_B=1 and flag_reset=0 then next_state rst=1; strt=0; if start_B=1 and flag_start=0 then next_state=stop_timing; elsif reset_B=1 and flag_reset=0 then next_state out_time=second; if( select_B =0 and flag_select=1) then next_disp out_time=minute; if( select_B =0 and flag_select=1 ) then next_disp out_time=msecond; if( select_B =0 and flag_select=1) then next_disp=disp_second; end if; end case; end if; end process; end Behavioral;-时钟运行模块-*library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity clock is port(clk,rst,strt:in std_logic; minute,second,msecond: inout std_logic_vector(7 downto 0);end clock;architecture Behavioral of clock is component CTR_59 is -模59进制模块 port(clk,inc,rst:in std_logic; dout:out std_logic_vector(7 downto 0); t59:out std_logic);end component; component CTR_99 is -模99进制模块 port(clk,inc,rst:in std_logic; dout :out std_logic_vector(7 downto 0); t99:out std_logic);end component;signal div100:integer range 0 to 660000;signal incsec,incmin:std_logic;signal c99,incs,incm: std_logic;begin msec1:CTR_99 port map(clk,c99,rst,msecond,incs); sec1:CTR_59 port map(clk,incsec,rst,second,incm); min1:CTR_59 port map(clk,incmin,rst,minute,open); incmin=incs and incm and c99; incsec=incs and c99 ; c99=1 when div100=660000 else 0; -开发板工作频率为66M,所以设定660000个时钟周期为百分之一秒 process(clk,rst,strt) begin if rst=0 then div100=0; elsif clkevent and clk =1 then if strt=0 then if c99=1 then div100=0; else div100=div100+1; end if; end if;end if;end process;end Behavioral; -模99进制模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity CTR_99 is port(clk,inc,rst:in std_logic; dout :out std_logic_vector(7 downto 0); t99:out std_logic);end CTR_99;architecture Behavioral of CTR_99 issignal dig0,dig1:std_logic_vector(3 downto 0);beginprocess(clk,rst,inc) begin if rst=0 then dig0=0000;dig1=0000; elsif clkevent and clk =1 then if inc=1 then if dig0=1001 then dig0=0000; if dig1=1001 then dig1=0000;else dig1=dig1+1;end if;else dig0=dig0+1;end if;end if;end if;end process;t99=1 when (dig1=1001 and dig0=1001)else 0;dout=dig1 & dig0;end Behavioral;-*-模59进制模块-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity CTR_59 is port(clk,inc,rst:in std_logic; dout :out std_logic_vector(7 downto 0); t59:out std_logic);end CTR_59;architecture Behavioral of CTR_59 issignal dig0,dig1:std_logic_vector(3 downto 0);beginprocess(clk,rst,inc) beginif rst=0 then dig0=0000;dig1=0000; elsif clkevent and clk =1 then if inc=1 then if dig0=1001 then dig0=0000; if dig1=0101 then dig1=0000;else dig1=dig1+1;end if;else dig0=dig0+1;end if;end if;end if;end process;t59=1 when (dig1=0101 and dig0=1001)else 0;dout=dig1 & dig0;end Behavioral;-D触发器模块-*library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity dff is port(clk,push:in std_logic; push_B:out std_logic);end dff;architecture Behavioral of dff isbegin process(clk,push) begin if(clkevent and clk =1) then push_B=push; end if; end process;end Behavioral;-七段数码管驱动模块-*library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity driver_segled is port(clk,rst:in std_logic; input_data:in std_logic_vector(7 downto 0); led_rck,led_srck:out std_logic; led_oe,led_data:out std_logic; led_b0,led_b1:out std_logic);end driver_segled;architecture Behavioral of driver_segled issignal led_disp:std_logic_vector(10 downto 0); -这两个数组用来对clk分频, signal led_disp1:std_logic_vector(9 downto 0); -控制led_b0,led_b1显示signal inc2,sysclk_srck:std_logic;signal reg_data :std_logic_vector(3 downto 0);signal led_seg :std_logic_vector(7 downto 0);signal sysclk_64:std_logic_vector(5 downto 0);-对时钟clk 64倍分频signal seg_rck:std_logic_vector(4 downto 0); -对led_srck 32倍分频signal seg_sel:std_logic_vector(2 downto 0); -对led_srck 8倍分频beginled_oe=0;process(clk,rst)begin if rst=0 then sysclk_64=000000; elsif clkevent and clk =1 then sysclk_64=sysclk_64+1; end if;end process;process(clk,rst,led_disp)begin if rst=0 then sysclk_srck=0; elsif clkevent and clk =1 then if sysclk_64=011111 then sysclk_srck=1; else sysclk_srck=0; end if; end if;end process;process(clk,rst,sysclk_srck)begin if rst=0 then led_srck=0; elsif clkevent and clk =1 then led_srck=sysclk_srck; end if;end process;process(sysclk_srck,rst)begin if rst=0 then seg_rck=00000; elsif sysclk_srckevent and sysclk_srck =1 then seg_rck=seg_rck + 1; end if;end process;process(seg_rck,clk,rst)begin if rst=0 then led_rck=0; elsif clkevent and clk =1 then if seg_rck=00001 then led_rck=1; else led_rck=0; end if; end if;end process;process(rst,clk,sysclk_srck)begin if rst=0 then seg_sel=000; elsif sysclk_srckevent and sysclk_srck =1 then seg_sel = seg_sel + 1; end if;end process;process(clk,rst,led_seg)begin if rst=0 then led_dataled_data led_data led_data led_data led_data led_data led_data led_data led_data = 0; end case; end if;end process;process(clk,rst,reg_data)begin if rst=0 then led_seg led_seg led_seg led_seg led_seg led_seg led_seg led_seg led_seg led_seg led_seg led_seg=11111111; end case;end if;end process; process(clk,rst)begin if rst=0 then led_disp=00000000000; elsif clkevent and clk =1 then led_disp=led_disp+1; end if;end process;process(clk,rst,led_disp)begin if rst=0 then inc2=0; elsif clkevent and clk =1 then if led_disp=11111111111 then inc2=1; else inc2=0; end if; end if;end process;process(clk,rst,inc2)begin if rst=0 then led_disp1=0000000000; elsif clkevent and clk =1 and inc2 =1 then led_disp1=led_disp1+1; end if;end process; process(clk,rst,led_disp1) -66000000/(29 * 210)=125begin if rst=0 then led_b0=0; led_b1=0; elsif clkevent and clk =1 then if led_disp1=0000000000 then led_b1=1; led_b0=0; reg_data=input_data(3 downto 0); elsif led_disp1=1000000000 then led_b0=1; led_b1=0; reg_data=input_data(7 downto 4); end if; end if;end process;end Behavioral;-UCF文件代码-NET clk LOC = P183;NET clk IOSTANDARD = LVCMOS33;NET reset LOC = P142;# -sw20NET start LOC = P148; # -sw18NET selct LOC = P130; # -sw16NET reset PULLUP;NET reset IOSTANDARD = LVCMOS33;NET led_data LOC = P82; #NET led_rck LOC = P75; #N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抖音短视频内容合作终止及版权归属确认协议
- 企业团体意外伤害险保单转移与续保协议
- 抖音企业号短视频创意制作与品牌传播合作协议
- 区块链智能合约版权保护审计及合规性审查协议
- 不宁腿综合征护理要点
- 护理教学组长职责
- 房地产开发流程全景图
- 医学生研究生面试准备与策略
- 第12课 近代战争与西方文化的扩张
- 2025版高中化学第三章第一节第1课时醇学案含解析新人教版选修5
- 施工员培训课件
- 2024年山东枣庄东林农文化产业发展有限公司招聘笔试真题
- 新疆可克达拉职业技术学院招聘事业单位人员笔试真题2024
- 增材制造在虚拟现实辅助机械制造中的应用-洞察阐释
- 土石回填合同协议书
- 电信网上大学智能云服务交付工程师认证参考试题库(附答案)
- 【苏州】2025年江苏省苏州工业园区部分单位公开招聘工作人员51人笔试历年典型考题及考点剖析附带答案详解
- 混凝土罐车运输合同协议
- 养老院安全常识培训
- 安徽省池州市各县区乡镇行政村村庄村名明细
- 幼儿园:周佳茵 中班科学教案《有趣的纸桥》
评论
0/150
提交评论