基于FPGA的多功能电子万年历.docx
《基于FPGA的多功能电子万年历.docx》由会员分享,可在线阅读,更多相关《基于FPGA的多功能电子万年历.docx(29页珍藏版)》请在冰豆网上搜索。
基于FPGA的多功能电子万年历
湖南文理学院
芙蓉学院
课程设计报告
课程名称:
专业课程课程设计
专业班级:
芙蓉通信1101班学号(13)
*******************************
******************************
完成时间:
2014年6月17日
报告成绩:
评阅意见:
评阅教师日期
基于FPGA的多功能电子万年历的设计
一、设计要求
基于FPGA设计多功能电子万年历,其中要包括对FPGA的介绍、电子万年历的八个模块以及顶层模块的工作原理和仿真调试。
二、设计的内容及目的
1.简介并了解FPGA;
2.了解FPGA的工作原理;
3.了解万年历的工作原理,比较不同的设计方案;
4.了解万年历的八个模块及顶层模块的结构功能、工作流程,并仿真;
5.了解时钟万年的控制系统。
三、设计方案
3.1FPGA简介
PLD/FPGA是近几年集成电路中发展最快的产品。
由于PLD性能的高速发展以及设计人员自身能力的提高,可编程逻辑器件供应商将进一步扩大可编程芯片的领地,将复杂的专用芯片挤向高端和超复杂应用。
据ICInsights的数据显示,PLD市场从1999年的29亿美元增长到去年的56亿美元,几乎翻了一番。
Matas预计这种高速增长局面以后很难出现,但可编程逻辑器件依然是集成电路中最具活力和前途的产业。
复杂可编程逻辑器件。
可编程逻辑器件的两种主要类型是现场可编程门阵列(FPGA)和复杂可编程逻辑(CPLD)。
在这两类可编程逻辑器件中,FPGA提供了最高的逻辑密度、最丰富的特性和最高的性能。
现在最新的FPGA器件,如XilinxVirtex"系列中的部分器件,可提供八百万"系统门"(相对逻辑密度)。
这些先进的器件还提供诸如内建的硬连线处理器(如IBMPowerPC)、大容量存储器、时钟管理系统等特性,并支持多种最新的超快速器件至器件(device-to-device)信号技术。
FPGA被应用于范围广泛的应用中,从数据处理和存储,以及到仪器仪表、电信和数字信号处理等。
3.2FPGA的工作原理
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输入输出模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。
FPGA利用小型查找表(16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
3.3电子万年历的工作原理
图1电子万年历的工作原理
1.功能键用来选择不同的工作模式:
时间正常显示功能、时间调整与显示、秒表功能、闹钟设置与查看、日期显示、日期调整与设置。
2.调整键1:
主要用于闹钟设置、日期显示与调整、秒表、时间调整与设置中的位置选择按钮,与功能键配合使用。
①2号键功能模式,即时间调整与设置时,用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于在特定位置进行调整;
②4号键功能模式,即闹钟设置与查看时,同样用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于在特定位置进行调整;
③6号键功能模式,即日期调整与设置时,用作月、日的移位,按一下,将会实现“月-日”的依次移位,便于在特定位置进行调整。
3.调整键2:
主要用于闹钟设置、日期显示与调整、秒表、时间调整与设置中的调整按钮,与功能键配合使用。
12号键功能模式,即时间调整与设置时,用作时、分、秒的调整,按一下,将会使得当前调整键1选择的位置数字增加1;
24号键功能模式,即闹钟设置与查看时,同样用作时、分、秒的调整,按一下,将会使得当前调整键1选择的位置数字增加1;
36号键功能模式,即日期调整与设置时,用作月、日的移位,按一下,将会使得当前调整键1选择的位置数字增加1。
3.4时钟万年历的设计方案选择与比较
1.方案一:
基于FPGA设计万年历
2.方案二:
采用Dallas公司的专用时钟芯片DS1302。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,可直接读取时间、日期,使得软件编程相对简单。
而且DS1302可以在很小电流的后备电源(2.5V-5.5V,在2.5V时耗电小于300nA)下继续计时,时钟在电网电压不足或突然掉电等突发情况下仍能正常工作。
3.方案三:
本方案完全用软件实现走时,原理为:
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高,而且由于是软件实现,当单片机不上电,程序不执行时钟将不工作。
4选择与比较
选择:
方案一
比较:
方案一采用FPGA技术,方案二和方案三采用的是单片机。
相比单片机,FPGA组织逻辑能力更强,时序能力更强,且有以下优点,所以本次设计采用FPGA技术。
①FPGA运行速度快
FPGA内部集成锁项环,可以把外部时钟倍频,核心频率可以到几百M,而单片机运行速度低的多.在高速场合,单片机无法代替FPGA
②FPGA管脚多,容易实现大规模系统
单片机IO口有限,而FPGA动辄数百IO,可以方便连接外设.比如一个系统有多路AD,DA,单片机要进行仔细的资源分配,总线隔离,而FPGA由于丰富的IO资源,可以很容易用不同IO连接各外设
③FPGA内部程序并行运行,有处理更复杂功能的能力
单片机程序是串行执行的,执行完一条才能执行下一条,在处理突发事件时只能调用有限的中断资源;而FPGA不同逻辑可以并行执行,可以同时处理不同任务,这就导致了FPGA工作更有效率
④FPGA有大量软核,可以方便进行二次开发
FPGA甚至包含单片机和DSP软核,并且IO数仅受FPGA自身IO限制,所以,FPGA又是单片机和DSP的超集,也就是说,单片机和DSP能实现的功能,FPGA一般都能实现
3.5时钟万年历的控制系统
此电子万年历系统主要有8个模块,分别是以下8个模块:
1.主控制模块maincontrol
2.时间及其设置模块timepiece_main
3.时间显示动态位选模块time_disp_select
4.显示模块disp_data_mux
5.秒表模块stopwatch
6.日期显示与设置模块date_main
7.闹钟模块alarmclock
8.分频模块fdiv
四、系统设计
4.1电子万年历的八个模块
1 主控制模块maincontrol
该模块实现对各个功能模块的整体控制,包括对时间显示与调整、日期显示与调整、闹钟显示与调整、秒表操作等的控制,结构功能图如2所示。
图2主控制模块的结构功能图
SW3是功能键,从波形图中可知,SW3每出现一次上升沿,输出都会发生相应的变化,即按照Timepiece_EN(时钟自动显示使能),TimeSet_EN(时钟设置与调整使能),Stopwatch_EN(秒表功能使能),Alarmclock_EN(闹钟时间设置使能),Date_EN(日期显示使能),DateSet_EN(日期显示与设置使能)的顺序依次输出有效波形“1”,对相应的模块输入有效使能,从而实现相应的功能。
2时间及其设置模块time_auto_and_set
时间及其设置模块主要完成时间的自动正常运行与显示,以及在相应的功能号下,实现时间的调整与设置。
①时间模块timepiece_main
该模块主要完成时间的自动增加与显示功能,即为正常的自动模式运行,其结构功能图如3所示,时间模块的结构功能图如4所示。
图3时间及其设置模块的结构功能图图4时间模块的结构功能图
a.秒自动计时子模块second_counter,结构功能图如5所示,
图5秒自动计时子模块的结构功能图
b.分自动计时子模块minute_counter,结构功能图如6示。
图6分自动计时子模块的结构功能图
c.小时自动计时子模块hour_counter,结构功能图如7所示。
图7小时自动计时子模块的结构功能图
当Timepiece_EN为1时,即处于时间自动工作状态,即每出现一次时钟信号clk,计数一次,先计数second0,当计数到1001(即十进制的9)时,向second1发出一个计数信号,此时second1进行一次计数,类推,second1计数到0101(即十进制的5),且second0计数到1001(即十进制的9)时,minute0则进行一次计数,按照此规律进行时间的计数。
当计满24小时,向day_EN发出一个计数信号,即此使能端输出有效信号1,进行日期的计数。
②.时间设置模块timeset
该模块主要完成对时间的设置相关的闪烁显示控制以及时间中的小时、分钟、秒等数据的改变,流程图如8所示,结构功能图如9所示。
图8时间设置模块的流程图
图9时间设置模块的结构功能图
表1时间设置模块的端口说明
输入端口
功能
TimeSet_EN
时间设置使能,当其电平为高时,时间设置有效
SW1,SW2
调整键1与调整键2输入信号
hour1,hour0
当前时间的小时数输入
minute1,minute0
当前时间的分钟数输入
second0,second1
当前时间的秒数输入
输出端口
功能
hour_set1,hour_set0
设置时间后的小时数
minute_set1,minute_set0
设置时间后的分钟数
second_set1,second_set0
设置时间后的秒数
disp_drive
设置中的闪烁显示设置
当Timeset_EN为1时,即实现时间设置功能。
SW1实现时间格式中小时高、低位,分钟高、低位,秒钟高、低位的位选,即每出现一个SW1上升沿,disp_drive的相应数值加1(选择具体的需要调整的位置)。
SW2实现相应得位的数值得调整,即每出现一个SW2上升沿,相应位的数值增加1。
③.时间数据与时间设置数据多路选择模块time_mux
该模块用来分时向显示单元传输显示数据,流程图如10所示,结构功能图如11所示。
图10多路选择模块的结构功能图
图11多路选择模块的流程图
表2多路选择模块的端口说明
输入端口
功能
TimeSet_EN
时间设置使能信号
hour1,hour0
自动模式中当前时间的小时数输入
minute1,minute0
自动模式中当前时间的分钟数输入
second0,second1
自动模式中当前时间的秒数输入
hour_set1,hour_set0
时间设置后的小时数输入
minute_set1,minute_set0
时间设置后的分钟数输入
second_set1,second_set0
时间设置后的秒数输入
输入端口
功能
hour_1,hour_0
当前需要显示的小时输出
minute_1,minute_0
当前需要显示的分钟输出
second_0,second_1
当前需要显示的秒输出
3 时间显示动态位选模块time_disp_select
该模块用来分时显示时间数据,但是在选择合适的时间间隔下,人眼并不能分辨出是分时显示的,这样显示的方式可以降低功耗,结构功能图如12所示。
图12时间显示动态位选模块的结构功能图
TimeSet_EN表示时间设置使能,Time_EN表示时间自动显示使能,clk_1kHz用于动态显示时间,clk_200Hz用于闪烁显示时间,timeset_disp_drive表示时间设置数据显示的同步信号,time_disp_select表示显示动态位选输出信号。
当TimeSet_EN为0,Time_EN为1时,以clk_1kHz为是时钟信号,输出自动显示的时间,按位依次显示;当TimeSet_EN为1,Time_EN为0时,则以clk_200Hz为时钟信号,输出以timeset_disp_drive对应的位置。
4 显示模块disp_data_mux
模块是时间、日期等数据用数码管显示的控制与数据传输模块,包括数据的传输以及BCD码的译码等,结构功能图如13所示。
图13显示模块的结构功能图
显示原理采用的是七段数码管的现实原理,如14所示:
图14七段数码管的显示原理
5 秒表模块stopwatch
该模块实现秒表的功能,在实际中,可以通过改变自动工作模式下的时间的计数时钟的频率来实现秒表的功能,流程图如15所示,结构功能图如16所示。
图15秒表模块的流程图
图16秒表模块的结构功能图
EN表示秒表使能控制信号,clk1表示自动工作模式的时钟信号,clk2表示秒表工作模式的时钟信号,故当EN为有效信号1时,输出F_out与clk2同,即处于秒表工作状态,同理EN为0时,输出F_out与clk1同,即处于自动工作状态。
6 日期显示与设置模块date_main
该模块实现日期的显示和日期的调整与设置,结构功能图如17所示。
图17时间显示与设置模块的结构功能图
6.1 日期自动工作模块autodate
该模块实现的是日期的自动工作功能,结构功能图如18所示。
图18日期自动工作模块的结构功能图
6.2 日期设置模块setdate
该模块用于日期,结构功能图如19所示。
图19日期设置模块的结构功能图
7 闹钟模块alarmclock
该模块实现的功能包括闹钟的设置以及闹钟时间到后的提示,流程图如20所示,结构功能图如21所示。
图20闹钟模块的流程图
图21闹钟模块的结构功能图
EN为闹钟设置使能,clk_200Hz用于设置中的闪烁显示的时钟,其中还定义了hour_set1,hour_set0,minute_set1,minute_set0,second_set1,second_set0,用来表示已经设置好的闹钟时间。
闹钟一直处于工作状态,当前时间(hour1,hour0,minute1,minute0,second1,second0)与设置的闹钟时间相比较,当小时、分钟、秒钟的时间完全相同时,则闹铃响,输出信号alarm为有效信号1。
SW1和SW2是调整键,分别控制位选和数值的调整。
8 分频模块fdiv
该模块完成全局时钟信号分频输出200Hz、60Hz、1Hz的三种时钟信号,结构功能图如22所示,流程图如23所示。
图22分频模块的结构功能图
图23分频模块的流程图
4.2 顶层模块
将各个主模块综合成电子万年历系统,其包括:
fdiv分频模块,maincontrol主控制模块,stopwatch秒表模块,time_auto_and_set时间及其设置模块,date_main日期及其设置模块,alarmclock闹钟模块,time_disp_select时间显示动态位选模块及disp_data_mux显示模块,该顶层电路Top如图24所示。
图24顶层电路Top
五、系统仿真与调试
1.主控制模块maincontrol
图25主控制模块的波形仿真图
2.时间及其设置模块time_auto_and_set
① 时间模块timepiece_main
图26时间模块的波形仿真图
②时间设置模块timeset
图27时间设置模块的波形仿真图
③时间数据与时间设置数据多路选择模块time_mux
图28多路选择模块的波形仿真图
3.时间显示动态位选模块time_disp_select
图29时间显示动态位选模块的波形仿真图
图30时间显示动态位选模块的波形仿真图
4.显示模块disp_data_mux
图31显示模块的波形仿真图
5.秒表模块stopwatch
图32秒表功能的波形仿真图
6.日期显示与设置模块date_main
图33日期自动工作模块的波形仿真图
图34日期自动工作模块的波形仿真图
7.闹钟模块alarmclock
图35闹钟模块的波形仿真图
8.分频模块fdiv
图36分频模块的波形仿真图
六、心得与体会
本次的课题是基于FPGA的多功能电子万年历的设计,从最开始的对FPGA的不了解以及对电子万年历原理的不知晓,到后来的找资料、设计,这个过程我学到了很多,也感悟了很多。
在学校课堂上学到的东西和在实训中学到的东西是不完全一致的。
实训是符合社会的,社会是发展的,是进步的,每时每刻都在发生着变化,你要适应社会,而不是要社会来适应你,所以你就得不断地学习,不断地充电。
实训是对每个人综合能力的检验,是让我们能更好的巩固专业知识、积累工作经验、掌握工作技能。
让我深深地体会到要想做好每一件事,除了自己平时要有一定的专业知识外,还需要有一定的实践动手能力,操作能力。
参考文献
1.帕尔尼卡、夏宇闻.VERILOGHDL数字设计与综合,电子工业出版社,2004.
2.褚振勇,翁木云.FPGA设计与应用(第二版),西安电子科技大学出版社,2006.
3.侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计修订版,西安电子科技大学出版社,2004.
4.赵曙光,郭万有.可编程逻辑器件原理,西安电子科技大学出版社,2000.
5.徐志军,徐光辉.CPLD/FPGA的开发与应用,电子工业出版社,2002.
6.冼进,戴仙金,潘懿萱.VerilogHDL数字控制系统设计实例,中国水利水电出版社,2007.
7.夏宇闻.VerilogHDL数字系统设计教程,北京航空航天大学出版社,2003.
8.黄智伟.FPGA系统设计与实践,电子工业出版社,2003.
9.王金明等.数字系统设计与verilogHDL,电子工业出版社,2002.
10.J.Bhasker.VerilogHDLSynthesis:
APracticalPrime,StarGalaxyPublishing,1998.
附录
电子万年历系统的VerilogHDL语言程序设计部分代码
1主控制模块
modulemaincontrol(clk,SW3,Timepiece_EN,TimeSet_EN,Stopwatch_EN,Alarmclock_EN,Date_EN,DateSet_EN);
outputTimepiece_EN;//时间自动显示使能
outputTimeSet_EN;//时间调整与设置使能
outputStopwatch_EN;//秒钟功能使能
outputAlarmclock_EN;//闹钟时间设置使能
outputDate_EN;//时期显示使能
outputDateSet_EN;//日期调整与设置使能
inputSW3;//功能号选择
inputclk;
regTimepiece_EN;
regTimeSet_EN;
regStopwatch_EN;
regAlarmclock_EN;
regDate_EN;
regDateSet_EN;
reg[2:
0]Function;
reg[31:
0]cnt;
regq1,q2,q3;
regCLK;
always@(posedgeclk)
begin
if(cnt<49999)
begin
cnt=cnt+1;
CLK<=0;
end
else
begin
cnt=0;
CLK<=1'b1;
end
end
always@(posedgeCLK)
begin
begin
q2<=q1;
q1<=SW3;
end
begin
q3<=q1&(~q2);
end
end
always@(posedgeq3)/*实现对时间显示与调整,日期显示与调整,闹钟显示与调整,秒表操作等的控制*/
begin//功能号的产生以及其自动循环
if(Function<3'b101&&SW3==1'b1)
Function<=Function+3'b1;
else
Function<=3'b0;
case(Function)//各个分功能的控制和实现
//时钟自动显示
3'b000:
begin
Timepiece_EN<=1'b1;
TimeSet_EN<=1'b0;
Stopwatch_EN<=1'b0;
Alarmclock_EN<=1'b0;
Date_EN<=1'b0;
DateSet_EN<=1'b0;
end
//时钟调整与设置
3'b001:
begin
end
//秒表
3'b010:
begin
end
//闹钟时间设置
3'b011:
begin
end
//日期显示
3'b100:
begin
end
//日期调整与设置
3'b101:
begin
end
default:
begin
end
endcase
end
endmodule
2秒自动计时子模块
modulesecond_counter(EN,clk,second_data1,second_data0,E0);
output[3:
0]second_data1,second_data0;
outputE0;
inputclk,EN;
reg[3:
0]second_data1,second_data0;
regE0;
always@(posedgeclk)
begin
if(EN==1'b1)
begin
if(second_data0<4'b1001)
second_data0<=second_data0+4'b1;
else
begin
E0<=1'b0;
second_data0<=4'b0;
if(second_data1<4'b0101)
second_data1<=second_data1+4'b1;
else
begin
second_data1<=4'b0;
E0<=1'b1;
end
end
end
end
endmodule
3时间自动工作控制
moduletimepiece_main(CLK,Timepiece_EN,day_EN,hour0,hour1,mi