数字逻辑电路(数电)课程设计_电子秒表_VHDL实现(含完整源代码!!)
数电课程设计:电子秒表

数电课程设计:电子秒表
电子秒表是一种常见的计时工具,它通过使用电子元件实现高精度的计时功能。
下面是一个基于数电的电子秒表的设计方案:
1. 运算部分设计:
- 使用一个1Hz的时钟源,可以通过计数器或者振荡器实现。
- 使用一个可重置的二进制计数器,位数根据需要的计时范
围确定。
例如,如果计时范围为1小时,可使用一个4位二进制计数器。
- 计时开始/停止控制逻辑:这可以通过一个开关电路实现,可以使用一个门电路或者触发器电路。
- 计数器重置逻辑:可以使用一个按钮或者开关来重置计数
器的值。
2. 显示部分设计:
- 使用数码管或者液晶显示器来显示计时结果。
数码管可以
使用共阳或者共阴的7段数码管。
- 使用译码器将计数器的二进制输出转换为译码信号,用于
控制数码管显示的数字。
3. 其他功能:
- 可以添加一个暂停功能,通过一个按钮或者开关来实现。
当计时中按下暂停按钮时,计时器会停止计数,再次按下暂停
按钮时,计时器继续计数。
- 可以添加一个拆表功能,通过一个按钮或者开关来实现。
按下拆表按钮时,计时器会记录当前的计时值,然后重置为0,再次按下拆表按钮时,计时器恢复原来的计时状态。
该设计方案中的电子秒表可根据实际需求进行调整和扩展,例如增加更多的功能按钮、调整计时范围和精度等。
同时,需要注意电路的稳定性和可靠性,以及对供电电源和信号的处理。
数电课程设计:电子秒表

《数字电子技术基础》课程设计报告题目:电子秒表专业:自动化班级:自动化姓名:指导教师:成绩:2015年8月25日课程设计任务书学生班级:自动化学生姓名:学号:设计名称:电子秒表起止日期:2015.8.22——2015.9.05 指导教师:摘要秒表应用于我们生活、工作、运动等需要精确计时的方面。
它由刚开始的机械式秒表发展到今天所常用的数字式秒表。
秒表的计时精度越来越高,功能越来越多,构造也日益复杂。
本次数字电路课程设计的数字式秒表的要求为:显示分辨率为1s/100,外接系统时钟频率为100Hz;计时最长时间为10min,6位显示器,显示时间最长为9m59.99s;系统设置启/停键和复位键。
复位键用来消零,做好计时准备、启/停键是控制秒表起停的功能键。
针对上述设计要求,我们先前往校图书馆借阅了大量的数字电路设计方面的书籍,以及一本电子元件方面的工具书,以待查阅各种设计中所需要的元件。
其次安装并学习了数字电路设计中所常用的Multisim仿真软件,在课程设计过程的电路图设计与电路的仿真方面帮助我们发现了设计电路方面的不足与错误之处。
关键字:555定时器十进制计数器多谐振荡器目录第一章方案设计与论证 .................................................. - 5 - 第二章单元电路设计与参数计算 .......................................... - 5 -2.1 时钟脉冲发生和控制信号- 5 -2.2 启动与停止电路- 6 -2.3 清零电路设计- 7 -第三章总电路工作原理及元器件清单 ...................................... - 7 -3.1 电路完整工作过程描述(总体工作原理)- 7 -3.2 总原理图:(见下图3-1)- 7 -第四章主要芯片介绍- 9 -4.1 74LS00- 9 -4.1 74LS160- 9 -第五章仿真............................................................. - 9 - 自我评价- 13 -插图清单图1-1 方案设计图 (5)图2-1555定时器构成的多谐振荡器 (6)图2-2启动与停止电路 (6)图2-3清零电路 (7)图3-1总原理图 (8)图5-1电子秒表仿真结果图1 (10)图5-2电子秒表仿真结果图2 (11)第一章方案设计与论证总体分析:图1-1 方案设计图如图1-1所示,该电路需要4个十进制的加计数器,一个555定时器组成的多谐振荡器,RS触发器启动停止电路。
用Verilog HDL语言编写的电子秒表

