基于VHDL的数字闹钟设计.docx
- 文档编号:28221004
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:38
- 大小:151.96KB
基于VHDL的数字闹钟设计.docx
《基于VHDL的数字闹钟设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的数字闹钟设计.docx(38页珍藏版)》请在冰豆网上搜索。
基于VHDL的数字闹钟设计
摘要
随着EDA技术的开展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
本文介绍了基于VHDL硬件描述语言设计的多功能数字闹钟的思路和技巧。
在Quartus11开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果说明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟播放音乐功能具有一定的实际应用性。
关键词:
闹钟FPGAVHDL
第一章选题背景
1.1选题研究内容
设计一个24小时的闹钟,该闹钟由显示屏、数字键、TIME键、ALARM键、扬声器组成。
闹钟总体系统包括如下几步分组成:
用于键盘输入预置数字的键盘缓冲器;用于时钟计数的计数器;用于保存闹钟时间的闹钟存放器;用于显示的七段数码显示器及控制以上各个局部协同工作的闹钟控制器。
1.2课题研究功能
(1)计时功能:
这是本计时器设计的根本功能,可进展时、分、秒计时,并显示。
(2)闹钟功能:
如果当前时间与设置的闹钟时间一样,那么扬声器发出一段音乐,并维持一分钟。
(3)调时调分调闹钟功能:
当需要校时或者要重新设置闹钟的时间时,可通过实验箱上的按键控制。
1.3课题相关技术应用
EDA技术和硬件描述语言VHDL的根底知识,通过对工程实例的系统分析、程序设计和仿真,深入细致地讨论了它们在数字系统设计中的广泛应用。
电子设计自动化(ElectronicDesignAutomation,即EDA)技术是指包括电路系统设计、系统仿真、设计综合、PCB幅员设计和制版的一整套自动化流程。
随着计算机、集成电路和电子设计技术的高速开展,EDA技术已经渗透到百姓生活的各个角落,日益成为电子信息类产品的支柱产业。
秒表、彩灯控制器、抢答器、电梯控制器、出租车计费器、微波炉控制器、FIR滤波器、I2C控制器、DDS、序列检测器、自动售货机、函数发生器、调制解调器和UART等15个数字系统的VHDL设计X例,给用户演示了数字电路的设计方法和思路。
当今电子产品正向功能多元化,体积最小化,功耗最低化的方向开展。
它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。
EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。
第二章FPGA简介
2.1FPGA概述
FPGA是现场可编程门阵列〔FieldProgrammableGateArray〕的简称,与之相应的CPLD是复杂可编程逻辑器件〔plexProgrammableLogicDevice〕的简称,两者的功能根本一样,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。
CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。
它如同一X白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。
通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。
使用CPLA/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
这些优点使得CPLA/FPGA技术在20世纪90年代以后得到飞速的开展,同时也大大推动了EDA软件和硬件描述语言HDL的进步。
2.1.1FPGA根本构造
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。
这3种可编程电路是:
可编程逻辑模块〔CLB--ConfigurableLogicBlock〕、输入/输出模块〔IOB--I/OBlock〕和互连资源〔IR—InterconnectResource〕。
可编程逻辑模块CLB是实现逻辑功能的根本单元,它们通常规那么的排列成一个阵列,散布于整个芯片;可编程输入/输出模块〔IOB〕主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路
2.2FPGA编程原理
硬件设计需要根据各种性能指标、本钱、开发周期等因素,确定最正确的实现方案,画出系统框图,选择芯片,设计PCB并最终形成样机。
CPLD/FPGA软件设计可分为两大块:
编程语言和编程工具。
编程语言主要有VHDL和Verilog两种硬件描述语言;编程工具主要是两大厂家Altera和Xilinx的集成综合EDA软件〔如MAX+plusII、QuartusII、Foundation、ISE〕以及第三方工具〔如FPGAExpress、Modelsim、SynposysSVS等〕。
具体的设计输入方式有以下几种:
1.HDL语言方式。
HDL既可以描述底层设计,也可以描述顶层的设计,但它不容易做到较高的工作速度和芯片利用率。
用这种方式描述的工程最后所能到达的性能与设计人员的水平、经历以及综合软件有很大的关系。
2.图形方式。
可以分为电路原理图描述,状态机描述和波形描述3种形式。
有的软件3种输入方法都支持,如Active-HDL。
MAX+plusII图形输入方式只支持电路原理图描述和波形描述两种。
电路原理图方式描述比拟直观和高效,对综合软件的要求不高。
一般大都使用成熟的IP核和中小规模集成电路所搭成的现成电路,整体放到一片可编程逻辑器件的内部去,所以硬件工作速度和芯片利用率很高,但是但工程很大的时候,该方法就显得有些繁琐;状态机描述主要用来设计基于状态机思想的时序电路。
在图形的方式下定义好各个工作状态,然后在各个状态上输入转换条件以及相应的输入输出,最后生成HDL语言描述,送去综合软件综合到可编程逻辑器件的内部。
由于状态机到HDL语言有一种标准的对应描述方式,所以这种输入方式最后所能到达的工作速度和芯片利用率主要取决于综合软件;波形描述方式是基于真值表的一种图形输入方式,直接描述输入与输出的波形关系。
这种输入方式最后所能到达的工作速度和芯片利用率也是主要取决于综合软件。
2.3FPGA设计流程
一般说来,一个比拟大的完整的工程应该采用层次化的描述方法:
分为几个较大的模块,定义好各功能模块之间的接口,然后各个模块再细分去具体实现,这就是TOPDOWN〔自顶向下〕的设计方法。
目前这种高层次的设计方法已被广泛采用。
高层次设计只是定义系统的行为特征,可以不涉及实现工艺,因此还可以在厂家综合库的支持下,利用综合优化工具将高层次描述转换成针对某种工艺优化的网络表,使工艺转化变得轻而易举。
CPLD/FPGA系统设计的工作流程如图2-2所示。
系统划分①
编译器③
代码级功能仿真④
综合器⑤
适配前时序仿真⑥
适配器⑦
CPLD/FPGA实现
适配后仿真模型⑧
适配后时序仿真
适配报告⑧
ASIC实现
VHDL代码或图形方式输入②
仿真综合库
器件编程文件⑧
图2.3FPGA设计流程
第三章数字闹钟整体方案设计
3.1数字闹钟整体设计
1〕各个输入输出端口
1、CLK为外部时钟信号,RESET为复位信号。
2、KEYPAD假设其中某一位为高电平,那么表示用户按下了相应的数字键
3、当KEYDOWN为高电平,表示用户按下某一数字键。
4、当ALAR-BUTTON为高电平时,表示用户按下ALARM键。
5、当TIME-BUTTON为高电平时表示用户按下TIME键
6、DISPLAY实际上表示了4个7段数码管,用于显示时间。
7、SOUND-ALARM用于控制扬声器发声,当SOUND-ALARM=’1’时,扬声器发出蜂鸣,表示到了设定时间。
2〕各局部的组成
根据系统的设计要求,整个系统分为7个模块:
闹钟控制器,译码器,键盘缓冲器,闹钟存放器,时间计数器,显示驱动器,分频器。
3.1.1数字闹钟各局部作用
1、闹钟控制器:
整个系统正常有序工作的核心,按设计要求产生相应的控制逻辑以控制其他局部工作。
2、译码器:
可将KEYPAD信号转换为0~9的整形数,以直观地表示和处理用户输入的数字。
3、键盘缓冲器:
是一个移位存放器,暂存用户键入的数字,并且实现用户键入数字在显示器上从左到右依次显示。
4、分频器:
将较高的外部时钟频率分成每分钟一次的时钟频率,以便进展时钟计数。
5、时间计数器:
实际上是一个异步复位、异步置数的累加器,通常情况下进展时钟累加计数,必要时可置入新的时钟值,然后从该值开场新的计数。
6、闹钟存放器:
用于保存用户设置的闹钟时间,是一个异步复位存放器。
7、显示驱动器:
根据需要显示当前时间、用户设置的闹钟时间或用户通过键盘输入新的时间,同时判断当前时间是否已到了闹钟时间,实际上是一个多路选择器加比拟器。
3.2数字钟的工作原理
数字闹钟电路的根本构造由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进展计时,当计时到23时59分59秒时,再来一个计数脉冲,那么计数器清零,重新开场计时。
秒计数器的计数时钟CLK为1Hz的标准信号。
当数字闹钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过4个数码管来动态显示。
数字闹钟除了能够正常计时外,还应能够对时间进展调整。
因此,通过模式选择信号KEY1、KEY2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定闹钟分、时5个状态。
当数字闹钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位,分的进位;当数字闹钟处于调整时间状态时,被调的分或时会一秒一秒地增加;当数字钟处于闹钟定时状态时,可以设定小时和分;当计时到所设定的时刻时,speak将会被赋予梁祝音乐信号用于驱动扬声器,持续1分钟。
第四章模块电路设计
4.1模块电路图设计
图4.1-1模块电路图
4.2各模块电路设计
1)时钟控制模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityshizhongis
port(clk:
instd_logic;
md1:
instd_logic;
md2:
instd_logic_vector(1downto0);
clken:
outstd_logic;
h1,h2,m1,m2,s1,s2:
outstd_logic_vector(3downto0));
endshizhong;
architectureoneofshizhongis
signalhou1:
std_logic_vector(3downto0);
signalhou2:
std_logic_vector(3downto0);
signalmin1:
std_logic_vector(3downto0);
signalmin2:
std_logic_vector(3downto0);
signalseth1:
std_logic_vector(3downto0);
signalseth2:
std_logic_vector(3downto0);
signalsetm1:
std_logic_vector(3downto0);
signalsetm2:
std_logic_vector(3downto0);
signalsec1:
std_logic_vector(3downto0);
signalsec2:
std_logic_vector(3downto0);
begin
-----------------------------------------------小时十位
h110:
process(clk,hou2,min1,min2,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")
and(sec1="0101"andsec2="1001")then
hou1<="0000";
elsifhou1="0010"andhou2="0011"andmd1='0'
andmd2="01"then--当时间为23点且处于校时状态时
hou1<="0000";
elsif(hou2="1001"and(min1="0101"andmin2="1001")
and(sec1="0101"andsec2="1001"))or(hou2="1001"andmd1='0'andmd2="01")
then
hou1<=hou1+1;
endif;
endif;
endprocessh110;
-----------------------------------------------小时个位
h220:
process(clk,min1,min2,sec1,sec2,md1,md2,hou1)
begin
ifclk'eventandclk='1'then
if(hou1="0010"andhou2="0011")and(min1="0101"andmin2="1001")
and(sec1="0101"andsec2="1001")then
hou2<="0000";
elsifhou2="1001"and(min1="0101"andmin2="1001")
and(sec1="0101"andsec2="1001")then
hou2<="0000";
elsif(hou2="1001"andmd1='0'andmd2="01")
or(hou1="0010"andhou2="0011")then
hou2<="0000";--md<='1';--
elsif((min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001"))
or(md1='0'andmd2="01")then
hou2<=hou2+1;--speak<=clk;--
endif;
endif;
endprocessh220;
-----------------------------------------------分钟十位
m110:
process(clk,min2,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
if(min1="0101"andmin2="1001")and(sec1="0101"andsec2="1001")then
min1<="0000";
elsifmin1="0101"andmin2="1001"and(md1='0'andmd2="00")then
min1<="0000";
elsif(min2="1001"and(sec1="0101"andsec2="1001"))
or(min2="1001"andmd1='0'andmd2="00")then
min1<=min1+1;
endif;
endif;--endif;
endprocessm110;
----------------------------------------------分钟个位
m220:
process(clk,sec1,sec2,md1,md2)
begin
ifclk'eventandclk='1'then
ifmin2="1001"and(sec1="0101"andsec2="1001")then
min2<="0000";
elsifmin2="1001"and(md1='0'andmd2="00")then
min2<="0000";
elseif(sec1="0101"andsec2="1001")or(md1='0'andmd2="00")then
min2<=min2+1;
endif;
endif;endif;
endprocessm220;
---------------------------------------------秒十位
s110:
process(clk)
begin
ifclk'eventandclk='1'then
if(sec1="0101"andsec2="1001")then
sec1<="0000";
elseifsec2="1001"then
sec1<=sec1+1;
endif;
endif;endif;
endprocesss110;
--------------------------------------------秒个位
s220:
process(clk)
begin
ifclk'eventandclk='1'then
ifsec2="1001"then
sec2<="0000";
elsesec2<=sec2+1;
endif;
endif;
endprocesss220;
-------------------------------------------时间设置小时局部
sethour1:
process(clk,seth2)
begin
ifclk'eventandclk='1'then
ifseth1="0010"andseth2="0011"then
seth1<="0000";
elsifseth2="1001"then
seth1<=seth1+1;
endif;
endif;
endprocesssethour1;
sethour2:
process(clk,md1,md2,seth1)
begin
ifclk'eventandclk='1'then
if(seth1="0010"andseth2="0011")orseth2="1001"then
seth2<="0000";
elsifmd1='1'andmd2="00"then
seth2<=seth2+1;
endif;
endif;
endprocesssethour2;
-------------------------------------------时间设置分钟局部
setmin1:
process(clk,setm2)
begin
ifclk'eventandclk='1'then
ifsetm1="0101"andsetm2="1001"then
setm1<="0000";
elsifsetm2="1001"then
setm1<=setm1+1;
endif;
endif;
endprocesssetmin1;
setmin2:
process(clk,md1,md2)
begin
ifclk'eventandclk='1'then
ifsetm2="1001"then
setm2<="0000";
elsifmd1='1'andmd2="01"then
setm2<=setm2+1;
endif;
endif;
endprocesssetmin2;
--------------------------------------------闹铃
speaker:
process(clk,hou1,hou2,min1,min2)
begin
ifclk'eventandclk='1'then
ifseth1=hou1andseth2=hou2andsetm1=min1andsetm2=min2then
clken<='1';
elseclken<='0';
endif;
endif;
endprocessspeaker;
disp:
process(md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2)
begin
ifmd1='0'then---------------计时时间显示和设置模式
h1<=hou1;h2<=hou2;
m1<=min1;m2<=min2;
s1<=sec1;s2<=sec2;
else-----------闹铃时间现实和设置模式
h1<=seth1;h2<=seth2;
m1<=setm1;m2<=setm2;
s1<="1111";s2<="1111";
endif;
endprocessdisp;
endone;
3〕乐曲演奏模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSpeakeraIS
PORT(clk:
INSTD_LOGIC;
Tone:
INSTD_LOGIC_VECTOR(10DOWNTO0);
SpkS:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFSpeakeraIS
SIGNALPreCLK,FullSpkS:
STD_LOGIC;
BEGIN
DivideCLK:
PROCESS(clk)
VARIABLECount4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PreCLK<='0';--将CLK进展16分频,PreCLK为CLK的16分频
IFCount4>11THENPreCLK<='1';Count4:
="0000";
ELSIFclk'EVENTANDclk='1'THENCount4:
=Count4+1;
ENDIF;
ENDPROCESS;
GenSpkS:
PROCESS(PreCLK,Tone)--11位可预置计数器
VARIABLECount11:
STD_LOGIC_VECTOR(10DOWNTO0);
BEGIN
IFPreCLK'EVENTANDPreCLK='1'THEN
IFCount11=16#7FF#THENCount11:
=Tone;FullSpkS<='1';
ELSECount11:
=Count11+1;FullSpkS<='0';ENDIF;
ENDIF;
EN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 数字 闹钟 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)