最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

3.7數(shù)字時鐘設計--明德?lián)P科教1(mdy-edu.com)

2023-01-04 07:07 作者:明德?lián)P易老師  | 我要投稿

本文的文檔編號:001600000019

需要看對應的視頻,請點擊視頻編號:001600000101

1.至簡原理與應用配套的案例文檔
2.使用6個數(shù)碼管實現(xiàn)數(shù)字時鐘功能,與數(shù)字時鐘相同,該功能可以顯示00:00:00到23:59:59范圍的時間。
3. ALTERA入門學習案例文檔

第三篇?FPGA至簡設計項目實踐? ?


第七章?數(shù)字時鐘


第1節(jié)?項目背景

數(shù)字時鐘是采用數(shù)字電路技術實現(xiàn)時、分、秒計時顯示的裝置,可以用數(shù)字同時顯示時,分,秒的精確時間并實現(xiàn)準確校時,具備體積小、重量輕、抗干擾能力強、對環(huán)境要求高、高精確性、容易開發(fā)等特性。與傳統(tǒng)表盤式機械時鐘相比,數(shù)字時鐘具有更高的準確性和直觀性,由于沒有機械裝置,其使用壽命更長。本設計基于FPGA開發(fā)板的數(shù)碼管功能進行數(shù)字時鐘的設計,在前面章節(jié)中已經詳細講解了數(shù)碼管的工作原理,這里就不再進行贅述,有需要詳細學習可以回到前面章節(jié)進行學習。本案例將詳細介紹用至簡設計法實現(xiàn)數(shù)字時鐘功能的設計。


第2節(jié)?設計目標

按照至簡設計法的設計特色,在正式學習本設計之前首先應明確設計目標。設計目標是整個設計的核心靈魂,后續(xù)的每個步驟與操作都是圍繞設計目標進行展開。至簡設計法的中心思想很簡單,就是用最直接簡潔的方法來進行工程設計。而明確設計目標則是為了讓后續(xù)的每個階段都有意義,避免進行不必要的工程工程,少走彎路。對于初學者來說,更應該在學習的過程中養(yǎng)成好習慣,才能在職業(yè)生涯中受益。所以再次強調在開始設計前一定要將設計目標分析透徹,認真思考本次設計的最終目的和實現(xiàn)效果,然后再圍繞目標展開設計。

本工程使用6個數(shù)碼管實現(xiàn)數(shù)字時鐘功能。與數(shù)字時鐘相同,其可以顯示00:00:00到23:59:59范圍的時間。

數(shù)字時鐘的上板效果如下圖所示,想要觀看上板演示視頻效果的讀者朋友可以登陸至簡設計法官方網站學習:www.mdy-edu.com/xxxx。

第3節(jié)?設計實現(xiàn)

接下來進入設計的實現(xiàn)階段,本書會按照步驟和原理分析分享案例的具體實現(xiàn)方法,考慮到初學者的需要,該部分的內容會比較詳細。如果基礎知識掌握得比較牢靠,只想學習此設計步驟,也可以跳過此部分,直接進入第五節(jié)的簡化版步驟分享。但建議初學者一定按照詳細分析的內容進行學習,不要選擇捷徑,只有打好基礎,掌握基礎知識,才可以從容的獨立完成項目設計。


3.1?頂層信號

新建目錄:D:mdy_bookmy_shizhong,并在該目錄中,新建一個名為my_shizong.v的文件。用GVIM打開后開始編寫代碼。這里建議初學者按照本書中提供的文件路徑以及文件名進行設置,避免后續(xù)出現(xiàn)未知錯誤。

第一步應確定頂層信號。開發(fā)板上共8個數(shù)碼管,分析設計目標可知,本次設計的功能是控制其使其中2個數(shù)碼管常滅,其余6個數(shù)碼顯示不同的數(shù)字。FPGA通過控制位選信號來控制8個數(shù)碼管,即應輸出一個8位的位選信號,將其設定為seg_sel。其中seg_sel[0]對應數(shù)碼管0,seg_sel[1]對應數(shù)碼管1,以次類推,seg_sel[7]對應數(shù)碼管7。同樣地,數(shù)碼管控制方法中講解過:只要控制每個數(shù)碼管上的7個子段就可以實現(xiàn)數(shù)碼管上不同數(shù)字的顯示,即控制段選信號實現(xiàn)數(shù)碼管的數(shù)字顯示。本設計中不需要用到h子段,共需要7個子段,因此FPGA需要輸出一個7位的段選信號,將其設定為seg_ment,seg_ment[6]~segm_ment[0]分別對應數(shù)碼管的abcdefg(注意對應順序)。當然,除位選信號和段選信號外,設計中進行工程控制的時鐘信號和復位信號也同樣必不可少。

