摘要:用ATMEGA128單片機結(jié)合CPLD實現(xiàn)了對VGA顯示器和激光打印機的控制,完成了在VGA顯示器上實時顯示字符和圖形的功能,并控制激光打印機實現(xiàn)了屏幕信息的打印輸出。本設(shè)計克服了單片機系統(tǒng)顯示和打印功能薄弱的缺點,為擴大其應(yīng)用范圍奠定了基礎(chǔ),同時也為其他嵌入式系統(tǒng)的信息輸出提供了一種解決方案。
關(guān)鍵詞:VGA控制器;PCL命令語言;激光打印;CPLD
隨著集成電路制造技術(shù)的不斷發(fā)展,MCU、ARM、DSP等微控制器、微處理器的性能急劇提高,但是輸出功能,尤其是顯示和打印功能仍然比較薄弱,與PC機相比有較大的差距。輸出功能薄弱的缺點,限制了其應(yīng)用范圍的擴大。ATmega128是美國Atmel公司生產(chǎn)RISC 結(jié)構(gòu)的高性能MCU芯片,含有ADC、I2C、SPI、PWM等多種資源 [1]。本論文以ATMEGA128單片機為例,結(jié)合CPLD和高速SRAM,介紹在VGA顯示器上顯示字符、圖形信息和控制激光打印機打印輸出屏幕信息的方法。本設(shè)計克服了單片機系統(tǒng)信息輸出功能薄弱的缺點, 為單片機和其他嵌入式系統(tǒng)的信息輸出提供了一個解決方案,使得其應(yīng)用范圍更加廣闊。系統(tǒng)結(jié)構(gòu)如圖1所示。
1 VGA顯示控制器的實現(xiàn)
PC機在VGA的顯示器(通常包括CRT和液晶顯示器)上的信息顯示是通過顯卡完成的。單片機在VGA顯示器上顯示信息同樣需要類似的模塊來輔助,因此我們設(shè)計了和顯卡功能相似的VGA顯示控制器來輔助ATMEGA128單片機在VGA顯示器上顯示信息。下面介紹640×480分辨率、59.9HZ刷新率的通用VGA顯示控制器的設(shè)計方法,并說明微控制器、微處理器如何在VGA接口的顯示器上顯示信息。
1.1 VGA時序產(chǎn)生模塊的設(shè)計
要實現(xiàn)VGA顯示控制器的功能,首先需要了解VGA信號的參數(shù)和時序。圖2所示為640×480分辨率、59.9HZ刷新率的VGA時序圖[2]。根據(jù)VGA時序圖,本論文研究并實現(xiàn)了VGA顯示控制器,所用硬件為Altera公司的EPM7128 CPLD和ISSI公司的高速SRAM。EPM7128的作用是通過編程產(chǎn)生VGA顯示所需的時序信號,并協(xié)助微控制器實現(xiàn)對顯存的讀寫操作。高速SRAM的作用是存儲需要顯示的數(shù)據(jù)信息,其讀寫周期為8ns,滿足顯示器刷新時對顯存進行快速讀寫的時間要求。設(shè)計中用一個bit代表一個象素,640×480分辨率需要37.5K字節(jié)的顯存。象素時鐘頻率的選擇與VGA監(jiān)視器的刷新頻率和分辨率相關(guān),59.9HZ刷新率時,象素時鐘頻率為25.175MHZ,其計算公式為:時鐘頻率=(行象素數(shù)+行消隱點數(shù))×(一場行數(shù)+消隱行數(shù))×刷新率。
根據(jù)VGA信號的要求,用VHDL語言對EPM7128芯片編程實現(xiàn)VGA時序產(chǎn)生模塊。VGA時序產(chǎn)生模塊包括:每行的象素數(shù)目計數(shù)器h_cnt、每場的行數(shù)目計數(shù)器v_cnt、行同步信號hs產(chǎn)生模塊、場同步信號vs產(chǎn)生模塊、消隱信號blank產(chǎn)生模塊和并行輸入串行輸出模塊等。其中, h_cnt的最大計數(shù)值是799, v_cnt的最計數(shù)值是是524。行同步信號產(chǎn)生模塊根據(jù)h_cnt的計數(shù)值來產(chǎn)生行同步信號hs;場同步信號產(chǎn)生模塊根據(jù)v_cnt的計數(shù)值來產(chǎn)生場同步信號vs。消隱信號產(chǎn)生模塊根據(jù)h_cnt的計數(shù)值在行同步期間、行消隱前肩和行消隱后肩,把消隱信號blank置為低電平;根據(jù)v_cnt的計數(shù)值在每一場的場同步期間、場消隱前肩和場消隱后肩,把消隱信號blank置為低電平;其余時間消隱信號blank為高電平,表示此時為有效顯示期。并行輸入串行輸出模塊在有效顯示期間從sram顯存中并行讀入數(shù)據(jù),串行輸出的顯示器的紅、綠、藍信號線上。對該程序編譯成功后用MaxplussII軟件進行波形仿真,以驗證設(shè)計的合理與否。最后設(shè)計完成的時序波形仿真如圖3所示。
圖 3 VGA顯示控制器時序仿真圖
從仿真波形圖種可以看到每一顯示行的時間為800個象素時鐘周期,每場包括525行。行同步脈沖的寬度為96個象素時鐘周期,場同步脈沖的寬度為2行。在行同步信號hs的行同步期間及其前肩和后肩,消隱信號blank為低電平,表示消隱期。在場同步信號vs的場同步期間及其前肩和后肩,消隱信號blank同樣為低電平,表示消隱期。仿真結(jié)果符合VGA標準時序,項目實際應(yīng)用也證明了此結(jié)果的正確性。
1.2 VGA顯示底層函數(shù)的編寫
要在屏幕上顯示信息,除VGA顯示控制器之外,還需要并在ATMEGA128單片機上設(shè)計底層繪圖函數(shù)并建立字符庫。通常編寫畫線、畫圓函數(shù)時,確定一個點是否在直線或圓上,需要乘、除法和開方運算,而畫線、畫圓函數(shù)調(diào)用最為頻繁,因此計算量將大到難以接受的程度,極大降低系統(tǒng)的性能。為了克服上述缺點,在編寫底層繪圖函數(shù)時采用了圖形學(xué)上的Bresenham
void circle(unsigned int x0,unsigned int y0,unsigned int r,unsigned char color) { register int x,y,deltax,deltay,d; x=0;y=r;deltax=3;deltay=2-r-r;d=1-r; while(x<=y) { drawpixel(x0+x,y0+y,color); drawpixel(x0-x,y0+y,color); drawpixel(x0-x,y0-y,color); drawpixel(x0+x,y0-y,color); drawpixel(x0+y,y0+x,color); drawpixel(x0-y,y0+x,color); drawpixel(x0-y,y0-x,color); drawpixel(x0+y,y0-x,color); if(d<0){ d+=deltax; deltax+=2; x++; } else { d+=(deltax+deltay); deltax+=2;deltay+=2; x++;y--; } } } |
2 激光打印機的控制
激光打印機是目前最常用輸出設(shè)備之一,和熱敏、噴墨打印機相比具有顯著的優(yōu)點,下面介紹用ATMEGA128微控制器直接控制激光打印機打印VGA顯示器屏幕內(nèi)容的方法。要控制打印機必須了解打印機命令語言。打印機語言指的是控制打印機工作的命令,它控制打印機如何組織被打印的文檔,打印機按照這些命令來處理打印數(shù)據(jù),并最終準確的打印出文字與圖像。
2.1 PCL打印機命令語言
PCL打印機命令語言是世界上應(yīng)用最為廣泛的標準打印機命令語言,由惠普公司開發(fā),支持文字、點陣圖像和矢量圖形的打印。PCL命令由2個以上的字符組成,總是以控制字符ESC開始,用符合EC 表示,其ASCII碼為27,所以PCL命令又被
圖 4 中點畫圓法示意圖 |
“兩字符”命令序列的格式如下:EC X,其中符號X代表ASCII碼48~126的字符,即ASCII字符表中“0” 和“~”之間的字符。符號X指示打印機需要進行的操作,例如命令“EC E”是打印機復(fù)位命令,命令“EC g”把紙張的左邊距和上邊距復(fù)位成默認值?!皡?shù)化”命令序列格式如下:EC X y z1 # z2 # z3 ... # Zn[data] ,其中EC為起始字符,X是參數(shù)化字符,代表ASCII碼33~47之間字符,其作用是指明該序列是“參數(shù)化”序列;y為組字符,代表ASCII碼96~126之間字符,用來指定待執(zhí)行的操作屬于什么組;#是數(shù)值域,其范圍從-32767到65535;z i是本命令的參數(shù),代表ASCII碼從96~126之間字符,該參數(shù)用于組合的“參數(shù)化”序列,非組合序列則不用,其作用是指定前面的數(shù)值域所用的參數(shù);Zn是結(jié)束字符,表示“參數(shù)化”命令序列結(jié)束;[data] 是傳送到打印機的待打印數(shù)據(jù),用8個bit表示,即為0~255之間任意數(shù)據(jù)。下面兩例分別是非組合的“參數(shù)化”命令序列和組合的“參數(shù)化”命令序:
1 2
1是非組合序列,不含參數(shù)。2是組合序列,由序列EC &l1O 和 EC&l2A組合而成,其中小寫的字符“o”是該序列的參數(shù)[4]。各種命令序列的詳細說明見參考文獻[4]。
2.2 打印屏幕
ATMEGA128單片機的IO口和激光打印機的并口由如下信號連接: Strobe、Busy、GND、D0~D7共11根信號線。其中D0~D7是數(shù)據(jù)線,單片機通過數(shù)據(jù)線把控制打印機的PCL命令和待打印數(shù)據(jù)傳送到打印機;Busy信號線指示打印機狀態(tài)是否繁忙;Strobe 信號線是選通控制線,單片機在Strobe 信號線上輸出一個低電平脈沖即可把D0~D7上的數(shù)據(jù)寫人打印機。在論文的第一部分曾經(jīng)提到,VGA顯示器所顯示的內(nèi)容存儲在SRAM顯存中,每一個bit代表一個象素,因此打印屏幕就是把顯存中的數(shù)據(jù)打印出來。ATMEGA128單片機首先發(fā)送PCL語言的打印機設(shè)置命令,對打印進行設(shè)置,然后即可傳送打印數(shù)據(jù)。其步驟如下:1、發(fā)打印機復(fù)位命令;2、發(fā)設(shè)置紙張大小命令;3、發(fā)設(shè)置打印的起始位置命令;4、發(fā)設(shè)置分辨率命令;5、發(fā)設(shè)置打印機為點陣圖形模式命令;5、傳送要打印的數(shù)據(jù);6、發(fā)結(jié)束圖形模式命令;7、發(fā)換頁指令,打印當前頁。下面是ATMEGA128單片機對HP LASERJET6L激光打印機發(fā)送PCL命令,并控制打印機打印輸出VGA屏幕信息的例程:
void print()
{unsigned int M; unsigned char i;
unsigned char xdata *p;p=NVRS;
out(27);out('E');//打印機復(fù)位
out(27); pprint("&l26A");// 設(shè)置紙張為A4
out(27); pprint("*p210X");// '設(shè)置本頁打印的X坐標起始位置
out(27); pprint("*p400Y");// '設(shè)置本頁打印的Y坐標起始位置
out(27); pprint("*t100R");// '設(shè)置分辨率
out(27); pprint("*r1A");// '設(shè)置圖形模式開始
for(M=0;M<480;M++) //傳送要打印的圖形數(shù)據(jù)
{ out(27); pprint("*b80W");
…………
out(27); pprint("*rC"); // '圖形模式結(jié)束
out(255); out(12);//'本頁結(jié)束,執(zhí)行打印
}
結(jié)論:
本文的創(chuàng)新點是用ATMEGA128單片機結(jié)合CPLD實現(xiàn)了對VGA顯示器和激光打印機的控制,使單片機可以在VGA接口的顯示器上顯示圖形、文字信息,并控制激光打印機把VGA屏幕上的信息打印輸出。本設(shè)計克服了單片機控制系統(tǒng)的信息顯示和打印功能薄弱的缺點,使其在發(fā)揮控制功能優(yōu)勢的基礎(chǔ)上,還具有了實用的顯示和打印功能,為擴大其應(yīng)用范圍奠定了基礎(chǔ)。此外,本設(shè)計中用到的ATMEGA128的接口為GPIO口和Intel格式的標準總線,因此可以方便得移植到其他類型的芯片中,為其它系統(tǒng)的信息顯示和打印提供了參考方案,本設(shè)計已經(jīng)成功移植到了TMS320C6713 DSP芯片上[5]。
參考文獻
[1] Atmel. 8-bit AVR Microcontroller with 128K Bytes In-System Programmable Flash2001
[2] 曹允. 基于FPGA的VGA時序彩條信號實現(xiàn)方 法及其應(yīng)用. 電子技術(shù)應(yīng)用.Vol.28 No.7 2002
[3] 孫家廣等. 計算機圖形學(xué). 清華大學(xué)出版社, 2002
[4] 惠普公司. PCL5 Printer Language Technical Reference Manual First Edition. 1992
[5] 何明星等. Max7000系列可編程器件在DSP系統(tǒng)設(shè)計中應(yīng)用 微計算機信息2003年19卷6期25-26頁