您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 数字式秒表verilog语言实现
一、实验目的(1)熟练掌握分频器、各种进制的同步计数器的设计。(2)熟练掌握同步计数器的级联方法。(3)掌握数码管的动态显示驱动方式。(4)掌握计数器的功能和应用。(5)理解开关防颤动的必要性。(6)掌握简单控制器的设计方法。二、实验内容和原理1、实验设计要求:(1)计时范围0’0’.0’’~59’59’.9’’,分辨率为0.1s,用数码管显示计时值。(2)秒表有一个按键开关:当电路处于“初始”状态时,第一次按键,计时开始(“计时”状态);再次按键。计时停止(“停止”状态);第三次按键,计时器复位为0’0’.0’’,且电路恢复到“初始”状态。2、根据设计要求,可画出秒表电路的原理框图,如图1-2所示,秒表电路由时钟管理模块(DCM)、分频器模块、按键处理模块、控制器、计时模块和显示模块组成。clksys_clkpulse10Hzpulse400HzclearcountstopButtonInButtonOut图1-2秒表电路的原理框图(1)DCM模块由于数字钟为低速电路,而XUPVirtex-IIPro开发系统只提供100MHz主时钟,因此需插入DCM分频模块以降低系统的工作时钟,从而提高系统的可靠性。DCM可采用16分频,输出6.25MHz的sys_clk信号作为系统的主时钟。ISE生成DCM内核的VerilogHDL代码:VgaDCMDCMInst(.CLKIN_IN(clk),.CLKDV_OUT(sys_clk),.CLKIN_IBUFG_OUT(),DCM按键处理模块分频器模块en计时模块控制器显示模块.CLK0_OUT(),.LOCKED_OUT());(2)分频器模块产生用于计时的1/10秒脉冲信号pulse10,频率为10Hz;产生用于显示模块的扫描脉冲信号pulse400,频率为400Hz。1/10秒脉冲信号pulse10和扫描脉冲信号pulse400的脉冲宽度为一个系统主时钟信号sys_clk的周期。分频器模块原理框图如图1-3所示,先设计一个15625分频器,产生400Hz的扫描信号pulse400,再由pulse400控制40分频器产生1/10秒脉冲信号pulse10。分频器设计:分频器实际上就是计数器:分频比n就是计数器的模。“1”pulse10sys_clk分频器模块的VerilogHDL代码:modulediv(sys_clk,sec,scan);//分频器模块inputsys_clk;outputsec,scan;div_n1u1(.cout(scan),.cin(1'b1),.clk(sys_clk));//按原理框图级联分频器div_n2u2(.cout(sec),.cin(scan),.clk(sys_clk));endmodulemodulediv_n1(cout,cin,clk);//15625进制计数器,产生400Hz扫描信号parametern=15625;parametercounter_bits=14;outputcout;inputcin,clk;reg[counter_bits:1]qout=0;assigncout=(qout==(n-1))&cin;//进位always@(posedgeclk)beginif(cin)beginif(qout==(n-1))qout=0;elseqout=qout+1;//计数装订线enout15625进制计数器enout40进制计数器pulse400图1-3分频器原理框图endendendmodulemodulediv_n2(cout,cin,clk);//40进制计数器,产生10Hz的0.1秒计时信号parametern=40;parametercounter_bits=6;outputcout;inputcin,clk;reg[counter_bits:1]qout=0;assigncout=(qout==(n-1))&cin;//进位always@(posedgeclk)beginif(cin)beginif(qout==(n-1))qout=0;elseqout=qout+1;//计数endendendmodule(3)按键处理模块按键处理模块完成按键输入的同步器、开关防颤动和脉冲宽度变换等功能,即当按键一次,输出一个宽度为sys_clk周期的脉冲信号Buttonout。其组成框图如图1-4所示。图1-4按键处理模块的示意框图(i)同步器设计在异步设计中,完全避免亚稳态是不可能的。因此,设计的基本思路是:首先尽可能的减少出线亚稳态的可能性,其次是尽可能地减少出线亚稳态给系统带来的危害的可能性。如图1-5所示的是一种基本同步器类型的原理框图,采用双锁存器法,即将输入的异步信号用两个锁存器连续锁存两次,这种设计理论上可以把出现亚稳态的几率降低到一个很小的程度,但这种方法对输入信号有一定延时。图1-5当异步脉冲宽度大于时钟周期时的同步器电路同步器的VerilogHDL代码:modulesynch(asynch_in,clk,reset,synch_out);//同步器;inputasynch_in,clk,reset;outputsynch_out;wirea;d_ffu1(.d(asynch_in),.reset(reset),.clk(clk),.q(a));d_ffu2(.d(a),.reset(reset),.clk(clk),.q(synch_out));endmodulemoduled_ff(d,reset,clk,q);//D触发器;inputd,reset,clk;outputregq;always@(posedgeclkorposedgereset)//异步复位;高电平有效;beginif(reset)beginq=0;endelsebeginq=d;endendendmodule(ii)开关防颤动电路的设计(a)开关的颤动即开关防颤动电路的功能人们完成一次按键操作的指压力如图1-6(b)所示,按键开关从最初按下到接触稳态需要经过数毫秒的颤动,按键松开时也有同样的问题。因此,按键被按下或释放时,都有几毫秒的不稳定输出,从逻辑电平来看不稳定输出期间,其电平在“0”、“1”之间无规则摆动。因此,一次按键操作的输出如图1-6(c)所示。一般情况,按键一次时间大于100ms,颤动时间(按下或释放)小于10ms。开关防颤动电路的目的是:按一次按键,输出一个稳定的脉冲,即将开关的输出作为开关防颤动电路的输入,而开关防颤动电路的输出作为理想输出,如图1-6(d)所示。(b)开关防颤动电路的设计开关防颤动电路的关键是避免在颤动期采样。颤动期时间长短与开关类型及按键指压力有关,一般为10ms左右。据此可以画出防颤动电路的设计流程图,如图1-7所示。图1-8所示为防颤动电路的原理框图。综合原理框图和工作流程图可画出控制器的算法流程图和状态机图,如图1-9,图2-0所示。图1-8所示为防颤动电路的原理框图。10ms定时器控制器分频器(÷162)ensys_clkresetViVotimer_clrtimer_donepulse400(iii)定时器的设计定时器实质上就是计数器,基本框图如图1-9所示,但定时器需一个启动信号timer_clr和一个定时到信号timer_done。其功能特性见表2-0所示。定时计数器的模N的选取:1、若用clk作时间基准:N≥T/Tclk,T为定时时间,Tclk为时钟周期。2、若用cin作时间基准(cin的脉冲宽度为Tcin):N≥T/Tcin,T为定时时间,Tcin为输入信号cin的周期。表2-0定时器功能表timer_clrcinclkqout功能1X*qout=0清零(启动)00*qout=qout保持01*qout=qout+1计数en定时器timer_clrtimer_donecinclkqout图1-9定时器框图图2-1控制器的算法流程图图1-7防颤动电路的工作流程图防抖动电路的VerilogHDL代码:moduledebouncer(clk,reset,vi,vo);//防抖动电路顶层模块inputclk,reset,vi;outputvo;divu1(.sys_clk(clk),.sec(),.scan(pulse400));time_nu2(.cin(pulse400),.clk(clk),.time_clr(b),.time_done(c));controlu3(.clk(clk),.vi(vi),.time_done(c),.reset(reset),.time_clr(b),.vo(vo));endmodulemoduletime_n(cin,clk,time_clr,time_done);//计时器parametern=8;parametercounter_bits=3;outputtime_done;inputcin,clk,time_clr;reg[counter_bits:1]qout;assigntime_done=(qout==(n-1))&cin;//进位always@(posedgeclk)beginif(time_clr)qout=0;//清零elseif(cin)beginif(qout==(n-1))qout=0;elseqout=qout+1;//计数endendendmodule图2-2防颤动电路控制器的ASM图modulediv(sys_clk,sec,scan);//16分频inputsys_clk;outputsec,scan;div_n1u1(.cout(scan),.cin(1'b1),.clk(sys_clk));div_n2u2(.cout(sec),.cin(scan),.clk(sys_clk));endmodulemodulecontrol(clk,vi,time_done,reset,time_clr,vo);//控制器inputclk,vi,time_done,reset;outputvo,time_clr;regvo,time_clr;reg[1:0]state;parameterhigh=2'b00,wait_low=2'b01,low=2'b11,wait_high=2'b10;//状态以格雷码编码always@(posedgeclk)beginif(reset)state=high;elsecase(state)high:beginif(!vi)state=wait_low;elsestate=high;endwait_low:beginif(time_done)state=low;elsestate=wait_low;endlow:beginif(vi)state=wait_high;elsestate=low;enddefault:beginif(time_done)state=high;elsestate=wait_high;endendcaseendalways@(*)begincase(state)high:begintime_clr=1'b1;vo=1'b0;endwait_low:begintime_clr=1'b0;vo=1'b1;endlow:begintime_clr=1'b1;vo=1'b1;enddefault:begintime_clr=1'b0;vo=1'b1;endendcaseendendmodule(iv)脉宽变换电路的设计开关或按键的输入信号宽度远远大于一个时钟周期,脉宽变换电路的作用是将输入信号宽度变换为一个时钟周期。由于输入已是同步的且宽度大于一个时钟周期的脉冲,所以脉宽变换电路的原理图如图2-3所示。DQ&inclkout脉宽变换电路的VerilogHDL代码:moduletransf(in,clk,out,reset);//脉宽变换模块inputin,clk,reset;outputout;wireb;d_ffu0(.d(in),
本文标题:数字式秒表verilog语言实现
链接地址:https://www.777doc.com/doc-5804907 .html