摘 要: 介紹了一種基于LabVIEW與FPGA的LED漢字顯示屏,其利用LabVIEW軟件靈活、簡(jiǎn)便地從計(jì)算機(jī)的漢字庫(kù)中提取漢字字模并轉(zhuǎn)換為供FPGA直接調(diào)用的十六進(jìn)制字模數(shù)據(jù)。通過(guò)在LabVIEW中進(jìn)行圖像信息掃描的方式得到任意漢字的字模,然后經(jīng)串口傳遞給FPGA控制顯示漢字。該方法的字模由上位機(jī)生成,省去了建立字模庫(kù)步驟,簡(jiǎn)化了顯示過(guò)程,實(shí)用性較強(qiáng)。
關(guān)鍵詞: LabVIEW;點(diǎn)陣字庫(kù);FPGA;LED顯示
隨著嵌入式技術(shù)的發(fā)展,各類智能電子裝置日益增多。在這些電子裝置中經(jīng)常需要顯示漢字,如各類由LED點(diǎn)陣組成的電子廣告牌與液晶顯示屏,它們都是以“點(diǎn)位點(diǎn)亮”的方式顯示。因此,在顯示漢字時(shí)必須通過(guò)某些技術(shù)手段獲得反映漢字字型點(diǎn)陣數(shù)據(jù)的漢字字模。本文介紹了一種直接利用LabVIEW的圖片處理功能自動(dòng)生成字符點(diǎn)陣的方法,它比其他字模提取方法簡(jiǎn)單直觀。利用該程序無(wú)需使用專門的字庫(kù)可自動(dòng)得到各種字符的點(diǎn)陣,然后將顯示信息通過(guò)串行傳輸方式發(fā)送到FPGA,通過(guò)FPGA驅(qū)動(dòng)相應(yīng)的二極管發(fā)光顯示信息。本設(shè)計(jì)的硬件由計(jì)算機(jī)、FPGA、驅(qū)動(dòng)電路和LED顯示屏構(gòu)成。結(jié)構(gòu)圖如圖1所示。
1 基于LabVIEW的漢字字模的提取
1.1 點(diǎn)陣字庫(kù)
點(diǎn)陣字庫(kù)包括16點(diǎn)陣、24點(diǎn)陣及48點(diǎn)陣字庫(kù)等,點(diǎn)陣數(shù)目越多,漢字質(zhì)量越高,而所用存儲(chǔ)空間也就越多。點(diǎn)陣字庫(kù)用于存放各個(gè)漢字的字模,在同一字庫(kù)中,各漢字字模所占字節(jié)數(shù)相同,以便于查找和提取。對(duì)于一個(gè)n×n的點(diǎn)陣字符,其生成方法就是在一個(gè)具有n×n個(gè)小格的坐標(biāo)紙上書(shū)寫(xiě)字符,若筆畫(huà)通過(guò)某小格,該小格對(duì)應(yīng)數(shù)字1;筆畫(huà)不通過(guò),則對(duì)應(yīng)數(shù)字0。然后將該點(diǎn)陣按行或按列切分為字節(jié)后存儲(chǔ),就構(gòu)成了一個(gè)字符的點(diǎn)陣數(shù)據(jù)。
1.2 點(diǎn)陣字模的存儲(chǔ)結(jié)構(gòu)
要顯示一個(gè)漢字,就必須知道這個(gè)漢字的點(diǎn)陣字模信息,這些字模有16點(diǎn)陣、24點(diǎn)陣和32點(diǎn)陣等。目前技術(shù)開(kāi)發(fā)中常用的是16點(diǎn)陣和24點(diǎn)陣兩種。不同點(diǎn)陣漢字字體又有宋體、仿宋體、黑體、楷體之分。在計(jì)算機(jī)中,相同點(diǎn)陣、相同字體的字符存放在一個(gè)字庫(kù)中,稱為一個(gè)漢字庫(kù)文件。本文所用的16點(diǎn)陣字庫(kù)結(jié)構(gòu)采用行排列的形式,共有16行,每行16個(gè)點(diǎn),每行點(diǎn)陣存入2 B,因此,每個(gè)字符占用32 B。字節(jié)的存放順序?yàn)閺淖蟮接摇纳系较?,如圖2(a)所示。24×24點(diǎn)陣字庫(kù)則主要為了打印方便,一般采用以列為主的存儲(chǔ)方式存放字模點(diǎn)陣,如圖2(b)所示。
1.3 點(diǎn)陣字庫(kù)原理
?。?)計(jì)算區(qū)位碼
根據(jù)我國(guó)頒布的《信息交換用漢字編碼字符集——基本集》,漢字庫(kù)中收集了6 763個(gè)漢字,其中3 755個(gè)為常用漢字,其余為次常用漢字。常用漢字按漢語(yǔ)拼音的順序存放在前面,次常用漢字按偏旁部首的順序存放在最后,整個(gè)字庫(kù)分94個(gè)區(qū),每個(gè)區(qū)可存放94個(gè)漢字或符號(hào),各漢字或符號(hào)所在區(qū)即為區(qū)碼,在區(qū)中的順序號(hào)則為位碼。因而,通過(guò)區(qū)碼和位碼便可唯一地確定一個(gè)漢字或符號(hào),計(jì)算公式為:
一個(gè)漢字或符號(hào)在字庫(kù)中的順序號(hào)=94×(區(qū)碼-1)+(位碼-1)(1)
如果直接利用漢字的區(qū)位碼作為編碼存儲(chǔ),就會(huì)無(wú)法區(qū)分是漢字還是西文字符,為此,對(duì)區(qū)位碼作統(tǒng)一變換后作為漢字的存儲(chǔ)代碼,即機(jī)內(nèi)碼。機(jī)內(nèi)碼與區(qū)位碼之間的變換關(guān)系如下:
機(jī)內(nèi)碼高位字節(jié)=區(qū)碼+160
機(jī)內(nèi)碼低位字節(jié)=位碼+160(2)
對(duì)于16點(diǎn)陣字庫(kù),每個(gè)漢字字模使用32 B(16 bit×16 bit),再由式(1)和式(2)可知,一個(gè)漢字字模在16點(diǎn)陣字庫(kù)中的起始位置可由式(3)求得:
32×[(機(jī)內(nèi)碼高字節(jié)-161)×94+(機(jī)內(nèi)碼低字節(jié)-161)] (3)
由于漢字庫(kù)前15個(gè)區(qū)主要用于存放各種非漢字符號(hào),有些漢字系統(tǒng)為了不同的需要進(jìn)行了裁減,對(duì)此必須特別注意,應(yīng)根據(jù)所選字庫(kù)對(duì)式(3)進(jìn)行適當(dāng)修改。同樣,一個(gè)漢字字模在24點(diǎn)陣字庫(kù)中的起始位置應(yīng)為:
72×[(機(jī)內(nèi)碼高字節(jié)-176)×94+(機(jī)內(nèi)碼低字節(jié)-161)](4)
(2)計(jì)算漢字點(diǎn)陣數(shù)據(jù)存儲(chǔ)位置偏移量
偏移量是指字模首字節(jié)距離文件頭的相對(duì)位置。其計(jì)算原理是:求出被檢索漢字之前的漢字個(gè)數(shù),再乘每個(gè)漢字所占的字節(jié)數(shù)。1個(gè)n×n點(diǎn)陣字符所占字節(jié)數(shù)等于n×n÷8。如16×16點(diǎn)陣占32 B,其偏移量offset計(jì)算式為:
offset=(94×(區(qū)碼-1)+(位碼-1))×32(5)
?。?)移動(dòng)文件指針讀出點(diǎn)陣字模數(shù)據(jù)
打開(kāi)點(diǎn)陣字庫(kù)文件,將文件指針從文件頭向后移動(dòng)offset個(gè)字節(jié),然后使用文件讀取函數(shù)讀出字模,如使用Windows API函數(shù)。點(diǎn)陣字庫(kù)存在分辨率低和不能放大兩個(gè)致命的缺點(diǎn)。其中,分辨率低導(dǎo)致不能反映字體形狀細(xì)節(jié),也就不能反映豐富多彩的字體,可以通過(guò)提高位圖點(diǎn)數(shù)提高分辨率。相較于其他字庫(kù),點(diǎn)陣字模原理簡(jiǎn)單且使用非常容易,因此,其在大型顯示屏等戶外電子裝置顯示漢字時(shí)得到了廣泛應(yīng)用。
1.4 漢字字模提取程序
1.4.1 漢字字模提取程序的前面板
前面板是圖形化用戶界面,用于設(shè)置輸入數(shù)值和觀察輸出量,漢字字模提取程序的前面板如圖3所示,它由漢字輸入和漢字顯示等幾部分組成。只需要在漢字輸入窗口輸入一個(gè)漢字,由LED控件組成的矩陣就可以模擬真實(shí)的LED顯示元件顯示所輸入的漢字。
1.4.2 漢字字模提取程序框圖
漢字字模提取程序基本流程為:在輸入一個(gè)漢字后,得到該漢字的機(jī)內(nèi)碼,從而進(jìn)一步計(jì)算得到該漢字字模首字節(jié)在漢字庫(kù)文件HZK16中的位置,同時(shí)將一個(gè)指明漢字庫(kù)文件HZK16路徑的常量送入Open/Create/Replace File VI的file path端口。將文件HZK16打開(kāi)并得到文件的標(biāo)識(shí)號(hào)。將文件HZK16的標(biāo)識(shí)號(hào)和得到的漢字字模首字節(jié)地址分別送入Set File Position VI的refnum端口和offset端口,即指明了漢字字模在文件HZK16中的起始位置。接著將得到的refnum送入讀二進(jìn)制文件節(jié)點(diǎn)Read from Binary File VI的file端口,同時(shí)在count端口指明讀取的字節(jié)數(shù)量為32。讀二進(jìn)制文件節(jié)點(diǎn)就會(huì)從漢字庫(kù)文件HZK16中,從得到的字模起始位置開(kāi)始連續(xù)讀取32 B的數(shù)據(jù),這樣就得到了一個(gè)容量為32的數(shù)組,即輸入漢字的點(diǎn)陣字模。然后利用一個(gè)For循環(huán),將一維數(shù)組的每個(gè)十六進(jìn)制元素通過(guò)Number To Boolean Array VI轉(zhuǎn)化為布爾量,這個(gè)布爾量與應(yīng)該得到的布爾量是前后顛倒的,因此應(yīng)將轉(zhuǎn)化的布爾量數(shù)組通過(guò)Reverse 1D Array VI再一次顛倒,并通過(guò)轉(zhuǎn)化為16×16矩陣,送入前面板顯示。程序框圖如圖4所示。
2 系統(tǒng)硬件設(shè)計(jì)概述
本文需要設(shè)計(jì)的LED控制系統(tǒng)是基于NiosⅡ的嵌入式系統(tǒng),其硬件平臺(tái)體系結(jié)構(gòu)如圖5所示。
由圖5可知,該LED顯示控制系統(tǒng)大致可以分為FPGA內(nèi)部邏輯、存儲(chǔ)器模塊和外圍元件3個(gè)部分。FPGA內(nèi)部邏輯在FPGA芯片內(nèi)部實(shí)現(xiàn),核心是NiosⅡ核,它集成了Avalon總線控制器、片內(nèi)存儲(chǔ)器、內(nèi)部定時(shí)器、CPU與外圍設(shè)備的接口等,在 SoPC Builder中首要設(shè)計(jì)的就是FPGA內(nèi)部邏輯。存儲(chǔ)器模塊由外接的Flash、SRAM及SDRAM組成。由于現(xiàn)有的FPGA還不能集成大容量的存儲(chǔ)器,需要外擴(kuò)Flash及SDRAM存儲(chǔ)器。
3 控制系統(tǒng)的軟件設(shè)計(jì)
軟件程序主要由初始化、主程序、中斷程序等構(gòu)成,采用匯編語(yǔ)言編寫(xiě)。主程序用于LED顯示,其流程圖如6所示。中斷程序主要用于接收上位機(jī)傳送的字模信息,由于LabVIEW和下位機(jī)傳遞的數(shù)據(jù)是ASCII形式的,需要轉(zhuǎn)換為十六進(jìn)制數(shù)。采用中斷的方式接收數(shù)據(jù)可以提高數(shù)據(jù)傳輸?shù)臅r(shí)效性。
本文設(shè)計(jì)了基于LabVIEW和FPGA的LED漢字顯示屏。采用LabVIEW編程方法產(chǎn)生字模,通過(guò)串口傳遞給FPGA,簡(jiǎn)化了編程,節(jié)省了FPGA程序運(yùn)行時(shí)間,不但能實(shí)現(xiàn)動(dòng)態(tài)輸入,還能根據(jù)需要隨時(shí)修改需要顯示的內(nèi)容,具有較高的實(shí)用價(jià)值。而下位機(jī)系統(tǒng)主要采用了FPGA技術(shù)、SoPC技術(shù)和NiosⅡ處理器技術(shù)。
雖然本設(shè)計(jì)只使用了一塊16×16 LED點(diǎn)陣,電路簡(jiǎn)單,但是包含了LED顯示屏的電路基本原理和基本編程思想,如要進(jìn)行擴(kuò)展,只需擴(kuò)展FPGA的I/O接口,增加一些LED點(diǎn)陣和相關(guān)芯片,就能設(shè)計(jì)出面積更大、花樣更多的LED顯示屏。實(shí)驗(yàn)結(jié)果表明,本文所設(shè)計(jì)的系統(tǒng)靈活性和可靠性較高,外圍電路簡(jiǎn)單,硬件易升級(jí),功能擴(kuò)展性增強(qiáng),是LED控制系統(tǒng)的一個(gè)主要發(fā)展方向。
參考文獻(xiàn)
[1] 周立功.SOPC嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2006.
[2] 褚振勇.翁木云.FPGA設(shè)計(jì)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002.
[3] Altera Corporation. QuartusII version6.0 handbook[EB/OL].www.altera.com. 2006.
[4] 楊樂(lè)平.LabVIEW程序設(shè)計(jì)與應(yīng)用(第2版)[M].北京:電子工業(yè)出版社,2005.
[5] 侯國(guó)屏.LabVIEW編程與虛擬儀器設(shè)計(jì)[M].北京:清華大學(xué)出版社,2005.