数字逻辑电路(数电)课程设计_电子秒表_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.情感态度价值观目标:通过学习秒表,培养学生对科学技术的兴趣和好奇心,提高学生的问题解决能力和团队合作意识。
二、教学内容本课程的教学内容主要包括以下几个部分:1.秒表的基本原理:介绍秒表的工作原理,包括时间计算、计数器等基本概念。
2.秒表的使用方法:教授学生如何正确使用秒表进行时间测量和计数,包括操作步骤和注意事项。
3.秒表的故障排查和维修:培养学生对秒表故障的识别和解决能力,包括常见故障的原因和维修方法。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法:1.讲授法:教师通过讲解秒表的基本原理和使用方法,让学生掌握相关知识。
2.讨论法:学生分组讨论秒表的使用心得和故障解决经验,促进学生之间的交流和合作。
3.案例分析法:教师提供一些实际的案例,让学生分析并解决秒表的使用问题,培养学生的实际操作能力。
4.实验法:学生在实验室进行秒表的操作和实践,加深对秒表的理解和掌握。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选择合适的秒表教材,为学生提供系统的学习资料。
2.参考书:提供一些相关的参考书籍,供学生进一步深入学习。
3.多媒体资料:制作一些教学视频和演示文稿,帮助学生更好地理解秒表的工作原理和使用方法。
4.实验设备:准备一些秒表和相关实验设备,让学生进行实际操作和实验。
五、教学评估为了全面、客观、公正地评估学生的学习成果,本课程将采用以下评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估其学习态度和理解能力。
(商务智能)数字逻辑电路课程设计模加法器VHDL实现(含完整
电子科技大学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA数字逻辑设计实验报告实验题目: 4bit模9加法器学生姓名:指导老师:一、实验内容设计一个4bit模9加法器。
输入为两个4bit的二进制数,输出为两数相加后模9的结果。
其数学表达式为:y=(x1+x2)mod 9。
二、实验要求1、功能性要求:能够实现4bit无符号数的模9加法运算,即输入两个4比特数据时能够正确输出其相加并模9运算结果。
2、算法要求:模加法器有多种算法,可采用任意算法进行设计。
3、设计性要求:采用全加器、半加器和基本门结构化描述。
能够编写Test Bench文件,并利用Modelsim进行仿真。
在Modelsim仿真正确的基础上,能够生成bit文件并上板验证其正确性。
4、基本上板要求:在上板实验时,输入的两个4bit数采用拨码开关输入,输出采用LED灯进行显示。
三、设计思路1、整体思路:为了实现4bit无符号数的模9加法运算,可以先将两个4bit的加数a和b 先分别模9,相加之后再模9得到最终结果。
2、模9器:先找出读入的5bit数与模9后的4bit数之间的关系,画出卡诺图,再根据卡诺图得出其相应的逻辑表达式即可。
设读入的5bit数为carry、a、b、c、d,模9后得到的4bit数为w、x、y、z。
则化简后得到的逻辑表达式分别为:w = carry’ab’c’d’,x= carry’bc + carry’a’b + carry’bd + carrya’b’c’d’,y = carry’a’c + carry’cd + carry’abc’d’ + carrya’b’c’d’,z= carry’a’d + carry’acd’ + carry’abd’ + carry a’b’c’d’。
3、全加器:全加器可以实现两个1bit数a、b和进位输入cin的相加,其真值表如下所示:这里全加器由半加器和或门构成,其原理图如下:4、半加器:半加器是全加器的基本组成单元,可以实现两个1bit数a和b的相加,并将进位输出,其真值表如下:半加器由一个异或门和一个与门构成,其原理图如下所示:5、数码管显示:单个数码管一共有7个端(不含小数点),用来表示组成一个数字的7个部分,故只要找到这7个段和模9后的4bit数间的对应关系,将其画出卡诺图并化简成逻辑表达式即可。
VHDL数字秒表设计
VHDL语言课程设计-秒表设计一、设计实验目的:在MAX+plusII软件平台上,熟练运用VHDL语言,完成数字时钟设计的软件编程、编译、综合、仿真,使用EDA实验箱,实现数字秒表的硬件功能。
二、设计实验说明及要求:1、数字秒表主要由:分频器、扫描显示译码器、一百进制计数器、六十进制计数器(或十进制计数器与6进制计数器)、十二进制计数器(或二十四进制计数器)电路组成。
在整个秒表中最关键的是如何获得一个精确的100H Z计时脉冲,除此之外,数字秒表需有清零控制端,以及启动控制端、保持保持,以便数字时钟能随意停止及启动。
2、数字秒表显示由时(12或24进制任选)、分(60进制)、秒(60进制)、百分之一秒(一百进制)组成,利用扫描显示译码电路在八个数码管显示。
3、能够完成清零、启动、保持(可以使用键盘或拨码开关置数)功能。
4、时、分、秒、百分之一秒显示准确。
三、我的设计思路:1、四个十进制计数器:用来分别对百分之一秒、十分之秒、秒和分进行计数;2、两个6进制计数器:用来分别对十秒和十分进行计数;3、一个24进制计数器,用来对小时进行计数;3、分频率器:用来产生100Hz的计数脉冲;4、显示译码器:完成对显示译码的控制。
四、设计过程:1.分频器:由10MHz变为100Hz,10MHz的周期是10的(-7)次方,而100Hz 的周期是10的(-2)次方,而且方波是高低相间,只有高电平有效,所以100Hz 的周期需要取一半,即0.02秒,这样算出的分频倍数就是50000分频器代码:将10MHz脉冲变成100Hz程序:library ieee;use ieee.std_logic_1164.all;entity fenpin isport(clr,clk: in bit;q: buffer bit);end fenpin;architecture a of fenpin issignal counter:integer range 0 to 49999;beginprocess(clr,clk)beginif (clk='1' and clk'event) thenif clr='1' thencounter<=0;elsif counter=49999 thencounter<=0;q<= not q;elsecounter<=counter+1;end if;end if;end process;end a;分频器的仿真图:2.十进制计数器:原理为加法计数器,从0加到9,计到10个数时由cout进位程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity c10 isport(clr,start,clk: in bit;daout: out std_logic_vector(3 downto 0)); end c10;,architecture a of c10 issignal temp:std_logic_vector(3 downto 0); begindaout<=temp;process(clk,clr)beginif clr='1' thentemp<="0000";cout<='0';elsif (clk'event and clk='1') thenif start='1' thenif temp>="1001" thentemp<="0000";cout<='1';elsetemp<=temp+1;cout<='0';end if;end if;end process;end a;十进制计数器仿真图:3.六进制计数器:原理为加法计数器,从0 加到5计到第六个数时由cout进位。
院校资料-数字逻辑电路(数电)课程设计_电子秒表_VHDL实现(含完整源代码!!)
数字逻辑电路(数电)课程设计_电子秒表_VHDL实现(含完整源代码!!)电子科技大学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’即可。
用VHDL设计数字秒表
实验五数字秒表的设计1、分频计的设计(1)分频计的源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FP ISPORT(CLK: IN STD_LOGIC;NEWCLK: OUT STD_LOGIC);END FP;ARCHITECTURE ART OF FP ISSIGNAL CNTER: INTEGER RANGE 0 TO 10#29999#;BEGINPROCESS(CLK) ISBEGINIF CLK'EVENT AND CLK='1' THENIF CNTER=10#29999# THEN CNTER<=0;ELSE CNTER<=CNTER + 1;END IF;END IF;END PROCESS;PROCESS(CNTER) ISBEGINIF CNTER=10#29999# THEN NEWCLK<='1';ELSE NEWCLK<='0';END IF;END PROCESS;END ART;(2)分频计的封装图(1)六进制计数器的源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY TN6 ISPORT(CLK: IN STD_LOGIC;CLR: IN STD_LOGIC;ENA: IN STD_LOGIC;CQ: OUT INTEGER RANGE 0 TO 15;CARRY_OUT: OUT STD_LOGIC); END TN6;ARCHITECTURE ART OF TN6 ISSIGNAL CQI: INTEGER RANGE 0 TO 15; BEGINPROCESS(CLK,CLR,ENA) ISBEGINIF CLR='1' THEN CQI<=0;ELSIF CLK'EVENT AND CLK='1' THEN IF ENA='1' THENIF CQI<5 THEN CQI<=CQI+1;ELSE CQI<=0;END IF;END IF;END IF;END PROCESS;PROCESS(CQI) ISBEGINIF CQI=5 THEN CARRY_OUT<='1';ELSE CARRY_OUT<='0'; END IF;END PROCESS;CQ<=CQI;END ART;(2)六进制的封装图(1)十进制计数器源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY TN10 ISPORT(CLK: IN STD_LOGIC;CLR: IN STD_LOGIC;ENA: IN STD_LOGIC;CQ: OUT INTEGER RANGE 0 TO 15;CARRY_OUT: OUT STD_LOGIC); END TN10;ARCHITECTURE ART OF TN10 ISSIGNAL CQI: INTEGER RANGE 0 TO 15; BEGINPROCESS(CLK,CLR,ENA) ISBEGINIF CLR='1' THEN CQI<=0;ELSIF CLK'EVENT AND CLK='1' THEN IF ENA='1' THENIF CQI<9 THEN CQI<=CQI+1;ELSE CQI<=0;END IF;END IF;END IF;END PROCESS;PROCESS(CQI) ISBEGINIF CQI=9 THEN CARRY_OUT<='1';ELSE CARRY_OUT<='0'; END IF;END PROCESS;CQ<=CQI;END ART;(2)十进制计数器的封装图(1)扫描电路的源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SCAN ISPORT(scanclk:in std_logic;count1,Count2,count3,count4,count5,count6:in std_logic_VECTOR(3 DOWNTO 0);S:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);DOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY SCAN;ARCHITECTURE DA TAFLOW OF SCAN ISSIGNAL SS:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINPROCESS(scanclk)beginIF(scanclk'EVENT AND scanclk='1')THENIF(SS="101")THENSS<="000";ELSESS<=SS+1;END IF;END IF;END PROCESS;S<=SS;DOUT<=COUNT1 WHEN SS="000" ELSECOUNT2 WHEN SS="001" ELSECOUNT3 WHEN SS="010" ELSECOUNT4 WHEN SS="011" ELSECOUNT5 WHEN SS="100" ELSECOUNT6;END DATAFLOW;5、位码选择电路的设计(1)位码选择电路的源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY YIMA ISPORT(INP: IN STD_LOGIC_VECTOR(2 DOWNTO 0);OUTP: OUT BIT_VECTOR(7 DOWNTO 0)); END YIMA;ARCHITECTURE ART OF YIMA ISBEGINOUTP(0)<='1' WHEN INP="000" ELSE '0';OUTP(1)<='1' WHEN INP="001" ELSE '0';OUTP(2)<='1' WHEN INP="010" ELSE '0';OUTP(3)<='1' WHEN INP="011" ELSE '0';OUTP(4)<='1' WHEN INP="100" ELSE '0';OUTP(5)<='1' WHEN INP="101" ELSE '0';OUTP(6)<='1' WHEN INP="110" ELSE '0';OUTP(7)<='1' WHEN INP="111" ELSE '0';END ART;(2)位码电路的封装图6、七位数码管译码显示电路(1)七位数码管显示电路的源程序代码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DELED ISPORT(NUM: IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B,C,D,E,F,G: OUT STD_LOGIC);END DELED;ARCHITECTURE ART OF DELED ISSIGNAL LED : STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS(NUM)BEGINCASE NUM ISWHEN "0000" => LED <= "";WHEN "0001" => LED <= "";WHEN "0010" => LED <= "";WHEN "0011" => LED <= "";WHEN "0100" => LED <= "";WHEN "0101" => LED <= "";WHEN "0110" => LED <= "";WHEN "0111" => LED <= "";WHEN "1000" => LED <= "";WHEN "1001" => LED <= "";WHEN "1010" => LED <= "";WHEN "1011" => LED <= "";WHEN "1100" => LED <= "";WHEN "1101" => LED <= "";WHEN "1110" => LED <= "";WHEN OTHERS => LED <= "";END CASE;END PROCESS;A<=LED(6);B<=LED(5);C<=LED(4);D<=LED(3);E<=LED(2);F<=LED(1);G<=LED(0); END ART;(2)七位数码管电路的封装图7、数字秒表系统的连接的原理图9、数字秒表电路的分析本次设计的数字秒表由分频器、六进制计数器、十进制计数器、扫描电路、位码选择电路、七段数码管显示电路六个模块组成。
VHDL课程设计--数字秒表
基于VHDL语言的数字秒表实现2013-5-1基于VHDL语言的数字秒表实现1 设计方案1.1 系统功能要求设计一块数字秒表,能够精确反映计时时间,并完成复位、计时功能。
秒表计时的最大范围为1小时,精度为0.01秒,并可显示计时时间的分、秒、0.1秒等度量。
( 1) 具有秒表系统功能要求显示功能, 用6个数码管分别显示分、秒、0.01秒; 计时范围为00: 00: 00~ 59: 59:99。
( 2) 计时精度是0.01s;( 3) 具有启/ 停开关, 复位开关。
1. 2 总体框图根据系统设计要求, 系统的底层设计主要由六十进制计数器模块、二十四进制计数器模块、分频模块、LED显示模块组成。
系统顶层设计图如图所示:图中左边为三个输入信号en,clk,reset;分为启/ 停开关,时钟信号和复位开关。
主要模块有:模60计数器(count60),模100计数器(count100),分频器(clk_div),复位控制(control),译码器(yima),防抖模块(fdou),状态变换模块(change)。
右边是六个LED显示输出信号。
2 模块功能设计由模60计数器模块与模100计数器模块进行计数;实验室仪器可产生标准的1kHz的时钟信号,通过分频器模块产生所需的100Hz的时钟信号;复位模块可进行计数器复位操作;译码器是为了将四位二进制信号转换为LED所需的七位二进制编码;防抖模块用于消除用户按键时的抖动消除,为方便仿真,此处原始时钟信号3周期以上可产生信号;状态变换模块是为了用户按键后信号的变换及保持。
2. 1 模60计数器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count60 ISPORT( en,Reset,clk: in STD_LOGIC;qa: out STD_LOGIC_VECTOR(3 DOWNTO 0);qb: out STD_LOGIC_VECTOR(3 DOWNTO 0);rco: OUT STD_LOGIC);END count60;ARCHITECTURE a OF count60 ISBEGINprocess(clk)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb: STD_LOGIC_VECTOR(3 DOWNTO 0);beginIf Reset ='0'then tma:="0000"; tmb:="0000";elsif clk'event and clk='1' thenif en='1' thenrco<=tmb(2)and tmb(0)and tma(3)and tma(0);if tma="1001" then tma:="0000";if tmb="0101" then tmb:="0000";else tmb:=tmb+1;end if;else tma:=tma+1;end if;end if;end if;qa<=tma;qb<=tmb;end process;END a;2. 2 模100计数器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count100 ISPORT( en,Reset,clk: in STD_LOGIC;qa: out STD_LOGIC_VECTOR(3 DOWNTO 0);qb: out STD_LOGIC_VECTOR(3 DOWNTO 0);rco: OUT STD_LOGIC);END count100;ARCHITECTURE a OF count100 ISBEGINprocess(clk)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb: STD_LOGIC_VECTOR(3 DOWNTO 0);beginIf Reset ='0'then tma:="0000"; tmb:="0000";elsif clk'event and clk='1' thenif en='1' thenrco<=tmb(3)and tmb(0)and tma(3)and tma(0);if tma="1001" then tma:="0000";if tmb="1001" then tmb:="0000";else tmb:=tmb+1;end if;else tma:=tma+1;end if;end if;end if;qa<=tma;qb<=tmb;end process;END a;2. 3 分频器模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clk_div ISPORT(clk :IN STD_LOGIC;clk_out :OUT STD_LOGIC);END clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL clk_temp :STD_LOGIC;BEGINPROCESS(clk)VARIABLE counter: INTEGER RANGE 0 TO 15; BEGINIF (clk'EVENT AND clk='1') THENIF (counter = 9) THENCounter := 0;Clk_out <= '1';ELSECounter :=counter +1 ;Clk_out <= '0';END IF;END IF;END PROCESS;END rtl;2. 4 复位控制该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY control ISPORT( CLK,RST:in std_logic;CLK_OUT:out std_logic);END control;ARCHITECTURE behav OF control ISsignal clk_data:std_logic;SIGNAL CNT : INTEGER := 0;BEGINPROCESS(CLK)BEGINIF RST = '0' THEN CNT<=0 ;ELSIF CLK'EVENT AND CLK='1' THENIF CNT=2 THEN clk_data<=NOT clk_data;CNT<=0;ELSE CNT<=CNT+1;END IF;END IF;CLK_OUT<=clk_data;END PROCESS;END behav;2. 5 译码器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY yima ISPORT( num:in STD_LOGIC_VECTOR(3 downto 0);led:out STD_LOGIC_VECTOR(6 downto 0));END yima ;ARCHITECTURE a OF yima ISBEGINprocess(num)begincase num iswhen"0000"=>led<="0111111";when"0001"=>led<="0000110";when"0010"=>led<="1011011";when"0011"=>led<="1001111";when"0100"=>led<="1100110";when"0101"=>led<="1101101";when"0110"=>led<="1111101";when"0111"=>led<="0100111";when"1000"=>led<="1111111";when"1001"=>led<="1101111";when others=>led<="0000000";end case;end process;END a;2. 6 防抖模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fdou ISPORT(CLK,DIN:IN STD_LOGIC;DOUT:OUT STD_LOGIC);END ENTITY fdou;ARCHITECTURE ARC OF fdou ISSIGNAL CP:STD_LOGIC;SIGNAL JSQ:INTEGER RANGE 0 TO 3;BEGINPROCESS(CLK)BEGINIF (CLK' EVENT AND CLK= '1' ) THEN IF DIN='1' THENIF JSQ=3 THENJSQ<=JSQ;ELSEJSQ<=JSQ+1;END IF;IF JSQ=1 THENCP<='1';ELSECP<='0';END IF;ELSEJSQ<=0;END IF;END IF;DOUT<=CP;END PROCESS;END ARC ;2. 7 状态变换模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY change ISPORT( clk_in,clk:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END ENTITY change;ARCHITECTURE a OF change ISSIGNAL cp:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF (CLK' EVENT AND CLK= '1' ) THEN IF (clk_in ='1') THENcp<='0';ELSEcp<='1';END IF;END IF;clk_out<=CP;END PROCESS;END a ;3仿真波形及分析各部分模块完成后, 用Quartus 对程序编译、仿真、得到的仿真波形,各模块仿真波形及顶层仿真波形如下:3.1模60计数器模块仿真clk:时钟信号rst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-5,qa取值范围为0-9rco:进位信号,当qb=5,qa=9, rco=0时,clk上升沿来到后,qb=0, qa=0, rco=1;当qb=0,qa=0, rco=1时,clk上升沿来到后,qb=0, qa=1, rco=03.2模100计数器模块仿真clk:时钟信号cst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-9,qa取值范围为0-9rco:进位信号,当qb=9,qa=9, rco=0时,clk上升沿来到后,qb=0, qa=0, rco=1;当qb=0,qa=0, rco=1时,clk上升沿来到后,qb=0, qa=1, rco=03.3分频器模块仿真因时钟脉冲(为1khz)通过分频器分频后频率(为100hz)。
数字电路实验 电子节拍器 VHDL源代码
八、源代码及注释--电子节拍器--分频器组模块dividers源代码--分频器组模块通过对50MHz的外部时钟进行分频,--产生其他模块所需的各种时钟频率并输出,--有60Hz、5000Hz、3000Hz、1500Hz、1000Hz,分别用5个进程实现。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dividers is --定义实体dividersport(clk : in std_logic; --外部时钟输入clk_out60: out std_logic; --60Hz频率输出clk_out5000 : out std_logic; --5000Hz频率输出clk_out3000 : out std_logic; --3000Hz频率输出clk_out1500 : out std_logic; --1500Hz频率输出clk_out1000 : out std_logic); --1000Hz频率输出end dividers;architecture div of dividers issignal tmp5000 : integer range 0 to 4999; --分频得5000hz 的计数器大小signal tmp3000 : integer range 0 to 8332; --3000hz 3x10^9=50x10^6x60 use 3000hz signal tmp1500 : integer range 0 to 16665; --1500hzsignal tmp1000 : integer range 0 to 49999; --1000hzsignal tmp60 : integer range 0 to 416666; --60hzsignal clktmp5000 : std_logic; --分频得5000hz 的时钟信号signal clktmp3000 : std_logic;signal clktmp1500 : std_logic;signal clktmp1000 : std_logic;signal clktmp60 : std_logic;beginp5000: process(clk) --分频得5000hz 的分频器进程beginif clk'event and clk='1' then --对50MHz进行10000分频得5000hz 的频率if tmp5000=4999 then --达到5000hz 的计数器大小时归零tmp5000<=0;clktmp5000<=not clktmp5000; --5000hz 的时钟信号翻转一次elsetmp5000<=tmp5000+1; ----未达到5000hz 的计数器模值时计数器加一end if;end if;end process p5000; --分频得5000hz 的分频器进程结束p1500: process(clk) --以下各分频器原理同上beginif clk'event and clk='1' thenif tmp1500=16665 thentmp1500<=0;clktmp1500<=not clktmp1500;elsetmp1500<=tmp1500+1;end if;end if;end process p1500;p1000: process(clk)beginif clk'event and clk='1' thenif tmp1000=49999 thentmp1000<=0;clktmp1000<=not clktmp1000;elsetmp1000<=tmp1000+1;end if;end if;end process p1000;p3000: process(clk)beginif clk'event and clk='1' thenif tmp3000=8332 thentmp3000<=0;clktmp3000<=not clktmp3000;elsetmp3000<=tmp3000+1;end if;end if;end process p3000;p60: process(clk)beginif clk'event and clk='1' thenif tmp60=416666 thentmp60<=0;clktmp60<=not clktmp60;elsetmp60<=tmp60+1;end if;end if;end process p60;clk_out5000 <= clktmp5000; --输出分频得到的5000hz 频率clk_out3000 <= clktmp3000;clk_out1500 <= clktmp1500;clk_out1000 <= clktmp1000;clk_out60 <= clktmp60;end div; ———————————————————————————————————————--电子节拍器--速度设置模块set_speed源代码--速度设置模块实现速度在40至120内连续可调library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity set_speed isport(clk60 : in std_logic; --分频器60hz时钟输入vadd : in std_logic; --加按键输入vdec : in std_logic; --减按键输入clear : in std_logic; --置位键输入beat_v : out std_logic_vector(6 downto 0); --速度输出v_out0 : out std_logic_vector(3 downto 0); --速度个位二进制输出(对应0号数码管)v_out1 : out std_logic_vector(3 downto 0); --速度十位二进制输出(对应1号数码管)v_out2 : out std_logic_vector(3 downto 0)); --速度百位二进制输出(对应2号数码管)end set_speed;architecture set of set_speed issignal cn : integer range 40 to 120; --速度记录信号signal change_a : std_logic; --加按键输入按下记录信号signal change_d : std_logic; --减按键输入按下记录信号signal count_add : integer:=0; --加按键输入按下时长记录信号signal count_dec : integer:=0; --减按键输入按下时长记录信号signal a10 : integer range 0 to 99; --速度减去百位的数的记录信号signal a0 : integer range 0 to 9; --速度个位记录信号signal a1 : integer range 0 to 9; --速度十位记录信号signal a2 : integer range 0 to 1; --速度百位记录信号beginprocess(clk60,vadd,vdec)beginif clk60'event and clk60='1' thenif (vadd='1') then --若加键按下change_a<='1'; --加按键输入按下记录信号置1count_add<=count_add+1; --加按键输入按下时长记录信号加1if (count_add>60 and cn<=115) then --加按键输入按下时长记录信号大于60--即加按键按下时长大于1s(长按)--若速度小于115cn<=cn+5; --则速度连加5count_add<=count_add-60; --同时加按键输入按下时长记录信号减60 elsif (count_add>60 and cn>115) then --若速度大于115cn<=120; --速度只能增加到设置的上限120count_add<=0; --加按键输入按下时长记录信号置0change_a<='0'; --加按键输入按下记录信号置0end if;elsif (vdec='1') then --原理同加按键change_d<='1';count_dec<=count_dec+1;if (count_dec>60 and cn>=45) thencn<=cn-5;count_dec<=count_dec-60;elsif (count_dec>60 and cn<45) thencn<=40;count_dec<=0;change_d<='0';end if;elsif(vadd='0' and vdec='0') then --检测到无键按下时if (change_a='1' and count_add<60 and cn<120 ) then --若加键按下--且加按键输入按下时长记录信号小于60(短按)--且速度小于120cn<=cn+1; --则速度加1count_add<=0;change_a<='0';elsif (change_a='1' and count_add>=60 ) then --若加键长按count_add<=0;change_a<='0';if (cn<=115 ) then --原理同上cn<=cn+5;elsif (cn>115 ) thencn<=120;end if;elsif (change_d='1' and count_dec<60 and cn>40 ) then --原理同加按键cn<=cn-1;count_dec<=0;change_d<='0';elsif (change_d='1' and count_dec>=60 ) thencount_dec<=0;change_d<='0';if (cn>=45 ) thencn<=cn-5;elsif (cn<45 ) thencn<=40;end if;end if;end if;if clear ='1' then --实现置位功能cn<=80;count_add<=0;count_dec<=0;end if;if cn>=100 thena2<=1;a10<=cn-100;elsea2<=0;a10<=cn;end if;a1<= a10/10;a0<= a10-a1*10;end if;end process;v_out2<=conv_std_logic_vector(a2,4); --将速度的百位(十进制)转换为二进制后输出v_out1<=conv_std_logic_vector(a1,4);v_out0<=conv_std_logic_vector(a0,4);beat_v<=conv_std_logic_vector(cn,7); --将速度(十进制)转换为二进制后输出end set;--电子节拍器--节拍型选择模块set_rhythm源代码--节拍型选择模块可设置的节拍有1/4、2/4、3/4、4/4、3/8、6/8可选,--通过sel 按键选择,送到2个数码管显示,并把选好的节拍型输出到相关模块。
基于数字电路的电子秒表课程设计
电子秒表摘要电子秒表是一种用数字电路技术实现时、分、秒计时的装置,无机械装置,具有较长的使用寿命,因此得到了广泛的使用。
它从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。
本次实验所做电子式秒表由信号发生系统和计时系统构成,并具有清零,暂停功能。
由于需要比较稳定的信号,所以信号发生系统555定时器与电阻和电容组成的多谐振荡器构成,信号频率为100HZ。
计时系统由计数器、译码器、显示器组成。
计数器由74 LS160构成,由十进制计数器组成了一百进制和六十进制计数器,采用异步进位方式。
译码器由74LS48构成,显示器由数码管构成。
清零,暂停功能由RS触发器构成防抖动开关。
具体过程为:由晶体震荡器产生100HZ脉冲信号先进入计数器,然后传入译码器,将4位信号转化为数码管可显示的7位信号,结果以“分”、“秒”、“10毫秒”依次在数码管显示出来。
该秒表最大计时值为59分59.99秒,“10毫秒”为一百进制计数器组成,“分”和“秒”为六十进制计数器组成。
关键词:计时精度计数器显示器AbstractElectronic stopwatch is the realization of a digital circuit technology,.It can realize the hour, minute, second timer.It does not have mechanical means and has a longer life, so it has been widely used. The principle is a typical digital circuit, which includes a combination logic circuit and a timing circuit. The experiments can be done by electronic stopwatch constituted by the signal system and timing system, and has cleared pause function. Due to the need of a more stable signal, the signal generating system is constituted by the 555 Timer with the resistors and capacitors, and the signal frequency is 100Hz. Timing system contains the counter, decoder, display. Counter 74 LS160 constituted by the decimal counter the decimal and sexagesimal counter, which uses asynchronous binary. The decoder from 74LS48 constitute display digital tube constitute Cleared, the pause function by the RS flip-flop. Its specific process: the 100Hz pulse signal generated by the crystal oscillator and first into the counter, and then the incoming decoder, a 4-bit signal is converted to 7-bit signal of the digital control can be displayed, the result by "minute", "second", "10 milliseconds" turn on the digital display. The stopwatch timing is 59 minutes, 59.99 seconds, 10 milliseconds is the 150 binary counter, "minute" and "second" is the six decimal counter.Keyword:Timing accuracy counter display目录一设计任务与要求 (1)二方案设计与论证 (1)三单元电路设计与参数计算 (6)(1)信号发生器单元电路 (6)(2)计数器单元 (9)(3)显示及译码单元电路 (12)(4)控制单元电路 (14)四总原理图及元件清单 (15)五结论与心得 (17)六参考文献 (18)一、设计任务与要求用74系列数字器件设计一个电子秒表,要求:1.以0.01秒为最小单位进行显示。
VHDL课程设计--数字秒表
基于VHDL语言的数字秒表实现2013-5-1基于VHDL语言的数字秒表实现1 设计方案1.1 系统功能要求设计一块数字秒表,能够精确反映计时时间,并完成复位、计时功能。
秒表计时的最大范围为1小时,精度为0.01秒,并可显示计时时间的分、秒、0.1秒等度量。
( 1) 具有秒表系统功能要求显示功能, 用6个数码管分别显示分、秒、0.01秒; 计时范围为00: 00: 00~ 59: 59:99。
( 2) 计时精度是0.01s;( 3) 具有启/ 停开关, 复位开关。
1. 2 总体框图根据系统设计要求, 系统的底层设计主要由六十进制计数器模块、二十四进制计数器模块、分频模块、LED显示模块组成。
系统顶层设计图如图所示:图中左边为三个输入信号en,clk,reset;分为启/ 停开关,时钟信号和复位开关。
主要模块有:模60计数器(count60),模100计数器(count100),分频器(clk_div),复位控制(control),译码器(yima),防抖模块(fdou),状态变换模块(change)。
右边是六个LED显示输出信号。
2 模块功能设计由模60计数器模块与模100计数器模块进行计数;实验室仪器可产生标准的1kHz的时钟信号,通过分频器模块产生所需的100Hz的时钟信号;复位模块可进行计数器复位操作;译码器是为了将四位二进制信号转换为LED所需的七位二进制编码;防抖模块用于消除用户按键时的抖动消除,为方便仿真,此处原始时钟信号3周期以上可产生信号;状态变换模块是为了用户按键后信号的变换及保持。
2. 1 模60计数器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count60 ISPORT( en,Reset,clk: in STD_LOGIC;qa: out STD_LOGIC_VECTOR(3 DOWNTO 0);qb: out STD_LOGIC_VECTOR(3 DOWNTO 0);rco: OUT STD_LOGIC);END count60;ARCHITECTURE a OF count60 ISBEGINprocess(clk)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb: STD_LOGIC_VECTOR(3 DOWNTO 0);beginIf Reset ='0'then tma:="0000"; tmb:="0000";elsif clk'event and clk='1' thenif en='1' thenrco<=tmb(2)and tmb(0)and tma(3)and tma(0);if tma="1001" then tma:="0000";if tmb="0101" then tmb:="0000";else tmb:=tmb+1;end if;else tma:=tma+1;end if;end if;end if;qa<=tma;qb<=tmb;end process;END a;2. 2 模100计数器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count100 ISPORT( en,Reset,clk: in STD_LOGIC;qa: out STD_LOGIC_VECTOR(3 DOWNTO 0);qb: out STD_LOGIC_VECTOR(3 DOWNTO 0);rco: OUT STD_LOGIC);END count100;ARCHITECTURE a OF count100 ISBEGINprocess(clk)variable tma: STD_LOGIC_VECTOR(3 DOWNTO 0);variable tmb: STD_LOGIC_VECTOR(3 DOWNTO 0);beginIf Reset ='0'then tma:="0000"; tmb:="0000";elsif clk'event and clk='1' thenif en='1' thenrco<=tmb(3)and tmb(0)and tma(3)and tma(0);if tma="1001" then tma:="0000";if tmb="1001" then tmb:="0000";else tmb:=tmb+1;end if;else tma:=tma+1;end if;end if;end if;qa<=tma;qb<=tmb;end process;END a;2. 3 分频器模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clk_div ISPORT(clk :IN STD_LOGIC;clk_out :OUT STD_LOGIC);END clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL clk_temp :STD_LOGIC;BEGINPROCESS(clk)VARIABLE counter: INTEGER RANGE 0 TO 15; BEGINIF (clk'EVENT AND clk='1') THENIF (counter = 9) THENCounter := 0;Clk_out <= '1';ELSECounter :=counter +1 ;Clk_out <= '0';END IF;END IF;END PROCESS;END rtl;2. 4 复位控制该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY control ISPORT( CLK,RST:in std_logic;CLK_OUT:out std_logic);END control;ARCHITECTURE behav OF control ISsignal clk_data:std_logic;SIGNAL CNT : INTEGER := 0;BEGINPROCESS(CLK)BEGINIF RST = '0' THEN CNT<=0 ;ELSIF CLK'EVENT AND CLK='1' THENIF CNT=2 THEN clk_data<=NOT clk_data;CNT<=0;ELSE CNT<=CNT+1;END IF;END IF;CLK_OUT<=clk_data;END PROCESS;END behav;2. 5 译码器该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY yima ISPORT( num:in STD_LOGIC_VECTOR(3 downto 0);led:out STD_LOGIC_VECTOR(6 downto 0));END yima ;ARCHITECTURE a OF yima ISBEGINprocess(num)begincase num iswhen"0000"=>led<="0111111";when"0001"=>led<="0000110";when"0010"=>led<="1011011";when"0011"=>led<="1001111";when"0100"=>led<="1100110";when"0101"=>led<="1101101";when"0110"=>led<="1111101";when"0111"=>led<="0100111";when"1000"=>led<="1111111";when"1001"=>led<="1101111";when others=>led<="0000000";end case;end process;END a;2. 6 防抖模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY fdou ISPORT(CLK,DIN:IN STD_LOGIC;DOUT:OUT STD_LOGIC);END ENTITY fdou;ARCHITECTURE ARC OF fdou ISSIGNAL CP:STD_LOGIC;SIGNAL JSQ:INTEGER RANGE 0 TO 3;BEGINPROCESS(CLK)BEGINIF (CLK' EVENT AND CLK= '1' ) THEN IF DIN='1' THENIF JSQ=3 THENJSQ<=JSQ;ELSEJSQ<=JSQ+1;END IF;IF JSQ=1 THENCP<='1';ELSECP<='0';END IF;ELSEJSQ<=0;END IF;END IF;DOUT<=CP;END PROCESS;END ARC ;2. 7 状态变换模块该模块部分VHDL 源程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY change ISPORT( clk_in,clk:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END ENTITY change;ARCHITECTURE a OF change ISSIGNAL cp:STD_LOGIC;BEGINPROCESS(CLK)BEGINIF (CLK' EVENT AND CLK= '1' ) THEN IF (clk_in ='1') THENcp<='0';ELSEcp<='1';END IF;END IF;clk_out<=CP;END PROCESS;END a ;3仿真波形及分析各部分模块完成后, 用Quartus 对程序编译、仿真、得到的仿真波形,各模块仿真波形及顶层仿真波形如下:3.1模60计数器模块仿真clk:时钟信号rst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-5,qa取值范围为0-9rco:进位信号,当qb=5,qa=9, rco=0时,clk上升沿来到后,qb=0, qa=0, rco=1;当qb=0,qa=0, rco=1时,clk上升沿来到后,qb=0, qa=1, rco=03.2模100计数器模块仿真clk:时钟信号cst:复位信号低电平清零en:置数端低电平不让它继续计数qb、qa:分别为输出数的十位个位,qb取值范围为0-9,qa取值范围为0-9rco:进位信号,当qb=9,qa=9, rco=0时,clk上升沿来到后,qb=0, qa=0, rco=1;当qb=0,qa=0, rco=1时,clk上升沿来到后,qb=0, qa=1, rco=03.3分频器模块仿真因时钟脉冲(为1khz)通过分频器分频后频率(为100hz)。
数字电子技术课程设计--电子秒表的设计
数字电子技术课程设计--电子秒表的设计数字电子技术课程设计课程设计题目:电子秒表的设计目录摘要 (2)1引言 (3)1.1设计目的 (3)1.2技术要求 (3)1.2.1基本要求 (3)1.2.2提高要求 (3)1.3设计内容 (3)1.4工作原理 (3)2设计框图 (4)3各个部分功能简介 (5)3.1按键去抖电路 (5)3.2控制器电路 (6)3.3时钟产生电路 (8)3.4计时电路 (9)3.5显示译码电路 (10)3.6 50000分频电路 (11)4硬件仿真 (13)4.1顶层逻辑图 (13)4.2LB0介绍 (14)4.3硬件仿真 (14)5课程设计的心得体会 (15)参考文献 (16)附录 (17)摘要本文以数字电子技术作为理论基础、以quartusⅡ软件为开发平台、以相关电路知识作为辅助,实现电子秒表电路的设计和制作。
该电子秒表可以准确显示时间,范围为00.00—99.99。
并且可以手动调节时间,随时启动、清零、暂停记录时间等。
操作起来简易、方便。
首先,本文针对电子秒表进行初步框架设计,并在对多种方案进行了认真比较和验证的基础上,又进一步详细介绍了时间脉冲发生器、秒计数器、译码及驱动显示电路。
其次,在总体电路图组装完成以后,用quartusⅡ软件对设计好的电路进行了仿真与调试,并逐一解决设计过程中出现的一系列问题。
最后,对照着电子秒表设计方案,对制作好的电子秒表功能进行总体验证。
并利用学院的LB0开发板进行硬件仿真。
关键词:电子秒表计数器分频quartusⅡ、1引言1.1设计目的1)掌握同步计数器74160,74161的使用方法,并理解其工作原理。
2)掌握用74160,74161进行计数器、分频器的设计方法。
3)掌握用三态缓冲器74244和74160,74138,7448进行动态显示扫描电路设计的方法。
4)掌握电子秒表的设计方法。
5)掌握在EDA系统软件MAX + plus Ⅱ环境下用FPGA/CPLD进行数字系统设计的方法,掌握该环境下功能仿真、时序仿真、管脚锁定和芯片下载的方法。
电子技术课程设计报告--电子秒表的设计
电子技术课程设计报告--电子秒表的设计一、设计目的本次课程设计的目的是设计一款电子秒表,实现具备暂停和复位功能的计时功能。
通过设计本次课程,我将学习到如何运用单片机实现计时功能,同时也将提高自己的电子设计能力。
二、设计原理本次设计采用AT89S52单片机作为控制芯片,通过单片机控制数码管的显示,完成对时间的计时和显示功能。
下面详细介绍如何实现设计的计时功能。
1、初始化:将计时器寄存器清零,并设置定时器为8位计时模式,同时设置时钟源为频率为12MHz的晶振。
2、启动计时:将定时器计数器初始值设置为0,同时启动计时器。
3、计时:定时器开始工作后,每过1ms,计时器的值就会加1,当计时器的值达到255时,定时器会自动清零,并触发定时溢出中断。
4、显示:将计时器的值传入程序中,经过处理后,将时间转化为时、分、秒、毫秒等信息,并通过数码管的显示完成时间的显示。
5、暂停功能:通过按下暂停键,可以停止计时器的工作,并记录下当前的计时时间。
6、复位功能:通过按下复位键,可以将计时器的值清零,并停止计时器的工作。
三、硬件设计1、主控芯片AT89S52单片机:采用AT89S52单片机作为控制核心,具有一定的处理能力和存储容量,能在实现计时功的同时,还实现一些其他的控制功能。
2、显示模块数码管:本设计采用了4位共阴数码管,能够完成对时间的显示。
3、按键模块本设计采用了两个按键,一个用于暂停功能,一个用于复位功能。
4、电源模块本设计采用了12V电源转接头,将12V电源转化为单片机和数码管所需要的5V电压。
5、其他零件晶振:采用12MHz的晶振作为单片机的时钟源。
电容:采用22pF电容和晶振配对使用,稳定时钟信号。
四、软件设计本设计采用Keil C51软件进行开发。
软件编写的主要思路如下:1、GPIO配置:定义IO口及初始化相关设置,如数码管的引脚及输出方向。
2、时钟初始化:配置外部晶振的时钟源,并初始化相应的寄存器。
3、定时器初始化:设定中断周期,选择定时器的计数模式,启动定时器,并设置中断优先级。
- 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”。