FPGA入門:數(shù)碼管靜態(tài)顯示原理與實(shí)現(xiàn)
一、 數(shù)碼管簡(jiǎn)介
數(shù)碼管是一種常見的顯示器件,廣泛應(yīng)用于數(shù)字時(shí)鐘、儀器儀表等設(shè)備中。它由多個(gè)發(fā)光二極管(LED)組成,通過點(diǎn)亮特定的LED段來顯示數(shù)字(0-9)或部分字母(A-F)。最常見的類型是七段數(shù)碼管,其包含a、b、c、d、e、f、g七個(gè)發(fā)光段以及一個(gè)小數(shù)點(diǎn)dp段,共8個(gè)控制引腳。
二、 靜態(tài)顯示原理
靜態(tài)顯示是指每個(gè)數(shù)碼管的每一個(gè)段碼都由一個(gè)獨(dú)立的I/O端口(或譯碼器輸出)進(jìn)行驅(qū)動(dòng)。當(dāng)一個(gè)數(shù)碼管需要穩(wěn)定地顯示一個(gè)數(shù)字時(shí),F(xiàn)PGA需要持續(xù)地向其對(duì)應(yīng)的段碼引腳輸出固定的高電平或低電平(取決于數(shù)碼管是共陽(yáng)極還是共陰極),以維持其點(diǎn)亮狀態(tài),直到需要改變顯示內(nèi)容為止。
對(duì)于單個(gè)數(shù)碼管,靜態(tài)顯示的實(shí)現(xiàn)非常簡(jiǎn)單直接,無需復(fù)雜的動(dòng)態(tài)掃描邏輯。其核心步驟是:
- 確定數(shù)碼管類型:共陽(yáng)極數(shù)碼管的公共端接高電平,段碼端輸入低電平來點(diǎn)亮對(duì)應(yīng)的段;共陰極數(shù)碼管的公共端接低電平,段碼端輸入高電平來點(diǎn)亮。
- 創(chuàng)建段碼表(真值表):根據(jù)要顯示的數(shù)字(0-9),確定需要點(diǎn)亮的段(a-g, dp),并將其編碼成FPGA I/O口能夠輸出的二進(jìn)制值。例如,對(duì)于一個(gè)共陰極數(shù)碼管,要顯示數(shù)字“0”,則需要點(diǎn)亮a, b, c, d, e, f段(g段和dp段熄滅),對(duì)應(yīng)的8位二進(jìn)制碼可能是
8'b0011_1111(假設(shè)a段對(duì)應(yīng)最低位)。 - FPGA引腳分配與編碼:在FPGA開發(fā)環(huán)境中,將設(shè)計(jì)好的段碼輸出信號(hào)分配到實(shí)際的硬件引腳上,這些引腳通過限流電阻連接到數(shù)碼管的段碼引腳。
三、 FPGA實(shí)現(xiàn)步驟(以Verilog HDL為例)
假設(shè)我們的目標(biāo)是在一個(gè)共陰極數(shù)碼管上靜態(tài)顯示數(shù)字“5”。
1. 模塊定義:
`verilog
module seg_static(
input wire clk, // 系統(tǒng)時(shí)鐘(雖然靜態(tài)顯示不一定需要時(shí)鐘,但通常引入以便于擴(kuò)展)
output reg [7:0] seg // 數(shù)碼管段碼輸出,[7:0]分別對(duì)應(yīng) dp, g, f, e, d, c, b, a
);
`
2. 段碼編碼:
我們需要一個(gè)查找表(LUT),將數(shù)字值映射到對(duì)應(yīng)的段碼。這里我們直接輸出固定數(shù)字“5”的編碼。對(duì)于共陰極數(shù)碼管,顯示“5”需要點(diǎn)亮a, f, g, c, d段。假設(shè)我們的位序是 seg[0]=a, seg[1]=b, ..., seg[6]=g, seg[7]=dp,那么“5”的段碼為 8'b0110_1101(其中1表示點(diǎn)亮,0表示熄滅)。
3. 邏輯實(shí)現(xiàn):
`verilog
// 將數(shù)字“5”的段碼常量賦值給輸出端口
always @(posedge clk) begin
seg <= 8'b01101101; // 這是數(shù)字5的段碼,具體編碼需根據(jù)硬件連接順序調(diào)整
end
`
實(shí)際上,對(duì)于純粹的靜態(tài)顯示,甚至可以不使用時(shí)鐘,直接使用連續(xù)賦值語(yǔ)句:assign seg = 8'b0110</em>1101;。使用時(shí)鐘觸發(fā)器(always @(posedge clk))是為了代碼風(fēng)格的一致性和未來擴(kuò)展為動(dòng)態(tài)顯示或顯示內(nèi)容可變時(shí)更容易修改。
4. 引腳約束:
在FPGA廠商的約束文件(如Xilinx的XDC文件或Intel的QSF文件)中,將 seg[7:0] 信號(hào)映射到實(shí)際連接數(shù)碼管段的FPGA引腳上。
四、 擴(kuò)展與注意事項(xiàng)
- 多位數(shù)碼管靜態(tài)顯示:如果系統(tǒng)中有多個(gè)數(shù)碼管需要顯示不同內(nèi)容,采用靜態(tài)顯示意味著每個(gè)數(shù)碼管的每個(gè)段都需要一個(gè)獨(dú)立的I/O引腳,這會(huì)導(dǎo)致I/O資源消耗巨大。例如,4個(gè)8段數(shù)碼管需要4*8=32個(gè)I/O。因此,靜態(tài)顯示通常只用于單個(gè)或極少數(shù)碼管的場(chǎng)合。
- 限流電阻:為了防止過電流損壞LED段,必須在FPGA引腳和數(shù)碼管段碼引腳之間串聯(lián)限流電阻(通常為100Ω至1kΩ)。
- 亮度與功耗:靜態(tài)顯示時(shí),點(diǎn)亮的LED段持續(xù)導(dǎo)通,亮度穩(wěn)定,但相比動(dòng)態(tài)掃描方式,其功耗可能更高(尤其是多位數(shù)碼管時(shí))。
- 從靜態(tài)到動(dòng)態(tài):當(dāng)需要驅(qū)動(dòng)多位數(shù)碼管時(shí),更常用的方法是動(dòng)態(tài)掃描顯示。它利用人眼的視覺暫留效應(yīng),通過快速輪流點(diǎn)亮各個(gè)數(shù)碼管,并同步改變段碼數(shù)據(jù),從而用較少的I/O引腳(n個(gè)公共端+8個(gè)段碼端)實(shí)現(xiàn)n位數(shù)碼管的顯示。靜態(tài)顯示是理解這一更復(fù)雜技術(shù)的重要基礎(chǔ)。
五、
數(shù)碼管靜態(tài)顯示是FPGA入門學(xué)習(xí)中的一個(gè)經(jīng)典實(shí)踐項(xiàng)目。它幫助初學(xué)者理解數(shù)字系統(tǒng)的基本輸出控制、二進(jìn)制編碼、硬件描述語(yǔ)言對(duì)硬件行為的建模,以及FPGA引腳分配的全流程。通過成功點(diǎn)亮一個(gè)數(shù)碼管并顯示指定數(shù)字,可以建立起操作FPGA外部設(shè)備的信心,為后續(xù)學(xué)習(xí)更復(fù)雜的接口和時(shí)序邏輯設(shè)計(jì)打下堅(jiān)實(shí)基礎(chǔ)。
動(dòng)手建議:在完成單個(gè)數(shù)碼管靜態(tài)顯示后,可以嘗試修改代碼,通過撥碼開關(guān)或按鍵輸入來改變顯示的數(shù)字,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的可控顯示,這將涉及組合邏輯和輸入接口的學(xué)習(xí)。