目录
工具:quartus18.1 lite
代码
module biao_v(clk,reset,pause,msh,msl,sh,sl,minh,minl);
//其中msh为百分秒的十位,msl为百分秒的个位,sh为秒的十位,sl为秒的个位,minh为分的十位,minl为分的个位
input clk,reset,pause;//时钟,复位,暂停
output [3:0] msh,msl,sh,sl,minh,minl;//输出
reg [3:0] msh,msl,sh,sl,minh,minl;//寄存器
reg count1,count2;//寄存器
//设置百分秒
always @(posedge clk or posedge reset)//时钟上升沿或复位上升沿
begin
if(reset)//信号为复位时
begin
{msh,msl}<=0;//百分秒十位和百分秒个位赋0
count1<=0;//寄存器count1赋0
end
else if(!pause)//信号不是复位不是暂停时
begin
if(msl==9)//如果百分秒个位为9
begin
msl<=0;//百分秒个位赋0
if(msh==9)//如果百分秒十位为9
begin
msh<=0;//百分秒十位赋0
count1<=1;//寄存器count1赋1
end
else//如果百分秒十位不为9
msh<=msh+1;//百分秒十位加1
end
else//如果百分秒个位不为9
begin
msl<=msl+1;//百分秒个位加1
count1<=0;//寄存器coount1赋0
end
end
end
//设置秒
always @(posedge count1 or posedge reset)//信号为寄存器count1上升沿或复位上升沿时
begin
if(reset)//信号为复位
begin
{sh,sl}<=0;//秒的十位和个位赋0
count2<=0;//寄存器count2赋0
end
else if(sl==9)//秒的个位为9
begin
sl<=0;//秒个位赋0
if(sh==5)//秒十位为5
begin
sh<=0;//秒十位赋0
count2<=1;//寄存器count2赋1
end
else //秒十位不为5
sh<=sh+1;//秒十位加1
end
else//秒个位不为9
begin
sl<=sl+1;//秒个位加1
count2<=0;//寄存器count2赋0
end
end
//设置分
always@(posedge count2 or posedge reset)//寄存器count2上升沿或复位上升沿
begin
if(reset)//信号为复位
begin
minh<=0;//分十位赋0
minl<=0;//分个位赋0
end
else if(minl==9)//信号为分个位为9
begin
minl<=0;//分个位赋0
if(minh==5)//分十位为5
minh<=0;//分十位赋0
else//分十位不为5
minh<=minh+1;//分十位加1
end
else//分个位不为9也不是复位
minl<=minl+1;//分个位加1
end
endmodule
结果
从功能仿真结果可以看到,只有百分秒十位个位发生了变化
事实上我自己对这个程序一知半解的,不太了解具体的原理
参考:https://blog.csdn.net/qq_43643118/article/details/117031719