基于FPGA的数字钟设计Word文档下载推荐.docx
- 文档编号:6670944
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:38
- 大小:578.44KB
基于FPGA的数字钟设计Word文档下载推荐.docx
《基于FPGA的数字钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字钟设计Word文档下载推荐.docx(38页珍藏版)》请在冰点文库上搜索。
代码的再利用功能。
这一点很适合目前急速发展的市场需求。
1.2MAX+plusII开发环境应用简介
1、原理图输入(GraphicEditor)
MAX+PLUSII软件具有图形输入能力,用户可以方便的使用图形编辑器输入电路图,图中的元器件可以调用元件库中元器件,除调用库中的元件以外,还可以调用该软件中的符号功能形成的功能块.图形编辑器窗口见图(13)。
2、硬件描述语言输入(TextEditor)
MAX+PLUSII软件中有一个集成的文本编辑器,该编辑器支持VHDL,AHDL和Verilog硬件描述语言的输入,同时还有一个语言模板使输入程序语言更加方便,该软件可以对这些程序语言进行编译并形成可以下载配置数据,文本编辑器窗口见图(14)。
图14文本编辑器窗口
图13图形编辑器窗口
3、波形编辑器(WaveformEditor)
在进行逻辑电路的行为仿真时,需要在所设计电路的输入端加入一定的波形,波形编辑器可以生成和编辑仿真用的波形(*.SCF文件),使用该编辑器的工具条可以容易方便的生成波形和编辑波形。
波形编辑器窗口如图(15)所示。
使用时只要将欲输入波形的时间段用鼠标涂黑,然后选择工具条中的按钮,例如,如果要某一时间段为高电平,只需选择按钮”1”。
还可以使用输入的波形(*.WDF文件)经过编译生成逻辑功能块,相当于已知一个芯片的输入输出波形,但不知是何种芯片,使用该软件功能可以解决这个问题,设计出一个输入和输出波形相同CPLD电路。
4、管脚(底层)编辑窗口(FloorplanEditor)
该窗口用于将已设计好逻辑电路的输入输出节点赋予实际芯片的引脚,通过鼠标的拖拉,方便的定义管脚的功能。
管脚(底层)编辑窗口见图(16)。
图16管脚(底层)编辑窗口
图15波形编辑器窗口
5、设计规则检查
选取Compile\Processing\DesignDoctor菜单,将调出规则检查医生,该医生可以按照三种规则中的一个规则检查各个设计文件,以保证设计的可靠性。
一旦选择该菜单,在编译窗口将显示出医生,用鼠标点击医生,该医生可以告诉你程序文件的健康情况。
见图(17)。
图17规则检测医生
6、编程文件的产生
编译器中的装配程序(Assembler)将编译好的程序创建一个或多个编程目标文件:
EPROM配置文件(*.POF)例如,MAX7000S系列
SRAM文件(*.SCF)例如,FLEX8000系列的配置芯片EPROM
JEDEC文件(*.JED)
十六进制文件(*.HEX)
文本文件(*.TTF)
串行BIT流文件(*.SBF)
7、仿真
当设计文件被编译好,并在波形编辑器中将输入波形编辑完毕后,就可以进行行为仿真了,通过仿真可以检验设计的逻辑关系是否准确.
8、分析时间(AnalyzeTiming)
该功能可以分析各个信号到输出端的时间延迟,可以给出延迟矩阵和最高工作频率.见图(18)和图(19)。
图18延迟矩阵
图19最高工作频率
2电子钟的概述
2.1设计原理
数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。
秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的24MHz信号通过分频得到。
当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过6个数码管来动态显示。
数字钟除了能够正常计时外,还应能够对时间进行调整。
因此,通过模式选择信号MOD1、MOD2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定分、时5个状态。
当数字钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位,分的进位;
当数字钟处于调整时间状态时,被调的分或时会一秒一秒地增加;
当数字钟处于定时状态时,可以设定小时和分;
当计时到所设定的时刻时,speak将会被赋予1KHz的脉冲信号用于驱动扬声器.
电子钟的外形图如下:
图1电子钟的外形图
2.1整体设计框图如下
2.2数字钟在FPGA芯片中的顶层原理图如下
图3数字钟在FPGA芯片中的顶层原理图
3各模块设计
3.1外部按键
Reset键:
该键为系统复位按键,按此键可以进行时间的复位。
如:
时间显示为23:
09:
18,则按此键后时间显示了00:
00:
00;
alarm键:
该键为闹钟设定按键,按此键可以进行闹钟的任意时间设置;
stop键:
该键为时间定时设定按键,用此键可以完成时间的定时功能;
ok键:
该键作为任何设定动作的确认键,如当需要调整时间时,调整好需要的时间后,按ok键即可确认所调的时间;
调秒键、调分键、调时键,六个七段数码管。
3.2晶振电路模块
振荡器是数字钟的核心。
振荡器的稳定度及频率的精确度决定了数字钟计时的准确程度,通常选用石英晶体构成振荡器电路。
一般来说,振荡器的频率越高,计时精度越高。
电子手表集成电路中的晶体振荡器电路,取晶振的频率为32768Hz,
图4晶振电路
3.3分频器模块
为了得到秒脉冲信号,需要经过一个分频电路,主要有2个部分,一个是产生1HZ的计数频率,一个是产生128HZ的显示扫描频率,其引脚说明如下
图6分频器模块引脚说明图
其程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityd32768is
port(clk:
instd_logic;
--fromsystemclock(32hz)
f128hz:
outstd_logic;
f1hz:
outstd_logic);
--lhzoutputsignal
end;
architecturearchofd32768is--input:
clk,output:
flhz
signalcount1:
integerrange0to255;
signalcount2:
integerrange0to127;
signalf128:
std_logic;
begin--processfordividingby1M
process(clk)
begin
ifrising_edge(clk)thencount1<
=count1+1;
ifcount1=255thenf128<
='
0'
;
count1<
=0;
elsifcount1=122thenf128<
1'
endif;
endif;
endprocess;
f128hz<
=f128;
process(f128)
ifrising_edge(f128)thencount2<
=count2+1;
ifcount2=127thenf1hz<
count2<
elsifcount2=63thenf1hz<
clk:
为频率输入端
f128hz:
outstd_logic:
为译码扫描输入128HZ的频率
f1hz:
outstd_logic)为计数器模块输入1HZ的频率
3.4正常计数器模块
电子钟计时模块主要是用来实现内部定时计数功能。
计时模块的输入信号包括内部计时时钟信号clk0,输出信号就是计时信息,包括小时十位信号hr10、小时个位信号hr、分十位信号min10、分个位信号min、秒十位信号sec10、秒个位信号sec。
实现计数器模块的原理图如下:
图7计数器模块的原理图
1.秒计数:
秒计数,在频率为1HZ的时钟下以60次为循环计数,并产生进位信号影响分计数;
2.分计数:
分计数,在秒进位信号为高电平时,计数一次,同样以60次为一个循环计数,同时产生分进位信号影响时计数;
3.时计数:
时计数,在分进位信号为高电平时,计数一次,以24次为一个循环计数
count60(秒计数和分计数)源程序如下
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entitycount60is
port(carry:
--from1hzinputclockorthe
--fullindexofsecond/minute
rst:
--initialization
times:
outintegerrange0to59;
full:
--carry_outsignal
endcount60;
architecturearchofcount60is--input:
rst,carry
--output:
times,full
signaltime:
integerrange0to59;
begin
--processfor60secondscounting
process(rst,carry)
ifrst='
thentime<
full<
elsifrising_edge(carry)then
iftime=59thentime<
=0;
--over60
--carry_outsignal
elsetime<
=time+1;
--keepcounting
endprocess;
times<
=time;
endarch;
port输入时钟信号和进位信号;
times:
时间输出从0到59
full:
计数产生进位
Count24(时计数)源程序如下:
entitycount24is
--from1hzinputclockor
--thefull_indexofsecond/minute
--initialization
outintegerrange0to23;
--carry_outsignal
endcount24;
architecturearchofcount24is--input:
--output:
signaltime:
integerrange0to23;
begin--processfor60secondscounting
process(rst,carry)
iftime=23thentime<
--over24
times<
=time;
时间输出从0到23
3.5定时器模块
在此模块中,先利用stop_watch组件设定定时器的计时时间,并执行计时动作,取得计时终止指针,然后由计时终止指针标示出计时终止状态led_stop=’1’。
其模块如下图所示。
图8定时器模块图
定时器模块的源程序如下:
---inputandoutputpinsdeclaraction
entitystop_watchis
port(rst,hz1:
--systemclock1hz
stop:
--keeppushingtodeclarestopsetting
--stop:
时器设定动作按键
--ok:
任何设定动作的确认?
ok:
--keeppushingtodeclarestopsetting
sec_tune:
--pushingbuttontotuneseconds
min_tune:
--pushingbuttontotuneminutes
hour_tune:
--pushingbuttontotunehours
stop_sec,stop_min:
stop_hour:
index:
disp:
endstop_watch;
architecturearchofstop_watchis
signala_sec,a_min:
signala_hour:
process(stop,ok,hz1)
begin
ifrst='
thenindex<
disp<
elsifrising_edge(hz1)then
ifstop='
andok='
then--setting
ifsec_tune='
then
ifa_sec=59thena_sec<
elsea_sec<
=a_sec+1;
ifmin_tune='
ifa_min=59thena_min<
elsea_min<
=a_min+1;
ifhour_tune='
ifa_hour=23thena_hour<
elsea_hour<
=a_hour+1;
disp<
='
elsifstop='
andok='
then--downcounting
ifa_sec=0then
ifa_min=0then
ifa_hour=0thenindex<
;
=a_hour-1;
a_min<
=59;
a_sec<
=a_min-1;
elsea_sec<
=a_sec-1;
index<
elsedisp<
stop_sec<
=a_sec;
stop_min<
=a_min;
stop_hour<
=a_hour;
endarch;
stop:
ok:
任何设定动作的确认
stop_sec,stop_min:
秒、分计时终了的指针;
stop_hour:
小时计时终了的指针;
index:
定时器计时终了指针;
disp:
输出标准逻辑。
3.6闹钟设定模块
为了设定闹钟,我们设计了一个目标时间调整程序。
以1Hz的显示速率来调整时分秒的显示,可以适应视觉要求。
将alarm的指拨开关转成on时,6个数字即显示00:
00,以等待输入。
当持续按住调秒键sec_tune时,秒针将从0持续增加至59后,再返回O,任何时刻松开按键即显示当时的值。
调分键与调时键的动作原理相同,此时ok指拨开关仍在off状态。
图9闹钟设定与时间对比功能模块引脚说明图
闹钟设定模块的源程序如下:
entityalarm_setis--设定闹钟表时间隔
port(rst,hz1:
alarm,ok:
--keeppushingtodeclarealarmset
--alarm:
闹钟设定按键信号;
ok:
任何设定动作的确认键;
--keeppushingtodeclaresecondtuning
--keeppushingtodeclareminutetuning
--keeppushingtodeclarehourtuning
sec,min:
hour:
outintegerrange0to23);
end;
--definethesignal_structureand_flowofthedevice
architecturearchofalarm_setis
signalsec_tmp,min_tmp:
signalhour_tmp:
tuning:
process(rst,hz1,alarm,ok)
thensec_tmp<
min_tmp<
hour_tmp<
ifalarm='
ifsec_tmp=59thensec_tmp<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 数字 设计