在傳統(tǒng)的工業(yè)控制應(yīng)用中,由于工業(yè)控制計(jì)算機(jī)中集成了高性能的顯卡,故通常采用工業(yè)控制計(jì)算機(jī)+液晶顯示器的體系結(jié)構(gòu),可方便地實(shí)現(xiàn)以圖形和字符為主的人機(jī)界面。而在對(duì)實(shí)時(shí)性能和可靠性要求比較高的航空航天領(lǐng)域,通常要求液晶顯示器內(nèi)部集成圖形顯示功能,以減輕主控處理器的負(fù)擔(dān),并提高系統(tǒng)的實(shí)時(shí)性。重點(diǎn)介紹了如何利用FPGA實(shí)現(xiàn)基于Bresenham算法的2D圖形繪制(包括畫點(diǎn)、畫線、畫圓、畫橢圓),以及點(diǎn)陣字符和位圖在液晶屏上的顯示,并提出了顯示性能優(yōu)化的一系列策略。經(jīng)過仿真驗(yàn)證和產(chǎn)品實(shí)際應(yīng)用,該設(shè)計(jì)方法實(shí)現(xiàn)的液晶顯示模塊圖形和字符顯示功能穩(wěn)定,性能良好,適合于航空航天領(lǐng)域高可靠性液晶顯示模塊的應(yīng)用需求。
?。薄∫ ⊙?/h2>
在傳統(tǒng)的工業(yè)控制應(yīng)用中,多采用X86架構(gòu)的工業(yè)控制計(jì)算機(jī),計(jì)算機(jī)外置或集成顯卡輸出VGA/DVI視頻信號(hào),由液晶顯示器完成顯示功能。在這種架構(gòu)下采用軟件編程實(shí)現(xiàn)人機(jī)界面比較方便。而在嵌入式系統(tǒng)領(lǐng)域,尤其是航空航天儀表顯示設(shè)備的信息顯示領(lǐng)域,對(duì)顯示任務(wù)的可靠性和實(shí)時(shí)性要求很高。一方面需要減少設(shè)備內(nèi)部的模塊及互聯(lián)總線,以提高設(shè)備的可靠性并降低功耗;另一方面,設(shè)備所選用的高可靠性處理器性能通常較低,需要專門的硬件加速器輔助完成顯示功能。硬件加速器主要完成字符顯示、圖表繪制及液晶屏驅(qū)動(dòng)等功能,以減輕處理器的負(fù)擔(dān),提高外部通信總線處理的實(shí)時(shí)性?;冢疲校牵恋囊壕э@示驅(qū)動(dòng)及圖形加速器就是為了滿足顯示儀表設(shè)備而設(shè)計(jì)的。由于液晶顯示模塊內(nèi)部集成了圖形和顯示功能,對(duì)設(shè)備主機(jī)處理器的性能要求大大降低,這樣就可以采用低性能、可靠性高的處理器來承擔(dān)顯示控制任務(wù)。
2 系統(tǒng)結(jié)構(gòu)
?。玻薄】傮w結(jié)構(gòu)
儀表設(shè)備系統(tǒng)結(jié)構(gòu)圖如圖1所示,由數(shù)據(jù)采集與通訊主機(jī)和液晶顯示模塊組成。
?。玻病?shù)據(jù)采集與通訊主機(jī)
數(shù)據(jù)采集與通訊主機(jī)采用51系列單片機(jī),外接A/D采集、CAN等接口,主要完成數(shù)據(jù)采集、通信及向液晶顯示模塊發(fā)送頁面顯示命令等功能。
?。玻场〗涌?/p>
液晶顯示模塊與設(shè)備主機(jī)間為RS422串行接口,通訊波特率為200kbit/s,數(shù)據(jù)傳輸協(xié)議是自定義的,由幀頭、數(shù)據(jù)包長(zhǎng)度、命令、參數(shù)、校驗(yàn)和構(gòu)成,單個(gè)數(shù)據(jù)包最大長(zhǎng)度為256字節(jié)。
幀頭:為0xEB、0x90兩字節(jié),為整個(gè)數(shù)據(jù)幀的通訊過程提供同步功能;
字節(jié)長(zhǎng)度:1字節(jié),數(shù)據(jù)幀格式中指令的總字節(jié)數(shù),最大不超過255字節(jié)。
指令:液晶顯示模塊操作指令內(nèi)容,包括命令和參數(shù),表1給出了部分操作指令格式及含義;
校驗(yàn):1字節(jié),“字節(jié)長(zhǎng)度”和“指令”字段的累加和,以校驗(yàn)數(shù)據(jù)幀的正確性。
2.4 液晶顯示模塊
液晶顯示模塊,相當(dāng)于小型液晶顯示終端,由液晶屏及其TCON 板、背光、圖形加速及顯示控制板組成。
液晶顯示模塊需完成的繪圖命令有:屏幕擦除(背景填充)、畫點(diǎn)、畫線、畫矩形、畫橢圓、畫圓、字符串顯示、自定義字顯示、圖片顯示、塊拷貝、塊粘貼等功能,以及字庫及圖片下載功能。除此之外,還有液晶屏亮度調(diào)節(jié)及狀態(tài)管理等命令。
2D繪圖指令定義見表1。
本設(shè)計(jì)選用的液晶屏為NEC公司的16.5cm(6.5in)TFT彩色液晶顯示屏,分辨率為640×480,液晶屏自帶TCON板,其接口為18bit數(shù)字RGB信號(hào)。
?。场。疲校牵猎O(shè)計(jì)實(shí)現(xiàn)
?。疲校牵猎诒驹O(shè)計(jì)中完成的工作主要是:一方面,進(jìn)行數(shù)據(jù)接收并解析,根據(jù)命令進(jìn)行圖形繪制操作,生成顯示幀存儲(chǔ)寫操作數(shù)據(jù)流,最后將要改寫的數(shù)據(jù)寫入SDRAM 存儲(chǔ)器中;另一方面,根據(jù)液晶屏同步信號(hào)時(shí)序要求,將幀存中顯示區(qū)的數(shù)據(jù)定時(shí)地讀出,生成液晶屏驅(qū)動(dòng)數(shù)據(jù)流;其次,FPGA內(nèi)部還具有PWM 信號(hào)生成模塊,可調(diào)節(jié)液晶顯示屏的亮度。
?。常薄。疲校牵疗骷x型
FPGA選用Xilinx?。玻郑常埃埃跋盗校郏保?,該器件具有28?。叮罚矀€(gè)LUT單元和個(gè)28?。叮罚矀€(gè)觸發(fā)器以及96個(gè)BlockRAMs,便于實(shí)現(xiàn)大規(guī)??刂七壿嫾埃疲桑疲?、Buffer等;另外,FPGA 內(nèi)部具有DCM,可將外部65MHz時(shí)鐘轉(zhuǎn)為25MHz時(shí)鐘,用于液晶屏驅(qū)動(dòng)時(shí)鐘,并可內(nèi)部經(jīng)分頻產(chǎn)生1kHz?。校祝托盘?hào),用于液晶屏背光亮度調(diào)節(jié)。
3.2?。疲校牵两Y(jié)構(gòu)
FPGA內(nèi)部結(jié)構(gòu)如圖2所示。
?。常玻薄∶罱邮战馕瞿K
數(shù)據(jù)命令(設(shè)備主機(jī)下發(fā))以200kbit/s UART接口送入FPGA 中,FPGA 接收數(shù)據(jù)后,完成數(shù)據(jù)幀的識(shí)別、校驗(yàn)。對(duì)于校驗(yàn)無誤的數(shù)據(jù)幀,解析命令字的含義,并將對(duì)應(yīng)的參數(shù)傳入相應(yīng)的模塊中,啟動(dòng)命令處理操作。
?。常玻病。玻膱D形加速模塊
所有的2D圖形繪制操作都可以分解為畫線段或畫橢圓等基本圖元操作,由于液晶屏為柵格顯示結(jié)構(gòu),基本圖元操作命令最終是轉(zhuǎn)化為打點(diǎn)操作。
畫線段和畫橢圓弧采用的是bresenham 算法[2]。該算法的基本原理是在進(jìn)行線段繪制操作時(shí),首先根據(jù)線段的斜率確定繪制的起點(diǎn)和方向,以確定每次在X 方向還是Y 方向上步進(jìn),然后每步進(jìn)一步,確定在另一個(gè)方向上的增量,保持不動(dòng)或者增1、減1,最后輸出該點(diǎn)坐標(biāo),流程圖如圖3所示。
如圖4所示,繪制一條從(0,0)至(18,6)的線段,第一個(gè)點(diǎn)為(0,0),由于dx>dy,則在x 方向上遞進(jìn),每個(gè)時(shí)鐘周期x 坐標(biāo)加1。根據(jù)bresenham
算法,初始判決式為d1=dy×2-dx=6×2-18=-6<0,則第2個(gè)點(diǎn)(1,0),同時(shí)d2=d1+dy×2=6>0,則y++,輸出第3個(gè)點(diǎn)為(2,1),依次輸出下一個(gè)點(diǎn),直到輸出最后一個(gè)點(diǎn)(18,6)。
同樣在進(jìn)行橢圓或者圓繪制操作時(shí),也采用了bresenham算法。在FPGA 中實(shí)現(xiàn)時(shí),采用狀態(tài)機(jī)的編碼方式,以繪制圓心為(x0,y0)、長(zhǎng)半軸為a、短半軸為b的橢圓為例,其狀態(tài)轉(zhuǎn)移流程圖圖如圖5所示。圖中CALC_A和CALC_B狀態(tài)分別為計(jì)算1/4橢圓弧中的a軸方向和b 軸方向的像素點(diǎn)。
畫線時(shí)的數(shù)據(jù)運(yùn)算只有乘以2和加法,乘以2通過將數(shù)據(jù)左移1位,末位補(bǔ)0來實(shí)現(xiàn)。
在進(jìn)行橢圓繪制時(shí),乘法操作采用的是FPGA內(nèi)部的MULT18X18S乘法單元,先將算式中的浮點(diǎn)數(shù)通過移位運(yùn)算放大2n倍數(shù)轉(zhuǎn)換為定點(diǎn)數(shù),計(jì)算得到的結(jié)果再通過截掉最低的n 位,相當(dāng)于除以2n。通過這種方法避免了在FPGA 中做硬件除法,同時(shí)提高了繪圖效率。
?。常玻场∽址皥D片顯示加速模塊
在該設(shè)計(jì)中,液晶屏上顯示的字符為點(diǎn)陣字符。該字符庫是通過串行通訊接口(RS422)預(yù)置在FLASH 中的,字庫為預(yù)先轉(zhuǎn)換好的GB2312點(diǎn)陣字庫。本設(shè)計(jì)中采用了兩種規(guī)格大小的標(biāo)準(zhǔn)字庫,西文為黑體8×16和16×32,漢字為16×16及32×32。除此之外,用戶還可下載自定義的字庫,點(diǎn)陣大小最大可以為256×256,字庫可在屏幕上任意位置為起始點(diǎn)顯示。
預(yù)置圖片為256色BMP圖片,最大不超過屏幕分辨率(640×480),可以在屏幕上任意位置為起始點(diǎn)顯示。
字符和圖片在數(shù)據(jù)結(jié)構(gòu)上具有相似性,均為點(diǎn)陣數(shù)據(jù)。
在顯示時(shí),根據(jù)顯示命令,首先從存儲(chǔ)單元中獲取欲顯示的字符或圖片的點(diǎn)陣數(shù)據(jù)。對(duì)于字符,其點(diǎn)陣數(shù)據(jù)中的“0”表示不顯示,“1”表示顯示,然后向顯示坐標(biāo)位置對(duì)應(yīng)的地址空間中依次寫入顏色值。對(duì)于不需要寫入的像素點(diǎn),在寫操作時(shí),使用SDRAM 的寫屏蔽功能,每完成一行,地址切換到下一行,直至寫操作結(jié)束。
?。常玻础∫壕翑?shù)據(jù)流生成模塊
本設(shè)計(jì)中選用的液晶屏型號(hào)為NEC公司的NL6448-BC20-20[3],接口為LVTTL 數(shù)字RGB接口,包括R、G、B(每色為6bit)、HS、VS、DE、CLK等信號(hào)。
該液晶屏有兩種時(shí)序模式,固定時(shí)序模式和DE信號(hào)模式。固定時(shí)序模式下,液晶屏有效數(shù)據(jù)起始點(diǎn)是以HS、VS邊沿為參考的固定數(shù)值,而DE信號(hào)模式下,有效數(shù)據(jù)范圍是以DE信號(hào)為參考的。本設(shè)計(jì)中選擇了DE模式,每行中DE為高電平的第一個(gè)周期對(duì)應(yīng)第一個(gè)有效數(shù)據(jù)。
液晶屏數(shù)據(jù)生成設(shè)計(jì)框圖如圖6所示。該模塊采用DCM 生成25MHz像素時(shí)鐘,并采用兩個(gè)計(jì)數(shù)器(行計(jì)數(shù)器和列計(jì)數(shù)器)生成DE信號(hào)[4-5],根據(jù)液晶屏?xí)r序要求,每行總共800個(gè)時(shí)鐘,有效像素點(diǎn)為640個(gè)時(shí)鐘;每列總共525行,有效數(shù)據(jù)區(qū)域?yàn)椋矗福靶?。在FPGA設(shè)計(jì)中,行計(jì)數(shù)器在像素時(shí)鐘下計(jì)數(shù),從0計(jì)數(shù)到799后,輸出HS脈
沖,同時(shí)計(jì)數(shù)值回到0重新進(jìn)行下一輪的計(jì)數(shù);列計(jì)數(shù)器以HS信號(hào)脈沖為計(jì)數(shù)條件,從0計(jì)數(shù)到524行后,輸出VS脈沖,同時(shí)計(jì)數(shù)值回到0。
將行計(jì)數(shù)值定義為h_cnt,列計(jì)數(shù)值定義為v_cnt,數(shù)據(jù)有效信號(hào)DE設(shè)計(jì)為:
數(shù)據(jù)讀取模塊根據(jù)HS信號(hào)從SDRAM 存儲(chǔ)器中讀取一行有效數(shù)據(jù)到FIFO中,并采用DE信號(hào)作為FIFO的讀使能信號(hào),將FIFO中的數(shù)據(jù)取出,生成18bit?。遥牵?a target="_blank">數(shù)字信號(hào)送給液晶屏TCON板,驅(qū)動(dòng)液晶屏輸出顯示畫面。
3.2.5 SDRAM 控制器
采用的SDRAM 容量為32M×32bit,設(shè)計(jì)的工作頻率為65 MHz,SDRAM 中劃分為多個(gè)區(qū)域:顯示頁面區(qū)、繪制操作頁面區(qū)、字庫區(qū)、圖片區(qū)等。
SDRAM 器件在進(jìn)行讀寫操作時(shí),需要先激活一行,然后在該行內(nèi),針對(duì)某個(gè)列地址進(jìn)讀/寫操作,操作完畢后,需要進(jìn)行預(yù)充電以關(guān)閉該行,同時(shí),SDRAM 需要定期地進(jìn)行刷新以保持其內(nèi)部數(shù)據(jù)穩(wěn)定不丟失。用FPGA 實(shí)現(xiàn)的SDRAM控制器就是為了實(shí)現(xiàn)提供一個(gè)便于上層讀寫訪問的簡(jiǎn)單接口。
?。常玻丁。疲蹋粒樱瓤刂破?/p>
采用的FLASH容量為16M×16bit的NOR FLASH。FLASH 主要用于存儲(chǔ)字庫和圖片,內(nèi)部數(shù)據(jù)可通過液晶顯示模塊數(shù)據(jù)通信口進(jìn)行下載。
?。疲蹋粒樱?接口為異步接口,在進(jìn)行讀操作時(shí),其時(shí)序相對(duì)簡(jiǎn)單,類似于ROM。而在進(jìn)行寫操作時(shí)則相對(duì)復(fù)雜,在寫FLASH 之前,先確認(rèn)扇區(qū)為空,如果不為空,則需要先擦除。
?。常玻贰〈鎯?chǔ)仲裁器
存儲(chǔ)仲裁器模塊結(jié)構(gòu)如圖7所示,在同一時(shí)間,SDRAM 只能為其中一個(gè)模塊提供數(shù)據(jù)讀或?qū)懖僮?。該模塊的設(shè)計(jì)是為了解決多模塊同時(shí)訪問SDRAM 或FLASH 時(shí)的優(yōu)先級(jí)控制,以及提供排隊(duì)訪問的機(jī)制。該模塊中采用了標(biāo)志位In-QueueFlag[2∶0]來分別記錄各模塊的狀態(tài)請(qǐng)求,并分別給出應(yīng)答信號(hào),以控制其對(duì)于SDRAM的讀寫訪問。
在FPGA設(shè)計(jì)中,由于液晶屏數(shù)據(jù)生成模塊對(duì)數(shù)據(jù)的及時(shí)性要求最高,給予其最高的優(yōu)先級(jí),在SDRAM接口空閑的情況下,優(yōu)先處理InQueue-Flag[0]=1的請(qǐng)求,處理完畢后,InQueueFlag[0]清0。如果InQueueFlag[0]=0,則檢查InQueue-lag[1]是否為1,依次直至所有標(biāo)志位為0。
?。础?yōu)化系統(tǒng)性能的幾點(diǎn)設(shè)計(jì)
?。矗薄〔捎秒p圖層、多頁面的設(shè)計(jì)
顯示屏在顯示時(shí),具有前景和背景兩個(gè)圖層。在繪圖過程中,可進(jìn)行切換[6]。
該顯示模塊在設(shè)計(jì)時(shí),存儲(chǔ)區(qū)中開辟了10個(gè)操作頁面和顯示頁面。正常使用情況下,在后臺(tái)頁面進(jìn)行繪圖操作,繪制完成后,將顯示頁面切換至該頁面。這樣可避免因繪圖操作對(duì)內(nèi)存數(shù)據(jù)更新而引起的顯示不流暢感。
?。矗病。玻担渡{(diào)色板設(shè)計(jì)
液晶屏有144種顏色,但對(duì)于圖形顯示屏而言,實(shí)際應(yīng)用中并不需要這么多種色彩,256色已經(jīng)可以滿足應(yīng)用要求。在FPGA 內(nèi)部,使用BlockRAM 建立了一個(gè)256色的調(diào)色板,每種色號(hào)對(duì)應(yīng)一個(gè)RGB顏色值。
如果每個(gè)像素都存儲(chǔ)RGB值,則每像素需要18位。而采用256色,每個(gè)像素點(diǎn)的顏色只需要用8位來表示,由此可見,采用256色調(diào)色板的設(shè)計(jì)可以減小一半以上的內(nèi)存帶寬需求。
?。矗场【彺嬖O(shè)計(jì)
在進(jìn)行繪圖和字符、圖片等顯示操作時(shí),每次寫入SDRAM 內(nèi)存的數(shù)據(jù),不是立即寫入的。而是先將要操作的SDRAM 地址及其數(shù)據(jù)暫存在buffer中,由專門的模塊負(fù)責(zé)將其寫入SDRAM中。這樣的設(shè)計(jì)有兩個(gè)好處,一是減少了對(duì)存儲(chǔ)器的頻繁讀寫,存儲(chǔ)器讀寫效率提高;另一方面,繪圖模塊無需等待數(shù)據(jù)寫入,便可繼續(xù)進(jìn)行繪圖操作,大大提高了繪圖效率,從而提升了整個(gè)顯示模塊的性能。
?。矗础「咝实模樱模遥粒?控制器
用FPGA 實(shí)現(xiàn)的SDRAM 控制器[7-8],其核心是控制好SDRAM 讀寫命令給出的時(shí)機(jī),并定時(shí)刷新SDRAM,同時(shí)提供方便的用戶接口給其他模塊使用。
另外,由于SDRAM 的特性,進(jìn)行單字節(jié)操作時(shí),其效率很低。經(jīng)過分析,在65MHz時(shí)鐘下,寫入1個(gè)字節(jié),至少需要8?jìng)€(gè)時(shí)鐘周期,包括激活命令、寫命令、預(yù)充電命令以及等待時(shí)間,效率只有12.5%。
本設(shè)計(jì)中使用Burst操作,在Fullpage操作時(shí),其讀寫效率會(huì)大大提高,接近97%。
?。矗怠。疲蹋粒樱葦?shù)據(jù)校驗(yàn)機(jī)制
為了保證存儲(chǔ)在FLASH區(qū)域中數(shù)據(jù)的完整性,系統(tǒng)在每次啟動(dòng)時(shí),會(huì)發(fā)送相關(guān)的自檢命令檢查FLASH 數(shù)據(jù)的完整性,并將自檢信息顯示在液晶屏上,以保證字庫、圖片數(shù)據(jù)的正確性。
?。怠》抡婕皽y(cè)試結(jié)果
采用ModelSim6.2g對(duì)本設(shè)計(jì)進(jìn)行了功能和時(shí)序仿真,仿真了屏幕擦除、畫線、畫圓和字符顯示等指令的性能情況。如圖8中(a)、(b)圖所示,圖中,cmd信號(hào)為指令(詳見表1),start_FBM、start_PCG是指令操作時(shí)的起始信號(hào),圖中還給出了SDRAM 信號(hào)線。從圖中可以看到,cmd信號(hào)從0x00變到0x42表明開始進(jìn)行擦除操作,由0x42切換到0x35表明擦除操作結(jié)束,開始執(zhí)行畫線命令??梢钥吹皆谄聊徊脸僮鬟^程中SDRAM 信號(hào)線CS、RAS、CAS上信號(hào)不斷變化,此時(shí)SDRAM 執(zhí)行寫操作。
仿真結(jié)果表明,在65MHz時(shí)鐘頻率下,典型操作時(shí)間為:擦除整屏(640×480)耗時(shí)為2?。梗保埃鼎蹋?;畫一條長(zhǎng)度為100的斜線段,耗時(shí)為14.0μs;繪制一個(gè)直徑為10的圓,耗時(shí)為13.6μs;顯示一個(gè)16×16大小的點(diǎn)陣漢字,耗時(shí)為44.1μs。
本設(shè)計(jì)實(shí)現(xiàn)的液晶顯示模塊在典型應(yīng)用情況下,每秒約有250條繪圖命令,包含了屏幕擦除及大量畫線及字符串顯示操作。經(jīng)仿真測(cè)試,在該使用情況下,SDRAM 讀寫占用率約為21%。
在RS422數(shù)據(jù)總線滿負(fù)荷情況下,每秒最大接收10k字節(jié)數(shù)據(jù),最多為5k個(gè)漢字顯示,估算SDRAM 讀寫占用率約為30%,資源利用仍有足夠的余量。
由此可見,采用本設(shè)計(jì)的液晶顯示模塊在典型工況和數(shù)據(jù)總線滿負(fù)荷情況下,均有足夠的余量能夠高效地完成上位機(jī)發(fā)送的作圖命令,不會(huì)造成顯示遲滯。
該液晶顯示模塊已應(yīng)用于飛行器儀表顯示系統(tǒng)中,并成功完成了飛行任務(wù)。
?。丁〗Y(jié) 論
采用基于FPGA 圖形和字符加速的液晶顯示模塊,可以較好地滿足航空航天領(lǐng)域中高可靠性儀表顯示設(shè)備中低性能微處理器作為主機(jī),而液晶顯示模塊作為顯示終端的應(yīng)用需求,減輕了處理器及顯示控制軟件的復(fù)雜度。當(dāng)然,本設(shè)計(jì)的部分性能指標(biāo)還有待提高,為了適應(yīng)高分辨率、大尺寸TFT液晶屏的要求,需要提高FPGA 運(yùn)行頻率,同時(shí)采用DDR/DDR2SDRAM 等高速存儲(chǔ)器件。
評(píng)論