摘 要:實現了基于FPGA硬件及VHDL語言設計的LED點陣漢字滾動顯示,可通過按鍵選擇,控制其滾動方式:左移或者右移及上移或者下移等。闡述了LED點陣顯示漢字的原理,給出了點陣漢字滾動顯示控制器的原理圖、部分VHDL源程序及時序仿真圖并進行了詳細的分析,提出了系統擴展成實現16×16點陣漢字滾動的改動思路。
關鍵詞:FPGA; VHDL語言; EDA技術; LED點陣
中圖分類號:TN949.16 文獻標識碼:B
文章編號: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 引 言
現代文明的一個顯著特征是城市中隨處可見的五顏六色的廣告宣傳,其中大多都是由LED點陣制作的漢字或圖形廣告,廣泛應用在銀行、醫院、酒店、火車站、體育場館等各種公共場所。
漢字滾動顯示器的傳統設計方法是用單片機來控制的,雖然單片機方案具有價格低廉,程序編程靈活等特點,但由于單片機硬件資源的限制,未來對設計的變更和升級,總是要付出較多研發經費和較長投放市場周期的代價[1-2],甚至有可能需要重新設計。況且,在以顯示為主的系統中,單片機的運算和控制等主要功能的利用率很低,單片機的優勢得不到發揮,相當于很大的資源浪費[3]。
采用EDA技術的自頂向下的模塊化設計方法,借助相關開發軟件,例如Qualtus Ⅱ軟件,將硬件描述語言——VHDL程序固化于具有豐富I/O口、內部邏輯和連線資源的FPGA(現場可編程門陣列)中。該技術具有系統設計效率高、集成度好、保密性強、易于修改、易于實現等優點,成為當今數字系統設計主流技術[4-6]。此方式所制作的LED點陣控制器,由于是純硬件行為,具有速度快、可靠性高、抗干擾能力強、開發周期短等顯著優點。
1 EDA點陣顯示漢字原理
以8×8的LED點陣為例,8×8的LED點陣是由64個發光二極管按矩陣形式排列而成,每一行上的發光管有一個公共的陽極(或陰極),每一列上的發光管有一個公共的陰極(或陽極),一般按動態掃描方式顯示漢字或圖形。掃描分為點掃描、行掃描和列掃描[7]三種方式。行掃描需要按行抽取字型碼,列掃描則需要按列抽取字型碼。為滿足視覺暫留要求,若使用點掃描方式,其掃描頻率必須大于16×64=1 024 Hz,周期小于1 ms。若使用行或列掃描,則頻率必須大于16×8=128 Hz,周期小于7.8 ms[8]。由于所用實驗板上提供有1 kHz的時鐘,本例設計中利用該時鐘進行掃描,使每行掃描時間為1 ms,實驗結果顯示亮度合適。現以行掃描為例簡單說明動態掃描顯示的原理。圖1給出漢字“熱”在點陣為列共陽時的行字模。工作時先將要掃描行的點陣字模從各列上輸出,再讓譯碼器選中(掃描)該行,使本行得以顯示,接著再送下一行數據,再使下一行有效,直到8行全被掃描一遍。至此,一幅完整的文字信息就顯現出來,然后再反復掃描這8行直至顯示新的信息。以下設計采用行掃描方式實現滾動顯示。
2 硬件原理圖
整個電路由五大部分組成:時鐘計數模塊GEL CLK,存儲漢字字模的ROM模塊ROMZI,數據分配器模塊MUX,移位模塊YW及顯示模塊XIANSHI。時鐘計數模塊用于產生整個電路所需要的時鐘及其對時鐘的計數值,例如:移位時鐘CLK YW,移位計數器CNT YW,字計數器CNT WORD,顯示掃描計數器CNT SM。 ROMZI模塊是由Qualtus Ⅱ中的LPM 1PORT ROM定制成,用來存儲8個待顯示的漢字。MUX模塊用于在掃描時鐘及掃描計數器的作用下,從 ROM中讀出一個漢字的8個行字模信息,送給移位模塊YW,YW模塊在移位時鐘及移位計數器作用下,根據SELECT信號選擇對讀出的字模信息,進行相應的移位(左移、右移、上移、下移)后,最后送顯示模塊DISP驅動LED點陣顯示漢字。原理圖如圖2所示。
圖1 漢字的像素點圖
圖2 點陣控制器原理圖
3 模塊設計及時序仿真
3.1 時鐘計數產生模塊
時鐘計數產生模塊由1 kHz的輸入時鐘為基準,進行17位的循環計數CNT[16..0]。該時鐘,既是動態掃描顯示的時鐘,也是從ROM中取一個字8個字模的時鐘,對之進行的3位循環計數作為掃描顯示計數器和取一個字的字型碼計數器。CNT[16..0]中的CNT[ 9] 是對該時鐘的1 024分頻,將其作為移位時鐘CNT YW,周期約為1 s。CNT[13..10]作為4位的移位計數器,是對移位時鐘CLK YW的計數,也是對移位位數的統計。16個狀態使一個漢字逐列移進點陣,又逐列移出。每經過16個移位時鐘,將會顯示完一個漢字。CNT[16..14]作為3位的取字計數器。CNT[16..14]CNT[2..0]作為ROM地址發生器。
3.2 ROMZI模塊
利用LPM參數化模塊庫中單口ROM,利用Qualtus Ⅱ中的MegaWizard Plug-In Manager定制而成,定制前首先要制作LPM ROM初始化文件,其中存儲待顯示漢字的字模數據,然后按照LPM MegaWizard Plug-In Manager的向導提示,結合設計要求進行定制[10]。
圖3為所定制ROM中的初始化漢字“元旦生日開心快樂”的字型碼。數據分配模塊MUX要求能在8個時鐘作用下,從ROM中讀出一行(一個漢字的8個字型碼)分別送到數據分配器中的WL1~WL8輸出端。圖4為數據分配模塊在掃描時鐘作用下讀取的字模數據,比較圖3和圖4可知,仿真結果正確,能滿足題目要求。
圖3 ROM中存儲字模數據
圖4 數據分配模塊的時序分析波形圖
3.3 移位模塊YW
移位模塊YW是整個設計的核心,行掃描實現左移,是通過每來一個移位時鐘,將每一行的字模按位左移一位,掃描時鐘到來時送出移位后的新字模。通過8次移位,可將一個漢字移出點陣平面,按類似的道理,也可以將一個漢字經8次移位后移進點陣平面。本例(圖2)中,CNT YW為移位時鐘的計數值,以WL1~WL8為欲顯示漢字的原始字模,L10~L80為移位后從列上送出的8行顯示字模信息,LL1~LL8為8個原始字模信息未送出位的暫存信號。設計中需要16個移位時鐘,通過前8個時鐘將WL1~WL8字模移進LED點陣平面,再經后8個時鐘,將漢字又一位一位地移出。移位設計參考文獻[9]中有關移位寄存器的設計,分計數值為“0000”和非“0000”兩部分處理,對第一行字模的處理為:
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
其他行可按相同方法處理,具體參見如下的程序:
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;
右移處理方法與上面左移相反,如對第一行可按如下方法處理:
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;
上移時的部分程序按以下思路編制:L10~L70在CNT YW為初態“0000”時,各信號均賦值X“00”,非初態時,均進行上移一位。即:L10<=L20;L20<=L30;…;L60<=L70;L70<=L80;對于L80,在漢字移進LED過程中即前8個狀態各移進一個新行,在移出LED即后8個狀態時,都補進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設計
顯示模塊DISP是以CNT SM為掃描計數器,是對1 kHz進行三位循環計數,由前述的時鐘計數產生模塊產生,WL1~WL8為待送出顯示的8個8位字型碼,由前述的移位模塊YW提供;SW[7..0]為行掃描輸出信號,連接至點陣的8個行;DATA[7..0]為行掃描時對應的列輸出字型碼,對外連至點陣的8列。 該模塊參考文獻[10]中數碼管動態顯示程序進行設計如下:
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 硬件實現
上述各模塊分別在Qualtus Ⅱ中通過了仿真驗證,最后對整體設計進行了硬件驗證。將設計載入KH31001開發板的CycloneⅠ系列EP1C6Q240C8 FPGA器件中,實驗證明漢字滾動顯示掃描情況均正常,能夠按照預想進行移位顯示,這說明FPGA的內核硬件工作良好,可以正確地實現所要求的設計功能。
5 系統擴展
本文是針對8×8點陣設計,故每次取8個字形碼,如果是16×16點陣,將RONZI中存儲的字形碼改為16位,數據線改為16位,一個漢字需要16個16位的字形碼,數據分配模塊MUX、移位模塊YW、顯示模塊DISP,均要將輸入輸出數據中的原來的8位改成相應的16位。掃描及取字型碼計數器CNT SM應改為CNT計數器的低4位。一個16×16點陣漢字的移進移出共需32個狀態,由5位的計數器提供。如用CNT[16..0]中的14~10位作為該計數器,這可在時鐘計數器產生單元CLK GE中應做相應修改,字計數器CNT WORD按照每取16個字進行加1統計。顯示DISP部分的譯碼器要由3-8譯碼改為4-16譯碼。顯示的漢字信息越多,ROM的地址線位數越多,字計數器CNT WORD應在時鐘計數器產生單元GE CLK中,將相應的計數器位數擴展,由CNT計數器的最高位到位15來承擔。若還是8個漢字,計數器應為CNT[17..0],CNT[17..15]為字計數器;若為16個漢字,計數器應為CNT[18..0],CNT[18..15]為字計數器,…,依次類推。
6 結 語
本文在KH31001開發板上實現了基于Altera 公司的Cyclone Ⅰ系列FPGA器件EP1C6Q240C8硬件及VHDL硬件描述語言設計的LED點陣漢字滾動顯示,能在8×8點陣上滾動顯示“元旦生日開心快樂”8個漢字。文中從 LED點陣顯示漢字的原理闡述出發,給出了點陣漢字滾動顯示控制器的原理圖,部分模塊的VHDL源程序及時序仿真圖,并能由按鍵選擇其滾動方式:左移、右移、上移、下移等,給出了系統擴展成16×16點陣漢字滾動的改動思路。從文中描述的系統擴展方案中看出,當系統顯示字符個數變化時,只需對控制邏輯和連接關系做適當的修改,再將修改完成的程序下載到器件即可,顯然,系統的維護和修改是極其方便和容易的,本文對同類設計也具有一定的參考價值。
參考文獻
[1]王廣軍,鄧記才,畢立恒.CPLD在LED點陣列滾動字符顯示中的應用[J].自動化技術與應用,2007(7):94-96.
[2]付永慶,張林.用EDA設計LED漢字滾動顯示器[J].電子產品世界,2001(13):29-30.
[3]呂常智,范迪.基于CPLD的LED點陣顯示控制器[J].微計算機信息,2006,22(32):218-219.
[4]袁海林.基于FPGA的LED點陣顯示系統的設計[J].信息技術,2007,31(8):11-13,93.
[5]曾繁泰,李冰,李曉林.EDA工程概論[M].北京:清華大學出版社,2002.
[6]褚振勇,翁木云.FPGA設計及應用[M].西安:西安電子科技大學出版社,2002.
[7]唐龍.基于FPGA的LED點陣顯示字符設計[J].科技風,2008(4):47-49.
[8]龍安國.基于單片機的LED漢字顯示屏設計與制作[J].現代電子技術,2007,30(13):186-188.
[9]潘松,黃繼業.EDA技術實用教程[M].北京:科學出版社,2002.
[10]潘松,黃繼業.EDA技術與VHDL[M].北京:清華大學出版社,2005.