




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、评阅老师分 数数字电路课程设计班 级 06级 一班 专 业 信息工程 姓 名 苗捷 序 号 17 1 题目要求多功能秒表设计设计一个可以顺计时和倒计时的秒表。要求计时的范围为00.0S99.9S,用三位数码管显示。基本要求:(80分)(1) 倒计时:通过小键盘可以实现设定计时时间(以秒为单位,最大计时时间为99.9秒)。通过键盘实现计时开始、计时结束。当所设定的倒计时间到达0.00S后,自动停止倒计时,同时响铃。(2) 顺计时:初始值为0.00S,通过键盘实现开始计时和结束计时功能。计时结束后,显示记录的时间。(3) 用三个发光二极管正确显示以下状态:倒计时状态、顺计时状态、待机状态。(4)
2、每当接收到有效按键时,蜂鸣器发出提示声。扩展功能:(20分)顺计时在一次计时中可以记录三个不同的结束时间,并能通过按键显示三次所记录的时间。说明:以上各项功能的功能键设置自定,不作统一规定,以简单且使用灵活方便操作为原则。2 设计方案(或设计分析)经过对题目的分析和思考,我所确立的初步方案如下:控制器键盘输入计数器数码管LED蜂鸣器图(1)初步逻辑功能分析框图如上图可见,需要一个核心控制器来对系统进行整体控制,按键输入部分收到按键信号后传递给控制器,控制器根据当前状态进行相应的动作,包括:控制计数器的运行和数码管的显示,控制蜂鸣器指示操作有效,控制LED显示当前状态。题目要求设计一个可以顺计时
3、和倒计时的秒表,计时的范围为00.0S99.9S,三位数码管显示。所以计数器部分是一个可以双向选择记时的3位10进制计数器,数码管扫描显示当前计数值,同时还要考虑在一定状态时要让数码管闪烁。键盘部分可以使用通常使用的扫描法来实现。初步确定按键有五个,但是在实际编写过程中为了节省系统资源,对案件功能进行了一定得复用,一共用了四个按键,所以就用不着对键盘进行扫描了,这样节省了系统的资源,同时也减少了复杂性。考虑到要进行模块化划分,所以以上的逻辑功能划分不能直接使用,所以再次进行了如下的模块划分。控制器键盘输入计数器数码管LED蜂鸣器图(2)初步模块划分框图3 模块实现在实际编写过程中,最终确定系统
4、分为三个模块,分别如下:模块1:keyboard图(3)模块1:keyboard键盘模块,把键盘信号发送给控制器。具体源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity keyboard isport(clk : in std_logic; key_out : out std_logic_vector(3 downto 0); key_in : in std_logic_vector(3 downto 0); key : out std_logic_vector(2 down
5、to 0);end entity;architecture behav of keyboard istype type_state is (s0,s1);beginkey_out <= "0111" proc1:process(clk) begin if rising_edge(clk) thencase key_in iswhen "1110"=> key<="000"when "1101"=> key<="001"when "1011"=&g
6、t; key<="010"when "0111"=> key<="011"when others=> key<="111"end case; end if; end process;end behav;模块2:counter图(4)模块2:counter最主要的部分,采用单进程法实现,主要部分是一个三位十进制计数器,接收keyboard的键盘信号后进行相应的响应,控制LED和蜂鸣器并输出显示信号。具体源代码如下:library ieee;use ieee.std_logic_1164.
7、all;use ieee.std_logic_unsigned.all;entity counter isport(clk : in std_logic; key : in std_logic_vector(2 downto 0); bcd1 : out std_logic_vector(3 downto 0); bcd2 : out std_logic_vector(3 downto 0); bcd3 : out std_logic_vector(3 downto 0); flash_mask : out std_logic_vector(2 downto 0); bell : out st
8、d_logic; led_up : out std_logic; led_down : out std_logic; led_pause : out std_logic; key_beep : out std_logic);end entity;architecture behav of counter issignal cnt1 : std_logic_vector(3 downto 0);-10signal cnt2 : std_logic_vector(3 downto 0);-1signal cnt3 : std_logic_vector(3 downto 0);-0.1type ty
9、pe_mode is (reset,pause,up,down,ov_down,buf,set1,set2,set3);signal mode : type_mode;constant key_sp : std_logic_vector := "000"-start pause incconstant key_set : std_logic_vector := "001"-setconstant key_dir : std_logic_vector := "010"constant key_reset : std_logic_vect
10、or := "011"constant key_null : std_logic_vector := "111"begin proc1:process(clk) variable key_tri : std_logic := '0' variable dir : std_logic := '0'-0=up, 1=down variable tick : integer range 0 to 50; variable buf1,buf2,buf3 : std_logic_vector(11 downto 0); variab
11、le buf_cnt1,buf_cnt2 : integer range 0 to 2; begin if (rising_edge(clk) then if key=key_null then key_tri := '0' end if; case mode is when reset =>- tick := 0; key_tri := '1' cnt1 <= (others => '0'); cnt2 <= (others => '0'); cnt3 <= (others =>
12、9;0'); dir := '0' bell <= '0' mode <= pause; when pause =>- led_pause <= '0' flash_mask <= "111" if dir='0' then-up led_up <= '0' led_down <= '1' else-down led_up <= '1' led_down <= '0' end if; i
13、f key_tri='0' thenkey_tri := '1' case key is when key_sp => led_pause <= '1' flash_mask <= "000" if dir='0' then mode <= up; else mode <= down; end if; when key_set => mode <= buf; when key_dir => tick := 0; if dir='0' then di
14、r :='1'-down led_up <= '1' led_down <= '0' else dir :='0'-up led_up <= '0' led_down <= '1' end if; when key_reset => mode <= reset; when others => key_tri := '0' end case; end if; when up =>- if key_tri='0' then
15、key_tri := '1' case key is when key_sp => mode <= pause; when key_set =>case buf_cnt1 iswhen 0 =>buf1:=cnt3&cnt2&cnt1;when 1 =>buf2:=cnt3&cnt2&cnt1;when 2 =>buf3:=cnt3&cnt2&cnt1;mode <= pause;end case;buf_cnt1:=buf_cnt1+1; when key_dir => null;
16、 when key_reset => null; when others => key_tri := '0' end case; end if; tick := tick + 1; if tick=49 then tick := 0; cnt3 <= cnt3 + 1; if cnt3="1001" then cnt3 <= "0000" cnt2 <= cnt2 + 1; if cnt2="1001" then cnt2 <= "0000" if cnt1=&q
17、uot;1001" then- cnt3 <= "1001"- cnt2 <= "1001" mode <=reset; elsecnt1 <= cnt1 + 1; end if; end if; end if; end if; when down =>- if key_tri='0' then key_tri := '1' case key is when key_sp => mode <= pause; when key_set =>null; when key
18、_dir => null; when key_reset => null; when others => key_tri := '0' end case; end if; tick := tick + 1; if tick=49 then tick := 0; cnt3 <= cnt3 - 1; if cnt3="0000" then cnt3 <= "1001" cnt2 <= cnt2 - 1; if cnt2="0000" then cnt2 <= "1001&
19、quot; if cnt1="0000" then cnt3 <= "0000" cnt2 <= "0000" mode <= ov_down; elsecnt1 <= cnt1 - 1; end if; end if; end if; end if; when ov_down =>- bell <= '1' if (key/=key_null) then mode <= reset; end if; when buf =>- flash_mask <= "
20、;000" case buf_cnt2 iswhen 0 =>cnt3 <= buf1(11 downto 8);cnt2 <= buf1(7 downto 4);cnt1 <= buf1(3 downto 0);when 1 =>cnt3 <= buf2(11 downto 8);cnt2 <= buf2(7 downto 4);cnt1 <= buf2(3 downto 0);when 2 =>cnt3 <= buf3(11 downto 8);cnt2 <= buf3(7 downto 4);cnt1 <=
21、 buf3(3 downto 0);end case; if key_tri='0' then key_tri := '1' case key is when key_sp => buf_cnt2 := buf_cnt2 + 1; when key_set => mode <= set1; when others =>key_tri := '0' end case; end if; when set1 =>- flash_mask <= "001" if key_tri='0'
22、; then key_tri := '1' case key is when key_sp => cnt1 <= cnt1 + 1; if cnt1="1001" then cnt1 <= "0000" end if; when key_set => mode <= set2; when key_dir => null; when key_reset => null; when others =>null; key_tri := '0' end case; end if; w
23、hen set2 =>- flash_mask <= "010" if key_tri='0' then key_tri := '1' case key is when key_sp => cnt2 <= cnt2 + 1; if cnt2="1001" then cnt2 <= "0000" end if; when key_set => mode <= set3; when key_dir => null; when key_reset => n
24、ull; when others => key_tri := '0' end case; end if; when set3 =>- flash_mask <= "100" if key_tri='0' then key_tri := '1' case key is when key_sp => cnt3 <= cnt3 + 1; if cnt3="1001" then cnt3 <= "0000" end if; when key_set =>
25、 mode <= pause; when key_dir => null; when key_reset => null; when others => key_tri := '0' end case; end if; end case; key_beep <= key_tri; end if; end process;bcd1 <= cnt1;bcd2 <= cnt2;bcd3 <= cnt3; end architecture;模块3:display图(5)模块3:display显示模块,接收counter模块的显示信号,并在
26、数码管上进行扫描输出,同时还具有控制显示闪烁的功能。具体源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity display is port(clk:in std_logic; flash_mask : in std_logic_vector(2 downto 0); bcd1 : in std_logic_vector(3 downto 0); bcd2 : in std_logic_vector(3 downto 0); bcd3 : in std_logic_vector
27、(3 downto 0); bcd : out std_logic_vector(3 downto 0); lsd : out std_logic_vector(2 downto 0); point : out std_logic);end display;architecture behav of display isbegin pro_lsd:process(clk) variable cnt : integer range 1 to 3; variable tick : integer range 0 to 127; begin if rising_edge(clk) then tick
28、 := tick + 1; lsd<="000" case cnt is when 1 => bcd <= bcd1; cnt := 2; point <= '0' if flash_mask(0)='1' and tick>63 then lsd(0) <= '0' else lsd(0) <= '1' end if; when 2 => bcd <= bcd2; cnt := 3; point <= '1' if flash_mas
29、k(1)='1' and tick>63 then lsd(1) <= '0' else lsd(1) <= '1' end if; when 3 => bcd <= bcd3; cnt := 1; point <= '0' if flash_mask(2)='1' and tick>63 then lsd(2) <= '0' else lsd(2) <= '1' end if; end case; end if; end pro
30、cess;end architecture;总连接图:程序最终使用了125个宏单元和25个管脚。4 仿真分析首先进行每个模块的独立仿真。模块一:keyboard显然,模块的输出信号key随着键盘信号key_in而变化,模块功能正常。这一部分主要是防止多个按键被按下。同时,单独划分一个模块也可以使以后的扩展变得更加容易。模块二:counter输入1KHz的clk信号,再输入开始记时的信号,计数器开始记时,记时正常。模块三:display扫描显示正常,同时可以进行正常的闪烁显示功能。系统整体:整体仿真结果基本正确。5 设计中遇到的问题整个设计过程一共用了半个多月的时间,其中有一大半的时间都是用来完
31、成扩展功能的,而基本功能比较顺利的就完成了。最开始的时候进行了逻辑上的模块划分,按照功能仔细的划分了模块,但是发现这样对设计造成很大的麻烦,在程序编写到一半的时候整个推翻重写。第二次写这个程序较为顺利,但是由于前期规划没有做好,在操作和程序逻辑上有一些混乱,虽然勉强能够运作但是效果不能让人满意。于是就有了第三次编写。这一次进行了比较详细的规划,对程序也有了比较准确的把握,写起来较为顺利。尤其是对操作方法进行了重新调整,还详细的画出了程序的流程图。按照流程图和一定的程序结构,顺利的完成了程序基本功能的编写,这一次只用了几个小时就完全完成了程序的编写和调试,整个过程非常顺利。在编写基本功能的过程中
32、由于整体较为顺利,两次推翻重新进行所有工作,到了第三次全部完成,一共花了大概一周的时间。开始的时候不熟悉VHDL设计的设计思想,走了不少弯路。而且在开始的时候抱着写写看的想法,对程序的功能没有进行仔细的分析,所以写程序的时候思路不是非常清晰,而且经常出现混乱。后来,经过探索,我总结出了“操作状态”的模式,细致的划定了各个状态和操作,每个状态该进行什么样的寄存器操作,什么样的按键响应,按键或是寄存器变化之后会有什么样的状态变化。在画出了相应的状态流程图之后发现编写程序基本上就是照着图“抄”程序,整个过程非常简单。虽然在按键方面出了一些问题,但是很快经过改进之后就好了。之后就是对基本功能的扩展,扩展功能花了很大的力气才完成,经过不断次对程序的修
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八里庄街道组织活动方案
- 公交公司庆国庆活动方案
- 诗仙李白名篇赏析教学教案
- 公交车站义诊活动方案
- 公共就业活动方案
- 美丽的真相读小抄写员有感1000字8篇范文
- 公司hr部门春节活动策划方案
- 公司一二九活动方案
- 土地流转及农民权益保障协议
- 2025至2030年中国价格牌行业投资前景及策略咨询报告
- T/CCMA 0137-2022防撞缓冲车
- 2024北京海淀区四年级(下)期末语文试题及答案
- 重庆市2025年初中学业水平暨高中招生考试数学试题预测卷(一)
- 征集和招录人员政治考核表
- 有限空间作业安全告知牌及警示标志(共21页)
- TROXLER3440核子密度仪
- 供电所星级班组(标准化)创建工作总结模板
- 炎症性肠病中活性氧及抗氧化的研究进展
- 《膀胱功能训练》PPT课件.ppt
- (完整word版)康复科门诊病历模板.doc
- 橡皮障的应用ppt课件
评论
0/150
提交评论