秒表功能 同上一個(gè)項(xiàng)目。 二、設(shè)計(jì)目標(biāo)開發(fā)板或者模塊是有 8 位數(shù)碼管,本次設(shè)計(jì)需要使用1個(gè)數(shù)碼管,即數(shù)碼管0,實(shí)現(xiàn)類似于秒表的功能,具體要求如下: 復(fù)位后,數(shù)碼管0顯示數(shù)字0并持續(xù)1秒;然后顯示數(shù)字1并持續(xù)2秒;然后顯示數(shù)字2并持續(xù)3秒;以此類推,最后是顯示數(shù)字9并持續(xù)10秒。然后再次循環(huán) 上板效果圖如下圖所示。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 上板的演示效果,請(qǐng)登陸網(wǎng)址查看:www.mdy-edu.com/xxxx。 三、模塊設(shè)計(jì)我們要實(shí)現(xiàn)的功能,概括起來就是控制8個(gè)數(shù)碼管,其中數(shù)碼管0亮,其他數(shù)碼管不亮。并讓數(shù)碼管0顯示不同的數(shù)字。 要控制8個(gè)數(shù)碼管,就需要控制位選信號(hào),即FPGA要輸出一個(gè)8位的位選信號(hào),設(shè)為seg_sel,其中seg_sel[0]對(duì)應(yīng)數(shù)碼管0,seg_sel[1]對(duì)應(yīng)數(shù)碼管1,以此類推,seg_sel[7]對(duì)應(yīng)數(shù)碼管7。 要顯示不同的數(shù)字,就需要控制段選信號(hào),不需要用到DP,一共有7根線,即FPGA要輸出一個(gè)7位的段選信號(hào),設(shè)為seg_ment,seg_ment[6]~segm_ment[0]分別對(duì)應(yīng)數(shù)碼管的abcdefg(注意對(duì)應(yīng)順序)。 我們還需要時(shí)鐘信號(hào)和復(fù)位信號(hào)來進(jìn)行工程控制。 綜上所述,我們這個(gè)工程需要4個(gè)信號(hào),時(shí)鐘clk,復(fù)位rst_n,輸出的位選信號(hào)seg_sel和輸出的段選信號(hào)seg_ment。
我們先分析要實(shí)現(xiàn)的功能,數(shù)碼管0顯示數(shù)字0,翻譯成信號(hào)就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001。然后數(shù)碼管0顯示數(shù)字1,也就是說seg_sel的值為8’b1111_1110,seg_ment的值為7’b100_1111。以此類推,數(shù)碼管0顯示數(shù)字9,就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0100。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png seg_sel一直為8’hfe,不變化。seg_ment隔一段時(shí)間后會(huì)變化,而這個(gè)時(shí)間在不同時(shí)期還不相同。把時(shí)間信息補(bǔ)充上,得到下面的波形示意圖。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png 上圖就是seg_sel和seg_seg信號(hào)的變化波形圖。在顯示第1個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h01并持續(xù)1秒;在第2個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h4f并持續(xù)2秒;以此類推,第8個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h04并持續(xù)10秒。然后又再次重復(fù)。 由波形圖可知,我們需要1個(gè)計(jì)數(shù)器用來計(jì)算時(shí)間,如2秒、3秒等。另外,我們還需要一個(gè)計(jì)數(shù)器,用來計(jì)算在第幾個(gè)階段中。所以總共需要2個(gè)計(jì)數(shù)器。 本工程的工作時(shí)鐘是50MHz,即周期為20ns,計(jì)數(shù)器計(jì)數(shù)到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以類類推,在第2次時(shí),數(shù)到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數(shù)到500_000_000個(gè),就表示10秒時(shí)間到。另外,由于該計(jì)數(shù)器是不停地計(jì)數(shù),永遠(yuǎn)不停止的,可以認(rèn)為加1條件一直有效,可寫成:assignadd_cnt0==1。綜上所述,結(jié)合變量法,該計(jì)數(shù)器的代碼如下 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg
第二個(gè)計(jì)數(shù)器用于表示第幾個(gè),很自然可以看到,每個(gè)階段完成后,該計(jì)數(shù)器加1,因此加1條件可為end_cnt0。該計(jì)數(shù)器一共要數(shù)10次。所以代碼為: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg
接下來設(shè)計(jì)seg_sel。該信號(hào)一直為8’hfe,所以代碼直接寫成如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image016.png
我們來思考輸出信號(hào)seg_ment的變化。概括起來,在第1次的時(shí)候輸出值為7’h01;在第2次的時(shí)候輸出值為7’h4f;以此類推,在第8次的時(shí)候輸出值為7’h0f。我們用信號(hào)cnt1來代替第幾次,也就是:當(dāng)cnt1==0的時(shí)候,輸出值為7’h01;在cnt1==1的時(shí)候輸出值為7’h4f;以此類推,在cnt1==9的時(shí)候輸出值為7’h04。再進(jìn)一步翻譯成代碼,就變成如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png
然后,用組合邏輯把x的值確定下來。 file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image019.png
此次,主體程序已經(jīng)完成。接下來是將module補(bǔ)充完整。 將module的名稱定義為my_time。并且我們已經(jīng)知道該模塊有4個(gè)信號(hào):clk、rst_n、seg_sel和seg_ment,代碼如下: file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image020.png
|
手把手教你學(xué)FPGA設(shè)計(jì)-秒表功能.pdf
1.44 MB, 下載積分: 積分 -1