綜上所述,本設計一共需要4個信號:時鐘信號clk,復位信號rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。信號和硬件的對應關系如下表所示。

表3.7 - 1信號和管腳關系

將module的名稱定義為my_shizhong,已知該模塊有4個信號:clk、rst_n、seg_sel和seg_ment,在頂層信號代碼中需要將與外部相連接的輸入/輸出信號列出,從而實現(xiàn)信號與管腳的連接。具體頂層代碼如下:


隨后聲明信號的輸入輸出屬性,在模塊中需要聲明這一信號對于FPGA來說屬于輸入信號還是輸出信號。信號若為輸入的話則聲明其為input,若為輸出聲明則聲明其為output。在本設計中,由于clk是外部的晶振輸入給FPGA的,因此在FPGA中clk為1位的輸入信號input;同樣地,rst_n是外部按鍵給FPGA的,因此在FPGA中rst_n也為1位的輸入信號input;seg_sel是FPGA控制數(shù)碼管亮滅的信號,因此seg_sel是8位的輸出信號output;seg_ment是FPGA控制數(shù)碼管顯示數(shù)字內容的信號,因此seg_ment是7位的輸出信號output。按照以上分析將輸入輸出端口定義補充完整,其具體代碼如下:


3.2?信號設計

在設計信號之前,先按照至簡設計法的思路來進行架構設計。根據(jù)設計目標先來分析要實現(xiàn)的功能,8個數(shù)碼管中有6個一直處于亮的狀態(tài),其余2個為滅的狀態(tài)。在不同的時刻時,相應位數(shù)的數(shù)碼管會一直變化,比如每一秒時間過后,表示秒鐘個位的數(shù)字發(fā)生變化。每十秒之后,表示秒鐘十位的數(shù)字會發(fā)生變化。每60秒之后,表示分鐘個位的數(shù)字發(fā)生變化,以此類推。隨著時間的變化這些數(shù)字按照既定規(guī)律進行變化,從而達到顯示正確時間的效果。

從分析中可以看出每個數(shù)字的變化條件是不同的,有的數(shù)字是每秒都在變化,有的數(shù)字則一小時才變化一次。對于初學者來說這項設計可能實現(xiàn)起來比較復雜,但只要遵循至簡設計法的思想就可以簡化成最直接最簡單的思路。下面請各位將時鐘的概念拋開,將每個數(shù)碼管單獨看作是不同時間不同位置顯示的數(shù)碼管,比如數(shù)碼管0顯示秒鐘個位,數(shù)碼管1顯示秒鐘十位,數(shù)碼管2顯示分鐘個位。在不同的時刻,數(shù)碼管顯示的數(shù)字不同,這樣一來就很好理解了。

本設計用m_g,m_s,f_g,f_s,s_g,s_s分別表示秒鐘個位、秒鐘十位、分鐘個位、分鐘十位、小時個位和小時十位所表示的數(shù)字值,m_g_s,m_s_s,f_g_s,f_s_s,s_g_s,s_s_s分別表示秒鐘個位、秒鐘十位、分鐘個位、分鐘十位、小時個位和小時十位所表示數(shù)碼管的段選值。

數(shù)碼管0顯示的是秒鐘個位值,翻譯成信號即seg_sel的值為8’b1111_1110,seg_ment的值為:m_g_s。數(shù)碼管1顯示秒鐘十位,即seg_sel的值為8’b1111_1101,seg_ment的值為m_s_s。以此類推,數(shù)碼管5顯示小時十位,即seg_sel的值為8’b1101_1111,seg_ment的值為s_s_s。輸出信號的時序波形圖如下所示。


圖3.7-2輸出信號時序


從波形圖中可以看出在不同時刻下,seg_ment和seg_sel的值會發(fā)生變化。那么多久會變化一次呢?這里需要學習一個新知識,即數(shù)碼管動態(tài)掃描原理。

數(shù)碼管動態(tài)顯示接口是應用最為廣泛的顯示方式之一。動態(tài)驅動是將數(shù)碼管的8個顯示筆劃"a,b,c,d,e,f,g,h"的同名端連在一起,每個數(shù)碼管的公共極COM需增加由各自獨立I/O線控制的位選通控制電路。當要輸出某一字形碼時,所有數(shù)碼管都會接收到相同的字形碼,但究竟是哪個數(shù)碼管會顯示出字形取決于單片機對位選通COM端電路的控制。只需將顯示數(shù)碼管的選通控制打開,該位就會顯示出字形,而沒有選通的數(shù)碼管并不會點亮。綜上所述,動態(tài)驅動是通過分時輪流控制各數(shù)碼管的COM端,使各個數(shù)碼管輪流受控顯示。

通俗來講就是將8個數(shù)碼管一樣的端口連在一起,通過一個信號進行控制。即若傳輸一個控制數(shù)碼管a段點亮的信號,8個數(shù)碼管也都會收到這一信號。發(fā)送信號時令需要點亮的數(shù)碼管顯出字形,不需要的數(shù)碼管不顯示字形。例如需要數(shù)碼管0顯示數(shù)字“5”,就應發(fā)出顯示數(shù)字“5“對應的段選信號,這時8個數(shù)碼管都會收到數(shù)字“5”的段選信號,此時只將數(shù)碼管0的選通控制打開,就只有數(shù)碼管0顯示了數(shù)字“5”,其余的數(shù)碼管沒有選通就不會亮。在不同時刻輪流控制各數(shù)碼管,就可以達到數(shù)碼管輪流受控顯示的效果,這也就是數(shù)碼管動態(tài)掃描的原理。

那么這種輪流顯示的模式下如何實現(xiàn)6個數(shù)碼管的同時顯示呢?在輪流顯示的過程中,每位數(shù)碼管的點亮時間為1~2ms。由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應,盡管各數(shù)碼管并非同時點亮,但只要掃描的速度足夠快,人們觀察到的就是一組穩(wěn)定的顯示數(shù)據(jù),而不會有閃爍感。在設計中將數(shù)碼管點亮時間設置為1~2ms,就可以達到動態(tài)顯示和靜態(tài)顯示相同的效果,但動態(tài)顯示不僅能夠節(jié)省大量的I/O端口,而且功耗更低。

綜上所述,本設計中將數(shù)碼管的刷新時間定為2ms,定義時間后的輸出時序波形圖如下所示:

圖3.7-3帶時間信息的輸出時序


根據(jù)波形圖分析可以得到本設計的計數(shù)器架構:本設計一共需要兩個計數(shù)器,一個計時器用來計算2ms時間,另一個計數(shù)器用來計算顯示次數(shù)。

先來討論計算2ms時間的計數(shù)器cnt0。至簡設計法的設計規(guī)則中有講過:計數(shù)器的設計只考慮兩個因素:加1條件和計數(shù)數(shù)量。只要確定相應邏輯,就能完成計數(shù)器代碼設計。

首先確定計數(shù)器cnt0的加1條件:由于該計數(shù)器在不停地計數(shù),永不停止,因此可以認為其加1條件一直有效,可寫成:assignadd_cnt0==1。

此處可能有同學存在疑惑加1條件的概念是什么?這里以停車位來進行比喻,一般情況下對每個停車位置會進行對應編號,但是如果某個位置上放置了一塊石頭無法作為停車位時,該位置就不能獲得對應的編號。反之則可以認為停車位編號的加1條件就是:對應位置上沒有石頭,其可以繼續(xù)的進行編號,即assign add_cnt0 = “沒有石頭”。因此如果在設計中計數(shù)器一直沒有阻礙地進行計數(shù)工作,就可以認為加1條件是一直有效的。

接著討論計數(shù)器cnt0的計數(shù)數(shù)量:本工程的工作時鐘是50MHz,即周期為20ns,計數(shù)器計數(shù)到第2_000_000/20=100_000個時就代表2毫秒時間到了。

確定好了加1條件和計數(shù)數(shù)量后開始進行代碼編寫。相信各位往常都是一行行輸入代碼,但是至簡設計法有一個小技巧,可以節(jié)省編寫代碼的時間,并且一定程度上降低了代碼的出錯率。至簡設計法將日常代碼中常用到的固定部分做成了模板,進行代碼編程時可以調用相應模板后根據(jù)邏輯輸入對應設計的變量將代碼補充完整。這里就可以用模板編寫計數(shù)器代碼,感受一下這個炫酷的功能。

打開GVIM,在命令模式下輸入“:Mdyjsq”,點擊回車后調出了對應模板,如下圖所示。之后再將本案例中的變量填到模板里面,就可以得到了完整正確的代碼。

補充完整后得到計數(shù)器cnt0的代碼如下所示。


接著討論表示顯示次數(shù)的計數(shù)器cnt1,根據(jù)波形圖可以發(fā)現(xiàn),完成2毫秒計數(shù)就進行下一次顯示,因此該計數(shù)器的加1條件為end_cnt0。每次循環(huán)中,6個段選信號m_g_s、m_s_s、f_g_s、f_s_s、s_g_s和s_s_s依次顯示,再進入下一個循環(huán),因此該計數(shù)器要數(shù)6次。繼續(xù)調用至簡設計法模板,在命令模式下輸入“:Mdyjsq”,點擊回車就調出了對應模板,將“add_cnt1”和“end_cnt1”補充完整,得到該計數(shù)器的代碼如下:

確定兩個計數(shù)器后來思考一下輸出信號seg_sel的變化。根據(jù)設計目標可知,在第1次顯示時,F(xiàn)PGA輸出值為8’hfe;第2次顯示時,F(xiàn)PGA輸出值為8’hfd;以此類推,在第6次顯示時,F(xiàn)PGA輸出值為8’hdf。本設計中用信號cnt1來代替第幾次顯示,即當cnt1==0的時候,輸出值為8’hfe;當cnt1==1的時候輸出值為8’hfd;以此類推,當cnt1==5的時候輸出值為8’hdf。根據(jù)分析將其翻譯成代碼,可以調用至簡設計法模板,在編輯模式下輸入“Shixu2”后將其補充完整,得到信號seg_sel的代碼如下:

以上代碼可以正確實現(xiàn)seg_sel的信號功能,不論是從實現(xiàn)角度還是資源角度來說都可以滿足設計要求。然而,在這里可以將其進行進一步的概括,得到化簡版的代碼。

根據(jù)設計目標可知,第1個數(shù)碼管0亮時seg_sel輸出為b8’b1111_1110;第2個數(shù)碼管1亮時seg_sel輸出為b8’b1111_1101;第3個數(shù)碼管2亮時seg_sel輸出為b8’b1111_1011;第4個數(shù)碼管3亮時seg_sel輸出為b8’b1111_0111;第5個數(shù)碼管4亮時seg_sel輸出為b8’b1110_1111;第6個數(shù)碼管5亮時seg_sel輸出為b8’b1101_1111;根據(jù)規(guī)律可以發(fā)現(xiàn)每一個數(shù)碼管點亮信號對應的數(shù)字“0”都比前一個信號向左移1位。在此可統(tǒng)一設為將8’b1向左移位后再取反的值,將該值賦給seg_sel。通過觀察可以看出每次的左移位數(shù)與cnt1的值相等,因此可以得到以下代碼,其中第6行即表示將8’b1向左移位后再取反的值賦給seg_sel。

讀者朋友也可以代入數(shù)值計算一下,假如此刻cnt1等于0,那么8’b1<<0的結果是8’b0000_0001,取反的值為8’hfe即b8’b1111_1110;假如cnt1等于3,那么8’b1<<3的結果為8’b000_1000,取反后的結果為8’hf7即8’b1111_0111。該設計方法與第一種設計得出的結果相同,但代碼經過了簡化更加清晰。這里同樣可以在編輯模式下輸入“Shixu2”,調出至簡設計法模板,補充完整后得到代碼如下:


下面來討論一下輸出信號seg_ment的變化。seg_ment的值是m_g、m_s、f_g、f_s、s_g和s_s等數(shù)值分別譯碼成數(shù)碼管顯示的信號m_g_s、m_s_s、f_g_s、f_s_s、s_g_s和s_s_s。需要根據(jù)不同的顯示次數(shù)選擇相應的數(shù)碼管信號,可以采用兩種設計方法實現(xiàn)這一功能。

第一種方法是將各數(shù)值均轉換成譯碼信號,再根據(jù)cnt1選擇相應的信號賦值給seg_ment,其原理圖如下圖所示。可以看到設計中先將m_g、m_s、f_g、f_s、s_g和s_s全都譯碼成對應的數(shù)碼管顯示信號m_g_s、m_s_s、f_g_s、f_s_s、s_g_s和s_s_s,隨后再根據(jù)對應的cnt1進行選擇,確定所需的seg_ment值。

圖3.7-5譯碼電路實現(xiàn)方法一


譯碼電路實現(xiàn)的另一種方法是在譯碼之前先選擇需要的數(shù)據(jù),只對需要的數(shù)據(jù)進行譯碼從而得到seg_ment值,其原理圖如下圖所示。先用cnt1進行選擇,只將選擇出的信號譯碼成數(shù)碼管信號。

圖3.7-6譯碼電路實現(xiàn)方法二


對比上面兩種方法的原理圖可以發(fā)現(xiàn):雖然兩種可以實現(xiàn)同樣的功能,但是第二種方法比第一種少了5個譯碼電路。由此也可以看出,在設計中想要實現(xiàn)一個功能可以使用很多方法。但設計師需要做的,就是使用最少的資源、較快的速度來實現(xiàn)同樣的功能,這也是至簡設計法基本的設計理念,同樣是FPGA設計的魅力所在。

經過思考分析,本設計選擇第二種設計方案,那么就需要設計一個信號sel_data來表示從6個數(shù)據(jù)中選擇進行譯碼的信號。將sel_data信息補充后的波形圖如下所示。

圖3.7-7補充sel_data信號時序圖

sel_data的值有可能為0~9中的任意數(shù)字,這些數(shù)字都要轉成數(shù)碼管的段選信號。前面章節(jié)有講過顯示數(shù)字對應的段選信號值,如下表所示。

表3.7- 20~9對應的數(shù)碼管段選信號值

至簡設計法開發(fā)板使用的是共陽數(shù)碼管。根據(jù)上表可寫出如下代碼。

當然這一代碼也可以寫為case的形式,其具體代碼如下:

根據(jù)波形圖可以分析出sel_data從m_g、m_s、f_g、f_s、s_g和s_s中選取。當cnt1=0,即數(shù)碼管0顯示時,sel_data的值為m_g;當cnt1=1,即數(shù)碼管1顯示時,sel_data的值為m_s;當cnt1=2,即數(shù)碼管2顯示時,sel_data的值為f_g;當cnt1=3,即數(shù)碼管3顯示時,sel_data的值為f_s;當cnt1=4,即數(shù)碼管4顯示時,sel_data的值為s_g;當cnt1=5,即數(shù)碼管5顯示時,sel_data的值為s_s。綜上所述,sel_data的代碼為:

接下來設計m_g、m_s、f_g、f_s、s_g和s_s信號,根據(jù)常識可知代表秒鐘個位的m_g信號值每過一秒會加1,其值在數(shù)字0~9中進行循環(huán),具體變化規(guī)律如下圖所示。

圖3.7-8秒鐘個位的時序圖

分析秒鐘個位的波形圖可知,秒鐘個位數(shù)據(jù)是0、1、2、3、4、5、6、7、8、9、0、1……這樣有規(guī)律的進行加1變化。回想一下計數(shù)器需要的條件:加1條件和計數(shù)數(shù)量,可以發(fā)現(xiàn)m_g其實可以設計成一個計數(shù)器,且該計數(shù)器每隔1秒時間加1一次,這里的1秒時間計時也需要一個計數(shù)器,可以將其設為cnt2。

首先來討論用來1秒計時的計數(shù)器cnt2??梢钥吹絚nt2是一直在不停計數(shù),永不停止的,即加1條件一直有效,可以寫成assign add_cnt2= 1。cnt2要數(shù)1秒時間,本工程的工作時鐘是50MHz,即周期為20ns,計數(shù)器計數(shù)到第1_000_000_000/20=50_000_000個時,就表示1秒時間到了,所以cnt2的計數(shù)數(shù)量是?50_000_000個。在命令模式下輸入“:Mdyjsq”,點擊回車,就調出了至簡設計法計數(shù)器模板,補充完整得出cnt2代碼表示如下:

接著討論m_g,可以將其視作另外一個計數(shù)器。其每隔1秒變化一次,因此它的加1條件是1秒計時完成,即end_cnt2==1。前面中分析過m_g需要進行0~9的循環(huán)計數(shù),即計數(shù)數(shù)量為10個。在命令模式下輸入“:Mdyjsq”后點擊回車調出至簡設計法計數(shù)器模板,將其補充完整后得到m_g代碼表示如下:

在m_g的基礎上來思考秒鐘十位m_s的變化。根據(jù)常識可知秒鐘個位進行一個循環(huán)后(即0~9秒完成后)秒鐘十位的信號值會加1,因此秒鐘十位m_s的信號波形圖變化情況如下所示。


圖3.7-9秒鐘十位的時序圖

分析波形圖可以看到,秒鐘十位m_s每隔10秒就會加1,即可將m_s也看做是一個計數(shù)器。其加1條件是10秒時間結束,由于m_g的一個循環(huán)是十秒,因此m_s的加1條件可寫為end_m_g。這里需要注意一下計數(shù)器m_s的計數(shù)數(shù)量并不是10,可以思考一下現(xiàn)實生活中的鐘表,一分等于60秒,那么秒鐘十位的變化是0、1、2、3、4、5,因此該計數(shù)器進行6次計數(shù)就會進入到下一個循環(huán),其計數(shù)數(shù)量為6。綜上所述,在命令模式下輸入“:Mdyjsq”,點擊回車就調出了至簡設計法計數(shù)器模板,補充完整得出m_s代碼表示如下:

接下來在秒鐘十位m_s的基礎上討論分鐘個位f_g,根據(jù)實際情況可以得知,每隔60秒即增加一分鐘,因此分鐘個位f_g的變化波形圖如下所示。


圖3.7-10分鐘個位的時序圖

分析波形圖可以看出,每隔1分鐘即60秒后分鐘個位f_g的信號值就會加1。很明顯,f_g也是一個計數(shù)器,其加1條件是60秒時間結束,即end_m_s。分鐘個位的計數(shù)器數(shù)10個會進入到下一個循環(huán),即計數(shù)數(shù)量為10。在命令模式下輸入“:Mdyjsq”,點擊回車,調用至簡設計法計數(shù)器模板,補充完整得出f_g代碼表示如下:

接下來根據(jù)分鐘個位f_g思考分鐘十位f_s的情況,根據(jù)常識可知,每過十分鐘分鐘十位的信號值會加1,其變化波形圖如下所示。

圖3.7-11分鐘十位的時序圖

根據(jù)波形圖可以看出,f_s分鐘個位也是一個計數(shù)器,其加1條件為10分鐘結束,即end_f_g;分鐘十位的計數(shù)器計數(shù)數(shù)量與秒鐘十位類似,1小時等于60分,因此分鐘十位計數(shù)為0、1、2、3、4、5,該計數(shù)器數(shù)的計數(shù)數(shù)量為6。綜上所述,在命令模式下輸入“:Mdyjsq”后點擊回車,調用至簡設計法計數(shù)器模板,補充完整得出f_s代碼表示如下:


接著根據(jù)分鐘十位f_s思考小時個位s_g,小時個位s_g的變化波形圖情況如下所示。



圖3.7-12小時個位的時序圖


分析波形圖可以明顯看出:小時個位s_g每隔1小時即60分鐘就會加1,因此s_g也是一個計數(shù)器,其加1條件是60分鐘時間結束,即end_f_g。

確定了加1條件,接著需要討論計數(shù)數(shù)量。根據(jù)實際情況可知一天為24小時,可以發(fā)現(xiàn)此時小時的個位周期循環(huán)并不是前面的0~6,那么小時個位的周期到底應該是多少呢?可能有同學認為是10個,因為小時個位和前面分鐘個位、秒鐘個位一樣有0~9的變化;可能有同學認為是24個,因為一天為24個小時,每天都是24的循環(huán);也可能有同學則會認為是4個,因為小時個位是0~3變化。

下面一起來思考一下現(xiàn)實情況,本書的前文部分中有講解過:為了簡單直接的設計,只單個討論每一個數(shù)碼管的顯示變化。而這里討論的是小時的個位,如果此時還認為其周期是24個小時則代表觀念還沒有轉變過來,沒有透徹的理解至簡設計法的設計理念。

24小時考慮的是小時個位和小時十位兩個數(shù)碼管的顯示內容,而在此單純分析小時個位會發(fā)現(xiàn)它以這樣的規(guī)律存在:0~9,0~9,0~3,0~9,0~9,0~3……??梢钥闯鲂r個位的計數(shù)數(shù)量,有時候是10,有時候是4,即其計數(shù)數(shù)量在不斷發(fā)生變化。這里按照至簡設計法的變量法,設其周期是x,其具體定義和取值在后文中會進行描述。打開GVIM,在命令模式下輸入“:Mdyjsq”,點擊回車,調用至簡設計法計數(shù)器模板,補充完整得出的s_g代碼如下所示。

最后根據(jù)小時個位s_g來思考小時十位s_s,小時十位s_s的變化波形圖情況如下所示。


圖3.7-13小時十位的時序圖


根據(jù)波形圖可以看出,當小時個位s_g要清零時(注意不是每隔10小時),小時十位s_s會加1,因此s_s也是一個計數(shù)器,該計數(shù)器加1條件是小時個位清零,即end_s_g。注意這里本書描述的計數(shù)器加1條件是s_g清零,而不是每隔10小時?;貞浺幌聅_g的計數(shù)數(shù)量,其有時是0~9一個周期進行循環(huán),計數(shù)數(shù)量是10;有時是0~3一個周期循環(huán),計數(shù)數(shù)量是4,因此該計數(shù)器的加1條件是小時個位清零。關于小時十位s_s計數(shù)器的計數(shù)數(shù)量,通過分析可知小時十位每數(shù)0、1、2后,計數(shù)器進入到下一個循環(huán),因此該計數(shù)器的計數(shù)數(shù)量為3。綜上所述,在命令模式下輸入“:Mdyjsq”,點擊回車,調用至簡設計法計數(shù)器模板,補充完整得出s_s代碼表示如下:

最后不要忘記對前文中表示小時個位計數(shù)數(shù)量的x進行設計。小時個位循環(huán)是按照0~9,0~9,0~3,0~9,0~9,0~3……的規(guī)律,即其計數(shù)單位是10或者是4。那么計數(shù)單位什么時候是10,什么時候是4呢?思考一下現(xiàn)實情況,小時個位的情況取決于小時十位的顯示,因為一天只有24小時,因此只有當時鐘的小時十位為2的時候,小時個位的計數(shù)數(shù)量為4。即當s_s為2時,x=4,否則x=10。根據(jù)以上分析得出x的代碼如下所示:



此次,主體程序已經完成。


3.3?信號定義

接下來將module補充完整,首先進行定義信號類型。再次強調,在進行reg和wire的判斷的時候,總容易存在多余的聯(lián)想,比如認為reg就是寄存器,wire是線;或者認為reg會綜合成寄存器,wire不會綜合成寄存器。但是這些其實和reg型還是wire型都并無關系,在信號類型的判斷時不需要做任何的聯(lián)想,只要記住一個規(guī)則“用always實現(xiàn)的是reg型,其他都是wire型”就可以了。

進行信號定義時還需要定義信號的位寬,至簡設計法在這里們分享一個非常實用的位寬獲取技巧:打開計算器,點擊“查看”,選擇“程序員”模式,在“十進制”下將信號值輸入進去,就會獲得對應的信號位寬。

cnt0是用always產生的信號,因此類型為reg。cnt0計數(shù)的最大值為100_000,如上圖所示,通過計算器可以得知需要用17根線表示,即位寬是17位。

add_cnt0和end_cnt0都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可。在編輯模式下輸入“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:

cnt1是用always產生的信號,因此類型為reg。cnt1計數(shù)的最大值為6,需要用3根線表示,即位寬是3位。編輯模式下輸入“Reg3”調用至簡設計法模板并補充完整;

add_cnt1和end_cnt1都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可。編輯模式下輸入“Wire1”調用至簡設計法模板并補充完整。

補充后的cnt1、add_cnt1和end_cnt1的定義代碼如下所示:

seg_sel是用always方式設計的,因此類型為reg,其共有8根線,即位寬為8。編輯模式下輸入“Reg8”調用至簡設計法模板,補充完整后得到代碼表示如下:


seg_ment是用always方式設計的,因此類型為reg,其用7根線表示,即位寬為7。代碼表示如下:



sel_data是用always設計的,所以類型為wire。其最大值為9,即位寬為4。編輯模式下輸入“Wire4”調用至簡設計法模板,補充完整后得到代碼表示如下:


cnt2是用always產生的信號,因此類型為reg。cnt2計數(shù)的最大值為50_000_000,使用計算機可以算出需要用26根線表示,即位寬是26位。

add_cnt2和end_cnt2都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1個線表示即可。編輯模式下輸入“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:

m_g是用always產生的信號,因此類型為reg。m_g計數(shù)的最大值為9,需要用4根線表示,即位寬是4位;

add_m_g和end_m_g都是用assign方式設計的,因此類型為wire。并且其值是0或者1,1個線表示即可;

編輯模式下輸入“Reg4”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:


m_s是用always產生的信號,因此類型為reg。m_s計數(shù)的最大值為5,需要用3根線表示,即位寬是3位;

add_m_s和end_m_s都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可;

編輯模式下輸入“Reg3”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:


f_g是用always產生的信號,因此類型為reg。f_g計數(shù)的最大值為9,需要用4根線表示,即位寬是4位;

add_f_g和end_f_g都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可;

編輯模式下輸入“Reg4”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:


f_s是用always產生的信號,因此類型為reg。f_s計數(shù)的最大值為5,需要用3根線表示,即位寬是3位;

add_f_s和end_f_s都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可;

編輯模式下輸入“Reg3”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:


s_g是用always產生的信號,因此類型為reg。s_g計數(shù)的最大值為9,需要用4根線表示,即位寬是4位;

add_s_g和end_s_g都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可;

編輯模式下輸入“Reg4”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:


s_s是用always產生的信號,因此類型為reg。s_s計數(shù)的最大值為2,需要用2根線表示,即位寬是2位;

add_s_s和end_s_s都是用assign方式設計的,因此類型為wire。其值是0或者1,用1根線表示即可。因此代碼如下:


編輯模式下輸入“Reg2”和“Wire1”調用至簡設計法模板,補充完整后得到代碼表示如下:

x是用always產生的信號,因此類型為reg。x計數(shù)的最大值為10,需要用4根線表示,即位寬是4位。編輯模式下輸入“Reg4”調用至簡設計法模板,補充完整后得到代碼表示如下:



至此,整個代碼的設計工作已經完成,完整代碼如下所示。此設計看起來比較復雜,但是認真思考會發(fā)現(xiàn)其原理非?;A。如果朋友還有不理解的地方,一定要反復推敲,弄懂之后會發(fā)現(xiàn)本設計還是非常有趣的。

接下來是新建工程和上板查看現(xiàn)象。


第4節(jié)?綜合與上板

4.1?新建工程

打開軟件Quartus?Ⅱ,點擊“File”下拉列表中的New ProjectWzard...新建工程選項,如下圖所示。

圖3.7-15Quartus新建工程



隨后會出現(xiàn)Quartus新建工程介紹,如下圖所示,直接點擊“Next”。

圖3.7-16Quartus新建工程介紹


此時會出現(xiàn)工程文件夾、工程名、頂層模塊名設置界面,如圖3.7- 17所示。設置目錄為:D:/mdy_book/my_shizhong,工程名和頂層名為my_shizhong。再次強調,為了避免初學者在后續(xù)操作中出現(xiàn)報錯情況,強烈建議設置的文件目錄和工程名稱與本書保持一致。設置完成后點擊“Next”。

圖3.7-17QUARTUS新建工程設置名稱



新建工程類型設置選擇“Empty project”,然后點擊“Next”。

圖3.7-18QUARTUS新建工程類型



文件添加界面如圖3.7- 19所示,點擊右側的“Add”按鈕,添加已經寫好的“my_shizhong.v”文件,點擊右側的“Add”按鈕,可以看到界面下方會顯示出文件,之后點擊“Next”。

圖3.7-19QUARTUS添加文件



芯片型號選擇界面如圖3.7-20所示,選擇“Cyclone?ⅣE”,在芯片型號選擇處選擇“EP4CE15F23C8”,之后點擊“Next”。

圖3.7-20QUARTUS選擇芯片型號



圖3.7- 21為QUARTUS設置工具界面,不必做任何修改,直接點擊“Next”。

圖3.7-21QUARTUS設置工具界面



下圖為新建工程匯總界面,可以看到新建工程的匯總情況,點擊“Finish”,完成新建工程。

圖3.7-22QUARTUS新建工程匯總界面



4.2?綜合

新建工程步驟完成后,就會出現(xiàn)下圖所示的QUARTUS新建工程后界面。

圖3.7-23QUARTUS新建工程后界面



點擊編譯按鈕,可以對整個工程進行編譯。編譯成功的界面,如圖3.7- 24所示。

圖3.7-24QUARTUS編譯后界面


4.3?配置管腳

下面需要對相應管腳進行配置。如下圖所示,在菜單欄中選中“Assignments”,然后選擇“Pin Planner”,隨后就會彈出配置管腳的窗口。


圖3.7-25QUARTUS配置管腳選項



在配置窗口最下方中的“l(fā)ocation”一列,參考信號和管腳關系,按照表3.7- 1中最右兩列配置好FPGA管腳,配置管理來源參見管腳配置環(huán)節(jié),最終配置的結果如圖3.7-26。配置完成后關閉Pin Planner,軟件自動會保存管腳配置信息。

表3.7 - 1信號和管腳關系

4.4?再次綜合

再次打開“QUARTUS”軟件,在菜單欄中選中“Processing”,然后選擇“StartCompilation”,再次對整個工程進行編譯和綜合,如圖3.7- 27所示。

圖3.7-27QUARTUS編譯選項


當出如下所示的編譯成功標志時,就說明編譯綜合成功。

圖3.7-28QUARTUS編譯成功標志



4.5?連接開發(fā)板

完成編譯后開始進行上板調試操作,按照下圖的方式,將下載器接入電腦USB接口,接上開發(fā)板電源后按下開發(fā)板下方藍色開關,硬件連接完畢。

4.6?上板

打開QUARTUS界面,單擊界面中的“?

?”,會彈出配置界面。在界面中點擊“add file”添加“.sof”文件后點擊“Start”,會在“Progress”出現(xiàn)顯示進度。

圖3.7-30QUARTUS界面



QUARTUS下載程序界面如下圖所示,當進度條到100%提示成功后,可在開發(fā)板上觀察相應的現(xiàn)象。

圖3.7-31QUARTUS下載程序界面


操作完成后可以在開發(fā)板上觀察現(xiàn)象,如果操作沒有錯誤,此刻可以看到數(shù)碼管上顯示出時間并且在開始不斷計數(shù)。如果顯示的方向或者時間表示出現(xiàn)錯誤,就需要從頭開始進行錯誤排查。如果無法自己完成錯誤排查的話,可以重新按照步驟操作一遍,相信一定有更多的收獲。


第5節(jié)?簡化版步驟分享

下面會分享簡化版的步驟,方便掌握基礎原理后進行反復操作復習。


5.1?設計實現(xiàn)

5.1.1頂層信號

新建目錄:D:mdy_bookmy_shizhong。在該目錄中,新建一個名為my_shizong.v的文件,用GVIM打開后開始編寫代碼。

確定頂層信號,信號和硬件的對應關系見表3.7- 1。

寫出頂層代碼。

聲明輸入輸出屬性。

未完 請看3.7數(shù)字時鐘設計--明德?lián)P科教2(mdy-edu.com)










3.7數(shù)字時鐘設計--明德?lián)P科教1(mdy-edu.com)的評論 (共 條)

分享到微博請遵守國家法律
新密市| 长兴县| 镇宁| 青川县| 宝山区| 柯坪县| 江山市| 罗定市| 茶陵县| 内丘县| 若尔盖县| 万载县| 建阳市| 遂溪县| 吉林市| 桐柏县| 邳州市| 宜兰市| 贞丰县| 英超| 八宿县| 曲阳县| 高雄市| 阳信县| 赤城县| 临湘市| 红安县| 托克逊县| 长岭县| 静乐县| 永兴县| 吉木乃县| 丽水市| 泗阳县| 公安县| 千阳县| 高青县| 象山县| 漠河县| 富锦市| 涪陵区|