module jian_kong(rest,kon,clk001,clk001out);//开始与暂停按键的控制电路 input rest; input kon; input clk001; output clk001out; wire k; wire d; assign d=~k; assign clk001out=k&clk001; D_FF D_FF0(rest,kon,d,k); endmodule module D_FF(rest,clk,d,q); input rest; input clk; input d; output q; reg q; always@(posedge rest or posedge clk) if(rest==1'b1) begin q<=1'b0; end else begin q<=d; end endmodule //到此程序全部结实
Module shumaguan(a_to_g,A_TO_D,clk,qian,bai,shi,ge);//数码管驱动 output reg [6:0]a_to_g; output reg [3:0]A_TO_D; input wire clk; input wire [3:0]qian; input wire [3:0]bai; input wire [3:0]shi; input wire [3:0]ge; reg [3:0]duan; reg [1:0]wei; reg a; reg [16:0]q; always@(posedge clk) begin if(q==49999) begin q<=0; a<=~a; end else q<=q+1; end
always@(*)//4位位选译码 case(wei) 3:begin A_TO_D=4'b1110; duan=qian; end 2:begin A_TO_D=4'b1101; duan=bai; end 1:begin A_TO_D=4'b1011; duan=shi; end 0:begin A_TO_D=4'b0111; duan=ge; end default:A_TO_D=4'b1110; endcase always@(posedge a)//四个状态循环 if(wei==3) wei<=0; else wei<=wei+1; endmodule //到此数码管驱动模块结束
数字电路课程设计电子秒表

机械与电子工程学院课程设计报告《数字电子技术》课程设计专业名称:班级:学号:姓名:指导教师:日期:2012.06.121前言秒表应用于我们生活、工作、运动等需要精确计时的方面。
它由刚开始的机械式秒表发展到今天所常用的数字式秒表。
秒表的计时精度越来越高,功能越来越多,构造也日益复杂。
本次数字电路课程设计的电子秒表的要求为:秒表最大计时值为99.99秒;分辨率为0. 1秒;具有启动计时、停止计时、清零等控制功能。
针对上述设计要求,我们先前往校图书馆借阅了大量的数字电路设计方面的书籍,以及一本电子元件方面的工具书,以待查阅各种设计中所需要的元件,并仔细阅读《电子技术基础实验》中实验十四《电子秒表》的设计相关资料。
工作安排方面:我们首先在课程设计的要求下设计出了数字式秒表的整体电路框图,将其分基本RS触发器,单稳态触发器,时钟发生器,计数及译码显示装置四个部分。
其次我们对每个单元电路进行设计分析,对其工作原理进行介绍。
完成了单元电路设计分析之后,进行总电路的拼接与调试,最后对总电路图进行分析,写出最终系统综述。
完成总电路的设计与分析之后,对资料与设计电路进行整理,排版,完成课程设计报告。
目录前言 (2)目录 (3)摘要 (4)关键字 (4)设计要求 (4)正文 (5)第一章系统概述 (5)第二章单元电路设计与分析 (6)一、时钟发生器电路设计 (1)二、计数及译码显示电路设计 (7)三、电子秒表的启动和停止电路设计 (7)四、电子秒表的清零电路设计 (8)第三章总体电路图 (9)参考文献、结束语 (10)主要器件及功能表 (10)收获与体会,存在的问题等 (13)课程设计评阅书 (15)电子秒表摘要第一章:系统概述简单介绍数字式秒表的系统设计思路,画出系统框图,并全面介绍总体工作过程或工作原理。
第二章:根据总功能框图的功能划分,分块设计单元电路,对每个单元路进行设计分析。
第三章:数字式秒表总电路图的给出,以及对系统进行综述。
数字逻辑电路课程设计_4B5B编码_VHDL实现(含完整代码!!)

