FPGA编程设计电子表实验报告doc.docx
- 文档编号:12120000
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:17
- 大小:29.69KB
FPGA编程设计电子表实验报告doc.docx
《FPGA编程设计电子表实验报告doc.docx》由会员分享,可在线阅读,更多相关《FPGA编程设计电子表实验报告doc.docx(17页珍藏版)》请在冰豆网上搜索。
FPGA编程设计电子表实验报告doc
FPGA编程设计电子表实验报告
电子表实验报告一.系统目标【基本要求】n计时计时显示格式中有时/分/秒;n对时可以通过按键,设定电子表的时间;n定时可以通过按键,设定电子表的“响闹”时间,具有“闹”钟的功能;【发挥部分】n年月日计时功能;n秒表功能;n倒计时功能;n整点报时;n采用多种方式设置初始值u按键递增、键盘直接输入、拨盘输入;n按键发声。
二.系统规范【系统输入】n20M时钟信号输入clk_20M用于生成时钟、数码管扫描控制时钟;n键盘列扫描输入kin(30)用于检测是否存在按键;n按键开关输入sw1、sw2、sw7、sw12用于控制功能转换;n拨盘输入s1(30)、s2(30)用于设置倒计时功能的初始值。
【系统输出】n键盘行扫描信号输出scan(30)对键盘进行行扫描;n数码管8位数据信号输出lcd(70)控制数码管数据显示;n数码管显示使能信号输出en(50)选择6位数码管中的某一个显示数据;n发光二极管控制信号输出led(70)星期显示、上/下午显示、倒计时结束标志显示n音频输出端口audio闹钟铃声以及按键发声输出端口。
【系统功能】系统开机后,滚动显示当前的日期(年月日)和时间(时分秒),在此状态下,可通过sw1,sw2,sw7,sw12四个按键开关进入各个功能模块,在各个功能模块中均可以通过长时间按键sw1回到滚动显示状态,在此电子表系统中主要实现4个功能1、日期和时间功能模块l日期显示l时间显示l日期和时间的调整设置2、秒表功能模块l秒表归零l秒表计时l秒表计时停止3、倒计时功能模块l利用拨盘进行倒计时初始值设置l利用键盘扫描输入进行初始值设置l重置上一次的初始值l倒计时开始,至0后停止倒计时4、闹钟设置模块l取消闹钟l设置闹钟时分秒l选择闹铃方式其它具体功能1、数码管显示方式l滚动显示滚动显示年月日、时分秒;l全亮显示6位数码管显示全亮亮度相同;l部分亮显示在调节时间的时分秒以及日期的年月日时,数码管相应部分的显示较其它部分亮度变暗。
2、按键方式由此把实验箱下方的4个按键输入变为5位的按键信号(增加一位长时按键标志)l短时按键按键脉冲宽度小于1秒;l长时按键按键脉冲宽度大于等于1秒。
3、闹铃以及按键发声方式l按键发声由于实验箱部分按键接触存在问题,因此通过按键有效时发出鸣叫声来提醒操作者此时按键有效l闹铃1普通滴滴声--鸣叫方式当满足设置闹钟时,闹铃持续30秒,在此30秒钟,前10s发出缓慢的滴滴声,10s20s时发出较快的滴滴声,20s30s时发出急促的滴滴声,之后闹钟停止30s,之后再次想起,如此反复3次,如果在此期间按任意键,则闹钟不再响铃。
l闹铃2曲1梁祝l闹铃3曲2小兔子乖乖l闹铃4曲34、设置时钟等主要方式l短时按up/down键以1为单位递增/递减l长时按键up/down以10HZ速度快增/快减l用拨盘直接设值l键盘输入直接设值三.系统框图1.主程序系统总框图用各系统功能模块的状态转移图来描述系统框图滚动显示日期/时间秒表倒计时闹钟设置sw1sw2sw7sw121长按sw12.时间/日期功能模块框图n按键控制状态转换01111-短按sw1;10111-短按sw2;11011-短按sw7。
显示时间状态clock显示日期状态date设置时状态ad_hour设置分状态ad_minute设置秒状态ad_second设置年状态ad_year设置月状态ad_month设置日状态ad_day时制转换12小时制/24小时制input0111101111110111011101111011110111110111011110111101111101111011110111101111011110111n正常走时及显示部分程序框图秒计时1HZ时钟分计时进位信号时刻计时日计时月计时年计时进位信号进位信号进位信号进位信号星期计算Clock、ad_hour、ad_minutead_second24位时间信号Date、ad_year、ad_month、ad_day24位日期信号7位LED信号指示星期秒分时日月年星期整数转换为BCD数整数转换为BCD数LED指示上午/下午闰年信号月n各计时子模块框图判断当前状态正常计时设置时间/日期ad_其它Speed’0’Speed’1’Presstag’1’短时按键增减长时按键快增快减直接用键盘设值3.秒表功能模块4.倒计时功能模块5.闹钟设置功能模块四.VHDL程序的层次化结构主程序clock.vhd滚动显示模块rolling_display.vhd七段数码管显示模块lcd_display.vhd日期(年月日)和时间(时分秒)模块Clock_date.vhdSub_yearSub_month.vhdSub_day.vhdSub_hour.vhdSub_minute.vhdSub_second.vhdSub_week.vhd秒表模块second_clk.vhd倒计时模块Timer.vhd闹钟设置模块Alarm.vhd闹铃及按键发声模块Alarm_ring.vhdPress_ring.vhdMusic.vhdstrike_ring.vhdMusic.vhdring.vhdRing0.vhdRing1.vhdRing2.vhdRing3.vhdMusic.vhd时钟生成模块Clk_generate.vhd输入转换模块Input_tran.vhd七段数码管显示模块Lcd_display.vhd键盘扫描模块Key_scan.vhd五.模块功能描述及基本设计思路1、主程序模块clock.vhdl模块功能控制电子表4个功能之间的状态转换,并对在各个状态下的输出端口(数码管显示数据控制信号、使能信号以及发光二极管控制信号)进行分配赋值。
l模块实体描述l系统的输入输出见[系统规范]部分l实现算法和结构说明编程思想在时钟控制下,定时监测在某一状态下是否存在按键,若存在按键,则根据按键的值进行状态转换。
例如若在倒计时状态,则倒计时元件模块开始工作并将此元件输出的倒计时数值进行数码管显示,并根据倒计时模块内部状态控制发光二极管的亮暗。
即此程序主要分为两大部分状态转换部分和输出端口赋值部分(根据当前状态,选择相应的signal信号赋值给输出端口,控制系统的显示)。
结构说明在主程序中主要包含以下几个部分lsignal信号的声明nsignal信号的主要作用作为临时的变量来存储各个模块的年/月/日,时/分/秒等用于数码管显示的数值或发光二极管的指示信号。
然后根据当前的状态选择该状态下需要显示的数据传送给数码管显示模块。
n例如signallcd_data_regstd_logic_vector143downto0;-就是用来存储各个模块所返回的用于数码管显示的数据signalled_data_regstd_logic_vector23downto0;用来存储各个模块所返回的用于发光二极管显示的控制信号。
l元件例化由于元件较多,选择以上几个暂作说明。
l状态转换部分l功能实现部分2、输入转换模块l模块功能四位按键输入转换为五位按键输出(增加一个长时按键指示位);对按键进行消抖处理。
l模块实体描述输入n四位按键输入对应于板子正下方的四个按键sw1、sw2、sw7、sw12;n100HZ时钟输入作为脉冲计数的时钟,用于测量脉宽。
输出n五位按键输出相对四位的按键增加一个长时按键指示位,组合为五位按键输出。
l算法结构共有四个状态,在时钟下跳沿进行状态转换准备状态/ready无按键时,五位按键输出为“11111”;有按键时,进入short状态。
短时按键状态/short长时按键标志位为1。
按键脉冲计数状态/count若计数满100则进入long状态。
长时按键状态/long长时按键标志置为0。
l模块测试结果资源消耗功能仿真短时按键效果如下图所示。
每次时钟下跳沿检测4位按键输入信号input,若有一个键被按下(即有一位为0),则输出5位键值(最后一位长时按键标志置1),且键值长度为一个100HZ时钟周期。
其它情况下5位键值输出为全1,即无按键输入。
同时实现了按键消抖。
长时按键效果如下图所示。
对输入的4位按键信号长度进行计数,若超过100个时钟周期(即1秒),判定为长时按键。
从第100个时钟下跳沿开始输出5位键值,同时长时按键标志位置0,直到该按键撤销。
2、滚动显示模块rolling_display.vhdl模块功能由于数码管只能显示六位值,为了能够使得使用者能够同时看到年月日/时分秒,因此采用在数码管上循环滚动显示的方式,从而达到同时显示年/月/日、时/分/秒的目的,从而使得用户界面友好。
l模块实体描述输入n20M时钟扫描时钟n1hz时钟控制滚动的速度n待显示的年月日时分秒的BCD码n数码管输出数据信号n数码管显示使能信号输出n数码管输出数据信号n数码管显示使能信号l实现算法和结构说明编程思想用1Hz时钟控制状态机的变换,在不同的状态下,给数码管显示模块分别传送不同的数据,从而形成滚动显示的效果。
结构说明主要包括两个部分l1hz时钟的控制屏幕滚动的速度l调用七段数码管显示模块进行显示3、七段数码管显示模块lcd_display.vhdl模块功能将输入的24位BCD码显示在6位数码管上。
l模块实体描述输入n20M时钟clk_20Mn输入24位BCD码lcd_datan控制显示方式flash输出n数码管数据信号lcd_subn数码管使能信号en_subl实现算法和结构说明编程思想在较快扫描时钟(例如20M时钟)的控制下,6个扫描状态循环变换,在每一个扫描状态下,有且仅有一个数码管使能信号有效,即仅有一个数码管进行显示,由于视觉暂留效果,我们可以看到清晰的数码管显示。
为了能够部分亮度显示,需添加一个控制显示方式的标志,选择全亮还是高两位变暗,低两位变暗或中间两位变暗,实现方式主要是控制这两位的扫描时钟,使其降低,从而可以使得此两位变暗。
结构说明lcd_display主要是根据当前的flash信号来进行显示,flash“00”时全亮,flash“01”时最高两位为暗,以flash“01”部分为例,程序代码如下由程序可以看到,使该位变暗的方法主要是通过一个count来进行计数,当计数为4时才进行显示,这样就相当于是降低了该位的扫描频率,从而降低了亮度。
4.时间和日期功能模块clock_date.vhdl模块功能时间(时/分/秒)和日期(年/月/日/星期)正常走时;时间和日期的调整设值;时制的切换(12小时制/24小时制);时间/日期的切换显示。
l模块实体描述输入n系统主状态输入/mainstate判断系统当前所处状态,非时间/日期模式下不允许调整时间/日期n5位按键信号输入/input状态切换,设置时间和日期n键盘有按键标志/presstagn键盘按键键值/keydatan100HZ时钟信号输入/clk100控制进程转换n10HZ时钟信号输入/clk10控制调整时间时的快增快减n1HZ时钟信号输入/clk1计时时钟输出nLed管显示/led在时间状态12小时制显示上午/下午,在日期状态显示星期n24位数码管数据信号输出/dig_data年月日或时分秒信号n闪烁信号输出/flash00-不闪烁;01-时/年闪烁显示;10-分/月闪烁显示;11秒/日闪烁显示。
n48位数码管数据信号输出/data48年月日时分秒的信号输出,用于滚动显示l算法结构及算法思想Clock_date.vhdsub_second.vhdsub_minute.vhdsub_hour.vhdsub_day.vhdsub_month.vhdsub_year.vhdsub_week.vhd[顶层文件clock_date.vhd]控制状态切换,控制时间和日期的正常走时。
显示时间状态clock显示日期状态date设置时状态ad_hour设置分状态ad_minute设置秒状态ad_second设置年状态ad_year设置月状态ad_month设置日状态ad_day时制转换12小时制/24小时制input0111101111110111011101111011110111110111011110111101111101111011110111101111011110111[各计时子模块]秒计时Sub_second.vhdn输入Clk100100HZ时钟信号,控制进程运行Clk11HZ时钟,控制正常走时Clk1010HZ时钟,控制快增快减Stsec增信号,该信号为1时,秒增Sbsec减信号,该信号为1时,秒减Speed控制增减的速度,为1时,以10HZ速度快增快减Presstag键盘按键标志,为1时,表示有键盘按键Keydata键盘键值,4位BCD码Pre_state当前状态,包括设置状态和其它正常走时状态n输出Enmin向分进位信号,即分计时的计时时钟Second输出秒计时结果,0~59之间的整数n算法实现判断当前状态ad_second若Speed’0’,则增/减信号为1时加/减计数若Speed’1’,则增/减信号为1时以10HZ的速度做加/减计数若Presstag’1’,则Keydata轮流为秒的十/个位赋值ad_minute/ad_hour调分/调时状态时时钟暂停其它正常计时,每次相应时钟上跳沿到来时进行加1计数。
分计时Sub_minute.vhd同Sub_second.Vhd。
为Sub_hour.vhd时刻计时提供走时时钟;输出分计时结果;在ad_minute状态进行分调整;在ad_second/ad_hour状态计时暂停;其它状态正常计时。
时刻计时Sub_hour.vhd同上。
为Sub_day.vhd日计时提供走时时钟;输出时刻计时结果(0~23之间的整数);在ad_hour状态进行时刻调整;在ad_minute/ad_second状态暂停计时;其它状态正常计时。
日计时Sub_day.vhd输入run_year信号(闰年)及month信号(月份),判断该年该月一共有多少天;为Sub_month.vhd月计时提供走时时钟;输出日计时结果;在ad_day状态进行日调整;在ad_year/ad_month状态日期暂停;其它状态日期正常走时。
月计时Sub_month.vhd为Sub_year.vhd年计时提供走时时钟;输出月计时结果(1~12之间的整数);在ad_month状态进行月调整;在ad_year/ad_day状态暂停计时;其它状态日期正常走时。
年计时Sub_year.vhd输出年计时结果(0~99之间的整数);输出run_year信号(闰年);在ad_year状态进行年调整;在ad_month/ad_day状态暂停计时;其它状态日期正常走时。
星期计算Sub_week.vhd输入当前年、月、日输出星期(1~7)计算公式根据蔡勒(Zeller)公式计算格里历的星期wy[y/4][c/4]-2c[26m1/10]d-1公式中的符号含义如下w星期;c世纪-1;y年(两位数);d日;m月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);[]代表取整,即只要整数部分。
C是世纪数减一,y是年份后两位,M是月份,d是日数。
1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。
算出来的W除以7,余数是几就是星期几。
如果余数是0,则为星期日。
l时间/日期模块测试结果资源消耗功能仿真正常走时秒计时模块工作情况如下图所示。
每次1HZ时钟上跳沿到来时秒加1,秒位走到59时,向分进位(enmin1),且秒回零。
闰2月天计时效果如下图所示。
走到29号时向月进位,且日回零。
快增快减效果如下两图所示。
在调时/分/秒/状态,若长时间按住up/down键,则该值以10HZ的速度增加或减小。
每次10HZ时钟上跳沿到来时加/减1,直到按键撤销。
键盘输入直接设值效果如下图所示。
由于仿真波形的精度问题,实际一次键盘按键脉冲长度并没有下图中那么长。
因此,下图所示的按键值可视为多次按同一键。
如多次按键5,则second被设置为55。
实际情况是每次键盘按键轮流给被设置量的十位和个位设值。
星期计算子模块工作情况如下图所示。
测试了2000年和2008年1月、2月、6月、9月某几天的星期。
能正常工作。
5、秒表功能模块second_clk.vhdl模块功能实现电子表的秒表功能,主要功能包括开始计时、停止计时、重新置零。
l模块实体描述输入n状态使能控制信号state_in;n100hz时钟clk_100;n10hz时钟clk_10;n转换后的5位按键输入信号input_data;输出n输出倒计时的24位BCD码lcd_datan控制数码管显示方式flashl实现算法和结构说明编程思想主要分为两个部分,前半部分实现状态转换,后半部分主要实现在各状态下的功能。
状态转换部分在100hz时钟的控制下,监测5位按键输入信号,若发生按键,则根据当前状态进行状态转换。
功能描述在100hz时钟控制下,在重置归零状态下,数据为0,在计数状态下,计数存储值count不断发生变化,在计数结束状态下count保持不变。
结构说明主要包括两部分l状态转换部分l计时部分代码略。
l模块功能仿真结果u计时功能u停止计时在计时功能中,我们可以看到当输入按键信号input_data有效时,则状态从00进入01,即加计数状态,在停止计时仿真中可以看到党输入按键信号有效时,停止计数,状态从01进入状态10,即停止计数状态。
6、倒计时功能模块second_clk.vhdl模块功能实现电子表的倒计时功能,主要功能包括开始倒计时、倒计时停止、重置初始值、设置初始值。
l模块实体描述输入n状态使能控制信号state_in;n100hz时钟clk_100;n10hz时钟clk_10;n转换后的5位按键输入信号input_data;n拨盘输入信号s1、s2;n扫描键盘是否存在按键信号press_tag;n键盘按键数值key_data;输出n输出倒计时的24位BCD码lcd_datan控制数码管显示方式flashn发光二极管控制信号led;l实现算法和结构说明编程思想倒计时模块由模块功能可以分为五个状态,因此将程序分为两个部分,即状态转换部分和在各状态下的具体功能实现部分。
在状态转换部分中,通过检测是否有按键输入并根据当前状态来决定下一状态,在第二部分,则根据现在具体处于何种状态来实现相应功能,例如若处于倒计时状态,则在100hz时钟控制下,计数signalcount在每个时钟上跳沿减1,实现倒计时功能。
注由于采用了拨盘和按键输入的方法,而拨盘可以产生比9大的数值,而按键也可以产生比规定范围大的值,因此要根据设置的是哪一位对输入的数值进行限制,如果超出范围,则原数值不变。
限制范围的代码如下对分的拨盘输入的限制对分的键盘输入的控制分高位分低位l倒计时模块功能仿真结果由仿真结果可以看出,在赋值输入按键信号Input_data有效时,则将s1和s2的值赋给/时/,在开始倒计时输入按键信号input_data有效后,则系统开始倒计时。
结构说明部分略。
7、闹钟设置模块alarm.vhdl模块功能实现电子表的闹钟功能,主要功能包括设置闹钟时间、选择闹铃、取消闹钟。
l模块实体描述输入n状态使能控制信号state_in;n100hz时钟clk100;n转换后的5位按键输入信号input_data;输出n输出设置闹钟的24位BCD码lcd_data;n闹铃选择信号sel;n控制数码管显示方式flash。
l实现算法和结构说明编程思想在该模块中设定中,申明一个有6个状态的状态机,用6个4位的寄存器作为时分秒寄存,当主程序中选择该模块时,模块进入准备状态,当按不断Sw2时,状态在设定时,设定分,设定秒,以及设定闹铃方式之间循环转换。
在不同的状态下,对按键输入进行一定的判断,例如在设定时状态,如果在时钟沿检测到Sw7键被按下,则时寄存器加一,若Sw12键被按下,则时寄存器减一。
同理在其他状态下作出相应得判断。
模块用两个进程控制,一个进程是状态转换控制,另一个进程是在一定状态下,对按键进行判断。
结构说明主要包括三个基本状态,从主菜单进入闹钟设置状态,则初始状态即为ready状态,此状态下显示当前处于何种状态,取消闹钟状态或者显示当前的闹钟时间,之后可以选择取消闹钟还是重新设置闹钟时间。
8、闹铃、按键发声及整点报时模块alarm_ring.vhdl模块功能实现电子表的所有发声功能状态的选择,由于电子表得发声功能主要包括闹铃、按键发声以及整点报时,因此在此功能模块主要实现折三个状态的转换,同时实现闹铃的发声方式(即若在闹铃期间没有任何按键,则每隔30s响铃30s)。
l模块实体描述输入n20M时钟clk_20M;n200hz时钟clk_200;n100hz时钟clk_100;n1hz时钟clk_1;n转换后的5位按键输入信号input_data;n键盘是否存在按键信号press_tag;n闹钟设置时间timing;n时间信号time;n闹铃选择信号sel;输出n音频输出端口audio。
l实现算法和结构说明编程思想根据此模块的功能,可以将此模块分为4个状态,状态1无任何操作,状态2闹铃发声,状态3按键发声,状态4整点报时。
因此将此模块分为两个部分状态转换部分和在各个状态下的功能实现部分。
状态转换部分当闹钟设置时间与时间相一致时,则状态转换至闹铃状态,若存在按键(无论是按键开关还是键盘)则状态转换至按键发声状态,若时间为整点时,则进入整点报时模块。
第二部分在各状态下实现相应功能。
结构说明在此模块中采用的状态转换方法与其它不同,不是根据当前状态然后再检测按键输入,而是直接检测按键开关进行状态转换。
此部分的具体程序代码如下9、铃声传送以及发声模块l模块功能实现闹铃选择以及音乐频率传送l模块实体描述输入n20M时钟--clk20Mn200HZ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 编程 设计 电子表 实验 报告 doc