【小月电子】ALTERA FPGA开发板系统学习教程-LESSON5数码管动态显示
數碼管動態顯示例程講解
若要觀看該博客配套的視頻教程,可點擊此鏈接 開發板實物圖 圖1.FPGA設計流程 根據多年工作經驗,總結出的FPGA的設計流程,概括起來總共有以上12步,其中根據項目難易度可省去其中一些步驟。比如非常簡單的項目,我們可以省去虛線框里面的步驟,但是我們的入門級課程,即使再簡單,也按照這12個步驟來進行講解。
1.需求解讀
1.1 需求
在六位數碼管上穩定的顯示123456
1.2 知識背景
數碼管是由多個 LED 發光二極管組成的一個“8”字型的器件,根據極性不同,分為共陽極和共陰極,我們開發板上采用的是共陽數碼管。數碼管內部結構如下圖:
 
通過圖上可以看出,共陽極和共陰極的區別。共陽極公共端接電源正極,共陰極公共端接地。選用共陽極數碼管時,我們只需將對應的 abcdefgdq 給低電平便可點亮對應的數碼管。共陰極與之相反,需要將 abcdefgdq 接入電源正極便可點亮對應的數碼管。數碼管示意圖如下:
 
我們選用的開發板使用的是共陽極數碼管,如果要顯示 2,那么我們應該點亮A,B,G,E,D 段發光二極管。如果要顯示 5,大家可以自行分析,應該點亮哪些段,這樣我們便可以得出共陽數碼管 0 到 9 的編碼。為了節約大家的時間,我將共陽數碼管對應的編碼整理出來,如下圖,可以直接調用。共陰數碼管的編碼只用按位取反即可。
 我們開發板共陽數碼管段選編碼表如下:
 
