EDA数字跑表课程设计1.docx
《EDA数字跑表课程设计1.docx》由会员分享,可在线阅读,更多相关《EDA数字跑表课程设计1.docx(15页珍藏版)》请在冰豆网上搜索。
EDA数字跑表课程设计1
EDA课程设计报告
数字跑表
学院:
机械与电子工程学院
专业:
电子科学与技术
学号:
1020630208
姓名:
熊……
一:
设计目的:
(1)学会利用QuartusⅡ发热宏单元和所学的数字电路知识,搭建复杂一点的数字电路或系统。
(2)学会使用EDA的程序语言FPGA/CPLD设计数字跑表,设计主要包括功能分析、方案设计和电路测试几个步骤。
二:
设计内容:
1.设计一个数字跑表,具有如下功能。
(1)复位和暂停,秒表计时等功能。
(2)跑表计时长度可达1小时,计时精度为0.01秒。
(3)通过6位数码管分别显示跑表的分、秒和百分秒。
控制端
取值
功能
复位(clr)
1
异步清零
0
计数
计数/暂停键(pause)
1
暂停
0
计数
2.方案论证:
数字跑表设三个输入端,分别为时钟输入(CLK),复位(CLR),启动、暂停按键(PUSE)。
复位信号高电平有效,可对跑表异步清零;当启动、暂停键为低电平时跑表开始计时,为高电平时暂停,变低后在原来的数值基础上继续计数。
数字跑表的结构示意图如下:
图2-1跑表示意图
3.模块电路设计:
数字跑表实际上为计数器,数据选择器,七段数码管译码器等模块构成,核心模块应为计数器,其次为暂停控制和清零控制。
计时电路
计时电路又分为百分秒计时电路、秒计时电路和分计时电路三个模块。
百分秒计时电路是一个100进制的计数器,以100Hz输入信号作为计数时钟,其进位信号作为秒计数电路的计数时钟,当秒计数器计满时,产生的进位信号又作为分计数电路的计数时钟。
电路的暂停和复位信号用于控制计时的开始、停止和清零。
计数器模块:
数字跑表的计时器功能是,当PAUSE为低电平时开始计数,百分秒低位自加一,加到九时归零,百分秒高位自加一,加到九时归零,且向秒位发出一个高电平,秒低位自加一,加到九时归零,秒高位自加一,加到五时归零,且向分位发出一个高电平,分低位自加一,加到六时系统清零。
数据选择器:
数据选择模块:
定义三位二进制数ss作为选择数码管的变量,ss自加一,当ss大于7时归零,当ss为5、4、3、2、1时分别将msl,msh,sl,sh,ml,mh的值赋给coder,当ss为6、7时赋值为零。
七段数码管显示译码器
七段数码管译码器模块:
根据数字的显示形状编制真值表,当上一模块coder为0~9时,分别给seg赋以一组八位二进制数,使数码管显示相应的数字。
表1七段数码管显示译码器真值表:
case
seg
0
1
2
3
4
5
6
7
8
9
4.数字跑表的流程图:
数字跑表主要由计时器,七段数码管译码器组成。
流程框图如图所示。
CLKmsl
pause
clr
图3-1程序流程图
表2控制信号的作用
复位clr
异步复位信号,高电平有效
pause
同步暂停信号,低电平有效计数。
sel
共阴数码管的位选信号
seg
共阴数码管的段选信号
三:
设计总体框图
三:
硬件电路设计与程序设计
设计思路
今需设计一个计时范围为0.01秒~1小时的数字秒表,首先需要获得一个比较精确的计时基准信号,这里是周期为1/100s的计时脉冲,可以把50MHz的信号经过100分频的分频器三次分频得到,其中分频器经过两次分频得到的信号还可作为数码管扫描电路的时钟。
其次,还需对每一计数器设置清零信号输入和对六个计数器设置时钟使能信号,即计时允许信号,以便作为秒表的计时起、停控制功能。
为了方便控制所有计数模块清零和使能功能设计了一个控制模块。
最后把所有计数器的输出数据通过数码管扫描电路模块和七段译码显示模块作为输出,接到实验箱上的8字数码显示电路上就可显示结果了。
因此数字秒表可由三个分频器、四个十进制计数器(1/100秒、1/10秒、1秒、1分)、两个六进制计数器(10秒、10分)、一个控制器、一个数据选择器以及七段译码显示器组成,如总体框图所示。
根据设计思路,本次设计就采用模块化设计,共分为分频器模块(fenpin)、控制模块(kongzhi)、十进制计数模块(cnt10)、六进制计数模块(cnt6)、数码管扫描模块(xuanze)、七段译码显示模块(decl7s)六个模块以及图形式顶层文件。
下面我们分别对每个模块的功能进行描述、程序进行设计以及各个模块功能的仿真。
1、分频器模块
根据设计需要,首先需要获得一个比较精确的计时基准信号,这里是周期为1/100s的计时脉冲。
我们可以把50MHz的信号经过100分频的分频器三次分频得到此基准信号,所以需要设计一个100分频的分频器。
此外,经过两次分频的信号(10KHz)还可以同时作为数码管扫描电路的时钟。
其模块图如下图所示:
Clk为时钟输入信号,newclk为100分频的输出信号。
2、控制模块
为了方便控制所有计数模块清零和使能功能需要设计一个控制模块,所以该模块的功能就是控制什么时候发出置零信号和使能信号来控制计数器工作。
其模块图如下图所示:
Clk为开始/暂停功能按钮(下降沿有效),初次按下它时clc(控制计数器清零)为低电平,en(使计数器计数)为高电平;再次按下它时,clc保持为低电平,en跳变为低电平,如此重复循环。
Reset为清零按钮(下降沿有效),无论何时按下它时,clc跳变为高电平,en变为低电平,以达到使计数器清零的目的。
3、十进制计数模块
此模块的功能就是完成十进制的计数功能,同时输出进位信号。
其模块图如下图所示:
Clk为时钟信号输入端,rst为计数器清零端(高电平有效),en为计数器使能端(高电平有效);daout为数据输出端,cout为进位信号输出端。
4、六进制计数模块
此模块的功能就是完成六进制的计数功能,同时输出进位信号。
其端口功能同十进制计数模块,在次不再重复诉说。
5、数码管扫描模块
该模块的功能是选择各个计数端口来的数据,当相应的数据到来时,数据选择器选择数据后输出给七段译码器,同时输出位选信号,再接入到实验箱上的8字数码显示电路上就可显示了。
其模块图如下图所示:
Clk为时钟信号输入端,msec1…...minute2是各个计数端口来的数据的输入端,deout为数据选择器选择数据后输出端,sel为位选信号输出端。
6、七段译码显示模块
该模块的功能就是把输入的四位二进制数据转换为七段数码管的显示编码,再输入到七段数码管中显示出数据。
其模块图如下图所示:
A为数据输入端,led7s为数据输出端。
五:
程序设计如下:
/************************************************************************************
*******************以下引脚锁定基于DE2-35,芯片为EP2C35F672C6***********************【例1】数字跑表(顶层模块)
信号定义如下:
Clk50m:
输入50MHz时钟信号;
Clr:
异步复位信号;
pause:
暂停信号;
dotout:
小数点;
ledl,led0:
百分秒的高位和低位;
led3,led2:
秒信号的高位和低位;
led5,1ed4:
分信号的高位和低位*/
modulepaobiao(clk,pause,clr,led0,led1,led2,led3,led4,led5,dotout);
parameterWIDTH=7;
//inputclk50m;
inputclk;
inputpause;
inputclr;
outputdotout;
output[WIDTH-1:
0]led5;
output[WIDTH-1:
0]led4;
output[WIDTH-1:
0]led3;
output[WIDTH-1:
0]led2;
output[WIDTH-1:
0]led1;
output[WIDTH-1:
0]led0;
wireisstop;
wirezero;
switch#(8)switchstop(clk50m,pause,isstop);
switch#(8)switchzero(clk50m,clr,zero);
//reg[18:
0]counter_l00hz;
regclk100;
//assignclkl00=counter_l00hz[18];
assigndotout=1'b1;
/*always@(posedgeclk50m)
beginif(!
isstop)
beginif(counter_l00hz==19'b1111_0100_0010_0100_000)counter_l00hz<=0;
elsecounter_l00hz<=counter_l00hz+1;
end
end*/
always@(*)
beginif(!
isstop)
clk100<=clk;
end
reg[3:
0]fs0;
regfscarry0;
reg[3:
0]fs1;
regfscarry1;
reg[3:
0]s0;
regscarry0;
reg[3:
0]s1;
regscarry1;
reg[3:
0]minu0;
regmiucarry0;
reg[3:
0]minu1;
always@(posedgeclk100orposedgezero)
beginif(zero)
beginfs0<=0;fscarry0<=0;end
elseif(clk100==1)
beginif(fs0==9)
beginfs0<=0;fscarry0<=1;end
else
beginfs0<=fs0+1;fscarry0<=0;end
end
end
always@(posedgefscarry0orposedgezero)
beginif(zero)
beginfs1<=0;fscarry1<=0;end
elseif(fscarry0==1)
beginif(fs1==9)
beginfs1<=0;fscarry1<=1;end
else
beginfs1<=fs1+1;fscarry1<=0;end
end
end
always@(posedgefscarry1orposedgezero)
beginif(zero)
begins0<=0;scarry0<=0;end
elseif(fscarry1==1)
beginif(s0==9)
begins0<=0;scarry0<=1;end
else
begins0<=s0+1;scarry0<=0;end
end
end
always@(posedgescarry0orposedgezero)
beginif(zero)
begins1<=0;scarry1<=0;end
elseif(scarry0==1)
beginif(s1==5)
begins1<=0;scarry1<=1;end
else
begins1<=s1+1;scarry1<=0;end
end
end
always@(posedgescarry1orposedgezero)
beginif(zero)
beginminu0<=0;miucarry0<=0;end
elseif(scarry1==1)
beginif(minu0==9)
beginminu0<=0;miucarry0<=1;end
else
beginminu0<=minu0+1;miucarry0<=0;end
end
end
always@(posedgemiucarry0orposedgezero)
beginif(zero)
beginminu1<=0;end
elseif(miucarry0==1)
beginif(minu1==5)minu1<=0;
elseminu1<=minu1+1;
end
end
ledledfs0(fs0,led0);
ledledfsl(fs1,led1);
ledleds0(s0,led2);
ledledsl(s1,led3);
ledledmiu0(minu0,led4);
ledledmiul(minu1,led5);
endmodule
/*【例1】数字跑表(7段数码管译码显示模块)。
led.v:
7段数码管(led)译码显示模块
datain:
4位,10进制数输入
ledout:
7位,数码管的7段*/
moduleled(datain,ledout);
parameterINWIDTH=4;
parameterOUTWIDTH=7;
input[INWIDTH-1:
0]datain;
output[OUTWIDTH-1:
0]ledout;
reg[OUTWIDTH-1:
0]dataout;
assignledout=dataout;
alwaysbegin
case(datain)
0:
dataout<=7'b1000000;
1:
dataout<=7'b1111001;
2:
dataout<=7'b0100100;
3:
dataout<=7'b0110000;
4:
dataout<=7'b0011001;
5:
dataout<=7'b0010010;
6:
dataout<=7'b0000010;
7:
dataout<=7'b1111000;
8:
dataout<=7'b0000000;
9:
dataout<=7'b0010000;
default:
dataout<=7'b1000000;
endcase
end
endmodule
/*【例1】数字跑表(按键廾关消抖电路)。
switch-v:
对按键开关的消抖电路,采用一个频率较低的时钟,
对输入进行采样,消除抖动*/
moduleswitch(clk,keyin,keyout);
parameterCOUNTWIDTH=8;
inputclk,keyin;
outputregkeyout;
reg[COUNTWIDTH-1:
0]counter;
wireclk_use;//频率较低的时钟
assignclk_use=counter[COUNTWIDTH-1];
always@(posedgeclk)
counter<=counter+1'b1;
always@(posedgeclk_use)
keyout<=keyin;
endmodule
六:
编译仿真及硬件测试
1、编译仿真
当完成了以上秒表系统各个模块的VHDL设计,就可以使用QuartusⅡ对本设计进行编译和仿真。
首先使用文本编辑器输入本设计的所有模块的源程序,先对各个模块进行编译和仿真,当所有模块全部编译通过和仿真功能正确后,就可以利用图形编辑工具完成顶层设计,其设计图如顶层设计图所示。
然后再对图形编辑器编辑出的顶层设计图进行全程编译,通过之后就可以进行系统的整体仿真了。
其中各个模块的仿真已在模块设计中完成,在此从略,下面只说明系统的整体仿真。
2.顶层设计图:
在仿真中,clk取10ns的信号,合理选取start和reset信号,就可以进行系统的整体仿真了。
3.仿真后得到如下仿真波形图:
七.实验心得及体会
从实验中,我对整个流程有了初步了解;对实验进行了深入学习,让我掌握硬件描述语言VerilogHDL语言的语言规则,数据类型,语句结构和模块设计;接着是最关键的编程,需要根据任务书分析需要的模块,编程并仿真。
两天的课程设计已经结束,虽然时间很短,但我不仅学到了许多关于EDA的知识,认识到了EDA的强大功能,更重要的是增强了我的实践动手能力,使我深刻地认识到仅仅学习课本上的知识是远远不够的,必须要多多动手,多多实践,才能真正理解并掌握所学的知识,达到学以致用的目的,为以后的工作积累了宝贵的经验,同时我也深深地感受到严谨的态度对于科学研究的重要性。
由于在设计的过程中,一点点的失误都可能造成整个系统的瘫痪,所以每一个细节都要认真思考,认真操作,不能有丝百分的大意。
这使我认识到要想做一个科研工作者是多么的不易!
自己身上的缺点还有很多,要靠以后艰苦的努力来克服!
这次的EDA课程设计给了我一次非常重要也非常难得的实践机会,使我可以将平时课本上学习的理论知识应用于实际操作。
设计的过程是十分艰苦的,由于从未接触过类似的领域,所以刚开始的时候一片茫然,不知道该干些什么。
随着研究的逐渐深入,自己渐渐的摸出头绪,掌握了一些规律和方法,设计的成果也逐步成型,最终按照要求完成了设计。
在实际操作的过程中,碰到了许多的困难,但最终在老师的耐心指导和同学的热情帮助下,按时完成了任务。
在此对老师和同学们表示衷心的感谢!
最后感谢老师给与我这次宝贵的实践机会!