基于verilogHDL的数字时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*****
顶层模块信号定义:
clk : 基准时钟信号输入;
keysel : 校时状态/正常计时状态选择键输入;
key_s : 校秒信号选择键输入;
key_m : 校分信号选择键输入;
key_h : 校时信号选择键输入;
keyclr : 计时清零键;
keyen : 计时开始键;
buzzout : 声响输出;
sled : 4位数码管段码输出;
sl : 4位数码管位码输出;
seg : 单个数码管输出;
********************************************************* ******/
module
clock(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;
output buzzout;
input clk;
input keysel,key_s,key_m,key_h,keyen,keyclr;
reg[24:0] count;
wire[23:0] min;
wire sec;
wire sec_s,sec_m,sec_h,sec_narmal;
divclk Q1(clk,sec_narmal,sec_s,sec_m,sec_h);
modify
Q2(clk,keysel,key_s,key_m,key_h,sec,sec_narmal,sec_s,sec_m,sec_h);
counttime Q3(sec,keyclr,keyen,min);
display Q4(clk,sec,min,sled,sl,seg);
music Q5(clk,min,buzzout,sec_narmal);
endmodule
*****
分频模块信号定义:
clk : 基准时钟信号输入;
sec_narmal : 周期为1的信号输出;
sec_s : 周期为0.5s的信号输出;
sec_m : 周期为0.05s的信号输出;
sec_h : 周期为0.0005s的信号输出;
********************************************************* ******/
module divclk(clk,sec_narmal,sec_s,sec_m,sec_h);
input clk;
output sec_narmal,sec_s,sec_m,sec_h;
reg[23:0] count1;
reg[22:0] count2;
reg[19:0] count3;
reg[12:0] count4;
reg sec_narmal,sec_s,sec_m,sec_h;
always@(negedge clk)
begin
count1=count1+1'b1;
if(count1==24'd1*******)
begin
count1=24'h0;
sec_narmal=~sec_narmal;
end
end
always@(negedge clk)
begin
count2=count2+1'b1;
if(count2==23'd6000000)
begin
count2=23'h0;
sec_s=~sec_s;
end
end
always@(negedge clk)
begin
count3=count3+1'b1;
if(count3==20'd600000)
begin
count3=20'h0;
sec_m=~sec_m;
end
end
always@(negedge clk)
begin
count4=count4+1'b1;
if(count4==13'd6000)
begin
count4=13'h0;
sec_h=~sec_h;
end
end
endmodule
/********************************************************* *****
计时处理模块信号定义:
sec : 计时信号输入;
keyclr : 计时清零键;
keyen : 计时开始键;
min : 计时结果输出;
********************************************************* ******/
module counttime(sec,keyclr,keyen,min);
input sec;
input keyclr,keyen;
output[23:0] min;
reg[23:0] min;
always@(posedge sec)
begin
if(!keyclr)
begin
min=24'h0;
end
else
if(!keyen)
begin
min=min+1'b1;
if(min[3:0]==4'ha)
begin
min[3:0]=4'h0;
min[7:4]=min[7:4]+1'b1;
if(min[7:4]==4'h6)
begin
min[7:4]=4'h0;
min[11:8]=min[11:8]+1'b1;
if(min[11:8]==4'ha)
begin
min[11:8]=4'h0;
min[15:12]=min[15:12]+1'b1;
if(min[15:12]==4'h6)
begin
min[15:12]=4'h0;
min[19:16]=min[19:16]+1'b1;
if(min[19:16]==4'ha)
begin
min[19:16]=4'h0;
min[23:20]=min[23:20]+1'b1;
end
if(min[23:16]==8'h24)
min[23:16]=0;
end
end
end
end
end