基于FPGA数字跑表实验说明书.doc

上传人:h**** 文档编号:127801 上传时间:2018-07-09 格式:DOC 页数:41 大小:1.21MB
下载 相关 举报
基于FPGA数字跑表实验说明书.doc_第1页
第1页 / 共41页
基于FPGA数字跑表实验说明书.doc_第2页
第2页 / 共41页
基于FPGA数字跑表实验说明书.doc_第3页
第3页 / 共41页
基于FPGA数字跑表实验说明书.doc_第4页
第4页 / 共41页
基于FPGA数字跑表实验说明书.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、Logo Sina :Jennifer-tthFPGA 设计实践报告 基于 FPGA数字跑表 专 业: 电子信息工程 班 级: 电子 xxx 班 学生学号: xxxx 学生姓名: xxxx 指导教师: xxxx 完成时间: 2018 年 7 月 9 日 2 数字跑表设计 一、 设计概述 FPGA( Field Programmable Gate Array),即现场可编程门阵列,它是在PAL、 GAL、 CPLD 等可编程器件的基础上进一步发展的产物。它是作为 专用集成电路 ( ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足, 又克服了原有可编程器件门电路数有限的缺点。 Ve

2、rilog HDL 语言是在 C 语言的基础上发展而来的。从语法结构上看,Verilog HDL 继承和借鉴了 C 语言的很多语法,两者有许多的相似之处,但Verilog HDL 作为一种硬件描述语言,还是有本质的区别。即可适用于综合的电路设计,也可胜任电路和系统的仿真;能在多层次上对所设计的系统加以描述,从开关级、门级,寄存器传输级到行为级等都可以担任,而且没规模限制;灵活多变的电路描述风格,可进行行为描述,也可进行结构描述等,应用十分的广泛。 Quartus软件是 Atlera 的 CPLD/FPGA 集成开发软件,具有完善的可视化设计环境,并具有 标准的 EDA 工具接口,基于 Quar

3、tus进行 EDA 设计开发需要以下步骤 :设计输入、编译、仿真、编程与验证等。 本次通过 Verilog HDL 语言编写一个具有“百分秒、秒、分”计时功能的数字跑表,可以实现一个小时内精确至百分之一秒的计时器。数字跑表的显示可以通过编写数码管显示模块程序来实现,设计实现计数及进位的功能,通过几个always 模块的设计实现一个特定用途的电子产品 -数字跑表。 二、设计功能 数字跑表是生活中常见的一种电子产品,特别应用与体育比赛中。本数字跑表是通过按键来控制计时的 开始和结束,一个是复位控制按键,用于设计跑表为初始零状态;另一个则是开始 /停止控制按键,在复位控制无效的情况下,按一下开始 /

4、停止键则计时器开始计时,再按一下则暂停计时,再按一下则继续计时。下面是其功能图: 具体性能如下: ( 1) 跑表的计时范围为 0.01s 59min59.99s,计时精度为 10ms; ( 2) 具有异步复位清零、启动、计时和暂停功能; 3 ( 3) 输入时钟频率为 100Hz; ( 4) 要求数字跑表的输出能够直接驱动共阴极 7 段数码管显示 . 实现要求: ( 1) 分析功能要求,划分功能模块; ( 2) 编写各模块的 VerilogHDL 语言的设计程序; ( 3) 在 Quartus软件上完成设计和仿真; ( 4) 根据实验室 FPGA 芯片,将设计生成配置文件,然后将配置文件下载到实

5、验装置上运行,操作实验装置上设定的功能按键,验证设计功能。 三、设计方案 本次设计的跑表首先要从最低位的百分秒计数器开始,按照系统时钟进行计数。百分位计数到 100 后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。秒计数到 60 后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数。数字跑表巧妙地运用进位位作为时钟来减少了计数的位数。 数字跑表提 供了清零位 CLR 和暂停 /开始位 PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至 100Hz,即可实现时间计数。 具体程序设计分为两个大模块。主要模块说明功能的分配、内部功能块和对外接口关系,功能模块具体控制实

6、际的逻辑功能和具体的实现。 (一) 主模块 在主程序模块中包括两部分,第一部分是 VerilogHDL 程序的逻辑结构。用if.else 以及进位来实现百分秒计满到 99 进位到秒,当秒满 59 时进位到分,分满 59 以后归 0.第二部分是 LDE 显 示部分。 (二) 时钟模块 4 第二大模块是时钟分频模块,本实验利用开发板上 50MHz 的时钟频率,通过分频程序将其分成所要求的 100Hz。通过计算得到需要利用 500000 分之一的分频,但是分频后快半秒,时钟是翻转后的一个高电平和一个低电平所以,最后分频是 250000 分之一分频。这样就刚好是正常的时间跳变速度。 四、 程序分析 下

7、面是程序的主要流程图: /*信号定义 CLK: 时钟信号; CLR: 异步复位信号; 分高位 分低位 秒高位 秒低位 百分秒高位 百分秒低位 MH ML SH SL MSH MSL 5 PAUSE: 暂停 /启动信号; */ module h (clk,clr,pause,msh,msl,sh,sl,mh,ml,led1,led2,led3,led4,led5,led6); input clk,clr; input pause; output 6:0led1; output 6:0led2; output 6:0led3; output 6:0led4; output 6:0led5; out

8、put 6:0led6; output 3:0 msh,msl,sh,sl,mh,ml; reg 6:0led1; reg 6:0led2; reg 6:0led3; reg 6:0led4; reg 6:0led5; reg 6:0led6; reg3:0 msh,msl,sh,sl,mh,ml; reg cn1,cn2; /cn1 为百分秒向秒的进位, cn2 为秒向分的进位 /百分秒计数进程,每计满 100, cn1 产生一个进位 1 always (posedge clk or posedge clr) begin if(clr) /异步复位 begin msh,msl=8h00; /

9、从 00 开始计数 cn1=0; end else if(!pause) /PAUSE 为 0 时正常计数,为 1 时暂时计数 begin if (msl=9) begin msl=0; /低位百分秒计数到 10 是归零 if (msh=9) begin msh=0; /高位百分秒计数到 10 是归零 cn1=1; /CN1 触发进位 end else /低位计数到 10,高位未计数到 10 时,高位计数 msh=msh+1; end else begin /低位计数未到 10 时,继续计数 msl=msl+1; 6 cn1=0; /低位未计数到 10 时, CN1 不产生进位 end end

10、 end /秒计数模块,每计数满 60, CN2 产生一个进位 always (posedge cn1 or posedge clr) begin if (clr) begin /异步复位 sh,sl=8h00; cn2=0; end else if(sl=9) begin sl=0; /低位秒计数到 10,低位归零 if (sh=5) begin sh=0; /低位计数到 10,高位计数到 6 时 ,高位秒归零 cn2=1; /cn2 触发进位 end else sh=sh+1; /低位计数到 10,高位未到 6 时,低位计数 end else begin sl=sl+1; /低位未计数到

11、10,低位计数 cn2=0; /低位未计数到 10 时, CN2 不产生进位 end end /分钟计数模块,每计满 60,系统自动清 0 always (posedge cn2 or posedge clr) begin if(clr) begin /异步复位 mh,ml=8h00; end else if(ml=9) begin ml=0; /低位分计数到 10 时,低位归零 if (mh=5) mh=0; /低位计数到 10,高位计数到 6 时,高位归零 7 else mh=mh+1; /低位计数到 10,高位未计数到 6 时,高位计数 end else ml=ml+1; /低位计数未到

12、 10 时,低位计数 end /led 显示模块 always(msl3:0) begin case(msl3:0) /利用 case 语句控制显示低位百分秒的 09 0: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; endcase end always(msh3:0) begin case(msh3:0)

13、/利用 case 语句控制显示高位百分秒的 09 0: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; endcase end always(sl3:0) begin case(sl3:0) /利用 case 语句控制显示低位秒的 09 0:led3=b1000000; 1:led3=b1111001; 2:le

14、d3=b0100100; 3:led3=b0110000; 8 4:led3=b0011001; 5:led3=b0010010; 6:led3=b0000010; 7:led3=b1111000; 8:led3=b0000000; 9:led3=b0010000; endcase end always(sh3:0) begin case(sh3:0) /利用 case 语句控制显示高位秒的 05 0:led4=b1000000; 1:led4=b1111001; 2:led4=b0100100; 3:led4=b0110000; 4:led4=b0011001; 5:led4=b001001

15、0; endcase end always(ml3:0) begin case(ml3:0) /利用 case 语句控制显示低位分的 09 0: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; endcase end always(mh3:0) begin case(mh3:0) /利用 case 语句控制显示高

16、位分的 05 0:led6=b1000000; 1:led6=b1111001; 2:led6=b0100100; 3:led6=b0110000; 4:led6=b0011001; 5:led6=b0010010; endcase 9 end endmodule module led (ledin,ledout);/七段译码模块 input3:0 ledin; output6:0 ledout; reg6:0 ledout; always(ledin) /case 语句进行译码 begin case(ledin) /分别对应数码管的 a-g 4d0:ledout=7b11000000; 4d

17、1:ledout=7b11111001; 4d2:ledout=7b10100100; 4d3:ledout=7b10110000; 4d4:ledout=7b10011001; 4d5:ledout=7b10010010; 4d6:ledout=7b10000010; 4d7:ledout=7b11111000; 4d8:ledout=7b10000000; 4d9:ledout=7b10010000; default:ledout=7bx; endcase end endmodule 分频模块 module clk(f50m,f100); input f50m; output f100; reg f100; reg 31:0h; always(posedge f50m) begin if(h=250000) /对计数器进行判断,确定 f100 信号是否反转 begin h=0; /不计数 f100=f100; end else /未计数到 250000 时,继续计数 h=h+1; end endmodule 五、 仿真实现 10 (一)系统的功能模块原理图: (二)仿真图 六、硬件实现

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。