(中國(guó)電子科技集團(tuán)公司 第二十七研究所, 鄭州 450047)
現(xiàn)場(chǎng)可編程門(mén)陣列(field-programmable gate array,FPGA)的飛速發(fā)展,在工業(yè)控制、電子計(jì)量、便攜儀器、數(shù)字通信、人工智能等各個(gè)領(lǐng)域得到廣泛應(yīng)用。Verilog HDL(Verilog hard design language)作為目前主流的硬件描述語(yǔ)言得到了FPGA工程師的青睞。目前數(shù)字鐘多應(yīng)用于儀器儀表、電子計(jì)量、實(shí)時(shí)控制系統(tǒng)中[1-2]。實(shí)時(shí)時(shí)鐘芯片PCF8563在數(shù)字鐘設(shè)計(jì)中應(yīng)用也非常廣泛,實(shí)質(zhì)是一個(gè)對(duì)標(biāo)準(zhǔn)頻率計(jì)數(shù)的計(jì)數(shù)電路,通常由晶體振蕩電路、分頻電路、時(shí)間計(jì)數(shù)電路、譯碼驅(qū)動(dòng)電路等組成[3]。本文提出了一種基于實(shí)時(shí)時(shí)鐘芯片PCF8563的數(shù)字鐘的FPGA設(shè)計(jì)實(shí)現(xiàn)思路,采用Altera公司的Cyclone IV E系列FPGA芯片EP4CE10F17C8作為主控芯片,通過(guò)Inter-Integrated Circuit(I2C)總線實(shí)現(xiàn)對(duì)實(shí)時(shí)時(shí)鐘芯片PCF8563的讀寫(xiě)控制,通過(guò)4個(gè)按鍵分別完成時(shí)鐘/日歷切換、實(shí)時(shí)顯示和手動(dòng)調(diào)校切換、數(shù)據(jù)移位設(shè)置和數(shù)據(jù)累加設(shè)置功能,完成實(shí)時(shí)和調(diào)校模式下的六位數(shù)碼管顯示,并在調(diào)校模式下實(shí)現(xiàn)數(shù)碼管閃爍指示功能。通過(guò)SignalTap邏輯分析儀,驗(yàn)證了系統(tǒng)功能實(shí)現(xiàn)的技術(shù)可行性,并在正點(diǎn)原子開(kāi)拓者EP4CE10開(kāi)發(fā)板上完成調(diào)試。
PCF8563是飛利浦公司的一款具有極低功耗的工業(yè)級(jí)多功能CMOS實(shí)時(shí)時(shí)鐘/日歷芯片,工作電流為0.25 μA,具有時(shí)鐘輸出、報(bào)警、定時(shí)器以及中斷輸出功能,能完成各種復(fù)雜的定時(shí)服務(wù),其內(nèi)部功能如圖1所示[4]。
圖1 PCF8563內(nèi)部功能框圖
PCF8563內(nèi)部包括16個(gè)8位寄存器、內(nèi)置32.768 Hz的振蕩器、時(shí)鐘監(jiān)控、電源復(fù)位、分頻器、可編程時(shí)鐘輸出、中斷輸出、看門(mén)狗電路以及I2C總線接口。分頻器給實(shí)時(shí)時(shí)鐘RTC提供源時(shí)鐘,內(nèi)存地址00 H、01 H用作控制和狀態(tài)寄存器,地址02 H~08 H用作TIME計(jì)時(shí)器,地址09 H~0 CH用于報(bào)警寄存器,地址0DH控制CLKOUT管腳的輸出頻率,地址0EH和0FH分別用于定時(shí)器控制寄存器和定時(shí)器寄存器,其中年月日時(shí)分秒寄存器均為BCD編碼[5]。
當(dāng)一個(gè)RTC寄存器被寫(xiě)入或讀取時(shí),所有時(shí)間計(jì)數(shù)器的內(nèi)容將被凍結(jié),可避免在進(jìn)位條件下錯(cuò)誤地寫(xiě)或讀時(shí)鐘和日歷,因此所有訪問(wèn)必須在1 s內(nèi)完成。開(kāi)機(jī)復(fù)位(POR)覆蓋,POR持續(xù)時(shí)間與晶體振蕩器的啟動(dòng)時(shí)間直接相關(guān),在上電復(fù)位后,應(yīng)持續(xù)大于8 ms,再進(jìn)行總線操作[6]。PCF8563的所有數(shù)據(jù)和地址均通過(guò)I2C總線接口串行傳遞,最大總線速度為400 kbits/s,每次讀寫(xiě)數(shù)據(jù)后,內(nèi)嵌的地址寄存器會(huì)自動(dòng)產(chǎn)生增量。
PCF8563寄存器寫(xiě)時(shí)序過(guò)程如下:先發(fā)送器件地址+寫(xiě)操作0,隨后發(fā)8位寄存器地址,最后發(fā)8位寄存器值,S為起始信號(hào),A為應(yīng)答信號(hào),P為停止信號(hào)。讀時(shí)序過(guò)程如下:先發(fā)7位地址+寫(xiě)操作0,然后發(fā)送寄存器地址,重新發(fā)送起始信號(hào)Sr,再次發(fā)送7位地址+讀操作1,讀取寄存器值。
數(shù)字鐘系統(tǒng)由晶振、電源模塊、實(shí)時(shí)時(shí)鐘芯片PCF8563、FPGA電路模塊、按鍵模塊以及數(shù)碼管顯示模塊6部分組成。系統(tǒng)采用3.3 V供電,晶振選擇32.768 kHz和50 MHz兩種,分別用于實(shí)時(shí)時(shí)鐘芯片PCF8563工作的外部晶振和FPGA工作的基準(zhǔn)時(shí)鐘,F(xiàn)PGA采用Cyclone IV E系列EP4CE10F17C8芯片[7],時(shí)鐘芯片PCF8563與FPGA通過(guò)I2C總線實(shí)現(xiàn)雙向通信,系統(tǒng)框圖如圖2所示。
圖2 數(shù)字時(shí)鐘系統(tǒng)框圖
數(shù)字鐘系統(tǒng)具體實(shí)現(xiàn)功能如下:1)實(shí)時(shí)時(shí)鐘功能,能夠完成常規(guī)時(shí)鐘/日歷的實(shí)時(shí)計(jì)數(shù);2)手動(dòng)調(diào)校功能,能夠手動(dòng)設(shè)置年月日時(shí)分秒,數(shù)據(jù)按照相應(yīng)約束條件進(jìn)行循環(huán)累加和移位操作,完成時(shí)鐘/日歷的手動(dòng)調(diào)校;3)數(shù)碼管動(dòng)態(tài)顯示功能,能夠在實(shí)時(shí)和調(diào)校模式下完成時(shí)鐘/日歷的數(shù)碼管切換顯示,并在調(diào)校模式下實(shí)現(xiàn)數(shù)碼管在當(dāng)前調(diào)整位置的閃爍指示功能。
FPGA作為本設(shè)計(jì)的核心部件,按照自頂向下的設(shè)計(jì)流程,各模塊功能通過(guò)Verilog硬件描述語(yǔ)言實(shí)現(xiàn),主要電路由按鍵消抖模塊、鍵控時(shí)鐘設(shè)置模塊、實(shí)時(shí)時(shí)鐘模塊、I2C驅(qū)動(dòng)模塊、數(shù)碼管驅(qū)動(dòng)模塊5部分構(gòu)成。
設(shè)計(jì)采用4個(gè)機(jī)械彈性按鍵,按下為低電平,彈起為高電平。由于機(jī)械按鍵開(kāi)關(guān)在閉合和斷開(kāi)時(shí)均不會(huì)馬上穩(wěn)定,存在瞬間抖動(dòng),為解決不利影響,故采用按鍵消抖的方法,即當(dāng)檢測(cè)到按鍵狀態(tài)改變且按鍵狀態(tài)穩(wěn)定后,計(jì)數(shù)器從20 ms開(kāi)始倒計(jì)時(shí),當(dāng)計(jì)數(shù)器遞減到1時(shí),說(shuō)明按鍵穩(wěn)定狀態(tài)維持了20 ms,此時(shí)按鍵消抖過(guò)程結(jié)束,通過(guò)寄存器寄存4個(gè)按鍵的狀態(tài)值key_value[3:0],分別表示按鍵0、1、2、3狀態(tài),并送入鍵控時(shí)鐘設(shè)置模塊。
鍵控時(shí)鐘設(shè)置模塊,主要完成邊沿檢測(cè)、模式切換和調(diào)??刂乒δ?。
1)邊沿檢測(cè)功能是當(dāng)一個(gè)按鍵按下時(shí),按鍵狀態(tài)值key_value[3:0]中的某一位為低電平,經(jīng)過(guò)下降沿的邊沿檢測(cè),得到對(duì)應(yīng)的一個(gè)周期CLK的高電平信號(hào),邊沿檢測(cè)后的信號(hào)表示為neg_sgn[3:0],即按鍵標(biāo)志信號(hào)。
2)模式切換功能是完成按鍵標(biāo)志信號(hào)neg_sgn[3:0]產(chǎn)生的相應(yīng)動(dòng)作。
當(dāng)按鍵0按下,按鍵標(biāo)志信號(hào)neg_sgn[0]檢測(cè)到一個(gè)周期的高電平,則通過(guò)狀態(tài)模式切換信號(hào)switch_0[1:0]完成狀態(tài)循環(huán)跳轉(zhuǎn),其中0表示實(shí)時(shí)時(shí)鐘模式,1表示手動(dòng)調(diào)校模式,2表示調(diào)校完成并跳轉(zhuǎn)至實(shí)時(shí)時(shí)鐘模式;
當(dāng)按鍵1按下,按鍵標(biāo)志信號(hào)neg_sgn[1]檢測(cè)到一個(gè)周期的高電平,則通過(guò)顯示模式切換信號(hào)switch_1完成狀態(tài)翻轉(zhuǎn),其中0表示時(shí)鐘顯示,1表示日歷顯示;
3)調(diào)??刂乒δ芡瓿蓵r(shí)鐘和日歷設(shè)置。當(dāng)按鍵2按下,按鍵標(biāo)志信號(hào)neg_sgn[2]檢測(cè)到一個(gè)周期高電平,當(dāng)前調(diào)整數(shù)據(jù)值移位一次;當(dāng)按鍵3按下,按鍵標(biāo)志信號(hào)neg_sgn[3]檢測(cè)到一個(gè)周期高電平,當(dāng)前調(diào)整數(shù)據(jù)值累加一次。時(shí)鐘設(shè)置代碼如下,日歷設(shè)置代碼類似,不再贅述。
//檢測(cè)到移位按鍵2標(biāo)志信號(hào)有效,且在手動(dòng)調(diào)校模式、時(shí)鐘顯示模式
else if(neg_sgn[2]=1’b1 &&swtich_0=2’d1 &&switch_1=1’b1)
begin
if(disp_drive_t< 3’b101)
disp_drive_t<= disp_drive_t +1’b1;
else
disp_drive_t<= 3’d0;
end
//檢測(cè)到移位按鍵3標(biāo)志信號(hào)有效,當(dāng)前調(diào)整數(shù)據(jù)值累加一次。
elseif(neg_sgn[2]=1 &&swtich_0=2’d 1&&switch_1=1’b1)begin
//時(shí)間驅(qū)動(dòng)信號(hào)
case(disp_drive_t)
3’d0:begin
//時(shí)計(jì)數(shù)
if(hour_set< 4’b0010)
hour_set<= hour_set +1’b1;
else
hour_set<= 4’d0;
3’d1://分計(jì)數(shù)
…
default:…
end
else
//數(shù)據(jù)保持
begin
disp_drive_t<= disp_drive_t;
hour_set<= hour_set;
…
end
最后,將寄存的時(shí)鐘和日歷數(shù)據(jù)分別拼接為調(diào)校時(shí)間輸出值num_timeset和調(diào)校日期輸出值num_dataset,通過(guò)顯示模式切換信號(hào)switch_1實(shí)現(xiàn)時(shí)鐘和日歷的切換輸出,具體代碼如:assignnum_set_xs = switch_1 ? num_dataset : num_timeset,將得到的調(diào)校輸出值num_set_xs[23:0]送入到數(shù)碼管顯示模塊進(jìn)行調(diào)校模式的數(shù)據(jù)顯示,同時(shí)將調(diào)校時(shí)間輸出值num_timeset和調(diào)校日期輸出值num_dataset進(jìn)行拼接,得到設(shè)置值num_set[47:0]送入實(shí)時(shí)時(shí)鐘模塊作為實(shí)時(shí)時(shí)鐘的初值,即通過(guò)I2C總線要寫(xiě)入PCF8563實(shí)時(shí)時(shí)鐘芯片中的數(shù)據(jù),并將狀態(tài)模式切換信號(hào)switch_0、顯示模式切換信號(hào)switch_1、時(shí)間驅(qū)動(dòng)信號(hào)disp_drive_t、日期驅(qū)動(dòng)信號(hào)disp_drive_d一并送出至后級(jí)模塊。
實(shí)時(shí)時(shí)鐘模塊通過(guò)調(diào)用I2C驅(qū)動(dòng)模塊來(lái)實(shí)現(xiàn)對(duì)PCF8563實(shí)時(shí)時(shí)鐘數(shù)據(jù)的讀寫(xiě),實(shí)時(shí)時(shí)鐘模塊與I2C驅(qū)動(dòng)模塊的操作時(shí)鐘一致,頻率選為250 kHz[8]。送至I2C驅(qū)動(dòng)模塊的信號(hào)包括I2C讀寫(xiě)控制信號(hào)I2C_r_w、I2C觸發(fā)執(zhí)行信號(hào)I2C_exe、I2C器件內(nèi)地址I2C_addr、I2C要寫(xiě)的數(shù)據(jù)I2C_data_w,以及從I2C驅(qū)動(dòng)模塊得到的信號(hào)包括I2C一次操作完成標(biāo)識(shí)信號(hào)I2C_done、從I2C讀的數(shù)據(jù)I2C_data_r。通過(guò)狀態(tài)機(jī)實(shí)現(xiàn)I2C數(shù)據(jù)的讀寫(xiě)操作,實(shí)時(shí)時(shí)鐘模塊狀態(tài)流程如圖3所示,主體循環(huán)狀態(tài)為12個(gè)。寫(xiě)狀態(tài)時(shí),將設(shè)置初值num_set[47:0]數(shù)據(jù)分段寫(xiě)入I2C_data_w寄存器;讀狀態(tài)是將I2C讀的數(shù)據(jù)I2C_data_r,分別存入秒寄存器sec[7:0]、分寄存器min[7:0]、時(shí)寄存器hour[7:0]、日寄存器day[7:0]、月寄存器month[7:0]、年寄存器year[7:0],最后將年月日時(shí)分秒寄存器值拼接為實(shí)時(shí)日期顯示值num_data[23:0]和實(shí)時(shí)時(shí)間顯示值num_time[23:0]的數(shù)據(jù),通過(guò)顯示模式切換信號(hào)switch_1實(shí)現(xiàn)實(shí)時(shí)顯示下的時(shí)鐘/日歷切換,具體代碼如:assignnum = switch_1 ? num_data : num_time,最后將得到的實(shí)時(shí)顯示輸出值num[23:0]傳遞至數(shù)碼管驅(qū)動(dòng)模塊進(jìn)行顯示。
圖3 實(shí)時(shí)時(shí)鐘模塊狀態(tài)流程圖
狀態(tài)機(jī)流程描述如下:上電初始化后,延時(shí)8 ms,按照順序執(zhí)行Q1~Q12狀態(tài)。進(jìn)入Q1寫(xiě)秒狀態(tài)時(shí),I2C觸發(fā)執(zhí)行信號(hào)I2C_exe設(shè)為1,器件內(nèi)地址I2C_addr設(shè)為0x02,將設(shè)置初值中的低8位num_set[8:0]存入I2C要寫(xiě)的數(shù)據(jù)I2C_data_w寄存器;進(jìn)入Q2讀秒狀態(tài)時(shí),當(dāng)I2C一次操作完成標(biāo)識(shí)信號(hào)I2C_done=1,將從I2C讀的數(shù)據(jù)I2C_data_r存入秒寄存器sec[7:0]寄存器;其他讀寫(xiě)過(guò)程類似,不同之處是器件內(nèi)地址、寫(xiě)入和讀出的數(shù)據(jù)值不同。順序執(zhí)行到Q12狀態(tài)時(shí),I2C讀寫(xiě)控制信號(hào)I2C_r_w拉高。
特別指出的是,當(dāng)進(jìn)入循環(huán)狀態(tài)后,寫(xiě)入數(shù)據(jù)完成,I2C一次操作完成標(biāo)識(shí)信號(hào)I2C_done拉高后,一直在執(zhí)行讀操作。設(shè)計(jì)要求完成調(diào)校設(shè)置后,需要重新寫(xiě)入調(diào)校后的值。這時(shí)我們?cè)谘h(huán)體外,加入判斷條件。當(dāng)狀態(tài)模式切換信號(hào)switch_0設(shè)置為2時(shí),即調(diào)校設(shè)置成功后,模塊中狀態(tài)和數(shù)據(jù)寄存器清零,否則進(jìn)入Q0狀態(tài)重新開(kāi)始執(zhí)行循環(huán)體,實(shí)現(xiàn)了調(diào)校設(shè)置后的數(shù)據(jù)值成功寫(xiě)入I2C總線,完成了時(shí)鐘/日歷初值調(diào)整。
I2C驅(qū)動(dòng)模塊實(shí)現(xiàn)底層的I2C讀寫(xiě)時(shí)序控制[9],讀寫(xiě)狀態(tài)轉(zhuǎn)移如圖4所示。
圖4 I2C讀寫(xiě)狀態(tài)轉(zhuǎn)移圖
當(dāng)I2C觸發(fā)執(zhí)行信號(hào)I2C_exe=1時(shí),從空閑W0跳轉(zhuǎn)至W1狀態(tài), Bit_ctrl=1表示16位字地址,Bit_ctrl=0表示8位字地址,本系統(tǒng)采用8位字地址,故跳轉(zhuǎn)至W3狀態(tài)。當(dāng)I2C讀寫(xiě)控制標(biāo)識(shí)信號(hào)rw_flag=0時(shí),表示寫(xiě)數(shù)據(jù),跳轉(zhuǎn)至W6狀態(tài),當(dāng)狀態(tài)結(jié)束信號(hào)done=1時(shí),結(jié)束I2C操作W7狀態(tài),表示一次I2C寫(xiě)操作完成,然后轉(zhuǎn)至空閑;當(dāng)I2C讀寫(xiě)控制標(biāo)識(shí)信號(hào)rw_flag=1時(shí),表示讀數(shù)據(jù),跳轉(zhuǎn)至W4狀態(tài),寫(xiě)地址讀后,進(jìn)入W5完成讀數(shù)據(jù),檢測(cè)到done=1時(shí)結(jié)束I2C操作W7狀態(tài),表示一次I2C讀操作完成,轉(zhuǎn)至空閑。
具體各狀態(tài)的輸出,按照I2C總線協(xié)議要求設(shè)計(jì)[10-11],SDA和SCL兩條信號(hào)線同時(shí)為高電平時(shí),總線處于空閑狀態(tài),即釋放總線。當(dāng)SCL為高電平且SDA信號(hào)由高電平跳變?yōu)榈碗娖?,即為開(kāi)始信號(hào)S;當(dāng)SCL為高電平且SDA信號(hào)由低電平跳變?yōu)楦唠娖?,即為停止信?hào)P,開(kāi)始信號(hào)和停止信號(hào)均有主控制器(FPGA)產(chǎn)生。SDA數(shù)據(jù)在SCL為高電平期間必須保持穩(wěn)定,只有在SCL為低電平期間,SDA數(shù)據(jù)線上的電平狀態(tài)才可以改變。輸出在SDA線上的每個(gè)字節(jié)均為8位,每個(gè)字節(jié)后需要有一個(gè)應(yīng)答信號(hào)ACK,即FPGA在時(shí)鐘9期間釋放數(shù)據(jù)線SDA,由從器件(PCF8563)反饋應(yīng)答信號(hào),確保在SCL時(shí)鐘9高電平期間為穩(wěn)定的低電平,則表示接收器(PCF8563)成功接收到該字節(jié)。當(dāng)FPGA為接收器時(shí),即從PCF8563中讀取數(shù)據(jù),當(dāng)FPGA接收完最后一個(gè)字節(jié)后,需要發(fā)送一個(gè)非應(yīng)答信號(hào)NACK,通知PCF8563停止數(shù)據(jù)發(fā)送,并釋放數(shù)據(jù)線SDA,以便FPGA發(fā)送停止信號(hào)P。
數(shù)碼管采用動(dòng)態(tài)掃描顯示,通過(guò)段選和位選信號(hào)進(jìn)行分時(shí)點(diǎn)亮控制。為實(shí)現(xiàn)在手動(dòng)調(diào)校模式下,進(jìn)行數(shù)據(jù)移位設(shè)置時(shí),具有當(dāng)前數(shù)碼管閃爍指示功能,首先通過(guò)顯示模式切換信號(hào)switch_1對(duì)時(shí)間驅(qū)動(dòng)信號(hào)disp_drive_t和日期驅(qū)動(dòng)信號(hào)disp_drive_d進(jìn)行選擇,得到位選閃爍標(biāo)志信號(hào)disp_drive,在0~5范圍內(nèi)變化;通過(guò)一個(gè)延時(shí)計(jì)數(shù)器得到一個(gè)0.5 s電平翻轉(zhuǎn)一次的信號(hào)sel_reg,當(dāng)進(jìn)入調(diào)校模式后,case語(yǔ)句進(jìn)行0~5狀態(tài)之間的常規(guī)動(dòng)態(tài)掃描,在0狀態(tài)情況下,位選信號(hào)sel[5:1] <= 5’b11111;如果位選閃爍標(biāo)志信號(hào)disp_drive = 0,則sel[0] <= sel_reg,即數(shù)碼管0閃爍顯示;否則sel[0] <= 0,即數(shù)碼管位選0點(diǎn)亮;在1狀態(tài)情況下,位選信號(hào)sel[5:2] <= 4‘b1111;sel[0] <= 1’b1;如果位選閃爍標(biāo)志信號(hào)disp_drive = 1,則sel[1]<= sel_reg,即數(shù)碼管1閃爍顯示;否則sel[1]<= 0,即數(shù)碼管位選1點(diǎn)亮;同理實(shí)現(xiàn)其他位選閃爍顯示。進(jìn)入顯示模式后,進(jìn)行常規(guī)動(dòng)態(tài)掃描,從而完成數(shù)碼管數(shù)據(jù)實(shí)時(shí)顯示和調(diào)校模式的閃爍指示。
具體實(shí)現(xiàn)代碼如下:
//得到位選閃爍標(biāo)志信號(hào)disp_drive
assigndisp_drive = switch_1 ? disp_drive_t :disp_drive_d;
//得到0.5 s電平翻轉(zhuǎn)一次的信號(hào)sel_reg
if(!rst_n)
begin
sel_reg<= 1’b0;
cnt_ss<= 26’d0;
end
else if(cnt_ss 26’d24999999)
begin
sel_reg<= ~sel_reg;
cnt_ss<= cnt_ss + 1’b1;
end
else if(cnt_ss 26’d49999999)
begin
sel_reg<= ~sel_reg;
cnt_ss<= 26’d0;
end
else
begin
sel_reg<= sel_reg;
cnt_ss<= cnt_ss + 1’b1;
end
//當(dāng)進(jìn)入調(diào)校模式,數(shù)碼管閃爍指示
else if(switch_0 2’d1)
begin
//動(dòng)態(tài)掃描
case(cnt)
//秒低位或日低位顯示
3’d0:begin
sel[5:1] <= 5’b11111; //數(shù)碼管1~5滅
num1 <= num[3:0]; //傳入秒低位或日低位
point1 <= point[0]; //小數(shù)點(diǎn)顯示
if(disp_drive 0)
sel[0] <= sel_reg; //0.5 s翻轉(zhuǎn),數(shù)碼管0閃爍
else
sel[0] <= 1’b0; //數(shù)碼管0點(diǎn)亮
end
//秒高位或日高位顯示
3’d1:begin
sel[5:2] <= 4‘b1111; //數(shù)碼管2~5滅
sel[0] <= 1’b1; //數(shù)碼管0滅
num1 <= num[7:4]; //傳入秒高位或日高位
point1 <= point[1]; //小數(shù)點(diǎn)顯示
if(disp_drive 1)
sel[1]<= sel_reg; //0.5 s翻轉(zhuǎn),數(shù)碼管1閃爍
else
圖5 SignalTap邏輯分析結(jié)果
sel[1]<= 1’b0; //數(shù)碼管1點(diǎn)亮
end
//分低位或月低位顯示
3’d2:…
…
default:…
end
//當(dāng)進(jìn)入顯示模式
else
begin
//動(dòng)態(tài)掃描數(shù)碼管0~5
case(cnt)
3’d0:begin
sel<= 6’b111110; //數(shù)碼管1~5滅,0亮
num1 <= num[3:0]; //傳入秒低位或日低位
point1 <= point[0]; //小數(shù)點(diǎn)顯示
… : …
end
3’d5:begin
sel<= 6’b011111; //數(shù)碼管0~4滅,5亮
num1 <= num[23:20]; //傳入時(shí)高位或年高位
point1 <= point[0]; //小數(shù)點(diǎn)顯示
end
default:…
end
通過(guò)SignalTap邏輯分析儀進(jìn)行功能驗(yàn)證,模式切換按鍵1設(shè)置為邊沿觸發(fā),在開(kāi)發(fā)板上將模式切換為調(diào)校模式,設(shè)置時(shí)間為21∶11∶10,移位按鍵調(diào)整至位選信號(hào)sel[3]控制的數(shù)碼管上,點(diǎn)擊按鍵1后,模式切換至實(shí)時(shí)顯示,SignalTap輸出邏輯分析結(jié)果如圖5所示。
實(shí)測(cè)結(jié)果為:鍵控時(shí)鐘設(shè)置模塊輸出num_set[47∶0]=0x000000211110h,實(shí)時(shí)時(shí)鐘模塊顯示輸出num_xs[23∶0]=0x211110h,時(shí)鐘顯示驅(qū)動(dòng)信號(hào)disp_drive_t=0x4h,結(jié)果符合期望要求,驗(yàn)證了該設(shè)計(jì)的時(shí)鐘數(shù)據(jù)寫(xiě)入和讀取以及位選閃爍指示功能的正確性,日歷數(shù)據(jù)不再贅述。
通過(guò)FPGA對(duì)實(shí)時(shí)芯片PCF8563進(jìn)行讀寫(xiě)控制,實(shí)現(xiàn)了時(shí)鐘/日歷切換顯示,對(duì)時(shí)鐘/日歷手動(dòng)調(diào)校。在調(diào)校狀態(tài)下,實(shí)現(xiàn)了數(shù)據(jù)移位時(shí)數(shù)碼管閃爍指示功能。通過(guò)SignalTap邏輯分析儀,驗(yàn)證了系統(tǒng)功能實(shí)現(xiàn)的技術(shù)可行性,并在開(kāi)發(fā)板上完成調(diào)試,可供FPGA開(kāi)發(fā)和數(shù)字鐘感興趣的人員參考,為后續(xù)實(shí)現(xiàn)報(bào)警、秒表、星期的顯示設(shè)置提供借鑒。PCF8563是一款功能完備的實(shí)時(shí)時(shí)鐘芯片,其可靠性高、功耗和成本低,可用于便攜式儀器、電子計(jì)量等場(chǎng)合或?qū)嶋H產(chǎn)品中[12]。