石家庄经济学院信息工程学院电子信息工程专业EDA技术课程设计报告题目:数字秒表姓名学号412109班级电子一班指导教师王军芬2015年1月16日课程设计任务书班级电子一班姓名学号课程设计题目数字秒表课程设计起止日期2014年12月29日至2015年1月16日实习地点实验楼5—308课程设计内容与要求:1.及格:计时显示范围0~59.99s,有启动和停止两个按键。2.中:使用四位数码管显示,从零开始计数,前两位显示秒(0~59),后两位显示0.01秒(0~99),计满后重新从零开始;有开始、暂停键、复位键,按开始键计数开始,暂停键计数停止,复位计数清零;3.良:具有记录最近5次计时操作结果的功能。按暂停键后停止计数,再按开始键下一组数据开始计数,按复位全部清零;再按暂停键可查看已保存的数据,按开始键翻看每一组数据,数据存储了几组,查看时就只循环查看几组。4.优:使用AT24C04记录5次计数操作结果。指导教师王军芬2014年12月29日一、设计原理与技术方法:1.设计方案本电路的设计实现了中的要求,分成5个模块进行设计,分别为:分频模块、数字秒表计数模块、数码管位选模块,数码管显示模块、按键消抖模块。(1)分频模块本模块的主要作用是将50mhz的频率分频为100hz和2000hz的频率。因为秒单位后面的最小单位是0.01s,所以要用到100hz的频率为计数做准备。且数码管位选需要一个时钟2000hz,目的是为了让扫描速度比较快,让我们视觉觉得四个数码管同时亮。(2)计数模块执行计时功能,计时方法为对标准时钟脉冲计数。计时范围是0秒---59.99秒,那么计时采用1个六进制计数器和3个十进制计数器构成,其中毫秒位、十毫秒位、秒位采用十进制计数器,十秒位采用六进制计数器。(3)数码管位选模块因为该芯片用的是并口输出,所以此处应有数码管位选部分,此处是用一个状态机做的,因为是共阳的,所以当哪个管子为低时,哪个管子亮,当扫描速度特别快时,利用人的视觉效果,则四个管子是同时亮的(4)数码管显示模块该芯片是共阳数码管,所以接有低电平的管段发亮。(5)按键消抖部分因为计数部分有开始,暂停,复位三个按键,为了消除毛刺现象对实验的影响,所以必须对三个按键消抖。2.方案设计流程图图1设计流程图分频模块将50MHz分频为100Hz和2000HZ的频率,100赫兹为计数模块计数所使用;计数模块主要完成十秒、秒、十分妙、百分秒的计数工作;消抖模块连接三个按键,此处是为了保证系统能正确识别按键开关,就必须对按键进行消抖动处理,分别实现开始,暂停,复位功能,计数模块输出连接到数码管位选显示模块,数码管位选模块连接到数码管显示模块,2000赫兹连接消抖模块和位选模块,数码管正确显示秒表数字;3.实验程序和原理图3.1管脚分配图50MHZ晶振分频模块计数模块按键消抖模块数码管位选模块数码管显示部分100HZ2000HZ3.2总电路连线及波形仿真图:图2电路原理总图3.35个模块原理图、波形仿真图及源程序:(1)分频模块:图3分频模块原理图因为将50MHz的频率分成100Hz和2000HZ的过程中涉及到到频率范围太大,进行波形仿真时,无法正常显示。设计原理:将50MHz分频为clk1100Hz和clk22000HZ的频率,先分频到2000HZ,分频倍数,N1=25000,所以此处用到的是偶数倍分频,其原理如下:使用一模N1计数器模块即可实现,即每当模N1计数器上升沿从0开始计数至N1时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,在把2000赫兹频率分为100赫兹,分频倍数为N2=20,每当模N2计数器上升沿从0开始计数至N2时,输出时钟进行翻转,同时给计数器一复位信号使之从0开始重新计数,为以此循环即可。源程序:modulefenpin(clk,clk1,clk2);inputclk;outputclk1;outputclk2;reg[15:0]k2;reg[7:0]k1;regclk2;regclk1;always@(posedgeclk)beginif(k216'd12499)k2=k2+8'd1;elsek2=0;if(k2==16'd12499)clk2=clk2+1;//clk2=2000hzendalways@(posedgeclk2)beginif(k18'd9)k1=k1+8'd1;elsek1=0;if(k1==8'd9)clk1=clk1+1;//clk1=100hzendendmodule(2)计数模块:图4计数模块原理图图5波形仿真图设计原理:此处rst是复位键键,当其处于高电平时,全部清零,start是开始键,pause是暂停键,三个按键都用了一个T触发器,按下复位键,其他二个按键没用,按下开始键计数开始,按下暂停键计数停止,再按开始键计数开始。其计数部分由一个六进制的计数器和三个十进制的计数器组成,首先是百分秒位msl开始从零计数,当其计数到九时,向十分秒位msh进一,同时将百分秒位清零;当十分位计数到九时,向秒位sl进一,同时将十分妙位和百分秒位清零;当秒位计数到九时,向十秒位sh进一,同时将秒位、十分秒位和百分秒位清零;当十秒位计数到五时,将所有位清零。源程序:modulecout(clk,start,pause,msh,msl,sh,sl,rst);inputclk;inputstart,pause,rst;output[3:0]msh,msl,sh,sl;reg[3:0]msh,msl,sh,sl;regcn1;regstart1=1,pause1=1,rst1=0;always@(posedgestart)start1=~start1;always@(posedgepause)pause1=~pause1;always@(posedgerst)rst1=rst1+1'b1;always@(posedgeclkornegedgerst1)beginif(!rst1)begin{msh,msl}=8'h00;cn1=0;endelseif(pause1^start1)beginif(msl==9)beginmsl=0;if(msh==9)beginmsh=0;cn1=1;endelsemsh=msh+1'h1;endelsebeginmsl=msl+1'h1;cn1=0;endendendalways@(posedgecn1ornegedgerst1)beginif(!rst1)begin{sh,sl}=8'h00;endelseif(start1^pause1)beginif(sl==9)beginsl=0;if(sh==5)sh=0;elsesh=sh+1'h1;endelsebeginsl=sl+1'h1;endendendendmodule(3)按键消抖模块:图6消抖模块原理图设计原理:这是一种去除双边沿抖动或毛刺的电路设计,它的主要原理分别用二个计数器对输入信号的高电平和低电平的持续时间(脉宽)进行计数(在时间上同时但在计数上独立)。只有当高电平的计数时间大于某个值,则判为遇到正常信号,若低电平的计数时间大于某值则输出为0.,此处是为了保证系统能正确识别按键开关,就必须对按键进行消抖动处理源程序:modulexiaodou(clk,kin,kout);//按键消抖inputclk,kin;outputkout;regkout;reg[3:0]kh,kl;always@(posedgeclk)beginif(!kin)kl=kl+1'b1;elsekl=4'b0000;endalways@(posedgeclk)beginif(kin)kh=kh+1'b1;elsekh=4'b0000;endalways@(posedgeclk)beginif(kh4'b1100)kout=1'b1;elseif(kl4'b0111)kout=1'b0;endendmodule(4)数码管位选模块:图7数码管位选扫描模块原理图设计原理此处设计用了一个状态机,输入了四个数据当现态c_st为s0=0时,选择第一个管子亮,且显示的是第一个是shi_h数据,当现态c_st为s1=1时,选择第二个管子亮,且显示的是第二位shi_l数据,当现态c_st为s2=2时,选择第3个管子亮,且显示的是第3位fen_h数据,当现态c_st为s3=3时,选择第4个管子亮,且显示的是第4位shi_l数据,且4个管子为共阳,当wei[3..0]对应的数据为低电平时则哪个管子亮。源程序modulewei_choose(clk,wei,shi_h,shi_l,fen_h,fen_l,duan);input[3:0]shi_h,shi_l,fen_h,fen_l;inputclk;output[3:0]duan;output[3:0]wei;reg[3:0]duan;reg[3:0]wei;parameters0=0,s1=1,s2=2,s3=3;reg[3:0]c_st,n_st;always@(posedgeclk)beginc_st=n_st;endalways@*begincase(c_st)s0:beginn_st=s1;wei=4'b0111;duan=shi_h;ends1:beginn_st=s2;wei=4'b1011;duan=shi_l;ends2:beginn_st=s3;wei=4'b1101;duan=fen_h;ends3:beginn_st=s0;wei=4'b1110;duan=fen_l;enddefault:beginn_st=s1;wei=4'b0111;duan=shi_h;endendcaseendendmodule(5)数码管显示模块图8数码管显示模块原理图设计原理:设输入的a[3:0]4位码输出控制7段共阳数码管的LED7S[6:0],输出信号LED7S[6:0]的7位分别接共阳数码管的7个段,高位在左,低位在右,接有低电平的段发亮源程序:moduledecl7s(a,led7s);input[3:0]a;output[6:0]led7s;reg[6:0]led7s;always@(a)case(a)4'b0000:led7s=~7'b0111111;4'b0001:led7s=~7'b0000110;4'b0010:led7s=~7'b1011011;4'b0011:led7s=~7'b1001111;4'b0100:led7s=~7'b1100110;4'b0101:led7s=~7'b1101101;4'b0110:led7s=~7'b1111101;4'b0111:led7s=~7'b0000111;4'b1000:led7s=~7'b1111111;4'b1001:led7s=~7'b1101111;4'b1010:led7s=~7'b1110111;4'b1011:led7s=~7'b1111100;4'b1100:led7s=~7'b0111001;4'b1101:led7s=~7'b1011110;4'b1110:led7s=~7'b1111001;4'b1111:led7s=~7'b1110001;default:led7s=~7'b0111111;endcaseendmodule课程设计成果展示图9成果展示图一图10成果展示图二图11成果展示图三图12成果展示图4二、课程设计工作记录:1.设计步骤与时间安排:12月28号确定设计题目,查找相关资料;12月29号查找学习开发板的相关内容;12月30号到31号编程、设计模块并进行仿真验证以及下载实现单个模块功能;1月4号到5号编程、设计模块并进行仿真验证以及下载实现单个模块功能;1月6号到7号编程、设计模块并进行仿真验证以及下载实现单个模块功能;1月8号到10号根据课程设计要求连接电路模块,设计出及格所要求实现的功能。调试