?? clock.v
字號:
module clock(CLK,CLK_1K,MODE,CHANGE,TURN,ALERT,HOU,MIN,SEC,LD_AL,LD_H,LD_M);
input CLK,CLK_1K,MODE,CHANGE,TURN;
output [7:0] HOU,MIN,SEC;
output ALERT,LD_AL,LD_H,LD_M;
reg [7:0] HOU,MIN,SEC,THOU,TMIN,TSEC,AHOU,AMIN;
reg [1:0] m,fm,sound;
reg LD_H,LD_M;
reg CLK_1Hz,CLK_2Hz,mclk,hclk;
reg alert1,alert2,ear;
reg count1,count2,lcount1,lcount2;
wire ct1,ct2,lct1,lct2,m_clk,h_clk;
always @(posedge CLK)
begin
CLK_2Hz<=~CLK_2Hz;
if(sound==3)
begin sound<=0;ear<=1;end
//ear信號用于產生或屏蔽聲音
else
begin sound<=sound+1;ear<=0;end
end
always @(posedge CLK_2Hz)
CLK_1Hz<=~CLK_1Hz; //產生1Hz的時基信號
always @(posedge MODE) //MODE信號控制3鐘功能的轉換
begin if(m==2) m<=0; //m=0:計時功能
else m<=m+1; //m=1:鬧鐘功能
end //m=2:手動校時
always @(TURN)
fm<=~fm; //校時時選擇調整分鐘還是小時
always
begin case(m)
2:begin if(fm)
begin
count1<=CHANGE;
{LD_H,LD_M}<=2'b01;
end
else
begin
count2<=CHANGE;
{LD_H,LD_M}<=2'b10;
end
{count1,count2}<=0;
end
1:begin if(fm)
begin
lcount1<=CHANGE;
{LD_H,LD_M}<=2'b01;
end
else
begin
lcount2<=CHANGE;
{LD_H,LD_M}<=2'b10;
end
{lcount1,lcount2}<=0;
end
default:{count1,count2,lcount1,lcount2,LD_H,LD_M}<=0;
endcase
end
always @(posedge CLK_1Hz) //秒計時和秒調整
if(!(TSEC^8'h59)|TURN&(!m))
begin TSEC<=0;
if(!(TURN&(!m)))
mclk<=1;
end
else begin
if(TSEC[3:0]==9)
begin TSEC[3:0]<=0;
TSEC[7:4]<=TSEC[7:4]+1;
end
else TSEC[3:0]<=TSEC[3:0]+1;
mclk<=0;
end
assign m_clk=mclk|count1;
assign h_clk=hclk|count2;
assign ct1=CLK|m_clk; //ct1用于計時、校時中的分鐘計數
assign ct2=CLK|h_clk; //ct2用于計時、校時中的小時計數
assign lct1=CLK|lcount1; //lct1用于定時狀態下調整分鐘信號
assign lct2=CLK|lcount2; //lct2用于定時狀態下調整小時信號
always @(posedge ct1) //分計時和分調整
begin if(TMIN==8'h59)
begin TMIN<=0;
hclk<=1;
end
else begin
if(TMIN[3:0]==9)
begin TMIN[3:0]<=0;
TMIN[7:4]<=TMIN[7:4]+1;
end
else TMIN[3:0]<=TMIN[3:0]+1;
hclk<=0;
end
end
always @(posedge ct2) //小時計時和小時調整
if(THOU==8'h23)
THOU<=0;
else begin
if(THOU[3:0]==9)
begin THOU[3:0]<=0;
THOU[7:4]<=THOU[7:4]+1;
end
else THOU[3:0]<=THOU[3:0]+1;
end
always @(posedge lct1) //鬧鐘定時中分鐘調整
if(AMIN==8'h59)
AMIN<=0;
else if(AMIN[3:0]==9)
begin AMIN[3:0]<=0;
AMIN[7:4]<=AMIN[7:4]+1;
end
else AMIN[3:0]<=AMIN[3:0]+1;
always @(posedge lct2) //鬧鐘定時中小時調整
if(AHOU==8'h23)
AHOU<=0;
else begin
if(AHOU[3:0]==9)
begin AHOU[3:0]<=0;
AHOU[7:4]<=AHOU[7:4]+1;
end
else AHOU[3:0]<=AHOU[3:0]+1;
end
always //鬧鐘功能:產生鬧鈴信號
if((THOU==AHOU)&&(TMIN==AMIN)&&(AHOU|AMIN)&&(!CHANGE))
//若按住"CHANGE"鍵不放就可以屏蔽鬧鈴
if(TSEC<8'h30) alert1<=1; //設定鬧鈴聲的長短,這里設為30秒
else alert1<=0;
else alert1<=0;
always
case(m)
0:begin HOU<=THOU; //計時狀態下時、分、秒顯示
MIN<=TMIN;
SEC<=TSEC;
end
1:begin HOU<=AHOU; //定時狀態下時、分、秒顯示
MIN<=AMIN;
SEC<=8'hzz;
end
2:begin HOU<=THOU; //校時狀態下時、分、秒顯示
MIN<=TMIN;
SEC<=8'hzz;
end
endcase
assign LD_AL=(AHOU|AMIN)?1:0;
always //整點報時功能:產生整點報時信號
begin if((TMIN==8'h59)&&(TSEC>8'h54)||(!(TMIN|TSEC)))
if(TSEC>8'h54)
alert2<=ear & CLK_1K; //產生短音
else
alert2<=!ear & CLK_1K; //產生長音
else alert2<=0;
end
assign ALERT=((alert1)?CLK_1K & CLK:0)|alert2;
//鬧鈴音和整點報時信號輸出
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -