目 录
摘要 I
第一章 课题背景 1
1.1 电子技术课程设计概要
1.1.1 电子技术课程设计的目的与意义 1
1.1.2 电子技术课程设计的方法和步骤 1
1.2 设计任务与要求 3
1.2.1 数字钟的设计目的 3
1.2.1 数字钟的设计要求 3
第二章 设计简介及设计方案论述 4
2.1 基本设计思路 4
2.2 设计方案论述 4
第三章 详细设计及参数计算 5 3.1 秒脉冲的产生 5
3.2 时钟显示电路设计 5
3.2.1 秒计数、译码及显示部分的设计 5
3.2.2 分计数、译码及显示部分的设计 6
3.2.3 时计数、译码及显示部分的设计 7
3.3 报时电路设计 7
3.4 调试、校准电路及参数计算 7 第四章 设计结果及分析 8
总结 9参考文献 10
第一章 课题背景
1.1 电子技术课程设计概要
1.1.1 电子技术课程设计的目的与意义
电子技术是一门实践性很强的课程,加强工程训练,特别是技能的培养,对于培养工程人员的素质和能力具有十分重要的作用。在电子信息类本科教学中,课程设计是一个重要的实践环节,它包括选择课题、电子电路设计、组装、调试和编写总结报告等实践内容。
通过课程设计要实现以下两个目标:一、学生初步掌握电子线路的设计、组装及调试方法。即学生根据设计要求,查阅文献资料,收集、分析类似电路的性能,并通过组装调试等实践活动,使电路达到性能要求;二、课程设计为后续的毕业设计打好基础。毕业设计是系统的工程设计实践,而课程设计的着眼点是让学生开始从理论学习的轨道上逐渐引向实际方面,运用已学过的分析和设计电路的理论知识,逐步掌握工程设计的步骤和方法,同时,课程设计报告的书写,为今后从事技术工作撰写科技报告和技术资料打下基础。
1.1.2 电子技术课程设计的方法和步骤
电子电路设计方法
在设计一个电子电路系统时,首先必须明确系统的设计任务,根据任务进行方案选择,然后对方案中的各部分进行单元电路的设计、参数计算和器件选择,最后将各部分连接在一起,画出一个符合设计要求的系统电路图。
一、明确系统的设计任务要求
对系统的设计任务进行具体分析,充分了解系统的性能、指标、内容及要求,以便明确系统应完成的任务。
二、方案选择
把系统要完成的任务分解为若干个单元电路,并画出一个能表示各单元功能 1
的整机原理框图。
方案选择的重要任务是根据掌握的知识和资料,针对系统提出的任务、要求和条件,完成系统的功能设计。在此过程中要敢于探索,勇于创新,争取方案的设计合理、可靠、经济、功能齐全、技术先进。并且对方案要不断进行可行性和优缺点的分析,最后设计出一个完整框图。
三、单元电路的设计、参数计算和器件选择
根据系统的指标和功能框图,明确各部分任务,进行各单元电路设计、参数计算和器件选择。
1.单元电路的设计
单元电路是整机的一部分,只有把单元电路设计好才能提高整机设计水平。 每个单元电路设计前都需明确本单元电路的任务,详细拟订出单元电路的性能指标,与前后级之间的联系,分析电路的组成形式。具体设计时,可以模仿成熟的先进的电路,也可以创新或改进,但都必须保证性能要求。而且,不仅单元电路本身要求设计合理,各单元电路间也要互相配合,注意各部分的输入、输出信号和控制信号的关系。
2.参数计算
为保证单元电路达到功能指标要求,就需要用电子技术知识对参数进行计算,例如振荡器中电阻、电容、振荡频率等参数。只有很好地理解电路的工作原理,正确利用计算公式,计算的参数才能满足设计要求。计算参数时,同一个电路可能有几组数据,注意选择一组能完成电路设计功能、在实践中真正可行的参数。
3.器件选择
(1) 阻容元件的选择注意功耗、容量、频率和耐压范围是否满足要求。
(2) 分立元件的选择包括电阻、电容等。根据他们的用途分别进行合理选择。
(3) 集成电路的选择根据电路功能、性能指标选择集成电路。注意集成电路的功耗、电源电压、工作速度是否满足设计要求。
通过查阅有关设计手册,进行元器件的选择。
2
四、电路图的绘制
电路图通常是在系统框图、单元电路设计、参数计算和器件选择的基础上绘制的,它是电路组装、调试和维修的依据。绘制电路图时,注意以下几点:
(1) 元器件布局合理、排列均匀、图面清晰、便于阅读。
(2) 注意信号流向。一般从输入端或信号源开始,由左至右或上至下按信号的流向依次画出各单元电路,而反馈通路的信号流向则与此相反。
(3) 图形符号标准,适当标注。
(4) 连线应为直线,尽量少交叉和折弯。
1.2 设计任务与要求
1.2.1 数字钟的设计目的
1. 掌握数字电子钟的设计方法;
2. 掌握常用数字集成电路的功能和使用。
1.2.1 数字钟的设计要求
1.时钟显示功能,能够十进制显示“时”、“分”、“秒”;
2.秒脉冲、分脉冲、小时脉冲分别能进行自行进位;
3.具有整点报时功能(属于拓展部分)。
3
第二章
设计简介及设计方案论述
2.1 基本设计思路
图2-1数字电子钟原理框图
数字电子钟原理如 图2-1所示。一个具有计时、显示等基本功能的数字钟主要由振荡器、计数器、译码器、显示器等四部分组成。多谐振荡器产生的信号输送到秒脉冲,秒脉冲送入计数器计数,计数结果通过“时”、“分”、“秒”译码器译码,并通过显示器显示时间。
2.2 设计方案论述
多谐振荡器产生稳定的 “秒”计时信号(1Hz)。对“秒”计时信号进行60进制计数,形成“分”计时信号和秒计数值;再对“分”计时信号进行60进制计数,形成“时”计时信号和分计数值;进一步对“时”计时信号进行24进制计数得到时计数值。秒计数值、分计数值和时计数值译码显示时间。
4
第三章 详细设计
3.1 秒脉冲的产生
图3-1秒脉冲发生器
脉冲发生器是数字钟的核心部分,它的精度和稳定度决定了数字钟的质量,通常用晶体振荡器产生标准频率信号经过整形、分频获得1Hz的秒脉冲。但由于实验器材条件受限,本实验只得采用555多谐振荡器获得1Hz的脉冲输出,电路图如图3-1所示。
3.2 时钟显示电路设计
3.2.1 秒计数、译码及显示部分的设计
图 3-2秒计数译码电路
5
4511 4511
秒计数器为M=60的计数器,即显示00~59,采用中规模集成电路双十进制计数器至少需要2片,因为10 < M < 100。它的个位为十进制,十位为六进制。本电路采用两片74LS90实现。当个位计数至1010时,R0(1)=1,R0(2)=1,清零端清零,当达到0000时,产生下降脉冲送给十位。十位计数至0110时清零。
3.2.2 分计数、译码及显示部分的设计
4511 4511
图3-3分计数译码电路
分计数器同秒计数器一样为M=60的计数器,即显示00~59,采用中规模集成电路双十进制计数器至少需要2片,因为10 < M < 100。它的个位为十进制,十位为六进制。本电路采用两片74LS90实现。当秒计数器十位计数至0110时清零,达到0000时产生下降沿脉冲送入分计数器的个位开始计数。当个位计数至1010时清零产生下降脉冲送给十位。十位计数至0110时继续清零。
3.2.3 时计数、译码及显示部分的设计
6
4511 4511
图3-4时计数译码电路
时为二十四进制计数器,显示为00~23,个位仍为十进制,而十位为三进制,但当十进位计到2,而个位计到4时清零,就为二十四进制了。时计数进位类似于分和秒。译码器都使用CC4511。
3.3 报时电路设计(拓展部分)
当计数至59分59秒时电路报时,所以将秒计数电路74LS90输出 0101 1001连到四输入与非门芯片 7421上,输出端连至蜂鸣器的一端。分计数器也如此,输出端连至蜂鸣器的另一端即可,这样即可实现报时功能。
3.4 调试校准电路及参数计算
将秒十位置零端信号经过一个开关再送入分个位端,分电路即可有两种信号接入进行校准。
由于秒脉冲的频率为1Hz,根据555多谐振荡器的周期计算公式T=0.7
(R1+2R2)*C可以分别确定某一组参数的数值,再联系实际,可采用以下参数:R1=15K R2=68K C=10uF 。
7
第四章 设计结果及分析
图 4-1实验结果显示
本次实验基本达到了老师的要求,实现了数字钟的时钟显示功能,分钟、时钟均能自动进位等功能。
8
总结
通过本次实验对输电知识有了更深入的了解,将其运用到了实际中来,明白了学习电子技术基础的意义,也达到了其培养的目的。在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。
在进行电路连接的时候,在确保一切都连接无误之后,秒钟显示还是有一点小问题(偶尔会在计数到达39时,计数突然从0开始计数到9,然后跳为40,接下来才正常计数),不过,经过老师的指导,我们将两片74LS90调换位置,之后就没有出现勤勉的问题了。
成功就是在不断摸索中前进实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。
9
参考文献
《电子线路设计、实验与测试》谢自美,华中科技大学出版社;
《电子线路实验——数字电路实验》,沈小丰主编,清华大学出版社; 《电子技术基础》数字部分,康华光主编,高等教育出版社,第五版; 百度网站
维库电子市场网
10
第二篇:数字钟VHDL设计报告(EDA)
设 计 报 告
课程名称 在系统编程技术
任课教师 查长军
设计题目 数字时钟
班级 通信(1)班
姓名 王兵
学号 0805070345
日期 2011、5、18
目 录
摘要:... 1
关键词:数字钟 EDA VHDL语言... 1
一、设计目的... 1
二、设计内容... 1
三、设计原理... 2
1、数字钟的基本工作原理:... 2
2、数字钟设计的电路原理图... 3
3、VHDL 设计... 3
四、设计仪器、设备... 4
五、设计步骤... 5
1、用VHDL程序设计... 5
步骤1:为本项设计建立文件夹... 5
步骤2:输入设计项目和存盘... 5
步骤3:选择目标器件并编译... 6
步骤4:时序仿真... 6
步骤5:引脚锁定... 9
步骤6:编程下载... 9
2、实验箱显示... 10
六、总结... 11
参考文献... 11
附录:... 11
摘要:
人类社会已进入到高度发达的信息化社会。信息化社会的发展离不开电子信息产品开发技术、产品品质的提高和进步。电子信息产品随着科学技术的进步,其电子器件和设计方法更新换代的速度日新月异。实现这种进步的主要原因就是电子设计技术和电子制造技术的发展,其核心就是电子设计自动化(EDA,Electronics Design Automation)技术,EDA技术的发展和推广应用又极大地推动了电子信息产业的发展。为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的一项先进技术和重要工具。目前,在国内电子技术教学和产业界的技术推广中已形成“EDA热”,完全可以说,掌握EDA技术是电子信息类专业学生、工程技术人员所必备的基本能力和技能。
EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL语言在EDA平台上设计一个电子数字钟,它的计时周期为24小时,显示满刻度为24时59分59秒,另外还具有校时功能和闹钟功能。总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数和设置程序模块、比较器程序模块、三输入数据选择器程序模块、译码显示程序模块和拼接程序模块。并且使用QUARTUS II软件进行电路波形仿真,下载到EDA实验箱进行验证。
关键词:数字钟 EDA VHDL语言
一、设计目的
1、熟练地运用数字系统的设计方法进行数字系统设计;
2、能进行较复杂的数字系统设计;
3、按要求设计一个数字钟。
二、设计内容
1、要求显示秒、分、时,显示格式如下:
图2.1 显示格式
2、可清零、可调时,具有整点报时功能。
三、设计原理
1、数字钟的基本工作原理:
数字钟以其显示时间的直观性、走时准确性作为一种计时工具,数字钟的基本组成部分离不开计数器,在控制逻辑电路的控制下完成预定的各项功能。数字钟的基本原理方框图如下:
图3.1数字钟实现原理框图
1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分
——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。产生“滴答.滴答”的报警声音。
5)LED灯在时钟显示时有花样显示信号产生。即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。显示:小时采用24进制,而分钟均是采用6进制和10进制的组合。
2、数字钟设计的电路原理图
图3.3 24进制数字钟的电路图
3、VHDL 设计
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alert IS
PORT(clk:IN STD_LOGIC;
dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
speak:OUT STD_LOGIC;
lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END alert;
ARCHITECTURE fun OF alert IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
speaker:PROCESS(clk)
BEGIN
IF(clk'event and clk='1')THEN
IF(dain="0000000")THEN
speak<=count1(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
END IF ;
END IF ;
END IF ;
END PROCESS speaker;
lamper:PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
END IF;
count<=count+1;
ELSE
count<="00";
END IF;
END IF;
END PROCESS lamper;
END fun;
注:详细的VHDL文件见附录
四、设计仪器、设备
PC机一台、GW48教学实验系统一台、下载电缆一根(已接好)
五、设计步骤
1、用VHDL程序设计
步骤1:为本项设计建立文件夹
任何一项设计都是一项工程,都必须首先为此工程建立一个放置与此工程相关的所有的文件夹,在此文件夹被EDA软件默认为工作库。一个设计项目可以包含多个设计文件,一般不同的设计项目最好放在不同的文件夹中。
注意:文件名不能使用中文,且不能带空格。
步骤2:输入设计项目和存盘
1) 打开QUARTUS||,单击“file”菜单,将鼠标移到New Project Wizard 选项单击则显示如下图内容,在其中建立项目名和实体名,项目名和实体必须保持一致,最后点击finish完成
图6.1 建立 New Project
2) 在其中点击file→new,选择原理图编辑器,在这里我们建立VHDL文件,点击确定则显示下图情况,可以在里面键入程序,如下图。
图6.2 输入程序
步骤3:选择目标器件并编译
1)在Assign选项的下拉菜单中选择器件选择项Device,如图所示。在Device Family(器件序列栏)中选定目标器件对应的序列名,EPF10K10对应的是FLEX10K系列。为了选择EPF10K10LC84-4器件,应将此栏下方标有Show only Fastest Speed Grades的勾消去,以便显示出所有速度级别的器件。完成器件选择后,按OK键。
注意:所选器件必须与目标板的器件型号完全一致。
选择Cyclone Package:TQFP PIN:144 Speed grade:8
图6.3 选择目标板器件型号
3) 输入完程序以后点击工具栏右方一个紫色的三角符号“”,然后运行程序,如果程序出现错误在改正。
步骤4:时序仿真
1.建立波形文件:选择File->New,选择Vector Waveform File,单击OK。
图6.4 建立波形文件
2.选择Edit->End Time选项,如图6.6所示,设定仿真时间宽度。
图6.5 设置仿真时间
3.双击Name下的空白处,弹出Insert Nod or Bus对话框,单击Node Finder。
图6.6 选择添加结点设置
4.如图6.7所示选定各个选择项。
图6.7 选择结点
5.单击OK,完成引脚输入。
图6.8
6.加上输入信号后波形文件存盘。
图6.9 波形
7.运行仿真器。在Processing菜单下选择StartSimulation项,直到Simulator was successful出现,仿真结束。完成波形如图所示。
步骤5:引脚锁定
选择Assign®Pin\Location\Chip,在跳出的窗口中的Node Name栏中用键盘输入半加器的端口名,如a、b等。如果输入的端口名正确,在右侧的Pin Type栏将显示该信号的属性。输入以后如下图,设定完成以后再运行一次程序。
图6.11 引脚锁定
步骤6:编程下载
1)首先将下载线把计算机的打印机口与目标板(如开发板或实验板)连接好,打开电源
2)下载方式设定。选择MAX+plusII®Programmer选项,跳出下图左侧所示的编程器窗口,然后选择Options®Hardware Setup硬件设置选项,其窗口图中左侧所示。在其下拉菜单中选ByteBlaster(MV)编程方式。此编程方式对应计算机的并行口下载通道,“MV”是混合电压的意思,主要指对ALTERA的各类芯核电压(如5V、3.3V、2.5V与1.8V等)的FPGA/CPLD都能由此下载。此项设置只在初次装软件后第一次编程前进行,设置确定后就不必重复此设置了
图6.12 下载编译
最后点击start按钮,进入下载模式,等待下载完成以后在试验箱上进行调试检测是否正确。
2、实验箱显示
(1)任意设置时间,让其从这一时间开始显示
图6.13 设置时间
(2)时间显示为24进制,当时间显示到大23:59:59后将会从00:00:00开始显示
图6.14 数字钟为24进制显示
图6.15 时间跳变到00 00 00
六、总结
经过几周EDA实验的学习,使我受益匪浅。这不仅增强了我对EDA设计的兴趣,更掌握了基本的电路设计流程、方法以及技巧。具备了这些基本知识,为今后的自主学习奠定了良好的基础。在编写时可以相互借鉴,这样可以节省一定的时间,尤其是24进制的处理上,我们采用了简单的方法即可完成多个功能的顺利实现。此次设计不足之处是不能进行定时闹钟,这是有待改进的地方,当然我们也可以在闹钟的时候采用音乐提醒,可以和乐曲硬件演奏电路设计相结合,这样数字钟的功能才算是完美。
在设计中还是需要注意一些常见的问题,比如实体名、项目名等,还有在编写VHDL文件时,一些文件名也是需要注意的。
最后感谢査老师对我们的指导,以及同学们对我的帮助,使得实验能够顺利完成!
参考文献
1、沈明山编著,EDA技术及可编程器件应用实训 北京:科学出版社
2、崔建明主编,电工电子EDA仿真技术 北京:高等教育出版社,2004
3、李衍编著,EDA技术入门与提高王行 西安:西安电子科技大学出版社
4、侯继红, 李向东主编,EDA实用技术教程 北京:中国电力出版社
5、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计 西安:西安电子科技大学出版
附录:
VHDL设计程序
1、秒
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY second IS
PORT( clk,reset,setmin:IN STD_LOGIC;
enmin:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC; --enmin_1为59秒时的进位信号
BEGIN --enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setmin and clk); --setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1 or enmin_2); --enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THEN count<="0000000"; --若reset为0,则异步清零
ELSIF(clk 'event and clk='1')then --否则,若clk上升沿到
IF(count(3 downto 0)="1001")then --若个位计时恰好到"1001"即9
IF(count<16#60#)then --又若count小于16#60#,即60H
IF(count="1011001")then --又若已到59D
enmin_1<='1';count<="0000000";--则置进位为1及count复0
ELSE --未到59D
count<=count+7; --则加7,而+7=+1+6,即作"加6校正"
END IF;
ELSE --若count不小于16#60#(即count等于或大于16#60#)
count<="0000000"; --count复0
END IF; --END IF(count<16#60#)
ELSIF(count<16#60#)then --若个位计数未到"1001"则转此句再判
count<=count+1; --若count<16#60#则count加1
enmin_1<='0'after 100 ns; --没有发生进位
ELSE --否则,若count不小于16#60#
count<="0000000"; --则count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END PROCESS;
END fun;
2、分
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY minute IS
PORT(clk,clk1,reset,sethour:IN STD_LOGIC;
enhour:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY minute ;
ARCHITECTURE fun OF minute IS
SIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);
SIGNAL enhour_1, enhour_2: STD_LOGIC; --enmin_1为59分时的进位信号
BEGIN --enmin_2由clk调制后的手动调时脉冲信号串
daout<=count;
enhour_2<= (sethour and clk1); --sethour为手动调时控制信号,高电平有效
enhour<= (enhour_1 or enhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0') THEN --若reset为0,则异步清零
count<="0000000";
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count (3 DOWNTO 0) ="1001")THEN--若个位计时恰好到"1001"即9
IF(count <16#60#) THEN --又若count小于16#60#,即60
IF(count="1011001") THEN--又若已到59D
enhour_1<='1'; --则置进位为1
count<="0000000"; --count复0
ELSE
count<=count+7; --若count未到59D,则加7,即作"加6校正"
END IF; --使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";--count复0(有此句,则对无效状态电路可自启动)
END IF; --END IF(count<16#60#)
ELSIF (count <16#60#) THEN
count<=count+1; --若count<16#60#则count加1
enhour_1<='0' after 100 ns; --没有发生进位
ELSE
count<="0000000"; --否则,若count不小于16#60# count复0
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END process;
END fun;
3、时
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY hour IS
PORT(clk,reset:IN STD_LOGIC;
daout:out STD_LOGIC_VECTOR(5 DOWNTO 0));
END ENTITY hour;
ARCHITECTURE fun OF hour IS
SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THEN count<="000000"; --若reset=0,则异步清零
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count(3 DOWNTO 0)="1001")THEN --若个位计时恰好到"1001"即9
IF(count<16#23#)THEN --23进制
count<=count+7; --若到23D则
else
count<="000000"; --复0
END IF;
ELSIF (count<16#23#)THEN --若未到23D,则count进1
count<=count+1;
ELSE --否则清零
count<="000000";
END IF; --END IF(count(3 DOWNTO 0)="1001")
END IF; --END IF(reset='0')
END PROCESS;
END fun;
4、主程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alert IS
PORT(clk:IN STD_LOGIC;
dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
speak:OUT STD_LOGIC;
lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END alert;
ARCHITECTURE fun OF alert IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
speaker:PROCESS(clk)
BEGIN
--speak<=count1(1);
IF(clk'event and clk='1')THEN
IF(dain="0000000")THEN
speak<=count1(1);
IF(count1>="10")THEN
count1<="00";--count1为三进制加法计数器
ELSE
count1<=count1+1;
END IF ;
END IF ;
END IF ;
END PROCESS speaker;
lamper:PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";--循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
END IF;
count<=count+1;
ELSE
count<="00";
END IF;
END IF;
END PROCESS lamper;
END fun;