加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

verilog HDL基礎(chǔ)之:實(shí)例3 數(shù)字跑表

2013/08/21
1
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

實(shí)例的內(nèi)容及目標(biāo)

1.實(shí)例的主要內(nèi)容

本節(jié)通過Verilog HDL語言編寫一個具有“百分秒、秒、分”計(jì)時功能的數(shù)字跑表,可以實(shí)現(xiàn)一個小時以內(nèi)精確至百分之一秒的計(jì)時。

數(shù)字跑表的顯示可以通過編寫數(shù)碼管顯示程序來實(shí)現(xiàn),本實(shí)例只給出數(shù)字跑表的實(shí)現(xiàn)過程。讀者還可以通過增加小時的計(jì)時功能,實(shí)現(xiàn)完整的跑表功能。

2.實(shí)例目標(biāo)

本實(shí)例主要實(shí)現(xiàn)了計(jì)數(shù)及進(jìn)位的設(shè)計(jì),通過幾個always模塊的設(shè)計(jì)實(shí)現(xiàn)一個特定用途的模塊——數(shù)字跑表。通過本實(shí)例,讀者應(yīng)達(dá)到下面的一些實(shí)例目標(biāo)。

  • 初步掌握Verilog語言的設(shè)計(jì)方法。
  • 完成一個數(shù)字跑表的設(shè)計(jì)。

原理簡介

本數(shù)字跑表首先要從最低位的百分秒計(jì)數(shù)器開始,按照系統(tǒng)時鐘進(jìn)行計(jì)數(shù)。計(jì)數(shù)至100后向秒計(jì)數(shù)器進(jìn)位,秒計(jì)數(shù)器以百分秒計(jì)數(shù)器的進(jìn)位位為時鐘進(jìn)行計(jì)數(shù)。計(jì)數(shù)至60后向分計(jì)數(shù)器進(jìn)位,分計(jì)數(shù)器以秒計(jì)數(shù)器的進(jìn)位位為時鐘進(jìn)行計(jì)數(shù),讀者可以自行增加小時計(jì)數(shù)器。

數(shù)字跑表巧妙地運(yùn)用進(jìn)位位作為計(jì)數(shù)時鐘來減少計(jì)數(shù)的位數(shù)。如果統(tǒng)一使用系統(tǒng)時鐘作為計(jì)數(shù)時鐘,那秒計(jì)數(shù)器將是一個6000進(jìn)制的計(jì)數(shù)器,而分計(jì)數(shù)器將是一個3600000進(jìn)制的計(jì)數(shù)器。這樣將極大的浪費(fèi)FPGA的邏輯資源。而使用進(jìn)位位作為計(jì)數(shù)時鐘,只需要一個100進(jìn)制的計(jì)數(shù)器和兩個60進(jìn)制的計(jì)數(shù)器。

本實(shí)例的數(shù)字跑表模塊圖。

?

在實(shí)際的設(shè)計(jì)中,為了使計(jì)數(shù)器更加簡單,計(jì)數(shù)器使用高低位兩個計(jì)數(shù)器實(shí)現(xiàn)。100進(jìn)制計(jì)數(shù)器分別是高位10進(jìn)制計(jì)數(shù)器,低位10進(jìn)制計(jì)數(shù)器;60進(jìn)制計(jì)數(shù)分別是高位6進(jìn)制計(jì)數(shù)器,低位10進(jìn)制計(jì)數(shù)器。這樣整個數(shù)字跑表使用6個計(jì)數(shù)器實(shí)現(xiàn)。

同時由于10進(jìn)制計(jì)數(shù)器重復(fù)使用了5次,可以使用獨(dú)立的模塊實(shí)現(xiàn)10進(jìn)制計(jì)數(shù)器,這樣就可以通過模塊復(fù)用來節(jié)省整個模塊使用的資源。

數(shù)字跑表提供了清零位CLR和暫停位PAUSE,百分秒的時鐘信號可以通過系統(tǒng)時鐘分頻提供。分頻至1/100s,即可實(shí)現(xiàn)真實(shí)的時間計(jì)數(shù)。詳細(xì)的時鐘分頻設(shè)計(jì)讀者可參考相關(guān)的資料實(shí)現(xiàn),在本實(shí)例中不再提供。

代碼分析

下面給出這個數(shù)字跑表的源代碼,讀者可以將這些源代碼嵌入自己的工程設(shè)計(jì)中,來實(shí)現(xiàn)數(shù)字跑表的功能。

首先給出代碼中端口信號的定義,讀者可根據(jù)這些端口與自己的工程設(shè)計(jì)進(jìn)行連接。

  • CLK:時鐘信號。
  • CLR:異步復(fù)位信號。
  • PAUSE:暫停信號。
  • MSH、MSL:百分秒的高位和低位。
  • SH、SL:秒信號的高位和低位。
  • MH、ML:分鐘信號的高位和低位。

下面是數(shù)字跑表的Verilog HDL源代碼及說明。

module paobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);??? //端口說明

