资源描述:
《基于veriloghdl的数字时钟》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、/**************************************************************顶层模块信号定义:clk:基准时钟信号输入;keysel:校时状态/正常计时状态选择键输入;key_s:校秒信号选择键输入;key_m:校分信号选择键输入;key_h:校时信号选择键输入;keyclr:计时清零键;keyen:计时开始键;buzzout:声响输出;sled:4位数码管段码输出;sl:4位数码管位码输出;seg:单个数码管输出;*************************************************
2、**************/moduleclock(clk,keysel,key_s,key_m,key_h,keyen,keyclr,sled,sl,seg,buzzout);output[7:0]sled;output[3:0]sl;output[7:0]seg;outputbuzzout;inputclk;inputkeysel,key_s,key_m,key_h,keyen,keyclr;reg[24:0]count;wire[23:0]min;wiresec;wiresec_s,sec_m,sec_h,sec_narmal;divclkQ1(clk,
3、sec_narmal,sec_s,sec_m,sec_h);modifyQ2(clk,keysel,key_s,key_m,key_h,sec,sec_narmal,sec_s,sec_m,sec_h);counttimeQ3(sec,keyclr,keyen,min);displayQ4(clk,sec,min,sled,sl,seg);musicQ5(clk,min,buzzout,sec_narmal);endmodule/**************************************************************分频模块信
4、号定义:clk:基准时钟信号输入;sec_narmal:周期为1的信号输出;sec_s:周期为0.5s的信号输出;sec_m:周期为0.05s的信号输出;sec_h:周期为0.0005s的信号输出;***************************************************************/moduledivclk(clk,sec_narmal,sec_s,sec_m,sec_h);inputclk;outputsec_narmal,sec_s,sec_m,sec_h;reg[23:0]count1;reg[22:0]count
5、2;reg[19:0]count3;reg[12:0]count4;regsec_narmal,sec_s,sec_m,sec_h;always@(negedgeclk)begincount1=count1+1'b1;if(count1==24'd12000000)begincount1=24'h0;sec_narmal=~sec_narmal;endendalways@(negedgeclk)begincount2=count2+1'b1;if(count2==23'd6000000)begincount2=23'h0;sec_s=~sec_s;endenda
6、lways@(negedgeclk)begincount3=count3+1'b1;if(count3==20'd600000)begincount3=20'h0;sec_m=~sec_m;endendalways@(negedgeclk)begincount4=count4+1'b1;if(count4==13'd6000)begincount4=13'h0;sec_h=~sec_h;endendendmodule/**************************************************************计时处理模块信号定义:
7、sec:计时信号输入;keyclr:计时清零键;keyen:计时开始键;min:计时结果输出;***************************************************************/modulecounttime(sec,keyclr,keyen,min);inputsec;inputkeyclr,keyen;output[23:0]min;reg[23:0]min;always@(posedgesec)beginif(!keyclr)beginmin=24'h0;endelseif(!keyen)beginmin=min
8、+1'b1;if(min