1.3 硬件設計
有源晶振,與E1管腳相連  數碼管驅動電路 數碼管位選段選與FPGA管腳對應關系我們開發板上選用的是PNP三極管,當給三極管基極輸入低電平,三極管的集電極與發射極便導通,3.3V 的電壓便加在了數碼管的位選管腳上,那么我們要點亮第一位數碼管則需要給SMG_W0 輸入低電平,并按數碼管編碼表給數碼管的段選賦值。原理掌握了,我們可以開始編寫代碼
1.4 數碼管動態掃描原理
我們上一講講了數碼管的靜態顯示,如果只有一位,用靜態掃描的方式那么我們需要控 制 8個段選,1個位選,總共 9 個引腳。如果我們要控制 6 位數碼管,而同樣采用靜態顯示的方式,那總共要用 9*6=54 個管腳,事必會造成管腳的嚴重浪費。為了節約管腳,同時又能顯示多位信息,我們可以采用動態掃描的方式來驅動多位數碼管,同樣的驅動6位數碼管,用動態掃描的方式只需要控制8個段選,6個位選信號,總共14個管腳,比靜態掃描節約了40個,所以,利用動態掃描方式驅動數碼管,是我們學習以及工作中必需要學會的。 多位數碼管用于顯示更多的數值信息,其由多個數碼管組成,這些數碼管的段(a~h) 一一對應連接在一起,公共極獨立。動態掃描即按照一定的方向逐一選中數碼管(通過位選接口來選中要點亮的數碼管),然后給段選管腳輸入事先準備好的編碼數據,并保持一定的時間,如此循環。由于人眼的視覺暫留效應,我們看到的現象便是多位同時顯示,這就像我們小時候翻看動畫書,當翻得很快時,我們就發現書里面的小動物跑起來了,當時還樂此不疲的找過各種動畫書。根據經驗,當幀率為 15fps 以上時,動畫是連貫的,幀率越高動畫也越流暢。但是幀率過高,會造成看不清數碼管上顯示的信息。所以適當的幀率才是最好的。對于我們的6位數碼管,掃描 1 次(顯示 6 個數字) 為一幀。我們可以觀察不同的掃描頻率對應的數碼管顯示效果,找到顯示效果較好的掃描方式。經實驗發現,當每一個數字顯示 10ms,數碼管有明顯的閃爍現象,當改為5ms時則顯示穩定。原理掌握了,我們可以開始編寫代碼
1.5 接口說明
| CLK_50M | 輸入 | E1 | 系統時鐘,50Mhz | 
| KEY1 | 輸入 | M1 | 獨立按鍵,按下低電平,當作復位使用 | 
| SMG_W0 | 輸出 | A2 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | 
| SMG_W1 | 輸出 | A3 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | 
| SMG_W2 | 輸出 | A4 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | 
| SMG_W3 | 輸出 | B5 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | 
| SMG_W4 | 輸出 | A5 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | 
| SMG_W5 | 輸出 | 位選控制信號,低電平可導通三極管,使其給數碼管位選供電 | |
| SMG_A | 輸出 | A9 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_B | 輸出 | K8 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_C | 輸出 | D8 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_D | 輸出 | A7 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_E | 輸出 | E7 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_F | 輸出 | B9 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_G | 輸出 | A10 | 數碼管段選控制信號,低電平點亮該段 | 
| SMG_DP | 輸出 | C8 | 數碼管段選控制信號,低電平點亮該段 | 
????總結:通過上述說明,可以將需求解讀成:當點亮第一位數碼管時,位選為6’h3e,此時數碼管段選的編碼為8’hf9;當點亮第二位數碼管時,位選為6’h3d,數碼管段選的編碼為8’h25;當點亮第三位數碼管時,位選為6’h3b,數碼管段選的編碼為8’h0d;當點亮第四位數碼管時,位選為6’h37,數碼管段選的編碼為8’h99;當點亮第五位數碼管時,位選為6’h2f,數碼管段選的編碼為8’h49;當點亮第六位數碼管時,位選為6’h1f,數碼管段選的編碼為8’h41;
2. 繪制理論波形圖
邏輯框圖 理論波形圖3.新建QuartusII 工程
為了讓工程看起來整潔,同時方便工程移植。我們新建4個文件夾,分別是Project,Source,Sim,Doc。
 Project — 工程文件夾,里面放的QuartusII工程
 Source — 源代碼文件夾,里面放的工程源碼(.v文件或.vhd文件)
 Sim — 仿真文件夾,里面放的仿真相關的文件
 Doc — 存放相關資料,比如數據手冊,需求文檔等