电子科技大学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA数字逻辑设计实验报告实验题目:4B5B编码器学生姓名:指导老师:一、实验内容4B/5B编码是百兆以太网中线路层编码类型之一,该试验需要实现用5bit的二进制数来表示4bit二进制数。
二、实验要求1、功能性要求:能够实现4B5B编码,即输入4bit数据时能输出正确的5bit编码结果.2、算法要求:利用卡诺图对编码真值表进行化简,得出其逻辑表达式,并基于此进行硬件设计.3、设计性要求:使用代码及原理图两种设计方式来进行设计.采用基本门结构化描述。
能够编写Test Bench文件,并利用Modelsim进行仿真。
三、实验原理及设计思路1、实验原理:在IEEE 802。
9a等时以太网标准中的4B:5B编码方案,因其效率高和容易实现而被采用。
这种编码的特点是将欲发送的数据流每4bit作为一个组,然后按照4B/5B编码规则将其转换成相应5bit码。
5bit码共有32种组合,但只采用其中的16种对应4bit码的16种,其他的16种或者未用或者用作控制码,以表示帧的开始和结束、光纤线路的状态(静止、空闲、暂停)等.4B5B编码表如下:2、设计思路:(1)整体思路:对已知的编码真值表,首先利用卡诺图对其进行化简,得出其逻辑表达式,再用基本门结构将其实现。
(2)卡诺图与表达式:设输入的4位编码为:ABCD,输出的5位编码为:VWXYZ,则分别画出其卡诺图并得出表达式如下:1.V:V=A+B'D’+B’C2。
W:W=B+A’C’X=C+A'B’D'4.Y:Y=A’B+AB'+C’D’+AC’Z=D(3)基本门结构设计:由上述表达式可见,用到的基本门有:非门、2输入与门、3输入与门、2输入或门、3输入或门、4输入或门,用not、and、or将其一一表示出即可.四、程序设计1、顶层模块:library IEEE;use IEEE。
vhdl实现秒表

案例一秒表一、案例说明1.功能描述(1).设计一块用数码管显示的秒表。
(2).能够准确地计时并显示。
(3).开机显示00.00.00。
(4).用户可随时清零、暂停、计时。
(5).最大计时59分钟,最小精确到0.01秒。
2.可选器件EPM7128S、共阴极七段数码管、发光二极管、按键开关、电阻、电容。
二、硬件电路结构图数字显示的秒表总体框图如图所示:图带数字显示的秒表总体框图三、软件设计Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity watch isport(sel: out std_logic_vector(6 downto 1);seg: out std_logic; --开始、停止计数。
reset: in std_logic);end watch;architecture behave of watch issignal num1:std_logic_vector(3 downto 0);signal num2:std_logic_vector(3 downto 0);signal num3:std_logic_vector(3 downto 0);signal num4:std_logic_vector(3 downto 0);signal num5:std_logic_vector(3 downto 0);signal num6:std_logic_vector(3 downto 0);signal num:std_logic_vector(3 downto 0);signal numlet:std_logic_vector(2 downto 0);signal count:std_logic_vector(17 downto 1);signal selsig:std_logic_vector(6 downto 1);signal segsig:std_logic_vector(7 downto 0);signal cp1:std_logic;signal cp3:std_logic;beginprocess(cp2) --分频。
电子秒表设计VHDL

一、设计题目:基于VHDL语言的电子秒表设计(可调时,有闹钟、定时功能)二、设计目的:⑴掌握较复杂的逻辑设计和调试⑵学习用原理图+VHDL语言设计逻辑电路⑶学习数字电路模块层次设计⑷掌握QuartusII软件及Modelsim软件的使用方法三、设计内容:(一)设计要求1、具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1S。
(二).系统功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、set、ds;时钟信号clk,采用实验箱的50MHz;系统复位信号为reset。
输入信号均由按键产生。
系统输出:8位LED七段数码管显示输出,蜂鸣器声音信号输出。
多功能数字钟系统功能的具体描述如下:2. 计时:set=1,ds=1工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在set=0,ds=0状态下,按下“k键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k键”则进入“秒校准”状态,之后如此循环。
1)“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
3)“秒”复零状态:在“秒复零”状态下,显示“分”的数码管以1Hz的频率递增计数。
4. 整点报时:蜂鸣器在“59”分钟的第50—59,以1秒为间隔分别发出1000Hz,500Hz的声音。
5. 显示:采用扫描显示方式驱动8个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出交替周期为1s的1000Hz、500Hz的声音,持续时间为一分钟;6. 闹钟定时设置:在set=0,ds=1状态下,按下“k”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态, 之后如此循环。
1)闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz 的频率递增计数。
电子技术课程设计:电子秒表

