基于FPGA数字跑表_第1页
基于FPGA数字跑表_第2页
基于FPGA数字跑表_第3页
基于FPGA数字跑表_第4页
基于FPGA数字跑表_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

[基于FPGA数字跑表]专业:电子信息工程[基于FPGA数字跑表]专业:电子信息工程班级:电子xxx班学生学号:xxxx学生姓名:xxxx指导教师:xxxx完成时间:Time\@"yyyy年M月d日"xxxxx年x月xx日FPGA设计实践报告数字跑表设计设计概述FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。VerilogHDL语言是在C语言的基础上发展而来的。从语法结构上看,VerilogHDL继承和借鉴了C语言的很多语法,两者有许多的相似之处,但VerilogHDL作为一种硬件描述语言,还是有本质的区别。即可适用于综合的电路设计,也可胜任电路和系统的仿真;能在多层次上对所设计的系统加以描述,从开关级、门级,寄存器传输级到行为级等都可以担任,而且没规模限制;灵活多变的电路描述风格,可进行行为描述,也可进行结构描述等,应用十分的广泛。QuartusⅡ软件是Atlera的CPLD/FPGA集成开发软件,具有完善的可视化设计环境,并具有标准的EDA工具接口,基于QuartusⅡ进行EDA设计开发需要以下步骤:设计输入、编译、仿真、编程与验证等。本次通过VerilogHDL语言编写一个具有“百分秒、秒、分”计时功能的数字跑表,可以实现一个小时内精确至百分之一秒的计时器。数字跑表的显示可以通过编写数码管显示模块程序来实现,设计实现计数及进位的功能,通过几个always模块的设计实现一个特定用途的电子产品------数字跑表。二、设计功能 数字跑表是生活中常见的一种电子产品,特别应用与体育比赛中。本数字跑表是通过按键来控制计时的开始和结束,一个是复位控制按键,用于设计跑表为初始零状态;另一个则是开始/停止控制按键,在复位控制无效的情况下,按一下开始/停止键则计时器开始计时,再按一下则暂停计时,再按一下则继续计时。下面是其功能图:具体性能如下:跑表的计时范围为0.01s~59min59.99s,计时精度为10ms;具有异步复位清零、启动、计时和暂停功能;输入时钟频率为100Hz;要求数字跑表的输出能够直接驱动共阴极7段数码管显示.实现要求:分析功能要求,划分功能模块;编写各模块的VerilogHDL语言的设计程序;在QuartusⅡ软件上完成设计和仿真;根据实验室FPGA芯片,将设计生成配置文件,然后将配置文件下载到实验装置上运行,操作实验装置上设定的功能按键,验证设计功能。三、设计方案本次设计的跑表首先要从最低位的百分秒计数器开始,按照系统时钟进行计数。百分位计数到100后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。秒计数到60后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数。数字跑表巧妙地运用进位位作为时钟来减少了计数的位数。数字跑表提供了清零位CLR和暂停/开始位PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至100Hz,即可实现时间计数。具体程序设计分为两个大模块。主要模块说明功能的分配、内部功能块和对外接口关系,功能模块具体控制实际的逻辑功能和具体的实现。主模块在主程序模块中包括两部分,第一部分是VerilogHDL程序的逻辑结构。用if...else以及进位来实现百分秒计满到99进位到秒,当秒满59时进位到分,分满59以后归0.第二部分是LDE显示部分。时钟模块第二大模块是时钟分频模块,本实验利用开发板上50MHz的时钟频率,通过分频程序将其分成所要求的100Hz。通过计算得到需要利用500000分之一的分频,但是分频后快半秒,时钟是翻转后的一个高电平和一个低电平所以,最后分频是250000分之一分频。这样就刚好是正常的时间跳变速度。程序分析下面是程序的主要流程图:分高位分低位秒高位秒低位百分秒高位百分秒低位MHMLSHSLMSHMSL/*信号定义CLK:时钟信号;CLR:异步复位信号;PAUSE:暂停/启动信号;*/moduleh(clk,clr,pause,msh,msl,sh,sl,mh,ml,led1,led2,led3,led4,led5,led6);inputclk,clr;inputpause;output[6:0]led1;output[6:0]led2;output[6:0]led3;output[6:0]led4;output[6:0]led5;output[6:0]led6;output[3:0]msh,msl,sh,sl,mh,ml;reg[6:0]led1;reg[6:0]led2;reg[6:0]led3;reg[6:0]led4;reg[6:0]led5;reg[6:0]led6;reg[3:0]msh,msl,sh,sl,mh,ml;regcn1,cn2;//cn1为百分秒向秒的进位,cn2为秒向分的进位//百分秒计数进程,每计满100,cn1产生一个进位1always@(posedgeclkorposedgeclr)beginif(clr)//异步复位begin{msh,msl}<=8'h00;//从00开始计数cn1<=0;endelseif(!pause)//PAUSE为0时正常计数,为1时暂时计数beginif(msl==9)beginmsl<=0;//低位百分秒计数到10是归零if(msh==9)beginmsh<=0;//高位百分秒计数到10是归零cn1<=1;//CN1触发进位endelse//低位计数到10,高位未计数到10时,高位计数msh<=msh+1;endelsebegin//低位计数未到10时,继续计数msl<=msl+1;cn1<=0;//低位未计数到10时,CN1不产生进位endendend//秒计数模块,每计数满60,CN2产生一个进位always@(posedgecn1orposedgeclr)beginif(clr)begin//异步复位{sh,sl}<=8'h00;cn2<=0;endelseif(sl==9)beginsl<=0;//低位秒计数到10,低位归零if(sh==5)beginsh<=0;//低位计数到10,高位计数到6时,高位秒归零cn2<=1;//cn2触发进位endelsesh<=sh+1;//低位计数到10,高位未到6时,低位计数endelsebeginsl<=sl+1;//低位未计数到10,低位计数cn2<=0;//低位未计数到10时,CN2不产生进位endend//分钟计数模块,每计满60,系统自动清0always@(posedgecn2orposedgeclr)beginif(clr)begin//异步复位{mh,ml}<=8'h00;endelseif(ml==9)beginml<=0;//低位分计数到10时,低位归零if(mh==5)mh<=0;//低位计数到10,高位计数到6时,高位归零elsemh<=mh+1;//低位计数到10,高位未计数到6时,高位计数endelseml<=ml+1;//低位计数未到10时,低位计数end//led显示模块always@(msl[3:0])begincase(msl[3:0])//利用case语句控制显示低位百分秒的0~90:led1='b1000000;1:led1='b1111001;2:led1='b0100100;3:led1='b0110000;4:led1='b0011001;5:led1='b0010010;6:led1='b0000010;7:led1='b1111000;8:led1='b0000000;9:led1='b0010000;endcaseendalways@(msh[3:0])begincase(msh[3:0])//利用case语句控制显示高位百分秒的0~90:led2='b1000000;1:led2='b1111001;2:led2='b0100100;3:led2='b0110000;4:led2='b0011001;5:led2='b0010010;6:led2='b0000010;7:led2='b1111000;8:led2='b0000000;9:led2='b0010000;endcaseendalways@(sl[3:0])begincase(sl[3:0])//利用case语句控制显示低位秒的0~90:led3='b1000000;1:led3='b1111001;2:led3='b0100100;3:led3='b0110000;4:led3='b0011001;5:led3='b0010010;6:led3='b0000010;7:led3='b1111000;8:led3='b0000000;9:led3='b0010000;endcaseendalways@(sh[3:0])begincase(sh[3:0])//利用case语句控制显示高位秒的0~50:led4='b1000000;1:led4='b1111001;2:led4='b0100100;3:led4='b0110000;4:led4='b0011001;5:led4='b0010010;endcaseendalways@(ml[3:0])begincase(ml[3:0])//利用case语句控制显示低位分的0~90:led5='b1000000;1:led5='b1111001;2:led5='b0100100;3:led5='b0110000;4:led5='b0011001;5:led5='b0010010;6:led5='b0000010;7:led5='b1111000;8:led5='b0000000;9:led5='b0010000;endcaseendalways@(mh[3:0])begincase(mh[3:0])//利用case语句控制显示高位分的0~50:led6='b1000000;1:led6='b1111001;2:led6='b0100100;3:led6='b0110000;4:led6='b0011001;5:led6='b0010010;endcaseendendmodulemoduleled(ledin,ledout);//七段译码模块input[3:0]ledin;output[6:0]ledout;reg[6:0]ledout;always@(ledin)//case语句进行译码begincase(ledin)//分别对应数码管的a--g4'd0:ledout=7'b11000000;4'd1:ledout=7'b11111001;4'd2:ledout=7'b10100100;4'd3:ledout=7'b10110000;4'd4:ledout=7'b10011001;4'd5:ledout=7'b10010010;4'd6:ledout=7'b10000010;4'd7:ledout=7'b11111000;4'd8:ledout=7'b10000000;4'd9:ledout=7'b10010000;default:ledout=7'bx;endcaseendendmodule分频模块module clk(f50m,f100);input f50m;output f100;reg f100;reg [31:0]h;always@(posedge f50m) begin if(h==250000)//对计数器进行判断,确定f100信号是否反转 begin h<=0;//不计数 f100<=~f100; end else//未计数到250000时,继续计数 h<=h+1; endendmodule仿真实现(一)系统的功能模块原理图:(二)仿真图六、硬件实现(一)引脚图(二)硬件图图中拨动开关右起第一个是复位功能键,第二个是暂

温馨提示

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

评论

0/150

提交评论