FPGA编程设计电子表实验报告.doc_第1页
FPGA编程设计电子表实验报告.doc_第2页
FPGA编程设计电子表实验报告.doc_第3页
FPGA编程设计电子表实验报告.doc_第4页
FPGA编程设计电子表实验报告.doc_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子表实验报告 一系统目标【基本要求】: n 计时: 计时显示格式中有 时/分/秒;n 对时: 可以通过按键,设定电子表的时间; n 定时: 可以通过按键,设定电子表的“响闹”时间,具有“闹”钟的功能; 【发挥部分】: n 年月日计时功能;n 秒表功能;n 倒计时功能;n 整点报时;n 采用多种方式设置初始值:u 按键递增、键盘直接输入、拨盘输入;n 按键发声。二系统规范 【系统输入】n 20M时钟信号输入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 选择闹铃方式 其它具体功能:、数码管显示方式:l 滚动显示:滚动显示年月日、时分秒;l 全亮显示:6位数码管显示全亮亮度相同;l 部分亮显示:在调节时间的时分秒以及日期的年月日时,数码管相应部分的显示较其它部分亮度变暗。、按键方式由此把实验箱下方的4个按键输入变为5位的按键信号(增加一位长时按键标志)l 短时按键:按键脉冲宽度小于1秒;l 长时按键:按键脉冲宽度大于等于1秒。、 闹铃以及按键发声方式l 按键发声:由于实验箱部分按键接触存在问题,因此通过按键有效时发出鸣叫声来提醒操作者此时按键有效l 闹铃1:普通滴滴声 -鸣叫方式:当满足设置闹钟时,闹铃持续30秒,在此30秒钟,前10s发出缓慢的滴滴声,10s20s时发出较快的滴滴声,20s30s时发出急促的滴滴声,之后闹钟停止30s,之后再次想起,如此反复3次,如果在此期间按任意键,则闹钟不再响铃。l 闹铃2:曲1梁祝l 闹铃3:曲2小兔子乖乖l 闹铃4:曲3、设置时钟等主要方式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小时制)input01111 01111110111011101111011110111110111011110111101111101111011110111101111011110111n 正常走时及显示部分程序框图:秒计时1HZ时钟分计时进位信号时刻计时日计时月计时年计时进位信号进位信号进位信号进位信号星期计算Clock、ad_hour、ad_minutead_second24位时间信号Date、ad_year、ad_month、ad_day24位日期信号7位LED信号指示星期秒分时日月年星期整数转换为BCD数整数转换为BCD数LED指示上午/下午闰年信号月n 各计时子模块框图判断当前状态正常计时设置时间/日期ad_其它Speed=0Speed=1Presstag=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.vhd:l 模块功能:控制电子表4个功能之间的状态转换,并对在各个状态下的输出端口(数码管显示数据控制信号、使能信号以及发光二极管控制信号)进行分配赋值。l 模块实体描述l 系统的输入输出见系统规范部分l 实现算法和结构说明编程思想:在时钟控制下,定时监测在某一状态下是否存在按键,若存在按键,则根据按键的值进行状态转换。例如若在倒计时状态,则倒计时元件模块开始工作并将此元件输出的倒计时数值进行数码管显示,并根据倒计时模块内部状态控制发光二极管的亮暗。即此程序主要分为两大部分:状态转换部分和输出端口赋值部分(根据当前状态,选择相应的signal信号赋值给输出端口,控制系统的显示)。结构说明:在主程序中主要包含以下几个部分:l signal信号的声明:n signal信号的主要作用:作为临时的变量来存储各个模块的 年/月/日,时/分/秒等用于数码管显示的数值或发光二极管的指示信号。然后根据当前的状态选择该状态下需要显示的数据传送给数码管显示模块。n 例如:signal lcd_data_reg : std_logic_vector(143 downto 0);-就是用来存储各个模块所返回的用于数码管显示的数据signal led_data_reg : std_logic_vector(23 downto 0);用来存储各个模块所返回的用于发光二极管显示的控制信号。l 元件例化:由于元件较多,选择以上几个暂作说明。l 状态转换部分:l 功能实现部分:2、 输入转换模块l 模块功能四位按键输入转换为五位按键输出(增加一个长时按键指示位);对按键进行消抖处理。l 模块实体描述输入:n 四位按键输入对应于板子正下方的四个按键sw1、sw2、sw7、sw12;n 100HZ时钟输入作为脉冲计数的时钟,用于测量脉宽。输出: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 模块实体描述:输入:n 20M时钟:扫描时钟n 1hz时钟:控制滚动的速度n 待显示的年月日时分秒的BCD码n 数码管输出数据信号n 数码管显示使能信号输出:n 数码管输出数据信号n 数码管显示使能信号l 实现算法和结构说明编程思想:用1Hz时钟控制状态机的变换,在不同的状态下,给数码管显示模块分别传送不同的数据,从而形成滚动显示的效果。 结构说明:主要包括两个部分:l 1hz时钟的控制屏幕滚动的速度l 调用七段数码管显示模块进行显示:3、 七段数码管显示模块 lcd_display.vhdl 模块功能将输入的24位BCD码显示在6位数码管上。l 模块实体描述输入n 20M时钟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:判断系统当前所处状态,非时间/日期模式下不允许调整时间/日期n 5位按键信号输入/input:状态切换,设置时间和日期n 键盘有按键标志/presstagn 键盘按键键值/keydatan 100HZ时钟信号输入/clk100:控制进程转换n 10HZ时钟信号输入/clk10:控制调整时间时的快增快减n 1HZ时钟信号输入/clk1:计时时钟 输出:n Led管显示/led:在时间状态(12小时制)显示上午/下午,在日期状态显示星期n 24位数码管数据信号输出/dig_data:年月日或时分秒信号n 闪烁信号输出/flash: 00不闪烁;01时/年闪烁显示;10分/月闪烁显示;11秒/日闪烁显示。n 48位数码管数据信号输出/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小时制)input01111 01111110111011101111011110111110111011110111101111101111011110111101111011110111各计时子模块 :秒计时Sub_second.vhd:n 输入:Clk100100HZ时钟信号,控制进程运行Clk11HZ时钟,控制正常走时Clk1010HZ时钟,控制快增快减Stsec增信号,该信号为1时,秒增Sbsec减信号,该信号为1时,秒减Speed控制增减的速度,为1时,以10HZ速度快增快减Presstag键盘按键标志,为1时,表示有键盘按键Keydata键盘键值,4位BCD码Pre_state当前状态,包括设置状态和其它正常走时状态n 输出:Enmin向分进位信号,即分计时的计时时钟 Second输出秒计时结果,059之间的整数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日计时提供走时时钟;输出时刻计时结果(023之间的整数);在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年计时提供走时时钟;输出月计时结果(112之间的整数);在ad_month状态进行月调整;在ad_year/ad_day状态暂停计时;其它状态日期正常走时。年计时Sub_year.vhd输出年计时结果(099之间的整数);输出run_year信号(闰年);在ad_year状态进行年调整;在ad_month/ad_day状态暂停计时;其它状态日期正常走时。星期计算Sub_week.vhd输入:当前年、月、日输出:星期(17)计算公式:根据蔡勒(Zeller)公式计算格里历的星期:w=y+y/4+c/4-2c+26(m+1)/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时,向分进位(enmin=1),且秒回零。闰2月天计时效果如下图所示。走到29号时向月进位,且日回零。快增快减效果如下两图所示。在调时/分/秒/状态,若长时间按住up/down键,则该值以10HZ的速度增加或减小。每次10HZ时钟上跳沿到来时加/减1,直到按键撤销。 键盘输入直接设值效果如下图所示。由于仿真波形的精度问题,实际一次键盘按键脉冲长度并没有下图中那么长。因此,下图所示的按键值可视为多次按同一键。如多次按键5,则second被设置为55。实际情况是每次键盘按键轮流给被设置量的十位和个位设值。星期计算子模块工作情况如下图所示。测试了2000年和2008年1月、2月、6月、9月某几天的星期。能正常工作。5、秒表功能模块 second_clk.vhdl 模块功能实现电子表的秒表功能,主要功能包括开始计时、停止计时、重新置零。l 模块实体描述输入n 状态使能控制信号state_in;n 100hz时钟clk_100;n 10hz时钟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;n 100hz时钟clk_100;n 10hz时钟clk_10;n 转换后的5位按键输入信号input_data;n 拨盘输入信号s1、s2;n 扫描键盘是否存在按键信号press_tag;n 键盘按键数值key_data;输出n 输出倒计时的24位BCD码lcd_datan 控制数码管显示方式flashn 发光二极管控制信号led;l 实现算法和结构说明编程思想:倒计时模块由模块功能可以分为五个状态,因此将程序分为两个部分,即状态转换部分和在各状态下的具体功能实现部分。在状态转换部分中,通过检测是否有按键输入并根据当前状态来决定下一状态,在第二部分,则根据现在具体处于何种状态来实现相应功能,例如若处于倒计时状态,则在100hz时钟控制下,计数signal:count在每个时钟上跳沿减1,实现倒计时功能。注:由于采用了拨盘和按键输入的方法,而拨盘可以产生比9大的数值,而按键也可以产生比规定范围大的值,因此要根据设置的是哪一位对输入的数值进行限制,如果超出范围,则原数值不变。限制范围的代码如下:对 分 的拨盘输入的限制:对 分的键盘输入的控制:分高位:分低位:l 倒计时模块功能仿真结果:由仿真结果可以看出,在赋值输入按键信号Input_data有效时,则将s1和s2的值赋给/时/,在开始倒计时输入按键信号input_data有效后,则系统开始倒计时。结构说明部分略。7、闹钟设置模块 alarm.vhdl 模块功能实现电子表的闹钟功能,主要功能包括设置闹钟时间、选择闹铃、取消闹钟。l 模块实体描述输入n 状态使能控制信号state_in;n 100hz时钟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 模块实体描述输入n 20M时钟clk_20M;n 200hz时钟clk_200;n 100hz时钟clk_100;n 1hz时钟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 模块实体描述:输入n 20M时钟-clk20Mn 200HZ时钟-clk200n 10hz时钟 clk10。n 模块使能信号输入-enablen 响铃方式输入ring_wayn 延时响铃控制输入-delay输出n 发声输出信号audiol 实现算法及结构说明: 编程思想:在该模块中,有五个子模块,分别是四个闹钟音频数据产生模块和一个发声模块。事先在各个音频模块中存入歌曲的音调所对应得分频系数,在使能信号的作用及时钟的同步下,各自模块有节奏的将音频信号输出到主模块,在主模块中,通过根据当前的闹铃选择,将对应的数据输入到发生模块,作为发生模块的分频系数,从而得到不同的音乐输出。 音频与频率的对应以及发声原理:组成乐曲的每个音符的发生频率以及持续时间是乐曲能够连续演奏所需要的两个基本要素。乐曲的12平均规律规定:每两个八度(例如简谱中音1与高音1)之间的频率相差1倍。音符A(简谱中的低音6)的频率为440Hz,音符B到C,E到F之间为伴音,其余为全音,由此可以计算出低音1至高音1之间每个音符的频率。音符频率/Hz音符频率/HZ音符频率/Hz低音126163中音1523.25高音11045.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440.00中音6880.00高音61760.00低音 7 493.88中音7 978.76高音71975.52 产生个音符所需要的频率可用分频器实现。由于个音符对应的频率多为非整数,而分频系数又不能为小数,故将计算所得的分频数四舍五入取整。若分频器的时钟过低,则取整后的误差较大,增加分频时钟会使得分频误差减小。本次设计的乐曲发声器采用20MHz的基准频率,即可以得出每个音符所对应的分频系数。 每个音符所持续的时间是乐曲能够继续演奏所需的另一个基本要求。例如化蝶中的最小节拍为1/4拍,将1拍的时间长度定为1s,则只需要再提供一个4Hz的时钟频率即可产生1/4拍的时长。每个音符的持需时间就可以通过高音符的重复次数来完成,例如如果该音符持续1拍,则事先在存谱时将该音符重复4次即可。 10、按键发声 press_ring.vhdl 模块功能按键时发出短促的鸣叫。l 模块实体描述输入n 20M时钟clk_20M;n 100hz时钟clk_100;n 转换后的5位按键输入信号input_data;n 键盘是否存在按键信号press_tag;输出n 输出是否存在按键,从而控制状态转换enable;n 音频输出端口audio。l 实现算法和结构说明编程思想:检测输入是否存在按键,主要是检测press_tag和input_data信号,若按键有效在音频信号输出短促鸣叫。结构说明略。11、时钟生成模块 clk_generate.vhdl 模块功能利用20M时钟输入,生成较准确的1M、200hz、100hz、10hz、1hz时钟信号,供系统其它模块使用。l 模块实体描述输入n 20M时钟clk_20M;输出n 200hz时钟clk_200;n 100hz时钟clk_100;n 10hz时钟clk_10;n 1hz时钟clk_1;l 实现算法和结构说明编程思想:由于20Mhz时钟信号是最稳定的,因此我们采用20Mhz时钟信号为基准信号,产生较准确的1M、200、100、1hz的时钟信号。以1MHz信号的产生为例:20M/1M=20,则对20Mhz时钟进行计数,如果等于20则归0,同时输出信号(信号类型std_logic)取反。结构说明略。12. 键盘扫描模块 Key_scan.vhdl 模块功能对键盘进行行扫描,检查是否存在按键,若存在按键,将按键转换为数据,并输出存在按键标志。l 模块实体描述输入n 10hz时钟clk_10;n 100hz时钟clk_100;n 列扫描检测端口kin。输出n 行扫描信号输入端口scan;n 按键输出数据key_data;n 是否存在按键信号输出press_tag。l 实现算法和结构说明编程思想:在键盘扫描中,要解决的问题主要是消除键盘抖动和要有足够的放电时间,在此部分程序中主要采取两个办法来实现:一是在两个行扫描中插入空闲周期,二是通过脉冲计数来实现开光抖,。如此可以实现稳定的键盘输入。 结构说明:程序代码如下:前一个case负责间歇性行扫描,后一个case负责进行脉冲计数,对按键进行消抖,从而在很大程度上增加了键盘按键检测的准确性。六系统测试结果 图一 实验板注:在以下操作与功能描述中所提到的按键等标号与实验箱上的对应关系如图一l 系统功能及其基本操作基本功能及相关操作说明书 基本状态转换说明书主菜单功能及其操作子功能及其操作及相应显示滚动显示-进入该功能后,数码管滚动显示年月日时分秒按键sw1-日期及时间显示和设置模块按键sw1:在显示日期/时间状态之间切换设置时/分/秒/年/月/日状态:按键sw7up/增;按键sw12down/减;长按sw7快增;长按sw12快加;键盘按键直接设值。显示时间状态:按键sw2状态在设置时/分/秒之间切换;按键sw1回到显示时间状态。按键sw3二十四时和十二时两种时制的切换显示日期状态:按键sw2状态在设置年/月/日之间切换;按键sw1回到显示日期状态。-此时发光二极管显示星期按键sw2-秒表功能模块-进入该功能后,数码管显示秒表初始值“00.00.00”按键sw2-开始计时数码管显示分、秒和分秒,若超过秒表计数最大值“59.59.99”则停止计数,数码管显示该值按键sw7停止计时数码管显示停止时的当前值无论在何时按键sw1均恢复初始0值长按键sw1则回到滚动显示主功能模块按键sw7-倒计时功能模块-进入该功能后,在第一次进入该功能模块时,显示初始值为“00.00.00”,若第二次进入该模块,则显示值为上一次设置的倒计时值按键sw7状态在设置分、秒和分秒状态之间转换,此时利用拨盘设置倒计时初始值注:在设置“分”时,数码管显示“分”部分较暗按键sw12状态在设置分高位及低位、秒高位及低位和分秒高位及低位状态之间转换,此时利用键盘输入设置倒计时初始值,而发光二极管指示正在调整哪一位。在设置初始值时两种方法随时均可以转换按键sw2倒计时开始,当倒计时最终减至0时,数码管显示为0,此时按键sw1对初始值进行重置或者按键sw7和sw12进行重新设置初始值长按键sw1则回到滚动显示主菜单功能按键sw12-闹钟设置模块-进入此功能后,数码管显示当前状态,若显示为数字则说明存在闹钟,若显示为“-”,则说明处于取消闹钟模块按键sw2在设置时分秒以及闹钟铃声选择各状态之间转换长按sw2取消闹钟,数码管显示为“-”在设置时分秒状态下,按键sw7表示递增,sw12表示递减长按sw1回到滚动显示主菜单 数码管显示方式、按键方式、发声方式、设置初始值方式介绍 数码管显示方式滚动显示滚动显示年月日、时分秒全亮显示6位数码管显示全亮亮度相同部分亮显示在调节时间的时分秒以及日期的年月日时,数码管相应部分的显示较其它部分亮度变暗 按键方式短时间按键为了满足复杂逻辑的需要,通过检测按键时间的长短来进行系统设计长时间按键 闹铃、整点报时以及按键发声方式按键发声由于实验箱部分按键接触存在问题,因此通过按键有效时发出鸣叫声来提醒操作者此时按键有效闹铃1普通滴滴声 -鸣叫方式:当满足设置闹利用实验箱上的拨盘对初始值进行设置钟时,闹铃持续30秒,在此30秒钟,前10s发出缓慢的滴滴声,10s20s时发出较快的滴滴声,20s30s时发出急促的滴滴声,之后闹钟停止30s,之后再次想起,如此反复3次,如果在此期间按任意键,则闹钟不再响铃。闹铃2曲1化蝶闹铃3曲2小兔子乖乖闹铃4曲3友谊天长地久整点报时上午(下午)112点分别响铃相应的次数 设置时钟等主要方式按键以1为单位递增或递减快速递增或递减以10HZ的速度递增或递减拨盘设置利用实验箱上的拨盘对初始值进行设置键盘扫描输入设置利用实验箱上的键盘对初始值进行设置在键盘输入和拨盘输入设置初始值时根据设置的内容保证设置的值不超出范围,例如在设置分时分的高位不超过5,低位不超过9l 系统RTL图从RTL图中我们可以看到程序中采用了层次化设计,在RTL图中的每一个绿色的小模块均表示实现某一component的电路模块,例如图中的外框为红色的即为时钟生成模块(clk_generate.vhd)。l 资源消耗总功能的实现所消耗的资源为:分析:此系统共使用的模块为2547,为总消耗的43%,资源消耗比较适中。对各个模块所消耗的资源进行观察如下:clock_data模块的资源消耗情况:alarm_ring模块的资源消耗状况: 由上面的数据可见,通过层次化设计使得每个功能模块所消耗的资源大约在100左右,从而使得逻辑简单,容易实现,而且通过层次化设计,每个模块的可移植性强,便于今后模块复用,同时也使得系统功能更加容易扩展。七系统总结 本系统几乎包括了电子表所有的实用功能,即:年,月,日,时,分,秒计时显示,还有附加星期的显示。秒表功能,倒计时功能,闹钟功能(其中有四种闹钟铃声可供选择),整点报时功能。主状态下的滚动显示增加了系统的活力以及灵活性,各个子功能状态切换自如,人机界面友好,使用方便。另外,本系统还充分利用实验环境中的输入资源,不但可以逐次按键加减设定时间,在不同的需要下,还可以拨盘输入,甚至直接键盘输入,多种输入设定方式可供用户方便选择。八. 可以改进的方向虽然此电子表系统功能齐全,而且在基本使用上很少有bug,但是还是存在一些不足,主要表现在1、当滚动显示时由于扫描时钟过高,而造成在本来不应该有显示的数码管位置处有淡淡的显示,主要改进方法就是适当调整扫描时钟使得数码管显示亮度适中又不会造成上述情况。2、有些功能的操作与实际不符:例如秒表模块,在真正的秒表模块中start和stop是同一个键,但是当时由于没有考虑与实际应用相一致,因此采用了两个键。3、对此电子表系统还可以进行进一步的功能扩展,例如对秒表可以在一次计时开始后,可以多次停止再继续开始,并且使得该秒表可以存储中间的计数值,以待以后使用。九实验总结在用VHDL编程实现一个较大的系统时,层次化设计就是团队合作的基础,而层次化设计最重要的有两点:如何划分元件模块和接口的设计,一个好的划分元件模块和接口的设计使得各个component能够很好的协调和工作。通过模块的划分进行层次性设计,我们的每个组员几乎都可以单独调试自己的程序而不会造成互相干扰,而且很容易嵌入至主程序。由于实现电子表的基本功能是一项较简单的工作,因此我们这次的系统设计主要围绕如何能够展现出自己的特色,如何让系统工作更加稳定,如何充分利用实验箱提供的资源让系统功能进一步完善。附录:VHDL源码:主程序文件 clock.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_signed.all;use ieee.std_logic_unsigned.all;entity clock isport (clk_20M : in std_logic;kin : inout std_logic_vector(3 downto 0);sw1,sw2,sw7,sw12 : in std_logic;s1 : in std_logic_vector(3 downto 0);s2 : in std_logic_vector(3 downto 0);lcd : out std_logic_vector(7 downto 0);led : out std_logic_vector(7 downto 0);scan : out std_logic_vector(3 downto 0);en : out std_logic_vector(5 downto 0);audio : out std_logic);end clock;architecture main of clock iscomponent clk_generate is -时钟生成模块port (clk_20M : in std_logic;clk_1M : out std_logic;clk_200 : out std_logic;clk_100 : out std_logic;clk_10 : out std_logic;clk_1 : out std_logic);end component;component rolling_display is -滚动显示模块port (clk_20M : in std_logic;clk_1 : in std_logic;lcd_data : in std_logic_vector(47 downto 0);lcd_main : out std_logic_vector(7 downto 0);en_main : out std_logic_vector(5 downto 0);end component;component lcd_display is -七段数码显示模块port (clk_20M : in std_logic;lcd_data : in std_logic_vector(23 downto 0);flash : in std_logic_vector(1 downto 0);lcd_sub : out std_logic_vector(7 downto 0);en_sub : out std_logic_vector(5 downto 0);end component;component input_tran is -输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论