湖南文理学院课程设计报告课程名称:《电子设计制作与工艺实习》课题名称:电子秒表系部:电气与信息工程学院专业班级:自动化10级10102班学生姓名:* *指导教师:* * *完成时间:2012年6月29日报告成绩:摘要摘要就是一段话,内容要反映六个方面:(1)课题目的;(2)技术手段;(3)硬件结构;(4)软件模块;(5)分析手段及实验与仿真结果;(6)结果与创新点。
整体上字数控制在300~500字以内,不能低于300字。
关键词:×××;×××;×××;×××;×××关键词的提炼来自四个方面:(1)课题中心词;(2)技术核心词;(3)技术手段名称;(4)设计工具术语。
严禁以器件型号作为关键词,关键词的数量控制在4~8个以内,小4号宋体,词与词之间分号隔开,最后一个关键词无标点符号。
Abstract(摘要翻译符合科技英文规范,多采用被动语态翻译,严禁是摘要的直译。
)Keywords:×××,×××,×××,×××,×××(关键词务必是专业单词与词组,可以是缩写方式,但许多期刊不允许缩写。
关键词之间用逗号隔开,最后一个关键词无标点符号)目录摘要 (II)Abstract (III)第一章电子秒表方案设计 (1)1.1绪论 (1)1.2 电子秒表功能或性能 (2)1.3 电子秒表设计方案 (2)第二章电子秒表电路设计 (4)2.1 秒分计时电路 (4)2.2 小时计时电路 (4)2.3 开关电路 (4)2.4 清零电路 (4)2.5 整体电路 (4)第三章电子秒表仿真与实验 (5)4.1秒分计时电路实验 (5)4.2 小时计时电路实验 (5)4.3 开关电路及清零电路实验 (6)总结 (8)参考文献 (9)致谢 (10)附录1 电子秒表电路图 (11)附录2 电子秒表明细表 (12)第一章电子秒表方案设计1.1 绪论目前数字电子技术已经广泛地应用于计算机,自动控制,电子测量仪表,电视,雷达,通信等各个领域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA数字逻辑设计实验报告实验题目:电子秒表学生姓名:指导老师:一、实验内容利用FPGA设计一个电子秒表,计时范围00.00 ~ 99.00秒,最多连续记录3个成绩,由两键控制。
二、实验要求1、实现计时功能:域值范围为00.00 ~ 99.00秒,分辨率0.01秒,在数码管上显示。
2、两键控制与三次记录:1键实现“开始”、“记录”等功能,2键实现“显示”、“重置”等功能。
系统上电复位后,按下1键“开始”后,开始计时,记录的时间一直显示在数码管上;按下1键“记录第一次”,次按1键“记录第二次”,再按1键“记录第三次”,分别记录三次时间。
其后按下2键“显示第一次”,次按2键“显示第二次”,再按2键“显示第三次”,数码管上分别显示此前三次记录的时间;显示完成后,按2键“重置”,所有数据清零,此时再按1键“开始”重复上述计时功能。
三、设计思路1、整体设计思路先对按键进行去抖操作,以正确的得到按键信息。
同时将按键信息对应到状态机中,状态机中的状态有:理想状态、开始状态、3次记录、3次显示、以及其之间的7次等待状态。
因为需要用数码管显示,故显示的过程中需要对数码管进行片选和段选,因此要用到4输入的多路选择器。
在去抖、计时、显示的过程中,都需要用到分频,从而得到理想频率的时钟信号。
2、分频设计该实验中有3个地方需要用到分频操作,即去抖分频(需得到200HZ时钟)、计时分频(需得到100HZ时钟)和显示分频(需得到25kHZ时钟)。
分频的具体实现很简单,需首先算出系统时钟(50MHZ)和所需始终的频率比T,并定义一个计数变量count,当系统时钟的上升沿每来到一次,count就加1,当count=T时就将其置回1。
这样只要令count=1~T/2时clk=‘0’,count=T/2+1~T时clk=‘1’即可。
3、去抖设计由于用按键为机械弹性开关,故当机械触点断开、闭合时,按键开关在闭合时不会马上稳定地接通,在断开时也不会马上断开,而是在闭合及断开的瞬间发生一系列的抖动,时间一般为5ms~10ms,如下图所示:故应考虑对按键时进行去抖操作。
这里去抖用到了一个状态机,具体如下:其中,按键按下时为低电平,松开后为高电平。
去抖用的频率为200HZ,当连续两次采样都为低电平时,认为按键稳定按下,在按键稳定按下后,采样到按键为高电平时,认为按键释放。
4、状态机设计(1)状态转移:当按下key1或者key2且检测到时间上升沿到来,状态机中将发生状态转移,且不论在什么状态,按下reset键时都将回到idle状态。
这里在记录状态和显示状态之间加入了一些“中间状态”,其目的是为了避免一次按键时间过长而导致认为其进行了多次按键的情况。
状态转移图如下所示:其中,a表示第一个按键(开始、记录),b表示第二个按键(显示、复位),idle为理想状态也是初始状态,r1、r2、r3为三个记录状态,d1、d2、d3为三个显示状态,m1~m7为7个中间状态。
(2)计时与监视:在“开始状态”之后,若没有按下reset键,都将一直进行计时,且记录的过程中数码管需要一直显示当前计时,于是数码管需要对当前时间进行不停得“监视”。
监视的过程中就涉及到计时,这里计时其实是用计数器来实现的,即每当分频后(这里分频为100mHZ,即0.01s)的时钟上升沿到来时,就使数码管最低位(即0.01位)加一,以此来实现计时。
5、数码管的显示:由于数码管的四个数字采用同一组控制开关,即共阴极、共阳极,所以如果直接开启数码管显示则四个管子的显示将完全相同,原理图如下所示:故这里用“扫描”的方式来控制数码管,当扫描速度很快时人眼将无法区分,故会认为四个数码管都在一直显示。
这里的扫描的频率选取为25kHz,四个数码管的选取通过4输入多路选择器来实现。
四、程序设计1、顶层:library IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_TEXTIO.ALL;USE STD.TEXTIO.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.NUMERIC_STD.ALL;entity main isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;key1 : in STD_LOGIC;key2 : in STD_LOGIC;led : out STD_LOGIC_VECTOR(0 to 6);led_com : out STD_LOGIC_VECTOR(3 downto 0);point : out STD_LOGIC);end main;architecture Behavioral of main isCOMPONENT debouncePORT(clk_deb : IN std_logic;reset : IN std_logic;keyi : IN std_logic;keyo : OUT std_logic);END COMPONENT;COMPONENT freq_div_debouncePORT(clk : IN std_logic;clk_out : OUT std_logic);END COMPONENT;COMPONENT freq_div_displayPORT(clk : IN std_logic;clk_out : OUT std_logic);END COMPONENT;COMPONENT freq_div_timePORT(clk : IN std_logic;clk_out : OUT std_logic);END COMPONENT;COMPONENT muxPORT(clk_dis : IN std_logic;num1 : IN std_logic_vector(3 downto 0);num2 : IN std_logic_vector(3 downto 0);num3 : IN std_logic_vector(3 downto 0);num4 : IN std_logic_vector(3 downto 0);led: OUT std_logic_vector(0 to 6);led_com : OUT std_logic_vector(3 downto 0);point : OUT std_logic);END COMPONENT;COMPONENT state_machinePORT(clk_t : IN std_logic;a : IN std_logic;b : IN std_logic;reset : IN std_logic;out1 : OUT std_logic_vector(3 downto 0);out2 : OUT std_logic_vector(3 downto 0);out3 : OUT std_logic_vector(3 downto 0);out4 : OUT std_logic_vector(3 downto 0));END COMPONENT;signal o,o1,o2,o3,o4:std_logic_vector(3 downto 0);signal k1,k2,clk_debounce,clk_time,clk_display:std_logic;begin--分频--div1: freq_div_debounce PORT MAP(clk,clk_debounce);div2: freq_div_time PORT MAP(clk,clk_time);div3: freq_div_display PORT MAP(clk,clk_display);--去抖--deb1: debounce PORT MAP(clk_debounce,reset,key1,k1);deb2: debounce PORT MAP(clk_debounce,reset,key2,k2);--状态机--s: state_machine PORT MAP(clk_time,k1,k2,reset,o1,o2,o3,o4);--多路选择器--m: mux PORT MAP(clk_display,o1,o2,o3,o4,led,led_com,point); end Behavioral;2、分频:(1)去抖分频:entity freq_div_debounce isPort ( clk: in STD_LOGIC;clk_out: out STD_LOGIC);end freq_div_debounce;architecture Behavioral of freq_div_debounce is signal count :integer range 1 to 250000 :=1; --赋初值beginprocess(clk)beginif (clk ' event and clk='1') thenif count=250000 thencount<=1;elsecount<=count+1;end if;end if;end process;process(count)beginif count<=125000 thenclk_out<='0';elseclk_out<='1';end if;end process;end Behavioral;(2)计时分频:entity freq_div_time isPort ( clk : in STD_LOGIC;clk_out : out STD_LOGIC);end freq_div_time;architecture Behavioral of freq_div_time issignal count :integer range 1 to 500000 :=1; --赋初值beginprocess(clk)beginif (clk ' event and clk='1') thenif count=500000 thencount<=1;elsecount<=count+1;end if;end if;end process;process(count)beginif count<=250000 thenclk_out<='0';elseclk_out<='1';end if;end process;end Behavioral;(3)显示分频:entity freq_div_display isPort ( clk : in STD_LOGIC;clk_out : out STD_LOGIC);end freq_div_display;architecture Behavioral of freq_div_display is signal count :integer range 1 to 2500 :=1; --赋初值beginprocess(clk)beginif (clk ' event and clk='1') thenif count=2500 thencount<=1;elsecount<=count+1;end if;end if;end process;process(count)beginif count<=1250 thenclk_out<='0';elseclk_out<='1';end if;end process;end Behavioral;3、去抖:entity debounce isPort ( clk_deb : in STD_LOGIC; --200HZreset : in STD_LOGIC;keyi : in STD_LOGIC;keyo : out STD_LOGIC);end debounce;architecture Behavioral of debounce istype state_type is (idle,d1,d2);signal state: state_type :=idle;beginprocess(clk_deb,reset,keyi)beginif (reset='0') thenstate<=idle; --初始状态keyo<='1';elsif (clk_deb' event and clk_deb='1') then --时钟上升沿来到case state iswhen idle =>keyo<='1';if keyi='0' thenstate<=d1;elsestate<=idle;end if;when d1 =>keyo<='1';if keyi='0' thenstate<=d2;elsestate<=idle;end if;when d2 =>keyo<='0';if keyi='1' thenstate<=idle;elsestate<=d2;end if;end case;end if;end process;end Behavioral;4、状态机:entity state_machine isPort ( clk_t : in STD_LOGIC; --100HZa : in STD_LOGIC;b : in STD_LOGIC;reset : in STD_LOGIC;out1 : out STD_LOGIC_VECTOR(3 DOWNTO 0);out2 : out STD_LOGIC_VECTOR(3 DOWNTO 0);out3 : out STD_LOGIC_VECTOR(3 DOWNTO 0);out4 : out STD_LOGIC_VECTOR(3 DOWNTO 0)); end state_machine;architecture Behavioral of state_machine istype statetype is (idle,start,r1,r2,r3,d1,d2,d3,m1,m2,m3,m4,m5,m6,m7); signal state : statetype :=idle;--记录1--signal r1_led1 :std_logic_vector (3 downto 0); --最低位signal r1_led2 :std_logic_vector (3 downto 0);signal r1_led3 :std_logic_vector (3 downto 0);signal r1_led4 :std_logic_vector (3 downto 0); --最高位--记录2--signal r2_led1 :std_logic_vector (3 downto 0); --最低位signal r2_led2 :std_logic_vector (3 downto 0);signal r2_led3 :std_logic_vector (3 downto 0);signal r2_led4 :std_logic_vector (3 downto 0); --最高位--记录3--signal r3_led1 :std_logic_vector (3 downto 0); --最低位signal r3_led2 :std_logic_vector (3 downto 0);signal r3_led3 :std_logic_vector (3 downto 0);signal r3_led4 :std_logic_vector (3 downto 0); --最高位--计时--signal t_led1 :std_logic_vector (3 downto 0); --最低位signal t_led2 :std_logic_vector (3 downto 0);signal t_led3 :std_logic_vector (3 downto 0);signal t_led4 :std_logic_vector (3 downto 0); --最高位begin--状态转移--process(clk_t,reset,a,b)beginif (clk_t' event and clk_t='1') thenif (reset='0') thenstate<=idle;elsecase state iswhen idle => if a='0' then state<= start; else state<= idle;end if;when start=> if a='1' then state<= m1; else state<= start;end if;when m1=> if a='0' then state<=r1;else state<=m1;end if;when r1=> if a='1' then state<=m2;else state<=r1;end if;when m2=> if a='0' then state<=r2;else state<=m2;end if;when r2=> if a='1' then state<=m3;else state<=r2;end if;when m3=> if a='0' then state<=r3;else state<=m3;end if;when r3=> if a='1' then state<=m4;else state<=r3;end if;when m4=> if b='0' then state<=d1;else state<=m4;end if;when d1=> if b='1' then state<=m5;else state<=d1;end if;when m5=> if b='0' then state<=d2;else state<=m5;end if;when d2=> if b='1' then state<=m6;else state<=d2;end if;when m6=> if b='0' then state<=d3;else state<=m6;end if;when d3=> if b='1' then state<=m7;else state<=d3;end if;when m7=> if b='0' then state<=idle;else state<=m7;end if;end case;end if;end if;end process;--计时(监视)--process(clk_t,reset,state)beginif (clk_t' event and clk_t='1') thenif reset='0' then --复位t_led1<="0000";t_led2<="0000";t_led3<="0000";t_led4<="0000";elsecase state iswhen idle => --初始状态t_led1<="0000";t_led2<="0000";t_led3<="0000";t_led4<="0000";when others =>if t_led1="1001" then --如果等于9,则清0,且进位t_led1<="0000";if t_led2="1001" thent_led2<="0000";if t_led3="1001" thent_led3<="0000";if t_led4="1001" thent_led4<="0000";elset_led4<=t_led4+1;end if;elset_led3<=t_led3+1;end if;elset_led2<=t_led2+1;end if;elset_led1<=t_led1+1;end if;end case;end if;end if;end process;--记录--process(clk_t,state)beginif (clk_t' event and clk_t='1') thencase state iswhen idle =>r1_led1<="0000";r1_led2<="0000";r1_led3<="0000";r1_led4<="0000";r2_led1<="0000";r2_led2<="0000";r2_led3<="0000";r2_led4<="0000";r3_led1<="0000";r3_led2<="0000";r3_led3<="0000";r3_led4<="0000";when r1 =>r1_led1<=t_led1;r1_led3<=t_led3;r1_led4<=t_led4;when r2 =>r2_led1<=t_led1;r2_led2<=t_led2;r2_led3<=t_led3;r2_led4<=t_led4;when r3=>r3_led1<=t_led1;r3_led2<=t_led2;r3_led3<=t_led3;r3_led4<=t_led4;when others => NULL;end case;end if;end process;--数码管数字--process(clk_t,reset,state)beginif (clk_t' event and clk_t='1') thencase state iswhen idle =>out1<= "0000";out2<= "0000";out3<= "0000";out4<= "0000";when d1|m5 =>out1<= r1_led1;out2<= r1_led2;out3<= r1_led3;out4<= r1_led4;when d2|m6 =>out1<= r2_led1;out2<= r2_led2;out3<= r2_led3;out4<= r2_led4;when d3|m7 =>out1<= r3_led1;out2<= r3_led2;out4<= r3_led4;when others =>out1<= t_led1;out2<= t_led2;out3<= t_led3;out4<= t_led4;end case;end if;end process;end Behavioral;5、多路选择器:entity mux isPort ( clk_dis : in STD_LOGIC; --25kHZnum1 : in STD_LOGIC_VECTOR(3 downto 0); --最低位num2 : in STD_LOGIC_VECTOR(3 downto 0);num3 : in STD_LOGIC_VECTOR(3 downto 0);num4 : in STD_LOGIC_VECTOR(3 downto 0); --最高位led :out STD_LOGIC_VECTOR (0 to 6); --a to gled_com : out STD_LOGIC_VECTOR(3 downto 0); --最高位downto 最低位point : out STD_LOGIC);end mux;architecture Behavioral of mux issignal count:integer range 1 to 4 :=1;signal num : std_logic_vector(3 downto 0);beginprocess(clk_dis) --计数beginif (clk_dis' event and clk_dis='1') thenif count=4 thencount<=1;elsecount<=count+1;end if;end if;end process;process(clk_dis,count,num1,num2,num3,num4) --选择begincase count iswhen 1 => num<=num1;led_com<="1110";point<='1';when 2 => num<=num2;led_com<="1101";point<='1';when 3 => num<=num3;led_com<="1011";point<='0';when 4 => num<=num4;led_com<="0111";point<='1';end case;end process;process(num) --数码管显示begincase num iswhen "0000" => led<="0000001"; --0,数码管:a-gwhen "0001" => led<="1001111";when "0010" => led<="0010010";when "0011" => led<="0000110";when "0100" => led<="1001100";when "0101" => led<="0100100";when "0110" => led<="0100000";when "0111" => led<="0001111";when "1000" => led<="0000000";when "1001" => led<="0000100"; --9when others => led<="0000000"; --其他end case;end process;end Behavioral;五、仿真与硬件调试1、仿真(1)顶层仿真1.仿真文件:ENTITY test_STOPWATCH ISEND test_STOPWA TCH;ARCHITECTURE behavior OF test_STOPWATCH IS-- Component Declaration for the Unit Under Test (UUT)COMPONENT mainPORT(clk : IN std_logic;reset : IN std_logic;key1 : IN std_logic;key2 : IN std_logic;led : OUT std_logic_vector(6 downto 0);led_com : OUT std_logic_vector(3 downto 0);point : OUT std_logic);END COMPONENT;--Inputssignal clk : std_logic := '0';signal reset : std_logic := '1';signal key1 : std_logic := '1';signal key2 : std_logic := '1';--Outputssignal led : std_logic_vector(6 downto 0);signal led_com : std_logic_vector(3 downto 0);signal point : std_logic;BEGIN-- Instantiate the Unit Under Test (UUT)uut: main PORT MAP (clk => clk,reset => reset,key1 => key1,key2 => key2,led => led,led_com => led_com,point => point);-- Clock process definitionsprocessbeginclk<='0';wait for 10 ns;clk<='1';wait for 10 ns;end process;-- Stimulus processstim_proc: processbeginkey1 <= '1';key2 <= '1';wait for 25 ms;key1 <= '0';key2 <= '1';wait for 25 ms;key1 <= '1';key2 <= '1';wait for 25 ms;key2 <= '1';wait for 25 ms; key1 <= '1'; key2 <= '1';wait for 25 ms; key1 <= '0'; key2 <= '1';wait for 25 ms; key1 <= '0'; key2 <= '1';wait for 25 ms; key1 <= '1'; key2 <= '1';wait for 25 ms; key1 <= '0'; key2 <= '1';wait for 25 ms; key1 <= '1'; key2 <= '1';wait for 25 ms; key1 <= '1'; key2 <= '0';wait for 25 ms; key1 <= '1'; key2 <= '1';wait for 25 ms; key1 <= '1'; key2 <= '0';wait for 25 ms; key1 <= '1'; key2 <= '0';wait for 25 ms; key1 <= '1'; key2 <= '0';wait for 25 ms;key2 <= '1';wait for 25 ms;key1 <= '1';key2 <= '0';wait for 25 ms;key1 <= '1';key2 <= '1';wait for 25 ms;key1 <= '1';key2 <= '0';wait for 25 ms;key1 <= '1';key2 <= '1';-- insert stimulus herewait;end process;END;2.仿真结果:(2)分频仿真1.仿真文件:LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY text_freq_div_debounce ISEND text_freq_div_debounce;ARCHITECTURE behavior OF text_freq_div_debounce IS-- Component Declaration for the Unit Under Test (UUT)COMPONENT freq_div_debouncePORT(clk : IN std_logic;clk_out : OUT std_logic);END COMPONENT;--Inputssignal clk : std_logic := '0';--Outputssignal clk_out : std_logic;BEGIN-- Instantiate the Unit Under Test (UUT)uut: freq_div_debounce PORT MAP (clk => clk,clk_out => clk_out);processbeginwait for 10 ns;clk<='1';wait for 10 ns;clk<='0';end process;END;2.仿真结果:2、硬件调试(1)管脚配置:NET "clk" LOC = P128;NET "reset" LOC = P47; #sw_3 NET "key1" LOC = P38; #sw_1 NET "key2" LOC = P41; #sw_2NET "led[0]" LOC = P52; #a NET "led[1]" LOC = p75;NET "led[2]" LOC = p58;NET "led[3]" LOC = p76;NET "led[4]" LOC = p77;NET "led[5]" LOC = p54;NET "led[6]" LOC = p53; #g NET "point" LOC = p66; #pointNET "led_com[0]" LOC = p81; NET "led_com[1]" LOC = p85; NET "led_com[2]" LOC = p83; NET "led_com[3]" LOC = p82;(2)调试结果:上图为初始状态,即尚未开始计时,此时显示为“00.00”。