您好,欢迎访问三七文档
实验五多功能数字钟一、实验内容1.通过ModelSim软件,运用Verilog语言编程实现多功能数字钟功能。二.实验要求及原理1.实验要求设计计数器多功能数字钟及分频器,并进行功能仿真。2.实验原理数字钟是一个最常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显示和调时的基本功能,可以显示时、分、秒和毫秒,并通过按键进行工作模式选择,工作模式有4种,分别是正常计时模式、调时模式、调分模式、调秒模式。构成电子表的基本模块有四个,分别是时钟调校及计时模块myclock、整数分频模块int_div、时钟信号选择模块clkgen和七段显示模块disp_dec。(1)时钟调校及计时模块时钟调校及计时模块myclock实现的功能是根据当前的工作状态进行时、分、秒的调整或正常的计时。modulemyclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);inputRSTn,CLK,UP,DN;output[7:0]H,M,S;output[7:0]MS;input[1:0]FLAG;reg[5:0]m_H,m_M,m_S;reg[6:0]m_MS;assignH=m_H;assignM=m_M;assignS=m_S;assignMS=m_MS;always@(posedgeCLK)if(~RSTn)beginm_H=8'd23;m_M=8'd52;m_S=8'b0;m_MS=8'b0;endelseif(FLAG==2'b01)beginif(UP)beginif(m_H==8'd23)m_H=8'd0;elsem_H=m_H+1'b1;endelseif(DN)beginif(m_H==8'h00)m_H=8'd23;elsem_H=m_H-1'b1;endendelseif(FLAG==2'b10)beginif(UP)beginif(m_M==8'd59)m_M=8'd0;elsem_M=m_M+1'b1;endelseif(DN)beginif(m_M==8'h00)m_M=8'd59;elsem_M=m_M-1'b1;endendelseif(FLAG==2'b11)beginif(UP)beginif(m_S==8'd59)m_S=8'd0;elsem_S=m_S+1'b1;endelseif(DN)beginif(m_S==8'h00)m_S=8'd59;elsem_S=m_S-1'b1;endendelsebeginif(m_MS==8'd99)beginm_MS=8'd0;if(m_S==8'd59)beginm_S=8'd0;if(m_M==8'd59)beginm_M=8'd0;if(m_H==8'd23)m_H=0;elsem_H=m_H+1'b1;endelsem_M=m_M+1'b1;endelsem_S=m_S+1'b1;endelsem_MS=m_MS+1'b1;endendmodule(2)整数分频模块由于数字系统提供的基准时钟信号的频率往往比较高,因此需要分频模块产生所需频率的时钟信号,例如上面时钟调校及计时模块所需的100Hz的时钟信号。整数分频模块int_div可以实现对输入时钟clock进行F_DIV分频后输出clk_out。F_DIV分频系数范围为1~2n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV或F_DIV_WIDTH到相应范围即可。若分频系数为偶数,则输出的时钟占空比为50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为50%时,输出也是50%)。moduleint_div(clock,clk_out);parameterF_DIV=48000000;parameterF_DIV_WIDTH=32;inputclock;outputclk_out;regclk_p_r;regclk_n_r;reg[F_DIV_WIDTH-1:0]count_p;reg[F_DIV_WIDTH-1:0]count_n;wirefull_div_p;wirehalf_div_p;wirefull_div_n;wirehalf_div_n;assignfull_div_p=(count_pF_DIV-1);assignhalf_div_p=(count_p(F_DIV1)-1);assignfull_div_n=(count_nF_DIV-1);assignhalf_div_n=(count_n(F_DIV1)-1);assignclk_out=(F_DIV==1)?clock:(F_DIV[0]?(clk_p_r&clk_n_r):clk_p_r);always@(posedgeclock)beginif(full_div_p)begincount_p=count_p+1'b1;if(half_div_p)clk_p_r=1'b0;elseclk_p_r=1'b1;endelsebegincount_p=0;clk_p_r=1'b0;endendalways@(negedgeclock)beginif(full_div_n)begincount_n=count_n+1'b1;if(half_div_n)clk_n_r=1'b0;elseclk_n_r=1'b1;endelsebegincount_n=0;clk_n_r=1'b0;endendendmodule(3)时钟信号选择模块时钟信号选择模块clkgen实际上是一个二选一电路,用于提供时钟调校及计时模块所需的时钟脉冲。当电子表工作在正常计时状态时选择100Hz时钟信号;当电子表工作在调时、调分、调秒三种设置模式时,如果采用100Hz时钟信号,那么手动按键一次可能引起设置数据的一串跳变,因此为了方便按键动作对时间的设置,这里采用2Hz的时钟信号。moduleclkgen(flag,clk_100hz,clk_2hz,clkout);input[1:0]flag;inputclk_100hz,clk_2hz;inputclk_100hz,clk_2hz;outputclkout;assignclkout=(flag==2'b00)?clk_100hz:clk_2hz;endmodule(4)七段显示模块1.BCD码显示模块BCD码显示模块的功能是将8位二进制数转换为2位十进制数后,进行七段译码显示。为了实现显示功能,在其内部调用了dual_hex2位七段显示模块。moduledisp_dec(hex,dispout);input[7:0]hex;output[15:0]dispout;reg[7:0]dec;always@(hex)begindec[7:4]=hex/4'd10;dec[3:0]=hex%4'd10;enddual_hexu1(1'b0,dec,dispout);endmodule2.2位七段显示模块2位七段显示模块的功能是将2位十进制或十六进制数转换为对应的七段段码,内部调用了一位七段译码模块seg_decoder。moduledual_hex(iflag,datain,dispout);inputiflag;input[7:0]datain;output[15:0]dispout;seg_decoderu1(iflag,datain[7:4],dispout[15:8]);seg_decoderu2(iflag,datain[3:0],dispout[7:0]);endmodule3.1位七段译码模块1位七段译码模块的功能是将4位二进制数转换为对应的共阴或共阳七段段码。moduleseg_decoder(iflag,iA,oY);inputiflag;input[3:0]iA;outputreg[7:0]oY;always@(iflag,iA)begincase(iA)4'b0000:oY=8'h3f;4'b0001:oY=8'h06;4'b0010:oY=8'h5b;4'b0011:oY=8'h4f;4'b0100:oY=8'h66;4'b0101:oY=8'h6d;4'b0110:oY=8'h7d;4'b0111:oY=8'h27;4'b1000:oY=8'h7f;4'b1001:oY=8'h6f;4'b1010:oY=8'h77;4'b1011:oY=8'h7c;4'b1100:oY=8'h58;4'b1101:oY=8'h5e;4'b1110:oY=8'h79;4'b1111:oY=8'h71;endcaseif(!iflag)oY=~oY;endendmodule(5)顶层模块的实现顶层模块是将各功能模块连接起来,实现电子表的完整功能。moduleclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);inputiCLK_50;inputRSTn,UP,DN;input[1:0]FLAG;output[1:0]Mode;output[15:0]H_dis,M_dis,S_dis,MS_dis;output[7:0]H,M,S;wire[7:0]MS;wireclk_100hz,clk_2hz;wireclk;assignMode=FLAG;int_div#(500000,32)nclk100(iCLK_50,clk_100hz);int_div#(50000000,32)nclk2(iCLK_50,clk_2hz);clkgenu0(FLAG,clk_100hz,clk_2hz,clk);myclcku1(RSTn,clk,FLAG,UP,DN,H,M,S,MS);disp_decHour(H,H_dis);disp_decMinute(M,M_dis);disp_decSecond(S,S_dis);disp_dechour(MS,MS_dis);endmodule三.实验内容(1)Testbench设计为实现数字钟正常工作的仿真,设计相应的激励文件,参数根据仿真需要可做出相应修改。代码如下:`timescale100ns/1nsmodulemyclock_tp;regiCLK_50,RSTn,UP,DN;reg[1:0]FLAG;wire[1:0]Mode;wire[15:0]H_dis,M_dis,S_dis,MS_dis;wire[7:0]H,M,S;clockmyclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);initialiCLK_50=0;alwaysbegin#10iCLK_50=1'b1;#10iCLK_50=1'b0;endinitialbeginRSTn=0;UP=0;DN=0;FLAG=2'b00;#500000RSTn=1;endEndmodule(2)功能仿真1.正常工作图1所示是电子表在正常计时工作方式的功能仿真波形。图中,FLAG=2'b00,H、M、S分别是时、分、秒的十进制计数值,图中的显示时间从23∶59∶57计数到0∶0∶16秒。信号H_dis、M_dis、S_dis以及MS_dis分别是当前时、分、秒和百分秒十进制数据的共阳极七段码的输出信号,例如当时间为23∶59∶57时,其七段段码数据分别为16'ha4b0、16'h9290、16'h92d8,在共阳极数码管上显示“23∶59∶57”。图1数字钟正常工作仿真波形2.调整时间电子表模块工作在时、分、秒的调整状态时的功能仿真波形如图2、3、4所示。图2中,当FLAG=2'b01时,即进入“时”调整状态,若UP=1、DN=0,则小时数据H进行加1调整,见图中小时数据H从0变化到6的调整过程;若UP=0
本文标题:多功能数字钟
链接地址:https://www.777doc.com/doc-2435811 .html