摘 要:實(shí)現(xiàn)了基于FPGA硬件及VHDL語(yǔ)言設(shè)計(jì)的LED點(diǎn)陣漢字滾動(dòng)顯示,可通過(guò)按鍵選擇,控制其滾動(dòng)方式:左移或者右移及上移或者下移等。闡述了LED點(diǎn)陣顯示漢字的原理,給出了點(diǎn)陣漢字滾動(dòng)顯示控制器的原理圖、部分VHDL源程序及時(shí)序仿真圖并進(jìn)行了詳細(xì)的分析,提出了系統(tǒng)擴(kuò)展成實(shí)現(xiàn)16×16點(diǎn)陣漢字滾動(dòng)的改動(dòng)思路。
關(guān)鍵詞:FPGA; VHDL語(yǔ)言; EDA技術(shù); LED點(diǎn)陣
中圖分類號(hào):TN949.16 文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004-373X(2010)13-0152-04
Design of LED Chinese Characters Scrolling Display Based on FPGA Control
SUN Zhen-hua, TANG Zheng-bing
(Xi’an Aerotechnical College, Xi’an 710077, China)
Abstract: The LED dot-matrix Chinese characters scrolling display was designed based on FPGA hardware and VHDL language, which can control its rolling way by the key selection(left shift, right shift, move up or move down). The principle of LED dot-matrix display Chinese characters, the schematic diagram of dot-matrix Chinese characters scrolling display controller are proposed, the VHDL source code and timing simulation map are analyzed in a detail. The ideas of expanding the system to realize a 16x16 dot-matrix Chinese characters scrolling.
Keywords: FPGA; VHDL language; EDA technology; LED dot-matrix
0 引 言
現(xiàn)代文明的一個(gè)顯著特征是城市中隨處可見(jiàn)的五顏六色的廣告宣傳,其中大多都是由LED點(diǎn)陣制作的漢字或圖形廣告,廣泛應(yīng)用在銀行、醫(yī)院、酒店、火車站、體育場(chǎng)館等各種公共場(chǎng)所。
漢字滾動(dòng)顯示器的傳統(tǒng)設(shè)計(jì)方法是用單片機(jī)來(lái)控制的,雖然單片機(jī)方案具有價(jià)格低廉,程序編程靈活等特點(diǎn),但由于單片機(jī)硬件資源的限制,未來(lái)對(duì)設(shè)計(jì)的變更和升級(jí),總是要付出較多研發(fā)經(jīng)費(fèi)和較長(zhǎng)投放市場(chǎng)周期的代價(jià)[1-2],甚至有可能需要重新設(shè)計(jì)。況且,在以顯示為主的系統(tǒng)中,單片機(jī)的運(yùn)算和控制等主要功能的利用率很低,單片機(jī)的優(yōu)勢(shì)得不到發(fā)揮,相當(dāng)于很大的資源浪費(fèi)[3]。
采用EDA技術(shù)的自頂向下的模塊化設(shè)計(jì)方法,借助相關(guān)開(kāi)發(fā)軟件,例如Qualtus Ⅱ軟件,將硬件描述語(yǔ)言——VHDL程序固化于具有豐富I/O口、內(nèi)部邏輯和連線資源的FPGA(現(xiàn)場(chǎng)可編程門陣列)中。該技術(shù)具有系統(tǒng)設(shè)計(jì)效率高、集成度好、保密性強(qiáng)、易于修改、易于實(shí)現(xiàn)等優(yōu)點(diǎn),成為當(dāng)今數(shù)字系統(tǒng)設(shè)計(jì)主流技術(shù)[4-6]。此方式所制作的LED點(diǎn)陣控制器,由于是純硬件行為,具有速度快、可靠性高、抗干擾能力強(qiáng)、開(kāi)發(fā)周期短等顯著優(yōu)點(diǎn)。
1 EDA點(diǎn)陣顯示漢字原理
以8×8的LED點(diǎn)陣為例,8×8的LED點(diǎn)陣是由64個(gè)發(fā)光二極管按矩陣形式排列而成,每一行上的發(fā)光管有一個(gè)公共的陽(yáng)極(或陰極),每一列上的發(fā)光管有一個(gè)公共的陰極(或陽(yáng)極),一般按動(dòng)態(tài)掃描方式顯示漢字或圖形。掃描分為點(diǎn)掃描、行掃描和列掃描[7]三種方式。行掃描需要按行抽取字型碼,列掃描則需要按列抽取字型碼。為滿足視覺(jué)暫留要求,若使用點(diǎn)掃描方式,其掃描頻率必須大于16×64=1 024 Hz,周期小于1 ms。若使用行或列掃描,則頻率必須大于16×8=128 Hz,周期小于7.8 ms[8]。由于所用實(shí)驗(yàn)板上提供有1 kHz的時(shí)鐘,本例設(shè)計(jì)中利用該時(shí)鐘進(jìn)行掃描,使每行掃描時(shí)間為1 ms,實(shí)驗(yàn)結(jié)果顯示亮度合適。現(xiàn)以行掃描為例簡(jiǎn)單說(shuō)明動(dòng)態(tài)掃描顯示的原理。圖1給出漢字“熱”在點(diǎn)陣為列共陽(yáng)時(shí)的行字模。工作時(shí)先將要掃描行的點(diǎn)陣字模從各列上輸出,再讓譯碼器選中(掃描)該行,使本行得以顯示,接著再送下一行數(shù)據(jù),再使下一行有效,直到8行全被掃描一遍。至此,一幅完整的文字信息就顯現(xiàn)出來(lái),然后再反復(fù)掃描這8行直至顯示新的信息。以下設(shè)計(jì)采用行掃描方式實(shí)現(xiàn)滾動(dòng)顯示。
2 硬件原理圖
整個(gè)電路由五大部分組成:時(shí)鐘計(jì)數(shù)模塊GEL CLK,存儲(chǔ)漢字字模的ROM模塊ROMZI,數(shù)據(jù)分配器模塊MUX,移位模塊YW及顯示模塊XIANSHI。時(shí)鐘計(jì)數(shù)模塊用于產(chǎn)生整個(gè)電路所需要的時(shí)鐘及其對(duì)時(shí)鐘的計(jì)數(shù)值,例如:移位時(shí)鐘CLK YW,移位計(jì)數(shù)器CNT YW,字計(jì)數(shù)器CNT WORD,顯示掃描計(jì)數(shù)器CNT SM。 ROMZI模塊是由Qualtus Ⅱ中的LPM 1PORT ROM定制成,用來(lái)存儲(chǔ)8個(gè)待顯示的漢字。MUX模塊用于在掃描時(shí)鐘及掃描計(jì)數(shù)器的作用下,從 ROM中讀出一個(gè)漢字的8個(gè)行字模信息,送給移位模塊YW,YW模塊在移位時(shí)鐘及移位計(jì)數(shù)器作用下,根據(jù)SELECT信號(hào)選擇對(duì)讀出的字模信息,進(jìn)行相應(yīng)的移位(左移、右移、上移、下移)后,最后送顯示模塊DISP驅(qū)動(dòng)LED點(diǎn)陣顯示漢字。原理圖如圖2所示。
圖1 漢字的像素點(diǎn)圖
圖2 點(diǎn)陣控制器原理圖
3 模塊設(shè)計(jì)及時(shí)序仿真
3.1 時(shí)鐘計(jì)數(shù)產(chǎn)生模塊
時(shí)鐘計(jì)數(shù)產(chǎn)生模塊由1 kHz的輸入時(shí)鐘為基準(zhǔn),進(jìn)行17位的循環(huán)計(jì)數(shù)CNT[16..0]。該時(shí)鐘,既是動(dòng)態(tài)掃描顯示的時(shí)鐘,也是從ROM中取一個(gè)字8個(gè)字模的時(shí)鐘,對(duì)之進(jìn)行的3位循環(huán)計(jì)數(shù)作為掃描顯示計(jì)數(shù)器和取一個(gè)字的字型碼計(jì)數(shù)器。CNT[16..0]中的CNT[ 9] 是對(duì)該時(shí)鐘的1 024分頻,將其作為移位時(shí)鐘CNT YW,周期約為1 s。CNT[13..10]作為4位的移位計(jì)數(shù)器,是對(duì)移位時(shí)鐘CLK YW的計(jì)數(shù),也是對(duì)移位位數(shù)的統(tǒng)計(jì)。16個(gè)狀態(tài)使一個(gè)漢字逐列移進(jìn)點(diǎn)陣,又逐列移出。每經(jīng)過(guò)16個(gè)移位時(shí)鐘,將會(huì)顯示完一個(gè)漢字。CNT[16..14]作為3位的取字計(jì)數(shù)器。CNT[16..14]CNT[2..0]作為ROM地址發(fā)生器。
3.2 ROMZI模塊
利用LPM參數(shù)化模塊庫(kù)中單口ROM,利用Qualtus Ⅱ中的MegaWizard Plug-In Manager定制而成,定制前首先要制作LPM ROM初始化文件,其中存儲(chǔ)待顯示漢字的字模數(shù)據(jù),然后按照LPM MegaWizard Plug-In Manager的向?qū)崾荆Y(jié)合設(shè)計(jì)要求進(jìn)行定制[10]。
圖3為所定制ROM中的初始化漢字“元旦生日開(kāi)心快樂(lè)”的字型碼。數(shù)據(jù)分配模塊MUX要求能在8個(gè)時(shí)鐘作用下,從ROM中讀出一行(一個(gè)漢字的8個(gè)字型碼)分別送到數(shù)據(jù)分配器中的WL1~WL8輸出端。圖4為數(shù)據(jù)分配模塊在掃描時(shí)鐘作用下讀取的字模數(shù)據(jù),比較圖3和圖4可知,仿真結(jié)果正確,能滿足題目要求。
圖3 ROM中存儲(chǔ)字模數(shù)據(jù)
圖4 數(shù)據(jù)分配模塊的時(shí)序分析波形圖
3.3 移位模塊YW
移位模塊YW是整個(gè)設(shè)計(jì)的核心,行掃描實(shí)現(xiàn)左移,是通過(guò)每來(lái)一個(gè)移位時(shí)鐘,將每一行的字模按位左移一位,掃描時(shí)鐘到來(lái)時(shí)送出移位后的新字模。通過(guò)8次移位,可將一個(gè)漢字移出點(diǎn)陣平面,按類似的道理,也可以將一個(gè)漢字經(jīng)8次移位后移進(jìn)點(diǎn)陣平面。本例(圖2)中,CNT YW為移位時(shí)鐘的計(jì)數(shù)值,以WL1~WL8為欲顯示漢字的原始字模,L10~L80為移位后從列上送出的8行顯示字模信息,LL1~LL8為8個(gè)原始字模信息未送出位的暫存信號(hào)。設(shè)計(jì)中需要16個(gè)移位時(shí)鐘,通過(guò)前8個(gè)時(shí)鐘將WL1~WL8字模移進(jìn)LED點(diǎn)陣平面,再經(jīng)后8個(gè)時(shí)鐘,將漢字又一位一位地移出。移位設(shè)計(jì)參考文獻(xiàn)[9]中有關(guān)移位寄存器的設(shè)計(jì),分計(jì)數(shù)值為“0000”和非“0000”兩部分處理,對(duì)第一行字模的處理為:
IF CNT YW=″0000″ THEN
L10<=″0000000″WL1(7);
LL1<=WL1(6 DOWNTO 0)′0′;
ELSE L10<=L10(6 DOWNTO 0)LL1(7);
LL1<=LL1(6 DOWNTO 0)′0′;
END IF
其他行可按相同方法處理,具體參見(jiàn)如下的程序:
IF CNT YW=″0000” THEN
L10<=″0000″WL1(7);LL1<=WL1(6 DOWNTO 0)′0′;
L20<=″0000″WL2(7);LL2<=WL1(6 DOWNTO 0) ′0′;
L30<=″0000″WL3(7);LL3<=WL1(6 DOWNTO 0) ′0′;
L40<=″0000″WL4(7);LL4<=WL1(6 DOWNTO 0) ′0′;
L50<=″0000″WL5(7);LL5<=WL1(6 DOWNTO 0) ′0′;
L60<=″0000″WL6(7);LL6<=WL1(6 DOWNTO 0) ′0′;
L70<=″0000″WL7(7);LL7<=WL1(6 DOWNTO 0) ′0′;
L80<=″0000″WL8(7);LL8<=WL8(6 DOWNTO 0) ′0′;
ELSE L10<=L10(6 DOWNTO 0)LL1(7);LL1<=LL1(6 DOWNTO 0) ′0′;
L20<=L20(6 DOWNTO0)LL2(7);LL2<=LL2(6 DOWNTO 0) ′0′;
L30<=L30(6 DOWNTO0)LL3(7);LL1<=LL3(6 DOWNTO 0) ′0′;
…
L80<= L80(6 DOWNTO 0)LL8(7);LL8<=LL8(6 DOWNTO 0) ′0′;
END IF;
右移處理方法與上面左移相反,如對(duì)第一行可按如下方法處理:
IF CNT YW=″0000″ THEN
L10<=WL1(0)″0000000″;
LL1<=′0′ WL1(7 DOWNTO 1);
ELSE L10<=LL1(0)L10(7 DOWNTO 1);LL1<=′0′LL1(7 DOWNTO 1);
END IF;
上移時(shí)的部分程序按以下思路編制:L10~L70在CNT YW為初態(tài)“0000”時(shí),各信號(hào)均賦值X“00”,非初態(tài)時(shí),均進(jìn)行上移一位。即:L10<=L20;L20<=L30;…;L60<=L70;L70<=L80;對(duì)于L80,在漢字移進(jìn)LED過(guò)程中即前8個(gè)狀態(tài)各移進(jìn)一個(gè)新行,在移出LED即后8個(gè)狀態(tài)時(shí),都補(bǔ)進(jìn)X“00”。程序如下:
IF CNT YW=″0000″ THEN
L10<=X″00″; L20<= X″00″; … L70<= X″00″;
ELSE L10<=L20;L20<=L30;L30<=L40;… L70<=L80;END IF;
IF CNT YW(3)=′0′ THEN
CASE CNT YW(2 DOWNTO 0) IS
WHEN ″000″=>L80<=WL1;WHEN ″001″ =>L80<=WL2;
…
WHEN ″110″=>L80<=WL7;WHEN ″111″ =>L80<=WL8;
WHEN OTHERS=>NULL;
END CASE;
ELSE L80<=X″00″;
END IF;
下移程序可按相反思路去編。
3.4 顯示模塊DISP設(shè)計(jì)
顯示模塊DISP是以CNT SM為掃描計(jì)數(shù)器,是對(duì)1 kHz進(jìn)行三位循環(huán)計(jì)數(shù),由前述的時(shí)鐘計(jì)數(shù)產(chǎn)生模塊產(chǎn)生,WL1~WL8為待送出顯示的8個(gè)8位字型碼,由前述的移位模塊YW提供;SW[7..0]為行掃描輸出信號(hào),連接至點(diǎn)陣的8個(gè)行;DATA[7..0]為行掃描時(shí)對(duì)應(yīng)的列輸出字型碼,對(duì)外連至點(diǎn)陣的8列。 該模塊參考文獻(xiàn)[10]中數(shù)碼管動(dòng)態(tài)顯示程序進(jìn)行設(shè)計(jì)如下:
LIBRARY IEEE;
USE IEEE.STD LOGIC 1164.ALL;
USE IEEE.STDLOGIC UNSIGNDE.ALL;
ENTITY DISP IS PORT( CNT SM:IN STD LOGIC VECTOR(2 DOWNTO 0); WL1,WL2,WL3,WL4,WL5,WL6,WL7,WL8:IN STD LOGIC VECTOR(7 DOWNTO 0);
DATA:OUT STD LOGIC VECTOR(7 DOWNTO 0);
SW:OUT STD LOGIC VECTOR(7 DOWNTO 0));
END;
ARCHITECTURE ONE OF DISP IS
BEGIN
PROCESS(CNT SM)
BEGIN
CASE CNT SM IS WHEN″000″=>SW<=″00000001″;DATA<=WL1;
WHEN″001″=>SW<=″00000010″;DATA<=WL2;
WHEN″010″=>SW<=″00000010″;DATA<=WL3;
WHEN″011″=>SW<=″00000010″;DATA<=WL4;
WHEN″100″=>SW<=″00000010″;DATA<=WL5;
WHEN″101″=>SW<=″10000000″;DATA<=WL6;
WHEN″110″=>SW<=″00000010″;DATA<=WL7;
WHEN″111″=>SW<=″00000010″;DATA<=WL8;
WHEN OTHERS=>NULL;
END CASE;
END PROCESS;
END;
4 硬件實(shí)現(xiàn)
上述各模塊分別在Qualtus Ⅱ中通過(guò)了仿真驗(yàn)證,最后對(duì)整體設(shè)計(jì)進(jìn)行了硬件驗(yàn)證。將設(shè)計(jì)載入KH31001開(kāi)發(fā)板的CycloneⅠ系列EP1C6Q240C8 FPGA器件中,實(shí)驗(yàn)證明漢字滾動(dòng)顯示掃描情況均正常,能夠按照預(yù)想進(jìn)行移位顯示,這說(shuō)明FPGA的內(nèi)核硬件工作良好,可以正確地實(shí)現(xiàn)所要求的設(shè)計(jì)功能。
5 系統(tǒng)擴(kuò)展
本文是針對(duì)8×8點(diǎn)陣設(shè)計(jì),故每次取8個(gè)字形碼,如果是16×16點(diǎn)陣,將RONZI中存儲(chǔ)的字形碼改為16位,數(shù)據(jù)線改為16位,一個(gè)漢字需要16個(gè)16位的字形碼,數(shù)據(jù)分配模塊MUX、移位模塊YW、顯示模塊DISP,均要將輸入輸出數(shù)據(jù)中的原來(lái)的8位改成相應(yīng)的16位。掃描及取字型碼計(jì)數(shù)器CNT SM應(yīng)改為CNT計(jì)數(shù)器的低4位。一個(gè)16×16點(diǎn)陣漢字的移進(jìn)移出共需32個(gè)狀態(tài),由5位的計(jì)數(shù)器提供。如用CNT[16..0]中的14~10位作為該計(jì)數(shù)器,這可在時(shí)鐘計(jì)數(shù)器產(chǎn)生單元CLK GE中應(yīng)做相應(yīng)修改,字計(jì)數(shù)器CNT WORD按照每取16個(gè)字進(jìn)行加1統(tǒng)計(jì)。顯示DISP部分的譯碼器要由3-8譯碼改為4-16譯碼。顯示的漢字信息越多,ROM的地址線位數(shù)越多,字計(jì)數(shù)器CNT WORD應(yīng)在時(shí)鐘計(jì)數(shù)器產(chǎn)生單元GE CLK中,將相應(yīng)的計(jì)數(shù)器位數(shù)擴(kuò)展,由CNT計(jì)數(shù)器的最高位到位15來(lái)承擔(dān)。若還是8個(gè)漢字,計(jì)數(shù)器應(yīng)為CNT[17..0],CNT[17..15]為字計(jì)數(shù)器;若為16個(gè)漢字,計(jì)數(shù)器應(yīng)為CNT[18..0],CNT[18..15]為字計(jì)數(shù)器,…,依次類推。
6 結(jié) 語(yǔ)
本文在KH31001開(kāi)發(fā)板上實(shí)現(xiàn)了基于Altera 公司的Cyclone Ⅰ系列FPGA器件EP1C6Q240C8硬件及VHDL硬件描述語(yǔ)言設(shè)計(jì)的LED點(diǎn)陣漢字滾動(dòng)顯示,能在8×8點(diǎn)陣上滾動(dòng)顯示“元旦生日開(kāi)心快樂(lè)”8個(gè)漢字。文中從 LED點(diǎn)陣顯示漢字的原理闡述出發(fā),給出了點(diǎn)陣漢字滾動(dòng)顯示控制器的原理圖,部分模塊的VHDL源程序及時(shí)序仿真圖,并能由按鍵選擇其滾動(dòng)方式:左移、右移、上移、下移等,給出了系統(tǒng)擴(kuò)展成16×16點(diǎn)陣漢字滾動(dòng)的改動(dòng)思路。從文中描述的系統(tǒng)擴(kuò)展方案中看出,當(dāng)系統(tǒng)顯示字符個(gè)數(shù)變化時(shí),只需對(duì)控制邏輯和連接關(guān)系做適當(dāng)?shù)男薷模賹⑿薷耐瓿傻某绦蛳螺d到器件即可,顯然,系統(tǒng)的維護(hù)和修改是極其方便和容易的,本文對(duì)同類設(shè)計(jì)也具有一定的參考價(jià)值。
參考文獻(xiàn)
[1]王廣軍,鄧記才,畢立恒.CPLD在LED點(diǎn)陣列滾動(dòng)字符顯示中的應(yīng)用[J].自動(dòng)化技術(shù)與應(yīng)用,2007(7):94-96.
[2]付永慶,張林.用EDA設(shè)計(jì)LED漢字滾動(dòng)顯示器[J].電子產(chǎn)品世界,2001(13):29-30.
[3]呂常智,范迪.基于CPLD的LED點(diǎn)陣顯示控制器[J].微計(jì)算機(jī)信息,2006,22(32):218-219.
[4]袁海林.基于FPGA的LED點(diǎn)陣顯示系統(tǒng)的設(shè)計(jì)[J].信息技術(shù),2007,31(8):11-13,93.
[5]曾繁泰,李冰,李曉林.EDA工程概論[M].北京:清華大學(xué)出版社,2002.
[6]褚振勇,翁木云.FPGA設(shè)計(jì)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002.
[7]唐龍.基于FPGA的LED點(diǎn)陣顯示字符設(shè)計(jì)[J].科技風(fēng),2008(4):47-49.
[8]龍安國(guó).基于單片機(jī)的LED漢字顯示屏設(shè)計(jì)與制作[J].現(xiàn)代電子技術(shù),2007,30(13):186-188.
[9]潘松,黃繼業(yè).EDA技術(shù)實(shí)用教程[M].北京:科學(xué)出版社,2002.
[10]潘松,黃繼業(yè).EDA技術(shù)與VHDL[M].北京:清華大學(xué)出版社,2005.