资源描述
[基于FPGA数字跑表]
专业: 电子信息工程
班级: 电子xxx班
学生学号: xxxx
学生姓名: xxxx
指导教师: xxxx
完成时间: 2024年4月15日
FPGA设计实践报告
Logo Sina :@Jennifer-tth
数字跑表设计
一、 设计概述
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
Verilog HDL语言是在C语言的基础上发展而来的。从语法结构上看,Verilog HDL继承和借鉴了C语言的很多语法,两者有许多的相似之处,但Verilog HDL作为一种硬件描述语言,还是有本质的区别。即可适用于综合的电路设计,也可胜任电路和系统的仿真;能在多层次上对所设计的系统加以描述,从开关级、门级,寄存器传输级到行为级等都可以担任,而且没规模限制;灵活多变的电路描述风格,可进行行为描述,也可进行结构描述等,应用十分的广泛。
QuartusⅡ软件是Atlera的CPLD/FPGA集成开发软件,具有完善的可视化设计环境,并具有标准的EDA工具接口,基于QuartusⅡ进行EDA设计开发需要以下步骤:设计输入、编译、仿真、编程与验证等。
本次通过Verilog HDL语言编写一个具有“百分秒、秒、分”计时功能的数字跑表,可以实现一个小时内精确至百分之一秒的计时器。数字跑表的显示可以通过编写数码管显示模块程序来实现,设计实现计数及进位的功能,通过几个always模块的设计实现一个特定用途的电子产品------数字跑表。
二、设计功能
数字跑表是生活中常见的一种电子产品,特别应用与体育比赛中。本数字跑表是通过按键来控制计时的开始和结束,一个是复位控制按键,用于设计跑表为初始零状态;另一个则是开始/停止控制按键,在复位控制无效的情况下,按一下开始/停止键则计时器开始计时,再按一下则暂停计时,再按一下则继续计时。下面是其功能图:
具体性能如下:
(1) 跑表的计时范围为0.01s~59min59.99s,计时精度为10ms;
(2) 具有异步复位清零、启动、计时和暂停功能;
(3) 输入时钟频率为100Hz;
(4) 要求数字跑表的输出能够直接驱动共阴极7段数码管显示.
实现要求:
(1) 分析功能要求,划分功能模块;
(2) 编写各模块的VerilogHDL语言的设计程序;
(3) 在QuartusⅡ软件上完成设计和仿真;
(4) 根据实验室FPGA芯片,将设计生成配置文件,然后将配置文件下载到实验装置上运行,操作实验装置上设定的功能按键,验证设计功能。
三、设计方案
本次设计的跑表首先要从最低位的百分秒计数器开始,按照系统时钟进行计数。百分位计数到100后向秒计数器进位,秒计数器以百分秒计数器的进位位为时钟进行计数。秒计数到60后向分计数器进位,分计数器以秒计数器的进位位为时钟进行计数。数字跑表巧妙地运用进位位作为时钟来减少了计数的位数。
数字跑表提供了清零位CLR和暂停/开始位PAUSE,百分秒的时钟信号可以通过系统时钟分频提供。分频至100Hz,即可实现时间计数。
具体程序设计分为两个大模块。主要模块说明功能的分配、内部功能块和对外接口关系,功能模块具体控制实际的逻辑功能和具体的实现。
(一) 主模块
在主程序模块中包括两部分,第一部分是VerilogHDL程序的逻辑结构。用if...else以及进位来实现百分秒计满到99进位到秒,当秒满59时进位到分,分满59以后归0.第二部分是LDE显示部分。
(二) 时钟模块
第二大模块是时钟分频模块,本实验利用开发板上50MHz的时钟频率,通过分频程序将其分成所要求的100Hz。通过计算得到需要利用500000分之一的分频,但是分频后快半秒,时钟是翻转后的一个高电平和一个低电平所以,最后分频是250000分之一分频。这样就刚好是正常的时间跳变速度。
四、 程序分析
下面是程序的主要流程图:
分高位
分低位
秒高位
秒低位
百分秒高位
百分秒低位
MH
ML
SH
SL
MSH
MSL
/*信号定义
CLK: 时钟信号;
CLR: 异步复位信号;
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: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;
reg cn1,cn2; //cn1为百分秒向秒的进位,cn2为秒向分的进位
//百分秒计数进程,每计满100,cn1产生一个进位1
always @(posedge clk or posedge clr)
begin
if(clr) //异步复位
begin
{msh,msl}<=8'h00; //从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;
cn1<=0; //低位未计数到10时,CN1不产生进位
end
end
end
//秒计数模块,每计数满60,CN2产生一个进位
always @(posedge cn1 or posedge clr)
begin
if (clr)
begin //异步复位
{sh,sl}<=8'h00;
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; //低位未计数到10,低位计数
cn2<=0; //低位未计数到10时,CN2不产生进位
end
end
//分钟计数模块,每计满60,系统自动清0
always@ (posedge cn2 or posedge clr)
begin
if(clr)
begin //异步复位
{mh,ml}<=8'h00;
end
else
if(ml==9)
begin
ml<=0; //低位分计数到10时,低位归零
if (mh==5)
mh<=0; //低位计数到10,高位计数到6时,高位归零
else
mh<=mh+1; //低位计数到10,高位未计数到6时,高位计数
end
else
ml<=ml+1; //低位计数未到10时,低位计数
end
//led显示模块
always@(msl[3:0])
begin
case(msl[3:0]) //利用case语句控制显示低位百分秒的0~9
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@(msh[3:0])
begin
case(msh[3:0]) //利用case语句控制显示高位百分秒的0~9
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@(sl[3:0])
begin
case(sl[3:0]) //利用case语句控制显示低位秒的0~9
0: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;
endcase
end
always@(sh[3:0])
begin
case(sh[3:0]) //利用case语句控制显示高位秒的0~5
0:led4='b1000000;
1:led4='b1111001;
2:led4='b0100100;
3:led4='b0110000;
4:led4='b0011001;
5:led4='b0010010;
endcase
end
always@(ml[3:0])
begin
case(ml[3:0]) //利用case语句控制显示低位分的0~9
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@(mh[3:0])
begin
case(mh[3:0]) //利用case语句控制显示高位分的0~5
0:led6='b1000000;
1:led6='b1111001;
2:led6='b0100100;
3:led6='b0110000;
4:led6='b0011001;
5:led6='b0010010;
endcase
end
endmodule
module led (ledin,ledout);//七段译码模块
input[3:0] ledin;
output[6:0] ledout;
reg[6:0] ledout;
always@(ledin) //case语句进行译码
begin case(ledin) //分别对应数码管的a--g
4'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;
endcase
end
endmodule
分频模块
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;
end
endmodule
五、 仿真实现
(一)系统的功能模块原理图:
(二)仿真图
六、硬件实现
(一)引脚图
(二)硬件图
图中拨动开关右起第一个是复位功能键,第二个是暂停/开始键。当复位键高电平时,跑表全部复位归零,拨动暂停/开始键依旧显示归零;当暂停键高电平时跑表停止计数,再恢复低电平继续计时。
七、总结
至此为期六周的FPGA设计实践课程就结束了,通过这段时间的学习实践,我初步掌握了Verilog HDL这种目前应用最广泛的硬件描述语言的编写方法以及联机下载到硬件验证的整个流程,圆满完成了设计任务。
1.通过实验熟悉了Quartus 软件编写 Verilog HDL语言以及下载到硬件的方法。
2.程序设计是这次实验的重点,通过老师上课讲的内容自己实际做了进位程序以及分频程序,基本掌握了它的使用。
3.在写完程序后,发现不能调用各个程序模块,后来在x老师的点拨下改成使用程序模块来生成具体的模块来使整个系统正常工作。
4.新建工程名的时候出现了和所建模块一样的名字导致编译出错,最后改正才能正常编译。
5.程序设计遇到了数码管无法显示的瓶颈,在老师的指导下通过LED显示模块实现了将4位MSL...转换成7段码对其进行显示,最终解决了这一问题。
6.下载到硬件以后时间略快半秒,对分频进行改进后得以和正常的时间相同。
总体上,本设计已经达到了预期的效果,在软件上做了相关的仿真,也实现了在硬件上的测试。
在此次课程设计过程中,我提升了自己的自学能力和动手能力,得到了x老师的悉心指导,使我受益匪浅,很多思路和方法都是在讨论过程中逐渐形成和完善的,在此我向xxxx老师表示衷心的感谢,谢谢老师对我的大力帮助。在完成自己的设计后,我还帮助其他同学解决了一些问题,拓展了自己的思路,享受了合作的快乐,增进了友谊,这也是一笔很大的收获。
八、参考文献
陈赜 《CPLD/FPGA与ASIC设计实践教程》,科学出版社,
2010年9月
Sina :@Jennifer-tth
展开阅读全文