4.編寫代碼
/// //QQ:3181961725 //TEL/WX:13540738439 //工程師:Mr Wang //模塊介紹:數據管動態掃描,顯示123456 module smg_drv(input clk,input rst_n,output reg [5:0] smg_bit,output reg [7:0] smg_seg);parameter refresh_time=50000;//一個時鐘周期20ns,50000*20=1000000ns=1msreg [3:0] cnt;reg [24:0] refresh_cnt;always@(posedge clk or negedge rst_n)beginif(!rst_n)refresh_cnt<=0;else if(refresh_cnt==refresh_time-1)refresh_cnt<=0;else refresh_cnt<=refresh_cnt+1;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)cnt<=4'hf;else if(refresh_cnt==0&&cnt==5)cnt<=0;else if(refresh_cnt==0)cnt<=cnt+1;else;endalways@(posedge clk or negedge rst_n)beginif(!rst_n)beginsmg_bit<=6'h3f;smg_seg<=8'h0;end else case(cnt)0:begin smg_bit<=6'h1f;smg_seg<=8'h9f; end 1:begin smg_bit<=6'h2f;smg_seg<=8'h25; end 2:begin smg_bit<=6'h37;smg_seg<=8'h0d; end 3:begin smg_bit<=6'h3b;smg_seg<=8'h99; end 4:begin smg_bit<=6'h3d;smg_seg<=8'h49; end 5:begin smg_bit<=6'h3e;smg_seg<=8'h41; end default:;endcaseend endmodule5.編寫仿真測試激勵文件
仿真邏輯框圖仿真時,我們主要關心的是輸入端口,在該實驗的輸入信號有clk,rst_n兩個,所以我們只用對這兩個信號賦值,讓其產生激勵,仿真代碼如下:
`timescale 1ns/1ns module smg_drv_tb;reg clk ;reg rst_n ; initial beginclk = 0;rst_n=0;#1000rst_n=1; end always #10 clk=~clk; smg_drv Usmg_drv(.clk (clk),.rst_n (rst_n),.smg_bit (),.smg_seg ()); endmodule6.Modelsim仿真
這個例程非常簡單,只用了一條語句,所以不需要仿真驗證。但是為了給大家演示一個完整的開發流程,這個實驗我們也新建一個仿真工程,從最簡單的一個代碼開始教大家如何編寫仿真激勵文件以及如何使用Modelsim軟件進行仿真。將第三步編寫的源碼和第四步編寫的仿真測試激勵文件一起加入到Modelsim仿真工程中,即可進行仿真觀察波形。
 Modelsim仿真一般有兩種方法:
圖形化界面仿真,即所有的操作都是在Modelsim軟件界面上來完成,該方式的優點是,簡單易學,適用于簡單的項目,缺點是操作步驟繁瑣。
批處理仿真,這種方式在仿真前需要編寫相應的腳本文件,該方式的優點是,一鍵即可完成仿真,省時省力,缺點是前期需要編寫腳本文件。為了讓大家所學的能夠很快的應用到工程實踐,僅僅第一個實驗和第二個實驗,采用圖形化界面仿真,后面的實驗均采用批處理方式仿真。為了更貼近工程實際,我們采用批處理方式仿真。仿真出的波形如下圖所示:
 
7.對比波形圖
將第二步繪制的理論波形圖與第六步Modelsim仿真出來的波形圖進行對比,結果一致,說明我們的邏輯設計是正確的。如果發現比對結果不一致,就需要找到不一致的原因,最終要保證對比結果一致。
 通過對比,理論波形與仿真波形一致,說明功能符合設計要求。
8.編譯綜合
9.綁定管腳
當工程編譯成功后,即可進行管腳分配(需要參考開發板的原理圖)。我們店鋪的開發板和模塊在PCB板上均標注了信號名,在綁定管腳時也可以直接參照實物的連接關系。
 
 管腳映射關系如下所示:
 
10.再次編譯綜合
11 下載SOF文件
再次編譯綜合成功后便可以將生成的SOF文件下載到開發板
 
 
 下載成功后,便可以觀察到開發板上的實驗現象,如果實驗現象與設計需求相符,那說明我們的設計是沒有問題的,即可進行下一步固化JIC文件操作
12 生成并固化JIC文件
FPGA有一個特性,就是掉電后配置信息會丟失,所以我們需要將配置信息存儲在配置芯片(FLASH)中,待開發板上電后,FPGA便會讀取配置芯片中的配置信息,這樣開發板掉電再上電后同樣可正常工作。要將程序固化到配置芯片,需要先生成JIC文件。SOF文件轉換成JIC文件步驟如下:
12.1 file–>Convert Programming File…
12.2 選擇JIC文件以及配置芯片的型號,FPGA的型號
標號1:選擇生成文件的格式,我們選擇JIC文件
 標號2:選擇配置芯片的型號,我們選擇EPCS16
 標號3:修改生成JIC文件的名字以及存放路徑
 標號4:鼠標左鍵點擊Flash Loader
 標號5:選擇FPGA的型號,我們開發板用的是EP4CE6F17C8這款FPGA,所以我們也應該選這個型號,如下圖所示:
 
12.3 選擇SOF文件
 標號1:鼠標左鍵點擊SOF Data
 標號2:添加SOF文件,選中我們工程生成的SOF文件,如下圖:
 
12.3 生成JIC文件
 到此,JIC文件生成好,可以進行固化操作了。
12.4 固化JIC文件
 固化好以后,掉電程序也不會丟失了!
實驗現象
與設計需求吻合,設計完成!
總結
以上是生活随笔為你收集整理的【小月电子】ALTERA FPGA开发板系统学习教程-LESSON5数码管动态显示的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java int short区别_Jav
 - 下一篇: instant-ngp总结