在電子系統中,通常都需要有輸出設備來(lái)輸出或顯示一定的信息,以指示當前系統運行的狀態(tài)。在以單片機和ARM為主的電子系統中,液晶屏是理想的輸出設備。而FPGA則因為其獨特的硬件結構,如果用RTL級電路來(lái)驅動(dòng)彩色液晶屏來(lái)顯示一定的數據,勢必是非常不劃算的選擇,而且驅動(dòng)也極為復雜。數碼管作為一種能夠直觀(guān)顯示一定數據信息的輸出設備,具有驅動(dòng)簡(jiǎn)單,顯示直觀(guān)的特點(diǎn),尤其適合作為FPGA系統的輸出設備。本節,小梅哥就將和大家一起進(jìn)行數碼管驅動(dòng)的開(kāi)發(fā)。 一、 實(shí)驗目的 實(shí)現6位7段數碼管的驅動(dòng),待顯示數據以BCD格式輸入。數碼管刷新時(shí)鐘為1KHz。實(shí)驗使用了4個(gè)獨立按鍵作為輸入,通過(guò)按鍵來(lái)改變需要數碼管顯示的數據,以驗證數碼管驅動(dòng)的正確性,同時(shí)也可檢驗獨立按鍵消抖模塊的可靠性。 二、 實(shí)驗原理 數碼管所謂的動(dòng)態(tài)掃描,就是利用人眼的視覺(jué)暫留特性,在人眼能分辨的變化速度以外,快速分時(shí)的點(diǎn)亮各個(gè)數碼管對應的段。因為分別點(diǎn)亮所有數碼管一次所用時(shí)間小于人眼的視覺(jué)暫留,因此,在人們眼里看來(lái),這些數碼管都是同時(shí)持續點(diǎn)亮的,并不會(huì )有閃爍的感覺(jué)。圖2-1 數碼管實(shí)物圖 關(guān)于數碼管的具體原理,請大家網(wǎng)上查閱,小梅哥一個(gè)人精力有限,沒(méi)辦法在這里從最低層的原理給大家一步一步講起,如果大家有不明白的,請自行百度。這里小梅哥就用最簡(jiǎn)單粗暴的方式給大家簡(jiǎn)單介紹一下。 圖2-2 數碼管簡(jiǎn)單等效電路 上圖為3位7段數碼管的等效電路圖,在這個(gè)圖中,可以明顯的看到24個(gè)發(fā)光二極管被分為了三組,每一組的8個(gè)發(fā)光二極管正極被接在了一起,通過(guò)一個(gè)三極管與VCC相連。三極管的基極連接到了FPGA的IO上,因此,只需要FPGA對應的IO上給出低電平,三極管便會(huì )導通。而三組LED中所有的相同編號的LED的負極被連接在了一起,并接到了FPGA的IO上。如果我們希望將最左邊一組的led0、led5、led7三個(gè)編號的led燈點(diǎn)亮,其它led不亮,則只需要給Q0的基極(sel0)連接上低電平,并將led0、led5、led7的負極(a、f、h)連接上低電平,其它所有端口都輸出高電平,則最左邊一組的對應的三個(gè)led燈就會(huì )被點(diǎn)亮,而其它led則會(huì )處于熄滅狀態(tài)。 假如我們需要在三秒時(shí)間內,完成以下三次操作:第一次操作,點(diǎn)亮最左邊一組led燈的led0、led5、led7;第二次操作,點(diǎn)亮中間一組led燈的led1、led2、led3;第三次操作,點(diǎn)亮最右邊一組led燈的led2、led4、led6;那么我們只需要按照如下表格中列出的真值表操作即可:按照以上表格,我們就能知道該如何操作了,只需要在不同的時(shí)間給各個(gè)IO不同的電平,便能實(shí)現我們想要的亮滅組合。以上我們是以1秒為單位進(jìn)行led組的切換的,假如我們將切換速度加快,變?yōu)?font face="Calibri">1毫秒一切換,會(huì )是什么情況呢?在1毫秒一切換的速度下,完成所有操作所需時(shí)間為3ms,遠遠超出了我們人眼所能辨識的變化速度范圍。如果我們讓以上三個(gè)操作永遠循環(huán)的進(jìn)行下去,那么我們將看見(jiàn)三組led燈中,我們點(diǎn)亮的那幾個(gè)led是同時(shí)且一直處于亮著(zhù)的狀態(tài)的,這便是動(dòng)態(tài)掃描的原理,假如我們把每個(gè)led做成一個(gè)長(cháng)條型的,并按照如下形狀擺放,便就是我們常見(jiàn)的數碼管了。 圖2-3 數碼管段分布 一、 硬件設計 圖2-2只是一個(gè)為了講述數碼管原理簡(jiǎn)化了的電路模型,常見(jiàn)的數碼管電路結構如下圖所示: ![]() 圖3-1 數碼管典型電路 在這個(gè)圖中,共有6位數碼管,每個(gè)數碼管的正極被接在一個(gè)驅動(dòng)三極管上,三極管的基極連接到三八譯碼器的Y端,則FPGA只需要三個(gè)引腳就可最多控制8個(gè)數碼管的位選。數碼管的段選在串接了470歐姆的電阻后與FPGA的IO相連。這里470歐姆的電阻主要起到限流的作用,保證流過(guò)數碼管的電流在正常范圍內。 一、 架構設計 本實(shí)驗由總共四個(gè)模塊組成,分別為數碼管驅動(dòng)模塊、獨立按鍵檢測模塊、控制模塊和頂層模塊,其架構如下: ![]() 圖4-1 led實(shí)驗模塊組織結構圖 由圖可知本實(shí)驗有1個(gè)輸出端口,對應驅動(dòng)了38譯碼器的三個(gè)選擇端和數碼管的8個(gè)段選腳。6個(gè)輸入端口,對應了4個(gè)獨立按鍵輸入和一個(gè)時(shí)鐘輸入以及一個(gè)復位輸入。詳細端口名及其意義如下 ![]() 表4-1 獨立按鍵檢測實(shí)驗端口說(shuō)明 因為存在模塊間的連接,因此有部分內部信號,下表為內部信號的名稱(chēng)和功能說(shuō)明 ![]() 表4-2 獨立按鍵檢測實(shí)驗內部信號說(shuō)明 一、 代碼組織方式 本實(shí)驗中,數碼管的驅動(dòng)采用了組合邏輯譯碼的方式進(jìn)行,具體將在代碼解讀時(shí)講解。 實(shí)驗中還設計了一個(gè)控制器,該控制器主要通過(guò)讀取按鍵信息來(lái)改變待數碼管待顯示的數據內容。 按鍵檢測部分使用前一節開(kāi)發(fā)的獨立按鍵的驅動(dòng),因此這里不進(jìn)行過(guò)多的分析介紹。 二、 關(guān)鍵代碼解讀 因為數碼管屬于低速設備,其正常的掃描頻率為500~10KHz,掃描頻率太快,會(huì )導致系統功耗增加,顯示效果變暗。掃描頻率太慢,會(huì )有明顯的閃爍感。本實(shí)驗通過(guò)調試觀(guān)察,選擇以1KHz作為掃描頻率,實(shí)際顯示效果非常好。 因此本實(shí)驗首先就需要產(chǎn)生一個(gè)1KHz的掃描時(shí)鐘,該時(shí)鐘由系統時(shí)鐘分頻得到。產(chǎn)生1KHz掃描時(shí)鐘的代碼如下:
[color=rgb(51, 102, 153) !important]復制代碼 其中,定義了一個(gè)全局參數system_clk,該參數為Clk的頻率,不同的時(shí)鐘頻率,只需要更改該參數,就可改變分頻計數器的最大計數值,以保證1KHz分頻的精準性。 在驅動(dòng)中,數碼管的位選以?huà)呙钑r(shí)鐘的速率進(jìn)行切換,因為只有6位數碼管,因此當位選計數到6-1后必須清零從頭開(kāi)始計數。相關(guān)代碼如下: //位選信號控制 always@(posedgeclk_1K or negedge Rst_n) if(!Rst_n)sel_r<=3'd0; elseif(sel_r == 3'd5) sel_r<=3'd0; else sel_r<=sel_r+1'b1; 每個(gè)數碼管需要顯示的內容都不相同,由Data中相應的位指定,Data中各位與數碼管的位對應關(guān)系如下: 因此需要從Data中將每個(gè)數碼管被選中時(shí)需要顯示的數據提取出來(lái),提取數據的代碼如下所示:
[color=rgb(51, 102, 153) !important]復制代碼 因為提取出來(lái)的數據還是BCD碼的形式,還需要將BCD碼對應的數據翻譯成為數碼管顯示對應字符時(shí)應該點(diǎn)亮或熄滅的對應的LED的控制信號,因此必須還有一個(gè)BCD碼譯碼的過(guò)程,該過(guò)程代碼如下所示:
[color=rgb(51, 102, 153) !important]復制代碼 最后,需要將位選和段選信號輸出: assignDig_Led_seg = seg_r; assignDig_Led_sel = sel_r; 控制部分相對簡(jiǎn)單,只需要根據對應的 按鍵信息,給待顯示的數據加上一個(gè)對應的值,該部分代碼如下所示: always @(posedge Clk or negedge Rst_n) if(!Rst_n) Dig_Led_Data<= 24'd0; elseif(Key_Flag) begin case(Key_Value) 4'b0001: Dig_Led_Data<= Dig_Led_Data + 23'd1; 4'b0010: Dig_Led_Data<= Dig_Led_Data + 23'd100; 4'b0100: Dig_Led_Data<= Dig_Led_Data + 23'd10000; 4'b1000: Dig_Led_Data<= Dig_Led_Data + 23'd100000; default: Dig_Led_Data<= Dig_Led_Data; endcase end 一、 測試平臺設計 本實(shí)驗主要對數碼管驅動(dòng)引腳的狀態(tài)與預期進(jìn)行比較和分析,通過(guò)仿真,驗證設計的正確性和合理性。數碼管驅動(dòng)模塊的testbench如下所示: `timescale 1ns/1ns module DIG_LED_DRIVE_tb; reg [23:0]data; reg clk; reg rst_n; wire [7:0]seg; wire [2:0]sel; DIG_LED_DRIVE DIG_LED_DRIVE_inst1( .Data(data), .Clk(clk), .Rst_n(rst_n), .Dig_Led_seg(seg), .Dig_Led_sel(sel) ); initial begin data = 0; clk = 1; rst_n = 0; #200; rst_n = 1; data = 24'h012345; #10000; data = 24'h518918; #10000; data = 24'h543210; #10000; $stop; end always #10 clk = ~clk; endmodule 每隔一段時(shí)間,更換數碼管的Data輸入數據,觀(guān)察數碼管的輸出是否正確。 一、 仿真分析 如有任何疑問(wèn),歡迎加入芯航線(xiàn)FPGA學(xué)習支持群(472607506)進(jìn)行討論 |