【正文】
這是我們在做校時電路時得到的教訓,最后通過重寫時鐘電路才得以解決。在隨后的幾天內(nèi),我們又利用課余時間陸續(xù)完成了萬年歷和秒表的功能。d1。d249999) begin clk_out=~clk_out。b0。 output clk_out。 end else t[11:8]=t[11:8]+439。b0101) t[15:12]=439。 else begin if(t[11:8]==439。b0001。b0000。b1001) begin t[3:0]=439。 always (posedge sclk or posedge stop ) begin if(stop) t[7:0]=t[7:0]。 reg[15:0] t=1639。 end end end endendmodule模塊(7) 秒表module second(CP,t,nCR,stop,clear )。 day[7:4]=day[7:4]+439。b0000_1001)|(day==839。b0001。b0000_1001)|(day==839。b0000_0001。 end else day[3:0]=day[3:0]+439。b0001_1001)) begin day[3:0]=439。 month[3:0]=month[3:0]+439。 end else if(month==839。b0000_1001) month=839。(day==839。b0000_0100)|(month==839。b0001。b0001。b0000。 if(year[7:4]==439。b0000_0001。b00110001)) begin day=839。b0000_1000)|(month==839。b0000_0001)|(month==839。 else month[3:0]=month[3:0]+439。b00000001。sel0amp。sel1amp。 end else year[3:0]=year[3:0]439。 end else year[11:8]=year[11:8]439。b0000) year[15:12]=439。 if(year[11:8]==439。b1001。sel0amp。b0001。b0001。 if(year[15:12]==439。b0000。b1001) begin year[3:0]=439。 end else begin if(ADamp。 month=839。d10*year[15:12]+year[11:8])%4==0) a=1。b0000000011111111) begin if((439。 secclk sec(CP,clk,nCR)。 output[8:0]month,day。 end endendmodule波形圖如下(僅檢測鬧鐘的報時模塊):即當t0與t1相同時輸出led為1模塊(6)萬年歷module date(clock,CP,nCR,year,month,day,sel0,sel1,sel2,AD,AM )。d1。amp。 end else if(t0==t1) begin led=1。 secclk second(CP,clk,nCR)。 output led。b0001。b0001。 ML=439。amp。sel0amp。b0000。 end else if(HL==439。d3) begin HH=439。(!sel2)) begin if(HH==439。b0001。b0001。 ML=439。amp。sel0amp。b0000。 end else if(HL==439。d3) begin HH=439。(!sel2)) begin if(HH==439。b0000。b0000。 assign t={HH,HL,MH,ML}。 output [15:0]t。鬧鐘設(shè)置模塊類似于計時模塊中的設(shè)置部分,鬧鐘時鐘切換模塊用于切換顯示。b0000。 else if (int[23:0]==2439。b1010。b001000010000000000000000)led_out=439。 else if (int[23:0]==2439。b0110。b000101110000000000000000)led_out=439。 else if (int[23:0]==2439。b0010。b000100110000000000000000)led_out=439。 else if (int[23:0]==2439。b1010。b000010010000000000000000)led_out=439。 else if (int[23:0]==2439。b0110。b000001010000000000000000)led_out=439。 else if (int[23:0]==2439。b0010。b000000010000000000000000)led_out=439。 else if(int[15:0]==1639。 else if(int[15:0]==1639。 else if(int[15:0]==1639。//仿廣播電臺報時功能always (posedge CP) begin if(int[15:0]==1639。output [3:0]led_out。整點報時功能基于十二小時制。 endcaseendmodule波形圖如下Show為輸入數(shù)碼管的波形,sw為數(shù)碼管掃描開關(guān),sel為切換時分或分秒,t為時間。b1001:led=739。 439。b0100000。b0101:led=739。 439。b0010010。b0001:led=739。 always (*) case(num) 439。 endendmodule//數(shù)碼管譯碼器模塊module translator(num,led)。 t=139。 reg clk_out=139。 input clk_in。 end endcase Q=Q+239。 sw[0]=1。 sw[2]=0。 end 239。 sw[0]=1。 sw[2]=1。 always(posedge sm) begin case(Q) 239。 reg [1:0] Q=239。 input CP。掃描模塊用來產(chǎn)生1000Hz的信號,相當于分頻器。 end end endmodule波形圖如下:波形的第一行是輸出的顯示信號,第二行是輸入信號(分別輸入13:00:00和14:00:00,第三行是切換信號。b00100011:t_out[23:16]=839。 839。b0000_1000。b00011001:t_out[23:16]=839。 839。b0000_0100。b00010101:t_out[23:16]=839。 839。b0001_0010。 reg [23:0]t_out。源代碼如下://1224小時轉(zhuǎn)換電路module TO_12(t,t_out,switch )。d1。d24999999) begin clk_out=~clk_out。b0。 output clk_out。 end else SL=SL+439。d9) begin SH=SH+439。b0001。 end else if(ML==439。 HL=439。h0。HL==439。h0。MH==439。h0。SH==439。b0001。b0001。 ML=439。amp。(!sel0)amp。b0000。 end else if(HL==439。d3) begin HH=439。(!sel2)) begin if(HH==439。b0000。amp。amp。b0000。