FPGA的电子钟设计VHDL语言.docx

上传人:b****6 文档编号:7110003 上传时间:2023-01-18 格式:DOCX 页数:16 大小:29.13KB
下载 相关 举报
FPGA的电子钟设计VHDL语言.docx_第1页
第1页 / 共16页
FPGA的电子钟设计VHDL语言.docx_第2页
第2页 / 共16页
FPGA的电子钟设计VHDL语言.docx_第3页
第3页 / 共16页
FPGA的电子钟设计VHDL语言.docx_第4页
第4页 / 共16页
FPGA的电子钟设计VHDL语言.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

FPGA的电子钟设计VHDL语言.docx

《FPGA的电子钟设计VHDL语言.docx》由会员分享,可在线阅读,更多相关《FPGA的电子钟设计VHDL语言.docx(16页珍藏版)》请在冰豆网上搜索。

FPGA的电子钟设计VHDL语言.docx

FPGA的电子钟设计的电子钟设计VHDL语言语言FPGA电子钟设计报告姓名:

刘洋洋专业:

生物医学工程专业学号:

09073064老师:

田莎莎一、摘要:

近年来,随着数字集成电路技术的发展,用以前传统的方法进行芯片或系统设计已不能满足要求,迫切需要提高设计效率。

能大大降低设计难度的VHDL设计方法正在被越来越广泛的采用。

VHDL即超高速集成电路硬件描述语言,诞生于1982年。

1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。

此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。

1993年IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。

现在,VHDL作为IEEE的工业标准硬件描述语言,已成为通用硬件描述语言。

关键字:

电子钟、FPGA、VHDL语言前言:

现在电子钟产品可谓百家争鸣,市场上到处可见一些功能齐全的设备,可能基于单片机的比较多,用FPGA设计电子钟可能比较少。

因为两个都可以实现同样的功能,而FPGA芯片的价格远比单片机高。

出于利润,当然会选择开发成本少的产品。

本次设计的目的是为了检验所学的知识(VHDL语言)同时结合实践巩固知识,由于初涉该领域,相关的知识可能不够全面,实践的经验不够,所以本设计旨在能够实现该功能并达到一定的精度,对于各模块设计的优化和性能等方面没有多加考虑。

为提高精度,所以本设计采用12MHZ的CLK信号,这样产生的误差也较小。

二、总体论述:

数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。

秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的24MHz信号通过分频得到。

当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过6个数码管来动态显示。

数字钟除了能够正常计时外,还应能够对时间进行调整。

因此,通过模式选择信号MOD1、MOD2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定分、时5个状态。

当数字钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位,分的进位;当数字钟处于调整时间状态时,被调的分或时会一秒一秒地增加;当数字钟处于定时状态时,可以设定小时和分;当计时到所设定的时刻时,speak将会被赋予1KHz的脉冲信号用于驱动扬声器,持续1分钟。

三、总体框图:

计数器在正常工作下是对1HZ的频率计数,在调整时间状况下是对需要调整的时间模块进行计数;控制按键用来选择是正常计数还是调整时间并决定调整时、分、秒;置数按键按下时,表示相应的调整块要加一,如要对小时调整时,显示时间的LED管将闪烁且当置数按键按下时,相应的小时显示要加一。

动态显示模块是对计数器的计数进行译码,送到LED显示。

同学们还可以增加定时和时区切换功基准时钟置数按键实验连线输入信号:

时钟clk:

接开发板可调时钟SW7(P152),选择100KHz频率;模式选择mode:

接脉冲发生器模块EPI0;P236时间设定set:

接脉冲发生模块EPI1;P238输出信号:

Seg77.0接数码管段扫描信号O50O56、SO57;P73、74、75、76、77、78、79、82Segctr7.0接数码管位选显示信号SO58SO65;P83、84、85、86、87、88、93、94CLR;P1清零信号四、各模块功能说明及主要代码:

(1)分频器将较高速的外部时钟频率分频成每分钟一次的时钟频率,以便进行时钟计数。

(2)计数器实际上是一个异步复位、异步置数的累加器,通常情况下进行时钟累加计数,必要时可置入新的时钟值,然后从该值开始新的计数。

