FPGA计时器文档格式.docx
《FPGA计时器文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA计时器文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
在我们的实际生活中,高精度计时器常用于体育竞赛及各种要求有较精确定时的技术领域中。
通常采用中规模集成电路即可实现高精度计时器的设计。
本次设计的计时器包括3个模块:
时钟分频模块、开关及控制模块、显示模块,以完成此计时器所界定的功能。
对各个功能模块进行硬件描述以后,可以采用新一代可编程逻辑器件开发软件平台VerilogHDL,进行逻辑功能仿真与时序验证,并在FPGA开发板上进行了综合和适配。
关键词:
计时器FPGAVerilogHDL
1绪论
通常,采用中规模集成电路即可实现高精度计时器的设计。
本项研究将基于新一代硬件描述语言(HDL)、采取ASIC(专用集成电路)设计方法,来实现秒、分计时器的前端设计。
本设计利用VHDL语言采用自顶向下的方法完成了计时器的设计,最后在FPGA开发板进行测试。
该计时器包含有计时、清零、开始、暂停的功能。
2课题背景
在高新技术日新月异的今天,科学技术已经成为整个社会发展的源动力,电子领域的发展更是令人目不暇接,在其推动下,现代电子产品几乎渗透了社会的各个领域,遍迹了千家万户,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
而我们人类对于电子产品精度的要求越来越高,同时也要求电子产品所具有的功能越来越多。
本次设计的计时器具有计时、清零、开始、暂停的功能。
2.1设计任务与要求
本设计主要能够采用层次化的方法进行设计,设计一个具有多种功能的计时器,设计层次清晰、合理。
设计要求:
1、计时器最大计时显示59分59秒,即4位数码管显示。
2、在计时器正常工作时可以对其进行暂停和继续。
3、在计时器正常工作时可以对数字钟进行不断电复位,即清零。
4、将程序通过电路下载到FPGA开发板,在FPGA开发板进行验证并完善设计效果。
2.2设计目的
通过该实训设计要熟练利用VerilogHDL语言进行数字系统设计,掌掌握数字系统的设计方法——自顶向下的设计思想;
掌握计数器的设计与使用;
根据秒表的功能要求设计一个秒表。
进一步锻炼在FPGA软件应用方面的实际动手能力。
2.2.1设计题目的概述
本设计主要采用层次化的方法进行设计,设计一个具有计时、清零、开始、暂停功能的计时器。
要求其精度达到1s。
在程序对各个功能模块进行硬件描述以后,然后采用新一代可编程逻辑器件开发软件平台VerilogHDL,进行逻辑功能仿真与时序验证,并在FPGA开发板上进行了综合和适配。
3总体设计方案
3.1设计思想
由于FPGA开发板上有相应的数码管计时显示模块和按键控制模块,所以我们此次的设计可以不用做硬件电路板进行调试和应用。
只是需要我们在软件上下苦功夫,努力将软件程序编写好并在FPGA开发板上进行调试和验证即可。
其软件程序应该包括数码管计时动态显示模块、按键控制模块、分频器模块等。
将这些模块合理结合即可设计出我们所需要设计的具有某些特定功能的计时器。
3.2方案选择与论证
计时器的实现方法通常有以下几种:
方案一:
FPGA程序采用自顶向下分层设计思想的大概设计示意图如图3.1所示:
图3.2.1FPGA程序自顶向下分层设计框图
方案一设计原理:
从图3.2.1可以看出,计时器经过两个不同的分频器,产生两个不同频率的时钟。
计时器包括分计数、秒计数,其中秒计数变化的频率是1Hz。
在计时器运行的过程中有个时间节点是需要特别注意的:
59分59秒,这两个时刻将会产生进位,与此同时这个时刻时间将会归零,计数又将从0开始。
只要注意这个时刻的判断并采取相应的措施便可完成正常的计数。
采用同步计数的方法可以有效地避免竞争冒险,使计时更加稳定。
该设计除了不用设计制作硬件电路以用于调试之外,其利用FPGA程序采用自顶向下分层设计,可以清晰地了解我们所要设计的方向模块以及该设计模块所需要具备的功能等,便于我们的程序设计。
将编写好的程序下载到FPGA开发板上调试并验证即可。
方案二:
利用单片机程序设计设计思想大概设计示意图如图3.2所示:
图3.2.2单片机程序设计框图
方案二设计原理:
从图3.2.2可以看出,该设计主要是利用单片机AT89C51芯片对各个功能模块进行驱动控制,将程序下载到单片机AT89C51芯片中,并在单片机实验箱上进行调试和验证。
方案选择:
此次设计选择方案一。
因为方案一所使用的是VerilogHDL语言,使用此语言,在功能设计上,逻辑验证阶段可以不必考虑门级以及工艺实现的细节,只需利用系统设计是对芯片的要求,实价不同的约束,即可实现电路,这给我们的设计带来了很多方便。
而方案二,我们还要考虑单片机AT89C51芯片各个引脚的功能和使用方法,而且还要考虑芯片有无损坏的问题,给我们的设计带来很多不便。
4硬件功能描述
4.1动态显示模块
以四位共阳数码管为例动态显示的原理图如下
图4.1动态显示原理图
动态显示的原理:
各数码管所对应的码段是连接在一起的,而将阳极作为选择端。
当一个数码管的阳极置’1’时,为选中状态,此时应该向数码管输入该数码管应该显示的字符的8位码。
由于其他数码管处于未选中状态,不予显示。
以此类推,各个数码管按扫描次序依次显示,当扫描速度很快时,由于人眼视觉暂留效应,看起来四个数码管同时显示。
4.2综合引脚配置
NET"
LED_OUT[6]"
LOC=T9;
LED_OUT[5]"
LOC=R9;
LED_OUT[4]"
LOC=M10;
LED_OUT[3]"
LOC=N10;
LED_OUT[2]"
LOC=P10;
LED_OUT[1]"
LOC=T10;
LED_OUT[0]"
LOC=T11;
seg_bit[3]"
LOC=N11;
seg_bit[2]"
LOC=P11;
seg_bit[1]"
LOC=P12;
seg_bit[0]"
LOC=P13;
clk"
LOC=P8;
led_test"
LOC=N9;
kz"
LOC=H10;
res"
LOC=G11;
5软件设计
5.1软件流程图及功能介绍
图5.1计时器的工作流程图
1、软件流程设计要求:
(1)要求设置复位按键。
当按下复位按键时,计时器清零并做好计时准备。
在任何情况下只要按下复位按键,计时器都要无条件地进行复位操作,即使是在计时过程中也要无条件地进行清零操作。
(2)要求设置启动/暂停按键。
实际上启动/暂停按键的使用与传统的机械式计时器完全相同:
当第一次按下启动/停暂按键后,将启动计时器并开始计时;
当再次按下启/停开关时,将终止计时器的计时操作并且保存当时所计时的数据。
(3)要求计时精度为1s。
因此要求设计的计时器能够显示到1s的时间。
(4)计时器的最长计时时间为60分钟,需要一个4位的显示器,显示的最长时间为59分59秒,到此直接清零,从00分00秒开始计时。
(5)要求在有电源的情况下,可以复位清零。
2、根据上面对计时器的功能描述,可以对该计时器的输入和输出电路进行以下推理。
首先来对计时器的输入电路进行描述:
(1)首先要按下复位清零按键res进行计时器的复位清零操作,使计时器作好计时准备。
(2)当做好计时准备后按下计时器的启动/暂停开关kz,计时器开始计时,计时器的最小计时单位是1s;
计时完毕后再按一下计时器的启动/暂停按键kz,这时将终止计时器的计时操作并保留当时计时的数据。
(3)由于计时器的计时精度为1s,所以提供给计时器内部定时的时钟信号频率应该大于1000Hz。
所以该计时器还应该有一个1000Hz的时钟输入信号clk。
5.2核心程序设计
always@(posedgeclk_1khz)//动态扫描;
begin
case(state)
s0:
//第一步:
让数码管的最低位点亮,并显示秒的个位数值.
seg_bit=4'
b0111;
display_tab=second_L;
state=s1;
led_test=1;
end
s1:
//第二步:
让数码管的第二位点亮,并显示秒的十位数值.
b1011;
display_tab=second_H;
state=s2;
//led_test=~clk_1hz;
s2:
//第三步:
让数码管的第三位点亮,并显示分的个位数值.
b1101;
display_tab=miniute_L;
led_test=~clk_1hz;
state=s3;
s3:
//第四步:
让数码管的最高位点亮,并显示分的十位数值.
b1110;
display_tab=miniute_H;
state=s0;
6调试
在计时器程序初步完成时,我们到实验室进行程序调试,在实验箱上验证自己所设计的计时器程序是否有效时,我们遇到的第一个问题就是计时器有计时的功能,程序中也有写清零部分,但是调试时,我们却不能对计时器进行清零。
经过检查,原来是因为我们在程序的清零部分中,定义(res)前少了一个“!
”才导致我们的计时器无法执行下一步的计时工作,一直在清零状态,经改正过后方才可以。
第二个问题是我们少写了计时器暂停功能模块的程序导致我们的计时器没有暂停功能。
后来加了该暂停程序模块后,方可实现计时器暂停的功能。
7结论
通过本次设计,系统地学习了FPGA的知识,对FPGA的应用有了一定的认识,在VerilogHDL平台下进行了计时器的设计。
在本次实训,我在学习了VHDL语言的基础上,基本可以使用VHDL语言进行程序设计;
运用自顶向下的设计思想,对计时器各个功能模块进行分解设计;
将程序的各个模块进行连接,组成一个系统,在不断地调试中发现问题并及时解决。
最终在实验箱上验证了本次设计计时器的完整作品。
由于个人的程序设计水平有限,此次设计还存在着一些不足和应该改进的地方。
如该计时器在工作的时候,数码管上的冒号和数码管的秒钟计时显示是同时进行的,需要进一步改进,该计时器的功能也可以进一步增加等。
在之前的FPGA课程学习中,我已经接触过了FPGA和VHDL语言,但这次的FPGA实训设计是我和同学合作第一次完整地做出了具有一定功能的作品。
我感叹于FPGA的神奇,就像给了一双翅膀可以尽情地在天空翱翔,给了一个平台实现了自己的想法。
它以计算机辅助设计为基础,让我们不再因搭建实际的电路而烦恼,大大地提高了我们设计的效率。
最近,FPGA越来越成为一种潮流,它正改变着传统的电路设计思想。
在未来的学习中,我会努力学好它,将它应用于与自己专业相关的领域,更好地发挥它的作用。
参考文献
【1】蒋立平,姜萍,谭雪琴,花汉兵.数字逻辑电路与系统设计.北京:
电子工
业出版社,2008.
【2】南京理工大学电子技术中心.EDA设计实验指导书.2008
【3】潘松,黄继业.EDA技术使用教程.北京:
科学出版社,2006
【4】===========.FPGA实验指导书.
【5】夏宇闻.Verilong数字系统设计教程.北京:
北京航空航天大学出版社,
【6】王金明.数字系统设计与VerilongHDL.北京:
电子工业出版社2011.1
2008.6
致谢
本设计在选题及研究过程中得到叶老师的悉心指导。
叶老师多次询问研究设计的进程,并为我指点迷津,帮助我开拓研究思路,精心点拔、热忱鼓励。
叶老师一丝不苟的作风、严谨求实的态度、踏踏实实做事的精神,不仅授我以文,而且教会我做人。
我对叶老师的感激之情是无法用言语表达的,他不仅学识渊博、对专业知识孜孜以求、精益求精,而且在百忙之中仍然读书不辍,不断探求电子设计领域的创新知识。
为人师表、率先垂范、传道授业、呕心沥血。
如果说我从指导老师那里学会了怎么做好学问,那么首先应该说我从指导师那里领略了真正的学术精神,导师严谨的治学态度和坚韧的探索精神将使我终生受益。
在实训即将完成之际,我要感谢一直以来授予我单片机课程和FPGA课程的叶老师,还要感谢帮助过我的同学们,正是由于你们的支持与帮助,我才能克服一个一个的困难,顺利完成本次实训。
在这里请接受我诚挚的谢意。
谢谢你们!
2013年06月24日
附件
程序附件:
moduleJSQ1(clk,LED_OUT,seg_bit,led_test,res,kz
);
inputclk;
inputres;
//复位,清零
inputkz;
//开始、暂停
regclk_1hz;
regclk_1khz;
outputregled_test;
outputreg[3:
0]seg_bit;
//定义seg_bit为4位的输出口;
outputreg[6:
0]LED_OUT;
reg[20:
0]counter;
reg[30:
0]counter_1hz;
//分频寄存器;
reg[7:
0]display_tab;
0]second_L,second_H;
0]miniute_L,miniute_H;
//reg[7:
0]hour_L,hour_H;
parameters0=2'
d0,s1=2'
d1,s2=2'
d2,s3=2'
d3;
reg[1:
0]state;
initial
beginstate=0;
counter=0;
counter_1hz=0;
miniute_L=9;
miniute_H=5;
second_H=5;
end//初始化寄存器;
//////////////////////////////////////////////////////////////////////////////////////
always@(posedgeclk)
if(counter_1hz==40000000)//分频,产生秒脉冲信号;
begincounter_1hz=0;
clk_1hz=~clk_1hz;
end
elsecounter_1hz=counter_1hz+1;
if(counter>
=100000)//分频,产生动态扫描控制脉冲信号;
begincounter<
=0;
clk_1khz<
=~clk_1khz;
end
//state=state+1;
if(state==4)state=0;
非状态机方法;
else
=counter+1;
end
case(display_tab)//数码管显示表;
0:
LED_OUT=7'
b100_0000;
//0
1:
b111_1001;
//1
2:
b010_0100;
//2
3:
b011_0000;
//3
4:
b001_1001;
//4
5:
b001_0010;
//5
6:
b000_0010;
//6
7:
b111_1000;
//7
8:
b000_0000;
//8
9:
b001_0000;
//9
default:
bz;
endcase
end
//////////////////////////////////////////////////////////////////////////////////////////
always@(posedgeclk_1hzorposedgekz)//时钟主体;
if(kz)//开始暂停是否按下
if(!
res)
beginsecond_L=0;
second_H=0;
miniute_L=0;
miniute_H=0;
second_L=second_L+1;
if(second_L==10)beginsecond_L=0;
second_H=second_H+1;
if(second_H==6)beginsecond_H=0;
miniute_L=miniute_L+1;
if(miniute_L==10)beginminiute_L=0;
miniute_H=miniute_H+1;
if(miniute_H==6)miniute_H=0;
beginLED_OUT=7'
endcase
endmodule