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七段数码管显示译码器真值表:caseseg010000001111100120100100301100004001100150010010600000107111100080000000900100004.数字跑表的流程图:数字跑表主要由计时器,七段数码管译码器组成。流程框图如图所示。CLKmslpauseclr图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;endend*/always@(*)beginif(!isstop)clk100=clk;endreg[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;endelseif(clk100==1)beginif(fs0==9)beginfs0=0;fscarry0=1;endelsebeginfs0=fs0+1;fscarry0=0;endendendalways@(posedgefscarry0orposedgezero)beginif(zero)beginfs1=0;fscarry1=0;endelseif(fscarry0==1)beginif(fs1==9)beginfs1=0;fscarry1=1;endelsebeginfs1=fs1+1;fscarry1=0;endendendalways@(posedgefscarry1orposedgezero)beginif(zero)begins0=0;scarry0=0;endelseif(fscarry1==1)beginif(s0==9)begins0=0;scarry0=1;endelsebegins0=s0+1;scarry0=0;endendendalways@(posedgescarry0orposedgezero)beginif(zero)begins1=0;scarry1=0;endelseif(scarry0==1)beginif(s1==5)begins1=0;scarry1=1;endelsebegins1=s1+1;scarry1=0;endendendalways@(posedgescarry1orposedgezero)beginif(zero)beginminu0=0;miucarry0=0;endelseif(scarry1==1)beginif(minu0==9)beginminu0=0;miucarry0=1;endelsebeginminu0=minu0+1;miucarry0=0;endendendalways@(posedgemiucarry0orposedgezero)beginif(zero)beginminu1=0;endelseif(miucarry0==1)beginif(minu1==5)minu1=0;elseminu1=minu1+1;endendledledfs0(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);parameterINWI