《2022年多功能数字钟 .pdf》由会员分享,可在线阅读,更多相关《2022年多功能数字钟 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验五多功能数字钟一、实验内容1.通过 ModelSim软件,运用 Verilog语言编程实现多功能数字钟功能。二实验要求及原理1.实验要求设计计数器多功能数字钟及分频器,并进行功能仿真。2.实验原理数字钟是一个最常用的数字系统,其主要功能是计时和显示时间。这里通过一个数字钟表的模块化设计方法,说明自顶向下的模块化设计方法和实现一个项目的设计步骤。这里实现的电子表具有显示和调时的基本功能,可以显示时、分、秒和毫秒,并通过按键进行工作模式选择,工作模式有 4 种,分别是正常计时模式、调时模式、调分模式、调秒模式。构成电子表的基本模块有四个,分别是时钟调校及计时模块myclock、整数分频模块 i
2、nt_div、时钟信号选择模块clkgen 和七段显示模块 disp_dec。(1)时钟调校及计时模块时钟调校及计时模块myclock 实现的功能是根据当前的工作状态进行时、分、秒的调整或正常的计时。module myclock(RSTn,CLK,FLAG,UP,DN,H,M,S,MS);input RSTn,CLK,UP,DN;output 7:0H,M,S;output 7:0MS;input 1:0FLAG;reg 5:0m_H,m_M,m_S;reg 6:0m_MS;assign H=m_H;assign M=m_M;assign S=m_S;assign MS=m_MS;always
3、(posedge CLK)if(RSTn)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -begin m_H=8d23;m_M=8d52;m_S=8b0;m_MS=8b0;end else if(FLAG=2b01)begin if(UP)begin if(m_H=8d23)m_H=8d0;else m_H=m_H+1b1;end else if(DN)begin if(m_H=8h00)m_H=8d23;else m_H=m_H-1b1;end end else if(FLAG=2b10)begin if(UP)begin if(m_M=8d59)m_M=8d0;e
4、lse m_M=m_M+1b1;end else if(DN)begin if(m_M=8h00)m_M=8d59;else m_M=m_M-1b1;end end else if(FLAG=2b11)begin 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -if(UP)begin if(m_S=8d59)m_S=8d0;else m_S=m_S+1b1;end else if(DN)begin if(m_S=8h00)m_S=8d59;else m_S=m_S-1b1;end end else begin if(m_MS=8d99)begin m_MS=8d0;i
5、f(m_S=8d59)begin m_S=8d0;if(m_M=8d59)begin m_M=8d0;if(m_H=8d23)m_H=0;else m_H=m_H+1b1;end else m_M=m_M+1b1;end else m_S=m_S+1b1;end else m_MS=m_MS+1b1;end endmodule 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -(2)整数分频模块由于数字系统提供的基准时钟信号的频率往往比较高,因此需要分频模块产生所需频率的时钟信号,例如上面时钟调校及计时模块所需的100 Hz的时钟信号。整数分频模块int_div可以实现
6、对输入时钟clock 进行 F_DIV分频后输出clk_out。F_DIV分频系数范围为 12n(n=F_DIV_WIDTH),若要改变分频系数,改变参数 F_DIV或 F_DIV_WIDTH 到相应范围即可。若分频系数为偶数,则输出的时钟占空比为 50%;若分频系数为奇数,则输出的时钟占空比取决于输入的时钟占空比和分频系数(当输入为 50%时,输出也是 50%)。module int_div(clock,clk_out);parameter F_DIV=48000000;parameter F_DIV_WIDTH=32;input clock;output clk_out;reg clk_p
7、_r;reg clk_n_r;regF_DIV_WIDTH-1:0count_p;regF_DIV_WIDTH-1:0count_n;wire full_div_p;wire half_div_p;wire full_div_n;wire half_div_n;assign full_div_p=(count_pF_DIV-1);assign half_div_p=(count_p1)-1);assign full_div_n=(count_nF_DIV-1);assign half_div_n=(count_n1)-1);assign clk_out=(F_DIV=1)?clock:(F_D
8、IV0?(clk_p_r&clk_n_r):clk_p_r);always(posedge clock)begin if(full_div_p)begin count_p=count_p+1b1;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -if(half_div_p)clk_p_r=1b0;else clk_p_r=1b1;end else begin count_p=0;clk_p_r=1b0;end end always(negedge clock)begin if(full_div_n)begin count_n=count_n+1b1;if(half_di
9、v_n)clk_n_r=1b0;else clk_n_r=1b1;end else begin count_n=0;clk_n_r=1b0;end end endmodule(3)时钟信号选择模块时钟信号选择模块clkgen 实际上是一个二选一电路,用于提供时钟调校及计时模块所需的时钟脉冲。当电子表工作在正常计时状态时选择100 Hz时钟信号;当电子表工作在调时、调分、调秒三种设置模式时,如果采用100 Hz时钟信号,那么手动按键一次可能引起设置数据的一串跳变,因此为了方便按键动作对时间的设置,这里采用2 Hz的时钟信号。module clkgen(flag,clk_100hz,clk_2hz
10、,clkout);input1:0flag;input clk_100hz,clk_2hz;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -input clk_100hz,clk_2hz;output clkout;assign clkout=(flag=2b00)?clk_100hz:clk_2hz;endmodule(4)七段显示模块1BCD 码显示模块BCD 码显示模块的功能是将8 位二进制数转换为2 位十进制数后,进行七段译码显示。为了实现显示功能,在其内部调用了dual_hex 2 位七段显示模块。module disp_dec(hex,dispout);i
11、nput7:0hex;output15:0dispout;reg7:0dec;always(hex)begin dec7:4=hex/4d10;dec3:0=hex%4d10;end dual_hex u1(1b0,dec,dispout);endmodule22 位七段显示模块2位七段显示模块的功能是将2位十进制或十六进制数转换为对应的七段段码,内部调用了一位七段译码模块seg_decoder。module dual_hex(iflag,datain,dispout);input iflag;input 7:0datain;output 15:0dispout;seg_decoder u1(
12、iflag,datain7:4,dispout15:8);seg_decoder u2(iflag,datain3:0,dispout7:0);endmodule31 位七段译码模块1位七段译码模块的功能是将4位二进制数转换为对应的共阴或共阳七段段码。module seg_decoder(iflag,iA,oY);input iflag;input3:0 iA;output reg7:0 oY;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -always(iflag,iA)begin case(iA)4b0000:oY=8h3f;4b0001:oY=8h06;4b00
13、10:oY=8h5b;4b0011:oY=8h4f;4b0100:oY=8h66;4b0101:oY=8h6d;4b0110:oY=8h7d;4b0111:oY=8h27;4b1000:oY=8h7f;4b1001:oY=8h6f;4b1010:oY=8h77;4b1011:oY=8h7c;4b1100:oY=8h58;4b1101:oY=8h5e;4b1110:oY=8h79;4b1111:oY=8h71;endcase if(!iflag)oY=oY;end endmodule(5)顶层模块的实现顶层模块是将各功能模块连接起来,实现电子表的完整功能。module clock(iCLK_50
14、,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);input iCLK_50;input RSTn,UP,DN;input 1:0FLAG;output 1:0Mode;output 15:0H_dis,M_dis,S_dis,MS_dis;output 7:0H,M,S;wire 7:0MS;wire clk_100hz,clk_2hz;wire clk;assign Mode=FLAG;int_div#(500000,32)nclk100(iCLK_50,clk_100hz);int_div#(50000000,32)nclk2(i
15、CLK_50,clk_2hz);名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 10 页 -clkgen u0(FLAG,clk_100hz,clk_2hz,clk);myclck u1(RSTn,clk,FLAG,UP,DN,H,M,S,MS);disp_dec Hour(H,H_dis);disp_dec Minute(M,M_dis);disp_dec Second(S,S_dis);disp_dec hour(MS,MS_dis);endmodule 三实验内容(1)Testbench 设计为实现数字钟正常工作的仿真,设计相应的激励文件,参数根据仿真需要可做出相应修改。代
16、码如下:timescale 100ns/1ns module myclock_tp;reg iCLK_50,RSTn,UP,DN;reg1:0 FLAG;wire1:0 Mode;wire15:0 H_dis,M_dis,S_dis,MS_dis;wire7:0 H,M,S;clock myclock(iCLK_50,RSTn,FLAG,UP,DN,H_dis,M_dis,S_dis,MS_dis,Mode,H,M,S);initial iCLK_50=0;always begin#10 iCLK_50=1b1;#10 iCLK_50=1b0;end initial begin 名师资料总结-
17、精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -RSTn=0;UP=0;DN=0;FLAG=2b00;#500000 RSTn=1;end Endmodule(2)功能仿真1.正常工作图 1 所示是电子表在正常计时工作方式的功能仿真波形。图中,FLAG=2b00,H、M、S分别是时、分、秒的十进制计数值,图中的显示时间从 235957计数到 0016秒。信号 H_dis、M_dis、S_dis 以及MS_dis分别是当前时、分、秒和百分秒十进制数据的共阳极七段码的输出信号,例如当时间为 235957时,其七段段码数据分别为16ha4b0、16h9290、16h92d8,在共阳极数码
18、管上显示“235957”。图 1 数字钟正常工作仿真波形2.调整时间电子表模块工作在时、分、秒的调整状态时的功能仿真波形如图2、3、4所示。图 2 中,当 FLAG=2b01时,即进入“时”调整状态,若 UP=1、DN=0,则小时数据 H进行加 1 调整,见图中小时数据H从 0 变化到 6 的调整过名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -程;若 UP=0、DN=1,则小时数据 H进行减 1 调整,见图中小时数据H从5 变化到 21 的调整过程。分和秒的调整过程也类似,见图3、4。图 2 调时仿真波形图 3 调分仿真波形图 4 调秒仿真波形四实验总结名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -