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

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

3.5數(shù)碼管動態(tài)掃描--明德?lián)P科教(mdy-edu.com)

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

本文的文檔編號:001600000017

需要看對應(yīng)的視頻,請點擊視頻編號:001600000099

1.至簡原理與應(yīng)用配套的案例文檔
2.實現(xiàn)開發(fā)板上數(shù)碼管顯示的功能,使8個數(shù)碼管有規(guī)律的按照時間進行顯示。復(fù)位后,數(shù)碼管0顯示數(shù)字“0”;1秒后,數(shù)碼管1顯示數(shù)字"1";再1秒后,數(shù)碼管2顯示數(shù)字"2";以此類推,每隔疫苗變化一次,最后當(dāng)數(shù)碼管7顯示數(shù)字"7"后再次回到數(shù)碼管0顯示"0";按這樣的規(guī)律循環(huán)。
3. 這是ALTERA入門學(xué)習(xí)案例文檔

第三篇?FPGA至簡設(shè)計項目實踐? ?


? ??第五章?數(shù)碼管動態(tài)掃描


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

?led數(shù)碼管(LED Segment Displays)是由多個發(fā)光二極管封裝在一起的器件,這些二極管組成“8”字型,在內(nèi)部完成引線連接,只引出它們的各個筆劃和公共電極。一般來說,led數(shù)碼管常用段數(shù)為7段,如下圖中所示的a、b、c、d、e、f、g,有的數(shù)碼管還會添加一個小數(shù)點,如圖中的h所示。

? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?

圖3.5-18位數(shù)碼管


數(shù)碼管可以通過驅(qū)動電路來驅(qū)動內(nèi)部的各個段碼,從而顯示出需要的數(shù)字。發(fā)光二極管單元按照連接方式可分為共陽極數(shù)碼管和共陰極數(shù)碼管。其中,將所有發(fā)光二極管的陽極連接到一起形成公共陽極(COM)的數(shù)碼管為共陽極數(shù)碼管。在應(yīng)用時應(yīng)將共陽極數(shù)碼管的公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,該字段點亮,當(dāng)某一字段的陰極為高電平時,該字段不亮。例如,當(dāng)共陽極數(shù)碼管的abcdefg值分別是1001111時,即b、c字段亮,其他字段不亮?xí)r,數(shù)碼管顯示數(shù)字“1”。反之,將所有發(fā)光二極管的陰極連接到一起形成公共陰極(COM)的數(shù)碼管為共陰極數(shù)碼管。在應(yīng)用時應(yīng)將共陰極數(shù)碼管的公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,該字段點亮,當(dāng)某一字段的陽極為低電平時,該字段不亮。


根據(jù)共陽極、共陰極數(shù)碼管的工作原理可得,數(shù)碼管顯示數(shù)字0到9對應(yīng)的abcdefg值如下表所示。


LED數(shù)碼管的正常顯示需要驅(qū)動電路來驅(qū)動數(shù)碼管的各個碼段,根據(jù)數(shù)碼管驅(qū)動方式的不同,可以將其分為靜態(tài)式和動態(tài)式兩類。

靜態(tài)驅(qū)動是指每個數(shù)碼管的每一個段碼都通過一個單片機的I/O端口進行驅(qū)動,或使用如BCD碼二-十進制譯碼器譯碼進行驅(qū)動,也稱直流驅(qū)動。靜態(tài)驅(qū)動編程簡單,顯示亮度高,但占用的I/O端口多:如果想要驅(qū)動5個數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來完成驅(qū)動,而一個89S51單片機可用的I/O端口才32個。如此一來,在實際應(yīng)用中則必須增加譯碼驅(qū)動器進行驅(qū)動,從而增加了硬件電路的復(fù)雜性。

由于靜態(tài)驅(qū)動的這一缺點,LED數(shù)碼管動態(tài)顯示接口應(yīng)用更廣。動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示字段"a、b、c、d、e、f、g、h"的同名端連接在一起,此外每個數(shù)碼管的公共極COM需增加由各自獨立I/O線控制的位選通控制電路。當(dāng)要輸出某一字形碼時,所有數(shù)碼管都會接收到相同的字形碼,但究竟是哪個數(shù)碼管會顯示出字形取決于單片機對位選通COM端電路的控制。只需將顯示數(shù)碼管的選通控制打開,該位就會顯示出字形,而沒有選通的數(shù)碼管并不會點亮。綜上所述,動態(tài)驅(qū)動是通過分時輪流控制各數(shù)碼管的COM端,使各個數(shù)碼管輪流受控顯示。在這一過程中,每位數(shù)碼管的點亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管各位數(shù)碼管并非同時點亮,但只要掃描速度足夠快,人們觀察到的就是一組穩(wěn)定的顯示數(shù)據(jù),而不會產(chǎn)生閃爍感。在顯示效果上,動態(tài)顯示和靜態(tài)顯示相同的,但動態(tài)顯示不僅能夠節(jié)省大量的I/O端口,而且功耗更低。

至簡設(shè)計法開發(fā)板上一共有2組4位的共陽數(shù)碼管,也就是說一共有8個共陽數(shù)碼管。數(shù)碼管的配置電路如下。

圖3.5-2教學(xué)板數(shù)碼管原理圖



圖中的SEG_A、SEG_B~SEG_DP是段選信號,8個數(shù)碼管共用。

DIG1~DIG8是位選信號,與8個數(shù)碼管分別對應(yīng)。當(dāng)位選信號為0時,段選信號的值將賦給相應(yīng)數(shù)碼管。例如DIG3信號為0則表示將段選信號SEG_A~SEG_DP的值賦給數(shù)碼管3。

信號SEG_A~SEG_DP,DIG1~DIG8,都與電阻進行連接,如下圖所示。

圖3.5-3教學(xué)板數(shù)碼管連接電阻

由此可見,SEG_A~SEG_DP由SEG0~SEG7產(chǎn)生,DIG1~DIG8由DIG_EN1~DIG_EN8產(chǎn)生。而SEG0~SEG7和DIG_EN1~DIG_EN8都直接與FPGA的IO相連,如下圖所示。

圖3.5-4FPGA與數(shù)碼管信號連接圖


這些信號與FPGA管腳的對應(yīng)關(guān)系如下表。FPGA通過控制相應(yīng)的管腳,從而實現(xiàn)對數(shù)碼管顯示的控制。

表3.5- 2 信號線與管腳的關(guān)系



第2節(jié)?設(shè)計目標(biāo)

按照至簡設(shè)計法的設(shè)計特色,在開始一個新的設(shè)計之前應(yīng)明確設(shè)計目標(biāo)。設(shè)計目標(biāo)是整個設(shè)計的核心靈魂,后續(xù)的每個步驟與操作都是圍繞設(shè)計目標(biāo)進行展開。至簡設(shè)計法的原理很簡單,即每一個步驟和思路都力求簡單快捷,明確設(shè)計目標(biāo)就是為了確保后續(xù)的每個階段都有意義,而不去進行不必要的工程。這一做法可以少走很多彎路,尤其對于初學(xué)者來說,好習(xí)慣的養(yǎng)成可以為以后的工程師生涯帶來無限的方便。所以再次強調(diào),在開始設(shè)計前一定要將設(shè)計目標(biāo)分析透徹,認(rèn)真思考本次設(shè)計最終想要實現(xiàn)什么目的,達到什么效果,然后再投入到設(shè)計中去。

本次設(shè)計需要實現(xiàn)開發(fā)板上數(shù)碼管顯示的功能,使8?個數(shù)碼管有規(guī)律的按照時間進行顯示。復(fù)位后,數(shù)碼管?0?顯示數(shù)字“0”;1?秒后,數(shù)碼管?1?顯示數(shù)字“1”;再1?秒后,數(shù)碼管?2?顯示數(shù)字“2”;以此類推,每隔?1?秒變化一次,最后當(dāng)數(shù)碼管?7?顯示數(shù)字“7”后再次回到數(shù)碼管0顯示“0”,按照這樣的顯示規(guī)律循環(huán)往復(fù)。

本設(shè)計的上板效果圖如下圖所示,也可以登陸至簡設(shè)計法官方網(wǎng)站觀看上板演示視頻效果:www.mdy-edu.com/xxxx。??

圖3.5-5數(shù)碼管動態(tài)掃描效果圖

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

在設(shè)計的實現(xiàn)階段本書會按照步驟和原理分析進行案例實現(xiàn)的分享,考慮到初學(xué)者的需要,此部分的內(nèi)容會比較詳細(xì)。如果基礎(chǔ)知識掌握得比較牢靠,只想學(xué)習(xí)此設(shè)計的步驟,可以跳過此部分,直接進入后面章節(jié)中的簡化版步驟分享。對于初學(xué)者來說,建議不要選擇捷徑,一定按照詳細(xì)分析的內(nèi)容進行學(xué)習(xí),只有掌握好基礎(chǔ)知識,才可以從容的獨立完成項目設(shè)計。


3.1?頂層信號

新建目錄:D:mdy_bookmy_seg,并在此目錄中新建一個名為my_seg.v的文件。用GVIM打開文件后開始編寫代碼。這里再次強調(diào),建議初學(xué)者按照書中提供的文件路徑以及文件名進行設(shè)置,避免后續(xù)出現(xiàn)未知錯誤。

分析設(shè)計目標(biāo)可知,本設(shè)計需要控制8個數(shù)碼管,讓其顯示不同的數(shù)字。通過前文分析的LED數(shù)碼管顯示原理可以得知:如果想要控制8個數(shù)碼管,則需控制位選信號,即FPGA要輸出一個8位的位選信號,將其設(shè)為seg_sel。其中seg_sel[0]對應(yīng)數(shù)碼管0,seg_sel[1]對應(yīng)數(shù)碼管1,以此類推,seg_sel[7]對應(yīng)數(shù)碼管7。

控制數(shù)碼管的不同數(shù)字顯示需要通過控制每個數(shù)碼管上的7個字段,即通過控制段選信號可以實現(xiàn)數(shù)碼管不同數(shù)字的顯示,此處由于只需顯示數(shù)字,無需用到“h”子段,因此一共有7個子段,即FPGA要輸出一個7位的段選信號,將其設(shè)為seg_ment。其中seg_ment[6]~segm_ment[0]分別對應(yīng)數(shù)碼管的abcdefg字段(注意對應(yīng)順序)。當(dāng)然,除位選信號和段選信號外,設(shè)計中進行工程控制的時鐘信號和復(fù)位信號也同樣必不可少。

綜上所述,本設(shè)計一共需要4個信號:時鐘信號clk,復(fù)位信號rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。信號和硬件管腳的對應(yīng)關(guān)系如下表所示。


表3.5 - 3信號和管腳關(guān)系

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


隨后對信號輸入輸出屬性進行聲明,指出這一信號對于FPGA來說屬于輸入信號還是輸出信號,若為輸入信號則聲明其為input,若為輸出信號則聲明其為output。在本設(shè)計中,由于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ù)字內(nèi)容的信號,因此seg_ment是7位的輸出信號output,綜上所述,其具體代碼如下:



3.2?信號設(shè)計

在設(shè)計信號之前,先按照至簡設(shè)計法的思路來進行架構(gòu)設(shè)計。分析需要實現(xiàn)的功能為:第1秒時數(shù)碼管0顯示數(shù)字“0”,其余數(shù)碼管不顯示任何數(shù)字;第2秒時數(shù)碼管1顯示數(shù)字“1”,其余數(shù)碼管同樣不顯示任何數(shù)字;第3秒時數(shù)碼管3顯示數(shù)字“3”,其余數(shù)碼管不顯示數(shù)字;以此類推,第八秒數(shù)碼管7顯示數(shù)字“7”,循環(huán)往復(fù)。

將現(xiàn)象翻譯成信號表示如下:

第1秒,數(shù)碼管0顯示數(shù)字“0”,即seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001;

第2秒,數(shù)碼管1顯示數(shù)字“1”,即seg_sel的值為8’b1111_1101,seg_ment的值為7’b100_1111;

第3秒,數(shù)碼管2顯示數(shù)字“2”,即seg_sel的值為8’b1111_1011,seg_ment的值為7’b001_0010;

第4秒,數(shù)碼管3顯示數(shù)字“3”,即seg_sel的值為8’b1111_0111,seg_ment的值為7’b000_0110;

第5秒,數(shù)碼管4顯示數(shù)字“4”,即seg_sel的值為8’b1110_1111,seg_ment的值為7’b100_1100;

第6秒,數(shù)碼管5顯示數(shù)字“5”,即seg_sel的值為8’b1101_1111,seg_ment的值為7’b010_0100;

第7秒,數(shù)碼管6顯示數(shù)字“6”,即seg_sel的值為8’b1011_1111,seg_ment的值為7’b010_0000;

第8秒,數(shù)碼管7顯示數(shù)字“7”,即seg_sel的值為8’b0111_1111,seg_ment的值為7’b000_1111;

第九秒,回到數(shù)碼管0顯示數(shù)字“0”,以此進行循環(huán)。


總結(jié)發(fā)現(xiàn),數(shù)碼管每隔1秒進行變化,且8個數(shù)碼管輪流顯示。通過分析可以畫出信號波形示意圖如下圖所示。

圖3.5-6數(shù)碼管動態(tài)掃描實現(xiàn)架構(gòu)


通過seg_sel和seg_seg信號的變化波形圖可以看出:顯示第1個數(shù)字時,seg_sel=8’hfe,seg_ment=7’h01,該狀態(tài)會持續(xù)1秒;顯示第2個數(shù)字時,seg_sel=8’hfd,seg_ment=7’h4f,同樣持續(xù)1秒;以此類推,到第8個數(shù)字時,持續(xù)1秒seg_sel=8’h7f,seg_ment=7’h0f。隨后進入新一輪循環(huán),再次重復(fù)seg_sel=8’hfe,seg_ment=7’h01的1秒持續(xù)。

根據(jù)波形圖分析可以得到本設(shè)計的計數(shù)器架構(gòu):本設(shè)計一共需要兩個計數(shù)器,一個計數(shù)器用來計算1秒的時間,另一個計數(shù)器用來計算1秒的次數(shù),即這是第幾個1秒。

來思考一下:既然設(shè)計目標(biāo)為1秒改變一次狀態(tài),為什么除了1秒的計數(shù)器之外,還要設(shè)計數(shù)第幾個的計數(shù)器,這樣豈不是更麻煩嗎?實際上增加計數(shù)器的操作正是運用了至簡設(shè)計法的道理,讓信號代碼更加有條理并便于設(shè)計師確定位置。

舉個生活中常見的例子,如下圖所示,將8個數(shù)碼管一次顯示循環(huán)看做樓層,把每1秒改變一次的狀態(tài)記作門牌號,即第1秒、第2秒、第3秒在一層樓一對應(yīng)1號2號3號,以此類推。如果只用一個計數(shù)器的話,那么一樓門牌號為1、2、3、4、5、6、7、8,二樓門牌號則為9、10、11、12、13、14、15、16、17、18,三樓以此類推。這種只有用一種計數(shù)單位的方法,開始確實沒有太大問題,但是隨著樓層的變高,這種計數(shù)方式的弊端就會顯露出來。比如在這種情況下想要找76號,就可能需要很久才能找到。

圖3.5-7單一門牌號計數(shù)模式

如果在一個計數(shù)單位的基礎(chǔ)上再加一個計數(shù)單位,即采用兩種技術(shù)模式,一個記樓層,一個記門牌號,如下圖所示。在同樣的門牌號計數(shù)中,可以記為一樓的1、2、3、4、5、6、7、8號,二樓的1、2、3、4、5、6、7、8、9、10號,以此類推,每一層都有對應(yīng)的房間號。在這種計數(shù)模式下,如果想要找到七層6號房間,不需要多做思考就可以一下就定位到正確位置。

圖3.5-8兩種門牌號復(fù)合計數(shù)模式


通過案例可以確定兩種計數(shù)器復(fù)合計數(shù)才是最簡單的計數(shù)模式,因此本設(shè)計使用一個計數(shù)1秒的計數(shù)器cnt0,一個表示第幾個1秒的計數(shù)器cnt1。這樣如果后續(xù)遇到問題,也可以快速的定位到相應(yīng)的位置,避免了很多麻煩。

此外,在以上門牌號計數(shù)案例中,如果想要尋找每一層的固定位置房間,按照兩種計數(shù)單位復(fù)合的模式,用cnt0來表示房間號,其范圍是0-9,用cnt1來表示樓層號,其范圍是0-1。通過這種方法可以通過cnt0和cnt1來找到任何一個房間。如果想找同一個位置的房間,也可以直接用cnt0來表示。例如cnt0==4可以統(tǒng)一表示每層樓的四號房間。但如果只有房間號這一計數(shù)模式而沒有樓層的話,想表示每層樓的四號房間,則表示方式為“cnt0==4”、“cnt0=12”,更高樓層以此類推。兩種表現(xiàn)形式的難易程度顯而易見。

可見兩個計數(shù)器復(fù)合計數(shù)的方式并不是多此一舉,反而是最適合本設(shè)計的計數(shù)器方案。不論是簡單設(shè)計還是復(fù)雜設(shè)計,至簡設(shè)計法都會全面的考慮設(shè)計需求,在每一個環(huán)節(jié)都會采用最適合的設(shè)計方案,盡量為后續(xù)的步驟減少不必要的麻煩。

確定了兩個計數(shù)器后,來依次討論每個計數(shù)器的實現(xiàn)。至簡設(shè)計法的設(shè)計規(guī)則中有講過,計數(shù)器的設(shè)計只考慮兩個因素:加1條件和計數(shù)數(shù)量。只要確定相應(yīng)邏輯,就能完成計數(shù)器代碼設(shè)計。

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

接著討論計數(shù)器cnt0的計數(shù)數(shù)量:本工程的工作時鐘是50MHz,即周期為20ns,當(dāng)計數(shù)器計數(shù)到第1_000_000_000/20=50_000_000個時,就代表1秒時間到了。因此因此cnt0的計數(shù)數(shù)量為50_000_000。

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

打開GVIM工具,在命令模式下輸入“:Mdyjsq”后點擊回車,就調(diào)出了對應(yīng)模板,如下圖所示。之后再將本案例中的變量填到模板里面,就可以得到完整正確的計數(shù)器代碼。

圖3.5-9至簡設(shè)計法調(diào)用計數(shù)器代碼模板


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


下面來設(shè)計記錄1秒次數(shù)的計數(shù)器cnt1。該計數(shù)器表示數(shù)到第幾個1秒,即每完成1秒計數(shù)后就加1,因此其加1條件為end_cnt0。該計數(shù)器一共要數(shù)8次進入下一個循環(huán),即計數(shù)數(shù)量為8。繼續(xù)調(diào)用至簡設(shè)計法模板,在命令模式下輸入“:Mdyjsq”,點擊回車后調(diào)出對應(yīng)模板,將“add_cnt1”和“end_cnt1”補充完整,得到該計數(shù)器的代碼如下:


確定完兩個計數(shù)器后來思考輸出信號seg_sel的變化。根據(jù)信號波形圖得知,第1秒時FPGA輸出值為8’hfe;第2秒時輸出值為8’hfd;以此類推,在第8秒時輸出值為8’h7f。設(shè)計中使用cnt1來表示第幾個1秒,即cnt1==0的時候,輸出值為8’hfe;在cnt1==1的時候輸出值為8’hfd;以此類推,在cnt1==7時輸出值為8’h7f。將其翻譯成代碼,調(diào)用至簡設(shè)計法模板,在編輯模式下輸入“Shixu2”,然后補充完整,得到信號seg_sel代碼如下:


觀察補充完整的代碼可以發(fā)現(xiàn):代碼表示與文字描述基本上是一模一樣的,這其實是體現(xiàn)了verilog“硬件描述語言”的特點。上文所列代碼可以正確實現(xiàn)seg_sel功能,且從實現(xiàn)角度和資源角度來說都足以完成設(shè)計,但依然可以將其進行進一步的概括從而得到簡化版的代碼。

根據(jù)設(shè)計目標(biāo)可知,第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;第7個數(shù)碼管顯示“6”時,seg_sel輸出為b8’b1011_1111;第8個數(shù)碼管顯示“7”時,seg_sel輸出為b8’b0111_1111;根據(jù)規(guī)律可以發(fā)現(xiàn)每個控制數(shù)碼管的閃亮信號,其對應(yīng)數(shù)字“0”都依次向左移動1位。在設(shè)計中可以統(tǒng)一設(shè)為將8’b1向左移位,將其取反后的值再賦給seg_sel,可以觀察出每次左移的位數(shù)和cnt1的值相等。因此可得以下代碼,其中的第6行即表示先將8’b1向左移位,再取反,將該值賦給seg_sel。

也可以帶入數(shù)值計算一下,假如此刻cnt1等于0,則8’b1<<0的結(jié)果是8’b0000_0001,取反的值為8’hfe即b8’b1111_1110;假如此刻cnt1等于3,則8’b1<<3的結(jié)果為8’b000_1000,取反后的結(jié)果為8’hf7即8’b1111_0111。兩段代碼的對比結(jié)果相同,但是這種方法下代碼經(jīng)過簡化,更加清晰。這里同樣可以在編輯模式下輸入“Shixu2”,調(diào)出至簡設(shè)計法模板,補充完整后得到代碼如下:

最后來思考輸出信號seg_ment的變化。分析波形圖可知,在第1次顯示時,其輸出值為7’h01;在第2次顯示時,其輸出值為7’h4f;以此類推,在第8次顯示時,其輸出值為7’h0f。用計數(shù)器cnt1表示第幾次顯示,也就是說:當(dāng)cnt1==0時seg_ment輸出值為7’h01;在cnt1==1時輸出值為7’h4f;以此類推,在cnt1==7時輸出值為7’h0f。將其翻譯成代碼,在編輯模式下“Shixu2”,調(diào)出至簡設(shè)計法模板,補充完整后的代碼如下:

上面的代碼可以正確實現(xiàn)seg_ment的功能,對于本設(shè)計來說已經(jīng)足夠。但進一步思考可以發(fā)現(xiàn):該代碼實現(xiàn)了類似譯碼的功能,將數(shù)字設(shè)成數(shù)碼管顯示的值,代碼中只對0~7進行譯碼。為了方便日后設(shè)計,在這里設(shè)計一個通用的譯碼模塊,將0~9都進行譯碼。這樣的話今后遇到類似的工程,就可以隨時調(diào)用這一代碼,譯碼模塊代碼如下所示:




在本設(shè)計中只要控制data信號,即可實現(xiàn)在數(shù)碼管顯示相應(yīng)數(shù)字。前文可知:當(dāng)cnt1=0,則數(shù)碼管會顯示0。當(dāng)cnt1=1,則數(shù)碼管會顯示1。因此data信號代碼如下:


在代碼的最后一行寫下endmodule


至此,主體程序已經(jīng)完成。



3.3?信號定義

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

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

圖3.5-10通過計算器獲取信號位寬


cnt0是用always產(chǎn)生的信號,因此類型為reg。其計數(shù)的最大值為50_000_000,通過計算器可以得知需要用26根線表示,即位寬是26位。add_cnt0和end_cnt0都是用assign方式設(shè)計的,因此類型為wire。其值是0或1,用1個線表示即可。打開GVIM,在編輯模式下輸入“Wire1”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼表示如下:

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

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


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


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


如果使用譯碼電路則會用到data信號。該信號是用assign設(shè)計的,所以類型為wire,其最大值為9,位寬為4。編輯模式下輸入“Wire4”調(diào)用至簡設(shè)計法模板,補充完整后得到代碼表示如下:


至此,整個代碼的設(shè)計工作已經(jīng)完成。完整版的工程代碼如下:


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

4.1?新建工程

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

圖3.5-11Quartus新建工程


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

圖3.5-12Quartus新建工程介紹


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

圖3.5-13QUARTUS新建工程設(shè)置名稱


新建工程類型設(shè)置選擇選擇“Empty project”,如下圖所示,然后點擊“Next”。

圖3.5-14QUARTUS新建工程類型

文件添加界面如圖3.5- 15所示,點擊右側(cè)的“Add”按鈕,添加之前寫好的“my_seg.v”文件,可以看到界面下方會顯示出文件,隨后點擊“Next”。

圖3.5-15QUARTUS添加文件

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

圖3.5-16QUARTUS選擇芯片型號

圖3.5- 17為QUARTUS設(shè)置工具界面,不必做任何修改,直接點擊“Next”。

圖3.5-17QUARTUS設(shè)置工具界面

新建工程的匯總情況如下圖所示,點擊“Finish”后完成新建工程。

圖3.5-18QUARTUS新建工程匯總界面


4.2?綜合

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

圖3.5-19QUARTUS新建工程后界面

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

圖3.5-20QUARTUS編譯后界面


4.3?配置管腳

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

圖3.5-21QUARTUS配置管腳選項


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


表3.5 - 3信號和管腳關(guān)系

圖3.5-22QUARTUS配置管腳


4.4?再次綜合

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

圖3.5-23QUARTUS編譯選項



當(dāng)出現(xiàn)如下所示的編譯成功標(biāo)志時則說明編譯綜合成功。

圖3.5-24QUARTUS編譯成功標(biāo)志

4.5?連接開發(fā)板

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

圖3.5-25開發(fā)板連接圖

4.6?上板

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

圖3.5-26QUARTUS界面

當(dāng)進度條到100%時提示成功,如下圖所示,此時即可在開發(fā)板上觀察相應(yīng)的現(xiàn)象。

圖3.5-27QUARTUS下載程序界面

如果操作沒有錯誤,此時可以觀察到開發(fā)板上數(shù)碼管的數(shù)字每一秒增加一個,并且按照從左到右數(shù)碼管的排列依次顯示。如果顯示方向或者時間錯誤,就需要從頭開始進行錯誤排查。如果無法自己完成錯誤排查的話,可以重新按照步驟操作一遍,相信一定可以達到想要的效果。


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

這里依舊會分享簡化版的步驟,方便掌握基礎(chǔ)原理后進行反復(fù)操作復(fù)習(xí)。


5.1?設(shè)計實現(xiàn)

5.1.1頂層信號


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

確定頂層信號。工程信號和管腳關(guān)系如下表所示:

表3.5 - 3信號和管腳關(guān)系


寫出頂層信號代碼:


聲明輸入輸出屬性:


5.1.2信號設(shè)計

首先進行架構(gòu)設(shè)計,分析設(shè)計目標(biāo)得出波形示意圖如下所示:

圖3.5-6數(shù)碼管動態(tài)掃描實現(xiàn)架構(gòu)

設(shè)計計數(shù)器架構(gòu),表示1秒計數(shù)器cnt0的代碼如下:


表示第幾個1秒的計數(shù)器cnt1代碼如下:


設(shè)計輸出信號seg_sel:


設(shè)計輸出信號seg_ment:

data代碼表示如下:

在代碼的最后一行寫下endmodule:

主體程序完成后,下面將module補充完整。



5.1.3信號定義

定義信號類型。cnt0、add_cnt0?和?end_cnt0的信號定義如下:


cnt1、add_cnt1和end_cnt1的信號定義如下:


seg_sel的信號定義如下:


seg_ ment的信號定義如下:


data的信號定義如下:



至此,整個工程的代碼的設(shè)計工作已經(jīng)完成,后續(xù)應(yīng)對代碼進行編譯綜合以及上板查看現(xiàn)象。


5.2?綜合與上板

5.2.1新建工程

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

圖3.5-11Quartus新建工程

直接點擊“Next”。

圖3.5-12Quartus新建工程介紹


此時會出現(xiàn)是工程文件夾、工程名、頂層模塊名設(shè)置界面,設(shè)置目錄為:D:/mdy_book/my_seg,工程名和頂層名為my_seg,完成設(shè)置后點擊“Next”。

圖3.5-13QUARTUS新建工程設(shè)置名稱

選擇“Empty project”后點擊“Next”。

圖3.5-14QUARTUS新建工程類型


點擊右側(cè)的“Add”按鈕,選擇“my_seg.v”文件,添加文件后點擊“Next”。

圖3.5-15QUARTUS添加文件


對芯片型號進行選擇:“Devicefamily”選項下選擇“Cyclone?ⅣE”,“Available devices”選項下選擇“EP4CE15F23C8”,隨后點擊“Next”。

圖3.5-16QUARTUS選擇芯片型號



直接點擊“Next”。

圖3.5-17QUARTUS設(shè)置工具界面


點擊“Finish”,完成新建工程。

圖3.5-18QUARTUS新建工程匯總界面


5.2.2綜合

新建工程后界面如下圖所示,點擊“編譯”。

圖3.5-19QUARTUS新建工程后界面


編譯成功界面如下圖。

圖3.5-20QUARTUS編譯后界面


5.2.3配置管腳

在菜單欄點擊“Assignments”后點擊“Pin Planner”,此時會彈出配置管腳的窗口。

圖3.5-21QUARTUS配置管腳選項

在配置窗口“l(fā)ocation”根據(jù)信號和管腳關(guān)系配置管腳,配置完成關(guān)閉“Pin Planner”即可自動保存配置信息。

圖3.5-22QUARTUS配置管腳


5.2.4再次綜合

打開“QUARTUS”軟件,在菜單欄中選擇“Processing”,點擊“StartCompilation”再次進行綜合。

圖3.5-23QUARTUS編譯選項


出現(xiàn)?QUARTUS?編譯成功標(biāo)志則表示此次編譯成功。

圖3.5-24QUARTUS編譯成功標(biāo)志


5.2.5連接開發(fā)板

下載器接入電腦?USB?接口,開發(fā)板接上電源后按下藍色開關(guān)。

圖3.5-25開發(fā)板連接圖


5.2.6上板

打開?QUARTUS?界面,單擊“?”圖標(biāo):

圖3.5-26QUARTUS界面



點擊“add file”,添加.sof文件,隨后點擊“Start”。在“Progress”中會顯示進度,當(dāng)進度條顯示“100%”表示成功,可在開發(fā)板上觀察現(xiàn)象。

圖3.5-27QUARTUS下載程序界面


第6節(jié)?擴展練習(xí)

至此,數(shù)碼管動態(tài)掃描工程已經(jīng)分享完畢,相信同學(xué)們已經(jīng)可以完全掌握這一工程。在掌握工程的基礎(chǔ)上可以多做一些思考,在工程原理不變的基礎(chǔ)上進行一定的數(shù)據(jù)調(diào)整,例如嘗試改變停留時間或改變數(shù)碼管的顯示順序,這樣可以更深刻的掌握案例。也歡迎有更好思路和想法的同學(xué)前往至簡設(shè)計法論壇進行討論。


3.5數(shù)碼管動態(tài)掃描--明德?lián)P科教(mdy-edu.com)的評論 (共 條)

分享到微博請遵守國家法律
安塞县| 涟水县| 成安县| 万源市| 武威市| 特克斯县| 日土县| 小金县| 临武县| 赤水市| 鹤壁市| 平邑县| 江安县| 台东市| 区。| 安福县| 安丘市| 育儿| 视频| 东辽县| 政和县| 泾源县| 客服| 正镶白旗| 莒南县| 佛教| 桓台县| 崇义县| 桃源县| 福泉市| 南城县| 平谷区| 昭通市| 淅川县| 寿阳县| 抚松县| 宜兰市| 泗阳县| 冷水江市| 黄骅市| 永州市|