2.7 秒表功能設計-明德揚至簡設計法原理與應用
本文的文檔編號:001600000018
需要看對應的視頻,請點擊視頻編號:001600000100
1.至簡原理與應用配套的案例文檔
2.設計中只需要使用開發(fā)板上的一個數碼管0來實現秒表功能,具體為:復位后,數碼管0顯示數字0并持續(xù)1秒;隨后顯示數字1并持續(xù)2秒;然后顯示數字2并持續(xù)3秒;以此類推,最后顯示數字9并持續(xù)10秒。之后再次回到顯示數字0并持續(xù)1秒的循環(huán)。
3.這是ALTERA入門學習案例文檔
1?項目背景
同上一個項目。
2?設計目標
開發(fā)板或者模塊是有?8?位數碼管,本次設計需要使用1個數碼管,即數碼管0,實現類似于秒表的功能,具體要求如下:
復位后,數碼管0顯示數字0并持續(xù)1秒;然后顯示數字1并持續(xù)2秒;然后顯示數字2并持續(xù)3秒;以此類推,最后是顯示數字9并持續(xù)10秒。然后再次循環(huán)
上板效果圖如下圖所示。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖?266
3?設計實現
3.1?頂層信號
新建目錄:D:mdy_bookmy_time。在該目錄中,新建一個名為my_time.v的文件,并用GVIM打開,開始編寫代碼。
我們要實現的功能,概括起來就是控制8個數碼管,其中數碼管0亮,其他數碼管不亮。并讓數碼管0顯示不同的數字。
要控制8個數碼管,就需要控制位選信號,即FPGA要輸出一個8位的位選信號,設為seg_sel,其中seg_sel[0]對應數碼管0,seg_sel[1]對應數碼管1,以此類推,seg_sel[7]對應數碼管7。
要顯示不同的數字,就需要控制段選信號,不需要用到DP,一共有7根線,即FPGA要輸出一個7位的段選信號,設為seg_ment,seg_ment[6]~segm_ment[0]分別對應數碼管的abcdefg(注意對應順序)。
我們還需要時鐘信號和復位信號來進行工程控制。
綜上所述,我們這個工程需要4個信號,時鐘clk,復位rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。

將module的名稱定義為my_time。并且我們已經知道該模塊有4個信號:clk、rst_n、seg_sel和seg_ment,代碼如下:

其中clk、rst_n是1位的輸入信號,seg_sel是8位的輸出信號,seg_ment是7位的輸出信號,根據此,補充輸入輸出端口定義。代碼如下:

3.2?信號設計
我們先分析要實現的功能,數碼管0顯示數字0,翻譯成信號就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001。然后數碼管0顯示數字1,也就是說seg_sel的值為8’b1111_1110,seg_ment的值為7’b100_1111。以此類推,數碼管0顯示數字9,就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0100。

圖?267
seg_sel一直為8’hfe,不變化。seg_ment隔一段時間后會變化,而這個時間在不同時期還不相同。把時間信息補充上,得到下面的波形示意圖。

圖?268
上圖就是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個計數器用來計算時間,如2秒、3秒等。另外,我們還需要一個計數器,用來計算在第幾個階段中。所以總共需要2個計數器。
本工程的工作時鐘是50MHz,即周期為20ns,計數器計數到2_000_000_000/20=100_000_000個,我們就能知道2秒時間到了。以類類推,在第2次時,數到150_000_000個,就知道了3秒時間到。第9次時,數到500_000_000個,就表示10秒時間到。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫成:assign add_cnt0==1。綜上所述,結合變量法,該計數器的代碼如下

第二個計數器用于表示第幾個,很自然可以看到,每個階段完成后,該計數器加1,因此加1條件可為end_cnt0。該計數器一共要數10次。所以代碼為:

接下來設計seg_sel。該信號一直為8’hfe,所以代碼直接寫成如下:

