【正文】
end else if(ML==439。d9) begin MH=439。(!sel2)) begin if(MH==439。b0001。b0001。 HL=439。amp。(!sel0)amp。b0000。b0000。b0000。 wire clk。 源代碼如下://計時與調(diào)時模塊module clock(CP,t,S1,S0,nCR,AH,AM,sel0,sel1,sel2,clear )。//整點報時 alarm alarmset(t_alarm,S0,S1,AH,AM,nCR,CP,sel0,sel1,sel2)。//萬年歷 TO_12 ampm(t[23:8],t_time)。 wire [15:0]year。 wire [23:0]t。 output [6:0]show。 萬年歷;216。 任意時刻鬧鐘; 216。 以數(shù)字形式顯示時、分、秒的時間; 216。 小時計數(shù)器為同步24進制;216。 小時顯示(12/24)切換電路216。 秒表。 output [3:0]sw。 wire [15:0]t_out,stopsec。 wire [7:0]month,day。//1224進制轉換 clock lclock(CP,t,S1,S0,nCR,AH,AM,sel0,sel1,sel2,clear)。//鬧鐘 TAswitch AT(t_time,t_alarm,t,t_out,sel0,sel1,sel2,year,month,day,stopsec)。 input S1,S0,CP,nCR,AH,AM,sel0,sel1,sel2,clear。 secclk sec(CP,clk,nCR)。 HL=439。 ML=439。 SL=439。(!sel1)amp。HL==439。b0000。 HL=439。 end else if(AMamp。d5amp。b0000。d9) begin MH=MH+439。 end else ML=ML+439。(!sel0)amp。sel2) begin SH=439。 end else begin //手動調(diào)時部分 if(S1amp。d2amp。b0000。d9) begin HH=HH+439。 end else HL=HL+439。(!sel1)amp。ML==439。b0000。 ML=439。 end else begin if(SL==439。d5) begin SL=439。 if(ML==439。d5) begin ML=439。 if(HH==439。d3) begin HH=439。 end else if(HL==439。h0。d9) begin ML=439。 end else ML=ML+439。b0001。b0001。 reg [24:0]t=2539。 always (posedge clk_in or negedge nCR) begin if(~nCR) t=2539。 t=139。 end endendmodule波形圖t為輸出端,CP為原脈沖信號,S1為手動校時,S0為手動校分,nCR為清零,AH和AM為自動校時和校分。//t為輸入信號,t_out為輸出信號,switch為選擇開關 input[23:0]t。 always(*) begin if(!switch) t_out=t。 839。b00010100:t_out[23:16]=839。b0000_0011。 839。b00011000:t_out[23:16]=839。b0000_0111。 839。b00100010:t_out[23:16]=839。b0001_0001??梢娫?3:00時第一行輸出的波形分別是13:00和1:00。譯碼模塊可以將時鐘信號轉化成數(shù)碼七段管的顯示信號。 input [15:0] t_now。b00。b00:begin num=t_now[3:0]。 sw[3]=1。 sw[1]=0。b10: begin num=t_now[11:8]。 sw[3]=1。 sw[1]=1。b01。 output clk_out。b0。d0。//num為輸入信號,led為數(shù)碼管的顯示信號 input [3:0]num。b0000:led=739。b1001111。 439。b0100:led=739。b0100100。 439。b1000:led=739。b0000100。模塊(4)報時電路: 報時模塊分為仿廣播電臺報時和整點報時。 源代碼如下://報時模塊module baoshi(CP,int,led_out,spark )。output spark。b0101100101010110)spark=1。b0101100101011000)spark=1。b0000000000000000)spark=1。b0000000000000010)spark=1。b0001。 else if (int[23:0]==2439。b000001000000000000000000)led_out=439。b0101。 else if (int[23:0]==2439。b000010000000000000000000)led_out=439。b1001。 else if (int[23:0]==2439。b000100100000000000000000)led_out=439。b0001。 else if (int[23:0]==2439。b000101100000000000000000)led_out=439。b0101。 else if (int[23:0]==2439。b001000000000000000000000)led_out=439。b1001。 else if (int[23:0]==2439。b001001000000000000000000)led_out=439。 endendmodule波形圖如下:第一行為整點報時信號led_out,第二行為仿廣播電臺報時spark,第三行為脈沖,第四行為從01:59:56到02:00:02的時鐘信號。鬧鐘報時模塊的功能是到達特定時刻點時led燈亮一分鐘。 reg [3:0]HH,HL,MH,ML。 always (posedge clk) begin if(!nAR) begin HH=439。 MH=439。 end else begin if(AHamp。d2amp。b0000。d9) begin HH=HH+439。 end else HL=HL+439。(!sel1)amp。ML==439。b0000。 ML=439。 end else begin if(S1amp。d2amp。b0000。d9) begin HH=HH+439。 end else HL=HL+439。(!sel1)amp。ML==439。b0000。 ML=439。 end end end endendmodule//鬧鐘報時模塊module time_alarm(t0,t1,led,CP,nCR )。 reg led。 always (posedge clk) begin if(!nCR) begin led=0。 count=1。(count339。 end else begin led=0。 input nCR,CP,AD,AM,sel0,sel1,sel2。 reg[15:0]year。 always (*) begin if(yearamp。d10*year[7:4]+year[3:0])%4==0) a=1。 else a=0。b0000_0001。sel0amp。b0000。 if(year[11:8]==439。b1001) year[15:12]=