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