基于FPGA的多功能数字钟设计实现.doc_第1页
基于FPGA的多功能数字钟设计实现.doc_第2页
基于FPGA的多功能数字钟设计实现.doc_第3页
基于FPGA的多功能数字钟设计实现.doc_第4页
基于FPGA的多功能数字钟设计实现.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

电子技术课程设计设计报告题目:基于FPGA的多功能数字钟设计实现班级:姓 名 :学 号 :指导教师:上交日期:2017.5.21摘 要 本设计为基于FPGA的多功能数字钟设计实现,具有计时、校对、闹钟、报整点等基础功能,以及日期、秒表、电子琴、延时闹钟、音乐闹钟等拓展功能。本设计采用EDA技术,以硬件描述语言Verilog HDL为系统逻辑描述语言设计文件,在QUARTUSII工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。 系统采用Alera DE0开发板,并外接了蜂鸣器电路。系统由分频模块、计时模块、闹钟模块、控制模块、显示模块、秒表模块、音乐模块、日期模块、电子琴模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成需求功能。 关键词:数字时钟,硬件描述语言,Verilog HDL,FPGA目录摘 要2目录31 绪论51.1背景51.2项目创意72需求分析82.1任务目标82.2元件清单82.3小组分工93系统设计93.1 系统主板电路分析93.2模块化设计方案164 模块电路设计174.1顶层模块174.2分频模块194.2.1 分频模块设计194.2.2 分频模块仿真214.3 计时模块214.3.1 计时模块设计214.3.2 计时模块仿真234.4 控制模块244.4.1 控制模块设计244.4.2 控制模块仿真244.5 秒表模块244.5.1 秒表模块设计244.6 日期模块264.6.1 日期模块设计264.7 电子琴模块284.7.1 电子琴模块设计285 系统调试及结果分析305.1 硬件检查305.2 软件编译305.3 调试过程及结果315.4 调试注意事项326 总结336.1课设中出现的问题与解决方案336.2心得体会331 绪论1.1 背景现代的社会是一个信息产品广泛使用,产品的性能越来越强大,做工越来越精细,工艺越来越高,更新换代越来越迅速的社会。而支持电子信息产品高速发展的是不断提高的微电子制造工艺水平和不断发展的电子产品的设计开发技术。EDA技术则正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。EDA是电子设计自动化(Electronics Design Automation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VerilogHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。现代EDA技术代表了当今电子设计技术的最新发展方向,它的基本特征是采用了硬件描述语言进行电路与系统的设计,具有系统仿真和综合能力。超大规模可编程逻辑器件是EDA得以实现的硬件基础,具有硬件测试和实现快捷、开发效率高、技术维护简单、工作可靠性好等特点。现场可编程门阵列(Field Programmable Gate Arrays,FPGA)是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。它是一种可编程使用的信号处理器件。通过改变配置信息,用户可对其功能进行定义,以满足设计需求。通过开发,FPGA能够实现任何数字器件的功能。与传统数字电路相比,FPGA具有可编程、高集成度、高可靠度和高速等优点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(161RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。硬件描述语言HDL(Hardware Description Language)是一种电子系统硬件行为描述、结构描述、数据流描述的语言。利用这种语言,数字电路系统的设计可以从顶层到底层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后,利用电子设计自动化( EDA )工具,逐层进行仿真验证,再把其中需要变为实际电路的模块组合,经过自动综合工具转换到门级电路网表。接下去,再用专用集成电路 ASIC 或现场可编程门阵列 FPGA 自动布局布线工具,把网表转换为要实现的具体电路布线结构。目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,HDL 在这种形势下显示出了巨大的优势,展望将来HDL 在硬件设计领域的地位将与C 和C+在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。Verilog HDL是工业和学术界的硬件设计者使用的两种主流的HDL 之一,另一种是VHDL,这两种HDL都已成为IEEE 标准。两者各有特点,但Verilog HDL 拥有更悠久的历史、更广泛的设计群体,资源也远比VHDL 丰富,且非常容易学习掌握。Verilog HDL是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,但它较自由的语法,也容易使初学者犯一些错误。Verilog HDL用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模,被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构。组成以及包含响应监控和设计验证方面的时延和波形产生机制都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。Verilog HDL提供了扩展的建模能力,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。1.2 项目创意数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,是人们日常生活中不可少的必需品。它是近代世界钟表业界的第三次革命:第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用,使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们更为熟悉的数字显示方式。钟表的数字化给人们生产生活带来了很大的方便,而且极大的扩展了钟表原先的功能。因此,电子时钟的出现给钟表计时业界带来了跨跃性的进步。数字钟的设计方法有许多种,例如可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用单片机来实现电子钟等等。这些方法都各有其特点,本次课程设计我们基于FPGA设计并开发一个数字钟,并且附带多种功能。2 需求分析2.1 任务目标设计开发一个基于FPGA器件的多功能数字钟,数字钟实现的功能如下:基本功能:1计时、校时与校分(自动校时、手动校时、指定时间(时、分、秒)校时);2报整点、广播报时;3闹钟与闹钟设置.:对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。拓展功能:1. 日期:具备显示日期、设定日期、自动调整日期功能;2. 秒表:具备显示功能、开始与暂停功能、清零功能;3. 电子琴:具备21个声调的发音以及显示功能;4. 延时闹钟:具备使闹钟时间延迟的功能;5. 音乐闹钟:具备多种音乐供使用者选择为闹钟。2.2 元件清单元件名称数量FPGA开发板DE0(Altera)1块数据线1根电源线1根蜂鸣器1个电路板1块三极管1个电阻若干导线若干2.3小组分工小组成员负责功能王艺敏闹钟、音乐闹钟、延时闹钟张翼飞计时、报时、秒表、日期、电子琴朱天宇显示、蜂鸣器电路其中我负责计时、报时、秒表、日期、电子琴等功能的设计和实现:1计时、校时与校分(自动校时、手动校时、指定时间(时、分、秒)校时);2.日期:具备显示日期、设定日期、自动调整日期功能;3.秒表:具备显示功能、开始与暂停功能、清零功能;4.电子琴:具备21个声调的发音以及显示功能。3系统设计3.1 系统主板电路分析DE0 开发板上的硬件:Altera Cyclone III 3C16 FPGA 器件;Altera 系列配置 EPCS4;板上USB Blaster 用于编程 ,支持JTAG 模式和 AS 模式;8 MB SDRAM ;4 MB 闪存 ;SD 卡槽; 3个按钮开关;10个拨动开关; 10个绿色LED ;50-MHz 振荡器时钟源 ;VGA DAC (4-bit 电阻网络) 带有VGA 输出接口; RS-232 接收器; PS/2 鼠标/键盘接口;两个40-pin 扩展口。下图为DE0开发板系统框图。为了提供用户最大灵活性,所有连接均通过Cyclone IIII FPGA 器件完成,因此用户可以配置FPGA来完成任何系统设计。CycloneIIII3C16FPGA15,408逻辑单元56M9K内存模块504KRAM56个内嵌乘法器4个锁相环346个I/Opins细间距球栅阵列484pins封装内置USBBlaster电路板上USBBlaster,用于编程及用户API(Applicationprogramminginterface)控制使用AlteraEPM240CPLDSDRAM单颗8MBSDRSDRAM芯片支持16-bits数据总线闪存4MBNOR闪存支持Byte(8-bits)/Word(16-bits)模式SD插口提供SPI模式和1位SD 模式用于SD 卡接入按钮开关3个按钮开关常闭开关,按下时产生低电平脉冲滑动开关10个滑动开关相应产生逻辑0与逻辑1人机界面10个绿色LED4个七段显示器16x2LCD接口(不含LCD模块)时钟输入50-MHz振荡器VGA输出4-bit电阻式DAC(数位类比转换)15-pin高密度D型接头最高支持1280x1024每秒60幅序列ports一组RS-232port(不含DB-9连接器)一组PS/2port(若要同时接滑鼠与键盘可使用PS/2YCable来扩充)两个40-pin扩充槽72个I/O接脚以及8个电源与接地接脚用于40-pin扩充槽的排线可利用IDE硬碟专用的40-pin排线1. LED灯和开关DE0开发板提供了3个按钮开关,分别为BUTTON0, BUTTON1和 BUTTON2,均直接连接至 Cyclone III FPGA芯片。 每个按钮开关没有被按下时,会输出高电平(3.3 V);被按下则会输出低电平(0 V)。 DE0开发板上同时也提供了10 个拨动开关。这些拨动开关均没有去抖动电路,故一般供电平敏感的电路做信号输入之用。每个拨动开关均直接连接至Cyclone III FPGA芯片上的一个特定引脚。当拨动开关置于DOWN档 (接近板子的边缘)时,它会提供一个低电平 (0 V) 的输入至PGA,当其置于 UP 档时,将会提供一个高电平(3.3 V)的输入。 DE0开发板上还提供了10个可供用户控制的 LED灯。每一个LED灯均是由Cyclone III FPGA芯片上的特定引脚直接驱动的;将其相对应的引脚置于高电平可点亮LED 灯,置于低电平则将熄灭LED灯。下图分别给出了按钮开关,拨动开关与Cyclone III FPGA芯片的连接示意图。2七段数码管DE0 开发板上提供了4个七段数码管。分为2组,每组2个,用于显示不同大小的数字。如图所示,七段数码管已连接至 Cyclone III FPGA芯片的相应引脚。FPGA输出低电压的时候,对应的字码段点亮,反之则熄灭。 数码管的每一个字段都被从0到 6依次编号,如图所示。除此之外,小数点被定义为DP。下表给出了所有七段数码管与FPGA芯片的引脚连接信息。信号名 FPGA引脚号 说明HEX0_D0 PIN_E11 Seven Segment Digit 00HEX0_D1 PIN_F11 Seven Segment Digit 01HEX0_D2 PIN_H12 Seven Segment Digit 02HEX0_D3 PIN_H13 Seven Segment Digit 03HEX0_D4 PIN_G12 Seven Segment Digit 04HEX0_D5 PIN_F12 Seven Segment Digit 05HEX0_D6 PIN_F13 Seven Segment Digit 06HEX0_DP PIN_D13 Seven Segment Decimal Point 0HEX1_D0 PIN_A13 Seven Segment Digit 10HEX1_D1 PIN_B13 Seven Segment Digit 11HEX1_D2 PIN_C13 Seven Segment Digit 12HEX1_D3 PIN_A14 Seven Segment Digit 13HEX1_D4 PIN_B14 Seven Segment Digit 14HEX1_D5 PIN_E14 Seven Segment Digit 15HEX1_D6 PIN_A15 Seven Segment Digit 16HEX1_DP PIN_B15 Seven Segment Decimal Point 1HEX2_D0 PIN_D15 Seven Segment Digit 20HEX2_D1 PIN_A16 Seven Segment Digit 21HEX2_D2 PIN_B16 Seven Segment Digit 22HEX2_D3 PIN_E15 Seven Segment Digit 23HEX2_D4 PIN_A17 Seven Segment Digit 24HEX2_D5 PIN_B17 Seven Segment Digit 25HEX2_D6 PIN_F14 Seven Segment Digit 26HEX2_DP PIN_A18 Seven Segment Decimal Point 2HEX3_D0 PIN_B18 Seven Segment Digit 30HEX3_D1 PIN_F15 Seven Segment Digit 31HEX3_D2 PIN_A19 Seven Segment Digit 32HEX3_D3 PIN_B19 Seven Segment Digit 33HEX3_D4 PIN_C19 Seven Segment Digit 34HEX3_D5 PIN_D19 Seven Segment Digit 35HEX3_D6 PIN_G15 Seven Segment Digit 36HEX3_DP PIN_G16 Seven Segment Decimal Point 33. 时钟电路DE0 开发板提供了一个 50 MHz 的时钟信号。 该已连接至 FPGA 芯片的时钟信号可用于驱动FPGA 内的用户逻辑电路。 除此之外,所有的时钟输入都连接至 FPGA 芯片的 PLL 时钟输入引脚,从而允许用户将这些时钟信号作为 PLL 电路的信号输入源。DE0 开发板上的时钟分配信息如图:4. 扩展接头DE0 开发板上有提供两个 40-pin 扩展接头。每个接头都直接连接至 Cyclone III FPGA 芯片上的36个引脚,同时也提供了 DC +5V (VCC5), DC +3.3V (VCC33)引脚和2个GND 引脚。在这36个 I/O 引脚中,4个引脚连接至 FPGA 芯片的 PLL 时钟输入与输出引脚,允许扩展子卡访问 FPGA 芯片的 PLL 模块。最后, 图 4-13 给出了相关的示意图。该图显示了这两个接头上的保护电路,但是该电路包含了所有的 72 数据引脚。3.2模块化设计方案根据需求,将整个系统划分为以下几个模块:1. 分频模块:由于FPGA内部提供的时钟信号频率大约为50MHz,所以需要将它转化成1Hz的标准时钟信号供数字钟的计时显示。2. 计时模块:进行计时和调时的功能模块。3. 闹钟模块:用于调整和控制闹钟。4. 控制模块:总体控制各个功能的启动和切换。5. 显示模块:实现对各个功能的显示。6. 秒表模块:实现秒表功能。7. 音乐模块:实现音乐数字钟功能。8. 日期模块:实现日期的控制和调整功能。9. 电子琴模块:实现电子琴的各种功能。总体模块设计框图:其中我负责的模块有:1.分频模块:由于FPGA内部提供的时钟信号频率大约为50MHz,所以需要将它转化成1Hz的标准时钟信号供数字钟的计时显示。2.计时模块:进行计时和调时的功能模块。3.控制模块:总体控制各个功能的启动和切换。4.秒表模块:实现秒表功能。5.日期模块:实现日期的控制和调整功能。6.电子琴模块:实现电子琴的各种功能。4 模块电路设计4.1顶层模块顶层模块框图:顶层模块的输入输出信号定义:module clock(clk,switch,key,seg_out0,seg_out1,seg_out2,seg_out3,beep);/ 模块名 input clk; / 输入时钟 input 7:0 switch;/输入开关: switch0显示切换,switch1设置/switch2闹钟,switch3闹钟开关,switch4秒表/switch5秒表开关,switch6日期,switch7电子琴input 2:0 key; /输入按键 ,key2:0分别为秒,分钟,小时的增加按键。output reg7:0 seg_out0,seg_out1,seg_out2,seg_out3; / 数码管0123的输/出引脚 output beep; /蜂鸣器输出端对各个接口信号及寄存器定义: reg 14:0 count; /定义计数寄存器 reg 5:0 count1; /定义计数寄存器1 reg 4:0 count2; /定义计数寄存器2reg 2:0 count3; /定义计数寄存器3reg 23:0 count4;/定义计数寄存器4reg 7:0 countpu;reg clk_ms; /1ms时钟reg clk_10ms;/10ms时钟reg clk_100ms;/100ms时钟reg clk_day=0;/1day时钟reg clk_4hz;/4hz时钟reg 23:0 now_time = 24h080057; / 定义现在时刻寄存器 reg 23:0 clk_time = 24h080100; /定义闹钟时刻寄存器 reg 23:0 stp_time = 24h000000; /定义秒表时刻寄存器reg 31:0 now_dat = 32h20170604; /定义日期寄存器reg 7:0 day_number;/定义日数寄存器reg 15:0 show_data; /定义数据寄存器reg 16:0 jishu_count = 17d0;reg 16:0 alarm_count = 17d131071;reg 16:0 plmusic_count = 17d131071;reg 7:0 music_key;/定义音调寄存器,7:4为123分别表示低中高音,3:0为1234567分别为音调。reg 7:0 r_switch;/定义按键寄存器reg 2:0 dout1 = 3b111; /按键寄存器 reg 2:0 dout2 = 3b111; reg 2:0 dout3 = 3b111; wire 2:0 time_set;/秒分时设置输出wire show_sec;/0显示时分,1显示秒wire show_clk;/0显示时间,1显示闹钟reg 3:0 alarm_set = 4h1;reg alarm;reg beep_s=1;reg baoshi;4.2分频模块4.2.1 分频模块设计clk_ms对于分频模块,目的是使用原有的50Mhz的时钟信号生成需要的1ms、10ms、100ms、4hz的时钟信号,分别用于计时模块、控制模块、秒表模块、日期模块、闹钟模块、音乐模块、电子琴模块。框图如下图:clk_10msclk分频模块clk_4hzclk_100ms关键代码及注释:/1ms信号产生部分 always (posedge clk) / 定义 clock 上升沿触发 begin count = count + 1b1; if(count = 15d25000) /0.5mS到了吗? begin count = 15d0; /计数器清零 clk_ms = clk_ms; /置位ms标志 end end /10ms信号产生部分always (posedge clk_ms)begincount3 = count3 + 1b1;if(count3 = 3d5)begincount3 = 3d0;clk_10ms = clk_10ms;endend/100ms信号产生部分 always (posedge clk_ms) / 定义 clock 上升沿触发 begin count1 = count1 + 1b1; if(count1 = 6d50) /50mS到了吗? begin count1 = 6d0; /计数器清零 clk_100ms = clk_100ms; /置位100毫秒标志 end end/4hz信号产生部分always(posedgeclk)/定义 clock 上升沿触发begincount4 = count4 + 1b1;if(count4 = 24d6250000)/25ms到了吗begincount4 = 24d0;clk_4hz = clk_4hz;endend4.2.2 分频模块仿真通过设置功能仿真,检查代码的正确性:由仿真可知模块正确。4.3 计时模块4.3.1 计时模块设计计时模块是采用16进制来实现的,将now_time23:0定义为其时分秒,其中now_time3:0为其秒钟上的个位数值,now_time7:4为其秒钟上的十位数值,now_time11:8为其分钟上的个位数值,now_time15:12为其分钟上的十位数值,now_time19:16为其时钟上的个位数值,now_time23:20为其时钟上的十位数值。当自动计时时,秒脉冲过来,秒个位now_time 3:0便开始加1,当加到9时,秒十位加1,与此同时秒个位清零,继续加1。当秒十位now_time7:4为5秒个位为9时(即59秒),分个位now_time 11:8加1,与此同时秒个位和秒十位都清零。以此类推,当分十位now_time 15:12为5和分个位为9时(即59分),时个位加1,与此同时时个位now_time 19:16和分十位都清零。当时十位now_time 23:20为2和时个位为4,全部清零,开始重新计时。而当调时时,根据按键不同,分别使秒个位、分个位、时个位加1,但秒分时之间没有进位。从功能上讲分别为模60计数器,模60计数器和模24计数器。关键代码及注释:/计时和调时模块/调整时间beginif(time_set2)/调秒beginnow_time3:0 = now_time3:0 + 1b1; /秒加 1 if(now_time3:0 = 4ha) /加到10,复位 begin now_time3:0 = 4h0; now_time7:4 = now_time7:4 + 1b1; / 秒的十位加一 if(now_time7:4 = 4h6) /加到6,复位 now_time7:4 = 4h0; endendelse if(time_set1)/调分beginnow_time11:8 = now_time11:8 + 1b1; /分个位加一 if(now_time11:8 = 4ha) /加到10,复位 begin now_time11:8 = 4h0; now_time15:12 = now_time15:12 + 1b1; /分十位加一 if(now_time15:12 = 4h6) /加到6,复位 now_time15:12 = 4h0; endendelse if(time_set0)/调时beginnow_time19:16 = now_time19:16 + 1b1; /时个位加一 if(now_time19:16 = 4ha) /加到10,复位 begin now_time19:16 = 4h0; now_time23:20 = now_time23:20 + 1b1; /时十位加一 end if(now_time23:16 = 8h24) /加到24,复位 now_time23:16 = 8h0; end end / 计 时 begincount2 = count2 + 1b1;if(count2=4d10)begincount2=4d0;now_time3:0 = now_time3:0 + 1b1; /秒加 1 if(now_time3:0 = 4ha) begin now_time3:0 = 4h0; now_time7:4 = now_time7:4 + 1b1; / 秒的十位加一 if(now_time7:4 = 4h6) begin now_time7:4 = 4h0; now_time11:8 = now_time11:8 + 1b1; /分个位加一 if(now_time11:8 = 4ha) begin now_time11:8 = 4h0; now_time15:12=now_time15:12 + 1b1;/分十位加一 if(now_time15:12 = 4h6) begin now_time15:12 = 4h0; now_time19:16=now_time19:16+1b1;/时个位加一 if(now_time19:16 = 4ha) begin now_time19:16 = 4h0; now_time23:20=now_time23:20 + 1b1; /时十位加一 if(now_time23:16 = 8h24) beginnow_time23:16 = 8h0;clk_day=clk_day; end end end end end end end4.3.2 计时模块仿真通过设置功能仿真,检查代码的正确性:由仿真可知模块正确。4.4 控制模块4.4.1 控制模块设计对按键实现去抖处理,对开关进行重新定义,并且对按键开关进行译码确保其他模块的功能实现。部分关键代码及注释:assign time_set = (key|dout3); / 按键消抖输出 always (posedge count15) /按键去噪声 begin dout1 = key; dout2 = dout1; dout3 =1&(!switch7)stp_time=24h000000;/重置秒表else if(switch5=0);elsebeginstp_time3:0 = stp_time3:0 + 1b1; /10ms加 1 if(stp_time3:0 = 4ha) begin stp_time3:0 = 4h0; stp_time7:4 = stp_time7:4 + 1b1; / 10ms的十位加一 if(stp_time7:4 = 4ha) begin stp_time7:4 = 4h0; stp_time11:8 = stp_time11:8 + 1b1; /秒个位加一 if(stp_time11:8 = 4ha) begin stp_time11:8 = 4h0; stp_time15:12 = stp_time15:12 + 1b1; /秒十位加一 if(stp_time15:12 = 4h6) begin stp_time15:12 = 4h0; stp_time19:16 = stp_time19:16 + 1b1; /分个位加一 if(stp_time19:16 = 4ha) begin stp_time19:16 = 4h0; stp_time23:20=stp_time23:20+1b1;/分十位加一 if(stp_time23:16 = 8h60) stp_time = 24h595999; end end end end end endend4.6 日期模块4.6.1 日期模块设计由于一年中各个月份的日的长短不同,共有二十八、二十九、三十和三十一天四种情况,可知日由年和月共同决定。二十九天的几率很低,为了方便起见,忽视闰年的情况,将所有年的二月视为二十八天。其中,一月、三月、五月、七月、八月、十月和十二月有三十一天,四月、六月、九月、十一月有三十天;二月有二十八天。日期模块是采用16进制来实现的,将now_dat 31:0定义为其年月日,其中now_dat3:0为其日位的个位数值,now_dat7:4为其日位上的十位数值,now_ dat11:8为其月位上的个位数值,now_ dat15:12为其月位上的十位数值,now_ dat19:16为其年位上的个位数值,now_ dat23:20为其年位上的十位数值,now_ dat27:24为其年位上的百位数值,now_ dat31:28为其年位上的千位数值。当自动计日期时,日脉冲过来,日个位now_ dat 3:0便开始加1,当加到9时,日十位加1,与此同时日个位清零,继续加1。根据当前月份,确定当月的日数day_number,当日位now_dat7:0大于这个day_number时,月个位now_ dat11:8加1,与此同时日个位置一,日十位清零。以此类推,当月十位now_ dat15:12为1和月个位大于2时(即12),年个位加1,与此同时月个位now_dat11:8置一,月十位清零。依次进位,当年位now_ dat31:16大于16h9999时,全部清零,开始重新计年。而当调日期时,根据按键不同,分别使日个位、月个位、年个位、年十位、年百位加1,但日、月、年个位、年十位、年百位之间没有进位。从功能上讲分别为模30(或29或27)计数器,模11计数器、模10计数器、模10计数器、模100计数器。部分关键代码及注释:/日期模块/调整日期/调日beginnow_dat3:0 = now_dat3:0 + 1b1; /日加 1 if(now_dat3:0 = 4ha) /加到10,复位 begin now_dat3:0 = 4h0; now_dat7:4 = now_dat7:4 + 1b1; / 日的十位加一 endcase(now_dat15:8)/根据月份为天数赋值8h01,8h03,8h05,8h07,8h08,8h10,8h12:day_number=8h31;8h02:day_number=8h28;8h04

温馨提示

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

评论

0/150

提交评论