我們來思考輸出信號seg_ment的變化。概括起來,在第1次的時候輸出值為7’h01;在第2次的時候輸出值為7’h4f;以此類推,在第8次的時候輸出值為7’h0f。我們用信號cnt1來代替第幾次,也就是:當cnt1==0的時候,輸出值為7’h01;在cnt1==1的時候輸出值為7’h4f;以此類推,在cnt1==9的時候輸出值為7’h04。再進一步翻譯成代碼,就變成如下:

然后,用組合邏輯把x的值確定下來。

此次,主體程序已經完成。接下來是將module補充完整。
3.3?信號定義
接下來定義信號類型。
cnt0是用always產生的信號,因此類型為reg。cnt0計數的最大值為500_000_000,需要用29根線表示,即位寬是29位。add_cnt0和end_cnt0都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1個線表示即可。因此代碼如下:

cnt1是用always產生的信號,因此類型為reg。cnt1計數的最大值為9,需要用4根線表示,即位寬是4位。add_cnt1和end_cnt1都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1根線表示即可。因此代碼如下:

seg_sel是用assign方式設計的,因此類型為wire,其一共有8根線,即位寬為8。因此代碼如下:

seg_ ment是用always方式設計的,因此類型為reg,其一共有7根線,即位寬為7。因此代碼如下:

x是用always方式設計的,因此類型為reg,他的位數和cnt0是一致的。

至此,整個代碼的設計工作已經完成。整體代碼如下:

下一步是新建工程和上板查看現象。
4?綜合與上板
4.1?新建工程
首先在d盤中創(chuàng)建名為“miaobiao”的工程文件夾,將寫的代碼命名為“miaobiao.v”,頂層模塊名為“miaobiao”。

圖?269

圖?270
然后打開Quartus?Ⅱ,點擊File下拉列表中的New Project Wzard...新建工程選項。

圖?271
3.再出現的界面中直接點擊Next。

圖?272
4.之后出現的是工程文件夾、工程名、頂層模塊名設置界面。按照之前的命名進行填寫,第一欄選擇工程文件夾“miaobiao”,第二欄選擇工程文件“miaobiao”,最后一欄選擇頂層模塊名“miaobiao”,然后點擊”Next”,在出現的界面選擇empty project。

圖?273

圖?274
5.之后是文件添加界面。添加之前寫的“miaobian.v”文件,點擊右側的“Add”按鈕,之后文件還會出現在大方框里,之后點擊“Next”。

圖?275
器件型號選擇界面。選擇Cyclone?ⅣE,在芯片型號選擇處選擇EP4CE15F23C8,然后點擊“Next”。

圖?276
EDA工具界面。直接點擊“Next”。

圖?277
8.之后出現的界面是我們前面設置的總結,確認無誤后點擊“Finish”。

圖?278
4.2?綜合
1.新建工程步驟完成后,就會出現以下界面。在“Project Navigator”下選中要編譯的文件,點擊上方工具欄中“Start Compilation”編譯按鈕(藍色三角形)。

圖?279
2.編譯成功后會出現一下界面。

圖?280
4.3?配置管腳

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖?281
在菜單欄中,選中Assignments,然后選擇Pin Planner,就會彈出配置管腳的窗口。

圖?282
在配置窗口最下方中的location一列,參考下表中最右兩列配置好FPGA管腳。

配置完成后,關閉Pin Planner,軟件自動會保存管腳配置信息。
4.4?再次綜合

圖?283
在菜單欄中,選中Processing,然后選擇Start Compilation,再次對整個工程進行編譯和綜合。

圖?284
出現上面的界面,就說明編譯綜合成功。
4.5?連接開發(fā)板
圖中,下載器接入電腦USB接口,電源接入電源,然后摁下藍色開關。

圖?285
4.6?上板
1.雙擊Tasks一欄中”Program Device”。

圖?286
2.會出現如下界面,點擊add file添加.sof文件,點擊“Start”,會在“Progress”出顯示進度。

圖?287
3.進度條中提示成功后,即可在開發(fā)板上觀察到相應的現象。