(3寄存器用于保存用户设置的闹钟时间,是一个异步复位寄存器。

(4)显示器根据需要显示当前时间、用户设置的闹钟时间或用户通过键盘输入的新的时间,同时判断当前时间是否已到了闹钟时间,实际上是一个多路选择器加比较器。

(5)控制器是设计的核心部分,按设计要求产生相应的控制逻辑,以控制其他各部分的工作。

(6)乐曲演奏电路,实现闹钟的功能,那时间就发出一段叫“梁祝”的乐音。

实验代码:

第一部分:

BCD为一个自定义元件,实现的功能为调整二进制加和的结果,保证为正确的BCD码libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityBCDisport(DataIn:

instd_logic_vector(5downto0);BCDOut:

outstd_logic_vector(7downto0);endBCD;architecturemainofBCDisbeginprocess(DataIn)variableinter:

std_logic_vector(13downto0);variabletest:

std_logic_vector(3downto0);begininter:

=00000000&DataIn;foriin0to5loop-调整部分算法test:

=inter(9downto6);if(test=5)thentest:

=test+3;inter(9downto6):

=test;endif;inter:

=inter(12downto0)&0;endloop;BCDOut=inter(13downto6);endprocess;endmain;第二部分:

主要程序段,顶层文件Libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityClockisport(mode,set,clr,clk:

instd_logic;seg7,segctr:

outstd_logic_vector(7downto0);endentity;ARCHITECTUREarchOFClockISsignalstate:

std_logic_vector(1downto0);signalHour,Min,Sec:

std_logic_vector(5downto0);signalBCDH,BCDM,BCDS:

std_logic_vector(7downto0);signalsegDat:

std_logic_vector(3downto0);signalblink:

std_logic_vector(2downto0);signalset_reg,blink_clk:

std_logic;componentBCDport(DataIn:

instd_logic_vector(5downto0);BCDOut:

outstd_logic_vector(7downto0);endcomponent;BEGINprocess(mode,clr)-这里进行过修改,把clr加入敏感信号可以有效减少warningsbeginif(clr=1)thenstate=00;state为正常显示,调节小时,调节分,调节秒四种循环状态elseif(modeeventandmode=1)thenstateblinkblinkblink_clk,others=0);-把blink_clk赋给blink的第二位,一会儿为0一会儿为1,以下同理when10=blinkblink_clk,others=0);when11=blinkblink_clk,others=0);endcase;endprocess;process(clk,clr)variableblink_cnt:

std_logic_vector(13downto0);beginif(clr=1)thenblink_clk0);elseif(clkeventandclk=1)thenif(blink_cnt=11000011010011)then-闪烁计数达到此值时即进行清零blink_cnt:

=(others=0);blink_clk=notblink_clk;elseblink_cnt:

=blink_cnt+1;endif;endif;endif;endprocess;process(clk,state,clr)variableclk_cnt:

std_logic_vector(16downto0);beginif(clr=1)thenHour=000000;Min=000000;Sec0);set_regif(clk_cnt=11000011010011111)then-这个数是99999,大于24*60*60=86400clk_cnt:

=(others=0);if(Sec=59)then-实现正常的计时功能Sec0);if(Min=59)thenMin0);if(Hour=23)thenHour0);elseHour=Hour+1;endif;elseMin=Min+1;endif;elseSecif(set=1)thenifset_reg=0thenset_reg=1;if(Hour=23)thenHour0);elseHour=Hour+1;endif;endif;elseset_regif(set=1)thenifset_reg=0thenset_reg=1;if(Min=59)thenMin0);elseMin=Min+1;endif;endif;elseset_regif(set=1)thenifset_reg=0thenset_reg=1;if(Sec=59)thenSec0);elseSec=Sec+1;endif;endif;elseset_reg0);segCtr0);-segCtr是控制数码管扫描位置elseif(clkeventandclk=1)then-这是扫描显示的过程cnt:

