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