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