摘要:為了實(shí)現(xiàn)便攜式、實(shí)時(shí)打印數(shù)據(jù)的目的,在分析EP3C25型FPGA和RD-E型微型打印機(jī)性能特點(diǎn)的基礎(chǔ)上,基于嵌入式技術(shù)設(shè)計(jì)了 FPGA與微型打印機(jī)的硬件接口電路、軟件流程及控制程序。利用FPGA控制微型打印機(jī)正常工作,對(duì)功能模塊進(jìn)行了仿真,實(shí)際應(yīng)用中運(yùn)行穩(wěn)定。利用 FPGA的穩(wěn)定性與高速數(shù)據(jù)處理能力,實(shí)現(xiàn)實(shí)時(shí)打印。整個(gè)系統(tǒng)集成于一塊電路板,并由微型打印機(jī)輸出,體積小,攜帶方便。
關(guān)鍵詞:FPGA;微型打印機(jī);硬件接口;軟件設(shè)計(jì)
0 引言
FPGA的超大規(guī)模集成度優(yōu)勢和內(nèi)部邏輯單元具有可重復(fù)配置能力的特點(diǎn),使得其在芯片控制和接口設(shè)計(jì)中成為一種頗具吸引力的高性價(jià)控制器件。在此,設(shè)計(jì)了一種基于FPGA控制RD-E微型打印機(jī)工作的控制模塊。在QuartusⅡ9.0 FPGA開發(fā)平臺(tái)上通過VHDL語言編程控制微型打印機(jī)打印數(shù)據(jù),在實(shí)際應(yīng)用中具有一定的實(shí)用價(jià)值。
1 硬件系統(tǒng)
設(shè)計(jì)中采用Altera公司的CycloneⅢ系列FPGA芯片EP3C25和榮達(dá)創(chuàng)新科技有限公司生產(chǎn)的RD-E微型打印機(jī)組成硬件系統(tǒng)。
1.1 RD-E微型打印機(jī)簡介
RD-E系列打印機(jī)是微型熱敏加熱點(diǎn)陣打印機(jī),它專為儀器儀表面板安裝而設(shè)計(jì),采用獨(dú)特的面板式嵌入結(jié)構(gòu),便可將整個(gè)打印機(jī)固定在儀表面板上。RD-E系列打印機(jī)內(nèi)嵌448個(gè)字符及圖塊,32個(gè)用戶自定義字符,國標(biāo)一、二級(jí)漢字庫中全部漢字和西文字、圖符共8 178個(gè)。采用模塊化驅(qū)動(dòng)控制電路,有效地保護(hù)了打印頭的絕對(duì)安全;打印機(jī)內(nèi)置專門的復(fù)位控制電路、電源監(jiān)測電路以及近乎完美的軟硬件看門狗控制電路,以確保打印機(jī)不死機(jī)、不亂打??刂齐娐诽峁囟葯z測、電壓檢測、過熱檢測、缺紙檢測等功能,有效延長了打印頭的使用壽命,同時(shí)保證了打印機(jī)在不同的工作場合,打印出的效果更加清晰美觀、更加高速流暢,也能降低打印噪音,輸出完整數(shù)據(jù)。備有39個(gè)ESC/P兼容的打印命令,支持字符、漢字、圖形的正向、反向、左右旋轉(zhuǎn)打印、反白、上下劃線、左右劃線打印以及任意變高、變寬、行間距、字間距調(diào)整、水平制表、垂直制表、曲線打印、條形碼打印等功能以及以上功能的混合打印。RD-E打印機(jī)分標(biāo)準(zhǔn)并行接口,標(biāo)準(zhǔn)串行接口2類,串行接口與RS232C標(biāo)準(zhǔn)兼容,可直接由微機(jī)串口或單片機(jī)控制。設(shè)計(jì)中采用并口打印機(jī),其接口與CENTRONICS標(biāo)準(zhǔn)并口兼容,其外形及從RD-E打印機(jī)的26芯插座的方向看插座的引腳序號(hào)如圖1所示。并行接口各引腳信號(hào)的定義如表1所示,信號(hào)的邏輯電平為TTL電平。
1.2 微型打印機(jī)與FPGA的接口設(shè)計(jì)
為滿足FPGA的工作條件,必須完成FPGA外圍電路的設(shè)計(jì),如外部存儲(chǔ)器、工作電源以及外部輸入時(shí)鐘即晶振電路的設(shè)計(jì)。EP3C25E144I7 N是CycloneⅢ系列工業(yè)級(jí)FPGA芯片,其供電電源分?jǐn)?shù)字電壓和模擬電壓兩類,其中模擬電壓有A1.2 V和A2.5 V,分別對(duì)其內(nèi)部鎖相環(huán)PLL和模擬電壓端供電,數(shù)字電壓有D1.2 V和D3.3 V,分別對(duì)內(nèi)部數(shù)字邏輯單元和輸入/輸出管腳供電。電源地同樣分為模擬地與數(shù)字地兩類,與模擬電源和數(shù)字電源對(duì)應(yīng)。系統(tǒng)時(shí)鐘由外部晶振提供,配置方式由外圍電路撥碼開關(guān)選擇。
設(shè)計(jì)控制功能模塊時(shí),由于FPGA有富余的I/O接口,所以打印機(jī)可以不經(jīng)過另外的接口電路而直接與FPGA相連接,同時(shí)FPGA其內(nèi)部的嵌入式陣列塊 EAB是輸入端口和輸出端口都帶有觸發(fā)器的RAM塊,可實(shí)現(xiàn)小容量的ROM和RAM,無需外部擴(kuò)展ROM和RAM,也無需外加鎖存器。FPGA芯片可以通過編程配置其內(nèi)部邏輯單元,通過編寫軟件來設(shè)計(jì)微型打印機(jī)控制器,所以只需分配好與打印機(jī)相連接的I/O接口,讀寫相連的信號(hào)線即可。打印機(jī)的BUSY,和D0~D7信號(hào)接口分別由FPGA在編程綜合過程中分配通用I/O接口,接口方式如圖2所示。
圖中JP1和JP2是FPGA的配置接口,JP1與EPCS16SI16N外部存儲(chǔ)芯片一起,構(gòu)成FPGA的串行(AS)配置端口,當(dāng)程序調(diào)試完成后,可將程序經(jīng)JP2口下載至配置芯片EPCS16SI16N,F(xiàn)PGA上電之后,系統(tǒng)自動(dòng)將配置芯片中的程序讀入FPGA內(nèi),完成邏輯功能塊的配置。JP1是 JTAG配置口,主要作用是方便程序的現(xiàn)場調(diào)試,不需經(jīng)過外部存儲(chǔ)器,程序直接下載到FPGA中完成邏輯功能塊的配置,以驗(yàn)證程序設(shè)計(jì)能否實(shí)現(xiàn)預(yù)期的功能。SP1與SP2用以設(shè)置配置芯片與FPGA數(shù)據(jù)傳輸?shù)墓ぷ鞣绞?,例如MESL2,MESL1,MESL0為“010”時(shí),配置為標(biāo)準(zhǔn)串行端口,配置電壓為3.3 V;若為“100”時(shí)為快速串行配置端口,配置電壓可在3.3 V和2.5V兩者中選其一。P1是有源晶振,可提供FPGA系統(tǒng)時(shí)鐘頻率。RP1是打印機(jī)數(shù)據(jù)端口的上拉排阻,這樣輸出數(shù)據(jù)與端口數(shù)據(jù)邏輯與之后輸入打印機(jī),避免顯示亂碼。打印機(jī)RD-E32-V8與FPGA由8根數(shù)據(jù)線和3條控制、狀態(tài)讀寫線連接,另有一條線將2部分的接地端連接到公共的模擬地線。
2 軟件實(shí)現(xiàn)
系統(tǒng)軟件設(shè)計(jì)是基于VHDL語言編寫的。軟件設(shè)計(jì)的關(guān)鍵是在打印機(jī)工作時(shí)序的基礎(chǔ)上完成微型打印機(jī)與FPGA之間數(shù)據(jù)和指令的讀寫和狀態(tài)的檢測。
2.1 控制時(shí)序與原理
控制過程的時(shí)序在延遲時(shí)間上有嚴(yán)格的要求,所以,設(shè)計(jì)控制程序時(shí),必須考慮打印機(jī)狀態(tài)轉(zhuǎn)換和數(shù)據(jù)傳輸?shù)难舆t時(shí)間。當(dāng)數(shù)據(jù)線上有待打印的數(shù)據(jù)時(shí),打印機(jī)并不是立即將數(shù)據(jù)打印輸出,必須根據(jù)當(dāng)前的打印機(jī)狀態(tài)來判斷。
當(dāng)BUSY狀態(tài)被檢測到為“1”時(shí),說明打印機(jī)處于“忙”狀態(tài),此時(shí)打印機(jī)不會(huì)接收任何數(shù)據(jù)。當(dāng)BUSY信號(hào)為“O”時(shí),說明打印機(jī)處于“空閑”狀態(tài),先向數(shù)據(jù)線寫入數(shù)據(jù),在延時(shí)時(shí)間符合時(shí)序的情況下,通過FPGA控制信號(hào),將數(shù)據(jù)寫入打印機(jī)。為數(shù)據(jù)選通觸發(fā)脈沖,下降沿時(shí)輸入數(shù)據(jù),對(duì)低電平的時(shí)間時(shí)序上也有要求,最小為O.5μs。當(dāng)下降沿到來的同時(shí),數(shù)據(jù)即送入打印機(jī),同時(shí)BUSY信號(hào)由低電平跳變?yōu)楦唠娖剑柚笷PGA向打印機(jī)數(shù)據(jù)線寫入數(shù)據(jù)。當(dāng)數(shù)據(jù)輸入以后,直到回答脈沖跳變成低電平,此時(shí)表示數(shù)據(jù)已被接受,而且打印機(jī)準(zhǔn)備好接受下一數(shù)據(jù),之后大約5μs時(shí)間以后,BUSY信號(hào)變?yōu)榈碗娖?,之后約5μs信號(hào)變高。對(duì)打印機(jī)的控制是通過查詢方式實(shí)現(xiàn)的,根據(jù)打印機(jī)工作時(shí)序,將打印機(jī)控制過程分為3個(gè)狀態(tài),打印機(jī)控制程序基于這3個(gè)狀態(tài),采用VHDL語言的有限狀態(tài)機(jī)編寫實(shí)現(xiàn)。時(shí)序與狀態(tài)轉(zhuǎn)換如圖3所示。
2.2 打印機(jī)控制命令及程序設(shè)計(jì)
RD-E型微型打印機(jī)提供了39條打印命令,打印命令與多數(shù)打印機(jī)兼容。其中,漢字打印命令其格式由16進(jìn)制數(shù)表示,則為x“1B”x“3 8”x“n”。在連續(xù)3次接收數(shù)據(jù)后若接收到的是該命令,打印機(jī)將根據(jù)n值的不同選擇不同點(diǎn)陣的漢字。在漢字打印方式中,打印機(jī)接收的漢字代碼是2個(gè)字節(jié)對(duì)應(yīng)一個(gè)漢字的標(biāo)準(zhǔn)機(jī)內(nèi)碼,即打印機(jī)每接收2個(gè)字節(jié)的機(jī)內(nèi)碼可調(diào)出一個(gè)漢字。打印機(jī)先接收機(jī)內(nèi)碼的高位字節(jié),再接收低位字節(jié)。設(shè)計(jì)中,由于欲打印的數(shù)據(jù)分 16×16和12×12兩種點(diǎn)陣漢字,所以n值設(shè)置為0或4,當(dāng)n=O選擇16×16點(diǎn)陣漢字打印,n=4選擇12×12點(diǎn)陣漢字印,n的默認(rèn)值為0。另一條命令是紙給進(jìn)命令,即換行命令,其格式用16進(jìn)制數(shù)表示為:x“OA”打印機(jī)打印當(dāng)前緩沖器里的數(shù)據(jù),并向前走紙一行,如果緩沖器里沒有數(shù)據(jù),則只執(zhí)行向前走紙一行。打印空格或空行命令,其格式用16進(jìn)制數(shù)表示為:x“1B”x“6 6”x“M”x“n”。如果M=O,該命令將打印n個(gè)空格;如果M=1,該命令將打印n個(gè)空行。由于打印數(shù)據(jù)必須與表頭的欄目一一對(duì)應(yīng),而且每行打印的字符點(diǎn)陣不會(huì)完全相同,所以編程過程中對(duì)空格數(shù)的控制是需要花功夫的,調(diào)試時(shí)便出現(xiàn)過打印的已處理數(shù)據(jù)與表頭不對(duì)應(yīng)的情況。由于打印機(jī)內(nèi)嵌選擇字符集1和自定義字符集2,打印的數(shù)據(jù)中含有自定義字符集中的字符,所以還需選擇打印輸出字符集數(shù)據(jù)。字符集選擇由命令x“1B”x“36"和x“1B”x“37”來實(shí)現(xiàn)。回車命令的命令字為x“0D”。打印機(jī)收到本命令后,即對(duì)緩沖區(qū)內(nèi)的命令和字符進(jìn)行處理,并按要求打印緩沖區(qū)內(nèi)的全部字符或漢字。
打印機(jī)內(nèi)置的漢字代碼為標(biāo)準(zhǔn)漢字內(nèi)碼,高字節(jié)數(shù)值范圍A1H~F7H,對(duì)應(yīng)1~87區(qū)漢字;低字節(jié)數(shù)值范圍A1H~FEH,對(duì)應(yīng)每一區(qū)中的漢字位碼1~94。漢字的區(qū)位碼與機(jī)內(nèi)碼之間相互計(jì)算的方法為:
區(qū)碼轉(zhuǎn)換為16進(jìn)制數(shù),位碼轉(zhuǎn)換為16進(jìn)制數(shù)
機(jī)內(nèi)碼高字節(jié)=區(qū)碼+AOH
機(jī)內(nèi)碼低字節(jié)=位碼+AOH
例如電阻的“阻”字區(qū)位碼為5572,即55區(qū),第2個(gè)字,其機(jī)內(nèi)碼為D7E8,將55(十進(jìn)制)轉(zhuǎn)為37(16進(jìn)制),37H+AOH=D7H;將 72(十進(jìn)制)轉(zhuǎn)為48(16進(jìn)制),48H+AOH=E8H,所以對(duì)表頭要打印的漢字將其區(qū)位碼轉(zhuǎn)換成內(nèi)碼后存儲(chǔ)起來,按先高字節(jié),后低字節(jié)的順序,在打印命令之后寫入打印機(jī)即可。
軟件設(shè)計(jì)在FPGA內(nèi)部綜合生成2個(gè)內(nèi)部存儲(chǔ)器,表頭數(shù)據(jù)存儲(chǔ)于一個(gè)存儲(chǔ)器中,對(duì)現(xiàn)場采集的數(shù)據(jù)獨(dú)立保存于另一個(gè)存儲(chǔ)器中,根據(jù)判別條件,由打印機(jī)控制模塊分時(shí)讀出存儲(chǔ)器的數(shù)據(jù)并寫入打印機(jī)顯示。控制系統(tǒng)原理如圖4所示。
圖4中,mapy模塊是按鍵防抖動(dòng)模塊,clk-conv是時(shí)鐘分頻模塊,得到打印控制塊和隨機(jī)存儲(chǔ)器所需的時(shí)鐘。隨機(jī)存儲(chǔ)器SRAM1和SRAM2是利用FPGA內(nèi)部資源綜合生成的,SRAM1中固化好了打印數(shù)據(jù)的表頭數(shù)據(jù),只需控制讀即可。設(shè)計(jì)中為了編程方便,僅僅將SRAM2源碼稍作修改即生成 SRAM1,實(shí)際可以設(shè)計(jì)ROM代替。SRAM2用來存儲(chǔ)打印機(jī)前端數(shù)據(jù)采樣與處理單元處理的數(shù)據(jù),并在打印控制模塊(printer)的控制下,分時(shí)送入打印機(jī)緩存。打印控制模塊是核心,它不僅查詢打印機(jī)的工作狀態(tài),控制打印機(jī)打印緩沖區(qū)數(shù)據(jù),還負(fù)責(zé)讀出SRAM中的數(shù)據(jù),并寫入打印機(jī)。
2.3 系統(tǒng)功能仿真與分析
微型打印機(jī)控制塊(圖4中printer塊)的功能仿真圖如圖5所示。clk是系統(tǒng)時(shí)鐘,busy,ack,stb,dout是微型打印機(jī)的并行接口信號(hào),currem_state表示工作時(shí)狀態(tài)之間的轉(zhuǎn)換關(guān)系。由圖可以看到,當(dāng)busy=O時(shí),狀態(tài)sO進(jìn)入s1,系統(tǒng)對(duì)stb置位后,數(shù)據(jù)由dout輸出,狀態(tài)轉(zhuǎn)移到s2,s2有足夠的延時(shí);當(dāng)ack為低電平時(shí),狀態(tài)轉(zhuǎn)移回到s0狀態(tài),等待下一次數(shù)據(jù)傳輸。實(shí)際上數(shù)據(jù)在s1狀態(tài)時(shí)就應(yīng)該輸出,但是圖中所示卻在s2狀態(tài)開始時(shí)輸出,這是因?yàn)樵O(shè)計(jì)有限狀態(tài)機(jī)時(shí),采用的是莫爾狀態(tài)機(jī)的基本思想,它屬于異步輸出狀態(tài)機(jī),輸出僅僅為當(dāng)前狀態(tài)的函數(shù),所以這類狀態(tài)機(jī)在輸入發(fā)生變化時(shí)還需要下一個(gè)時(shí)鐘的到來。打印機(jī)實(shí)際打印效果如圖6所示。
3 結(jié)語
利用VHDL硬件描述語言設(shè)計(jì)系統(tǒng)軟件,通過FPGA控制微型打印機(jī)工作。本微型打印機(jī)與FPGA組成打印系統(tǒng)后,F(xiàn)PGA將顯示數(shù)據(jù)寫入FPGA內(nèi)部設(shè)計(jì)的SRAM中,F(xiàn)PGA與微型打印機(jī)進(jìn)行數(shù)據(jù)交換后,將欲打印數(shù)據(jù)讀出并與控制命令一起按打印順序送到微型打印機(jī)打印緩沖區(qū)中,完成打印輸出。設(shè)計(jì)的打印系統(tǒng)攜帶方便,實(shí)時(shí)性高。