????? input CLK,CLR;

??? ??input PAUSE;

????? output[3:0] MSH,MSL,SH,SL,MH,ML; ? ? ? ??? //內(nèi)部信號說明

????? reg[3:0] MSH,MSL,SH,SL,MH,ML;

????? reg cn1,cn2; ???????????? ? ? ? ? ? ?? ???? //cn1為百分秒向秒的進(jìn)位,cn2為秒向分的進(jìn)位

????? //百分秒計(jì)數(shù)模塊,每計(jì)滿100,cn1 產(chǎn)生一個進(jìn)位

????? always @(posedge CLK or posedge CLR) begin

?? ????????if(CLR) begin ?????? ? ? ? ? ? ????? //異步復(fù)位

????? ????????{MSH,MSL}<=8'h00;

????? ?????????cn1<=0;

????? ??????end

????? ??????else if(!PAUSE) begin ? ? ? ? ? ? ? //PAUSE 為0時正常計(jì)數(shù),為1時暫停計(jì)數(shù)

????? ????????????if(MSL==9) begin

????? ??????????????????MSL<=0; ??????? ? ? ? ? //低位計(jì)數(shù)至10時,低位歸零

????? ??????????????????if(MSH==9) begin

????? ????????????????????????MSH<=0;? ? ? ? ?? //低、高位計(jì)數(shù)至10時,高位歸零

????? ????????????????????????cn1<=1; ? ? ? ?? //低、高位計(jì)數(shù)至10時,觸發(fā)進(jìn)位位

????? ??????????????????end

????? ??????????????????else???????????? //低位計(jì)數(shù)至10,高位計(jì)數(shù)未至10時,高位計(jì)數(shù)

????? ????????????????????????MSH<=MSH+1;??

????? ????????????end

????? ????????????else begin

????? ??????????????????MSL<=MSL+1; ??? //低位計(jì)數(shù)未至10時,低位計(jì)數(shù)

????? ??????????????????cn1<=0;???????? //低位計(jì)數(shù)未至10時,不觸發(fā)進(jìn)位位

????? ????????????end

????? ??????end

????? end

?????

????? //秒計(jì)數(shù)模塊,每計(jì)滿60,cn2 產(chǎn)生一個進(jìn)位

????? always @(posedge cn1 or posedge CLR) begin

????? ??????if(CLR) begin ???????????? //異步復(fù)位

????? ????????????{SH,SL}<=8'h00;

????? ????????????cn2<=0;

????? ??????end

????? ??????else if(SL==9) begin

???? ?????????????SL<=0;???????????? ?? //低位計(jì)數(shù)至10時,低位歸零

????? ????????????if(SH==5) begin

????? ??????????????????SH<=0;?????? ?? //低位計(jì)數(shù)至10,高位計(jì)數(shù)至6時,高位歸零

????? ??????????????????cn2<=1;????? ?? //低位計(jì)數(shù)至10,高位計(jì)數(shù)至6時,觸發(fā)進(jìn)位位

????? ????????????end

????? ????????????else

???? ???????????????????SH<=SH+1;??? ?? //低位計(jì)數(shù)至10,高位計(jì)未數(shù)至6時,高位計(jì)數(shù)

????? ??????end

????? ??????else begin

????? ????????????SL<=SL+1; ??????????? //低位計(jì)數(shù)未至10時,低位計(jì)數(shù)

????? ????????????cn2<=0;??????????? ?? //低位計(jì)數(shù)未至10時,不觸發(fā)進(jìn)位位

????? ??????end

????? end

????? //分鐘計(jì)數(shù)模塊,每計(jì)滿60,系統(tǒng)自動清零

????? always @(posedge cn2 or posedge CLR) begin

????? ??????if(CLR) begin ???????????? //異步復(fù)位

????? ????????????{MH,ML}<=8'h00;?

????? ??????end

????? ??????else if(ML==9) begin

????? ????????????ML<=0;???????????? ?? //低位計(jì)數(shù)至10時,低位歸零

????? ????????????if(MH==5)

????? ??????????????????MH<=0;?????? ?? //低位計(jì)數(shù)至10,高位計(jì)數(shù)至6時,高位歸零

????? ????????????else

????? ??????????????????MH<=MH+1;?? ??? //低位計(jì)數(shù)至10,高位計(jì)未數(shù)至6時,高位計(jì)數(shù)

????? ??????end

????? ??????else

????? ????????????ML<=ML+1;???????? ??? //低位計(jì)數(shù)未至10時,低位計(jì)數(shù)

????? ??????end

endmodule

通過上面的這3個模塊,即可實(shí)現(xiàn)數(shù)字跑表的功能。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠(yuǎn)見(www.farsight.com.cn)是國內(nèi)領(lǐng)先嵌入師培訓(xùn)機(jī)構(gòu),2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠(yuǎn)見除提供嵌入式相關(guān)的長期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負(fù)責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實(shí)驗(yàn)平臺的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠(yuǎn)見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。