=cnt+1;casecntiswhen000=segDat=BCDH(7downto4)or(blink

(2)&blink

(2)&blink

(2)&blink

(2);-通过位与操作segctrblink

(2)=1时,数码管全亮segDat=BCDH(3downto0)or(blink

(2)&blink

(2)&blink

(2)&blink

(2);segctrsegDat=1010;segctrsegDat=BCDM(7downto4)or(blink

(1)&blink

(1)&blink

(1)&blink

(1);segctrsegDat=BCDM(3downto0)or(blink

(1)&blink

(1)&blink

(1)&blink

(1);segctrsegDat=1010;segctrsegDat=BCDS(7downto4)or(blink(0)&blink(0)&blink(0)&blink(0);segctrsegDat=BCDS(3downto0)or(blink(0)&blink(0)&blink(0)&blink(0);segctrseg7seg7seg7seg7seg7seg7seg7seg7seg7seg7seg7seg7CLK8HZ,ToneIndex=ToneIndex);U2:

ToneTabaPORTMAP(Index=ToneIndex,Tone=Tone);U3:

SpeakeraPORTMAP(clk=CLK12MHZ,Tone=Tone,SpkS=SPKOUT,en=speak);END;模块二、libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitynotetabsisport(clk:

instd_logic;speak:

instd_logic;toneindex:

outstd_logic_vector(3downto0);end;architectureoneofnotetabsiscomponentmusicport(address:

instd_logic_vector(7downto0);clock:

instd_logic;q:

outstd_logic_vector(3downto0);endcomponent;signalcounter:

std_logic_vector(7downto0);begincnt8:

process(clk,speak)beginifcounter=138thencounter=00000000;elsif(clkeventandclk=1)thenifspeak=1thencounter=counter+1;elsecountercounter,q=toneindex,clock=clk);end;模块三、libraryieee;useieee.std_logic_1164.all;entitytonetabaisport(index:

instd_logic_vector(3downto0);tone:

outstd_logic_vector(10downto0);end;architectureoneoftonetabaisbeginsearch:

process(index)begincaseindexiswhen0000=tonetonetonetonetonetonetonetonetonetonetonetonetonenull;endcase;endprocess;end;模块四、libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityspeakeraisport(clk:

instd_logic;tone:

instd_logic_vector(10downto0);spks:

outstd_logic);endentityspeakera;architectureoneofspeakeraissignalpreclk,fullspks:

std_logic;begindivideclk:

process(clk)variablecount4:

std_logic_vector(3downto0);beginpreclk11thenpreclk=1;count4:

=0000;elsifclkeventandclk=1thencount4:

=count4+1;endif;endprocessdivideclk;genspks:

process(preclk,tone)variablecount11:

std_logic_vector(10downto0);beginifpreclkeventandpreclk=1thenifcount11=16#7ff#thencount11:

=tone;fullspks=1;elsecount11:

=count11+1;fullspks=0;endif;endif;endprocess;delayspks:

process(fullspks)variablecount2:

std_logic;beginiffullspkseventandfullspks=1thencount2:

=notcount2;ifcount2=1thenspks=1;elsespks=0;endif;endif;endprocess;end;五、结论:

本实验是以md2、md1为控制整个闹钟的校时,校分,校闹钟时、分,分别将md21,md20,md1,送到实验上的三个键,由这三个键来控制整个校时,校分,校闹钟时,校闹钟分的过程,加上分别连接的键叫A,B,C键,则当A=0,B=1,C=0时是对时钟进行校时,时个位和时十位会以二十四进制循环自动增加;当A=0,B=0,C=0时是对时钟进行校分,分个位和分十位会以六十进制循环增加,并且不对时进位;当A=0,B=1,C=1时是对闹钟进行校时,闹钟时个位和时十位会以二十四进制循环自动增加;当A=0,B=0,C=1时是对闹钟进行校分,闹钟分个位和分十位会以六十进制循环增加,并且不对时进位;而当A=1,B=0,C=0或者A=1,B=1,C=0是正常的计时时间,秒从零开始计时,每秒加一,当到达五十九在来一个脉冲后,秒十位和秒个位清零,从零开始直到六十一直循环,并且向分个位清零;分位的原理同秒的一样,计数到五十九后自动清零向时进位,而时与秒,分的不同之处是,当时计数到二十四时清零并且不向任何位进位。

另外当计数的时,分和闹钟所事先设置时,分相等时,“梁祝”这首歌会响起,作为闹钟并且维持一分钟,一分钟歌曲自动停止。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1