微型打印机与FPGA的硬件接口及软件设计
扫描二维码
随时随地手机看文章
摘要:为了实现便携式、实时打印数据的目的,在分析EP3C25型FPGA和RD-E型微型打印机性能特点的基础上,基于嵌入式技术设计了 FPGA与微型打印机的硬件接口电路、软件流程及控制程序。利用FPGA控制微型打印机正常工作,对功能模块进行了仿真,实际应用中运行稳定。利用 FPGA的稳定性与高速数据处理能力,实现实时打印。整个系统集成于一块电路板,并由微型打印机输出,体积小,携带方便。
关键词:FPGA;微型打印机;硬件接口;软件设计
0 引言
FPGA的超大规模集成度优势和内部逻辑单元具有可重复配置能力的特点,使得其在芯片控制和接口设计中成为一种颇具吸引力的高性价控制器件。在此,设计了一种基于FPGA控制RD-E微型打印机工作的控制模块。在QuartusⅡ9.0 FPGA开发平台上通过VHDL语言编程控制微型打印机打印数据,在实际应用中具有一定的实用价值。
1 硬件系统
设计中采用Altera公司的CycloneⅢ系列FPGA芯片EP3C25和荣达创新科技有限公司生产的RD-E微型打印机组成硬件系统。
1.1 RD-E微型打印机简介
RD-E系列打印机是微型热敏加热点阵打印机,它专为仪器仪表面板安装而设计,采用独特的面板式嵌入结构,便可将整个打印机固定在仪表面板上。RD-E系列打印机内嵌448个字符及图块,32个用户自定义字符,国标一、二级汉字库中全部汉字和西文字、图符共8 178个。采用模块化驱动控制电路,有效地保护了打印头的绝对安全;打印机内置专门的复位控制电路、电源监测电路以及近乎完美的软硬件看门狗控制电路,以确保打印机不死机、不乱打。控制电路提供温度检测、电压检测、过热检测、缺纸检测等功能,有效延长了打印头的使用寿命,同时保证了打印机在不同的工作场合,打印出的效果更加清晰美观、更加高速流畅,也能降低打印噪音,输出完整数据。备有39个ESC/P兼容的打印命令,支持字符、汉字、图形的正向、反向、左右旋转打印、反白、上下划线、左右划线打印以及任意变高、变宽、行间距、字间距调整、水平制表、垂直制表、曲线打印、条形码打印等功能以及以上功能的混合打印。RD-E打印机分标准并行接口,标准串行接口2类,串行接口与RS232C标准兼容,可直接由微机串口或单片机控制。设计中采用并口打印机,其接口与CENTRONICS标准并口兼容,其外形及从RD-E打印机的26芯插座的方向看插座的引脚序号如图1所示。并行接口各引脚信号的定义如表1所示,信号的逻辑电平为TTL电平。
1.2 微型打印机与FPGA的接口设计
为满足FPGA的工作条件,必须完成FPGA外围电路的设计,如外部存储器、工作电源以及外部输入时钟即晶振电路的设计。EP3C25E144I7 N是CycloneⅢ系列工业级FPGA芯片,其供电电源分数字电压和模拟电压两类,其中模拟电压有A1.2 V和A2.5 V,分别对其内部锁相环PLL和模拟电压端供电,数字电压有D1.2 V和D3.3 V,分别对内部数字逻辑单元和输入/输出管脚供电。电源地同样分为模拟地与数字地两类,与模拟电源和数字电源对应。系统时钟由外部晶振提供,配置方式由外围电路拨码开关选择。
设计控制功能模块时,由于FPGA有富余的I/O接口,所以打印机可以不经过另外的接口电路而直接与FPGA相连接,同时FPGA其内部的嵌入式阵列块 EAB是输入端口和输出端口都带有触发器的RAM块,可实现小容量的ROM和RAM,无需外部扩展ROM和RAM,也无需外加锁存器。FPGA芯片可以通过编程配置其内部逻辑单元,通过编写软件来设计微型打印机控制器,所以只需分配好与打印机相连接的I/O接口,读写相连的信号线即可。打印机的BUSY,和D0~D7信号接口分别由FPGA在编程综合过程中分配通用I/O接口,接口方式如图2所示。
图中JP1和JP2是FPGA的配置接口,JP1与EPCS16SI16N外部存储芯片一起,构成FPGA的串行(AS)配置端口,当程序调试完成后,可将程序经JP2口下载至配置芯片EPCS16SI16N,FPGA上电之后,系统自动将配置芯片中的程序读入FPGA内,完成逻辑功能块的配置。JP1是 JTAG配置口,主要作用是方便程序的现场调试,不需经过外部存储器,程序直接下载到FPGA中完成逻辑功能块的配置,以验证程序设计能否实现预期的功能。SP1与SP2用以设置配置芯片与FPGA数据传输的工作方式,例如MESL2,MESL1,MESL0为“010”时,配置为标准串行端口,配置电压为3.3 V;若为“100”时为快速串行配置端口,配置电压可在3.3 V和2.5V两者中选其一。P1是有源晶振,可提供FPGA系统时钟频率。RP1是打印机数据端口的上拉排阻,这样输出数据与端口数据逻辑与之后输入打印机,避免显示乱码。打印机RD-E32-V8与FPGA由8根数据线和3条控制、状态读写线连接,另有一条线将2部分的接地端连接到公共的模拟地线。
2 软件实现
系统软件设计是基于VHDL语言编写的。软件设计的关键是在打印机工作时序的基础上完成微型打印机与FPGA之间数据和指令的读写和状态的检测。
2.1 控制时序与原理
控制过程的时序在延迟时间上有严格的要求,所以,设计控制程序时,必须考虑打印机状态转换和数据传输的延迟时间。当数据线上有待打印的数据时,打印机并不是立即将数据打印输出,必须根据当前的打印机状态来判断。
当BUSY状态被检测到为“1”时,说明打印机处于“忙”状态,此时打印机不会接收任何数据。当BUSY信号为“O”时,说明打印机处于“空闲”状态,先向数据线写入数据,在延时时间符合时序的情况下,通过FPGA控制信号,将数据写入打印机。为数据选通触发脉冲,下降沿时输入数据,对低电平的时间时序上也有要求,最小为O.5μs。当下降沿到来的同时,数据即送入打印机,同时BUSY信号由低电平跳变为高电平,阻止FPGA向打印机数据线写入数据。当数据输入以后,直到回答脉冲跳变成低电平,此时表示数据已被接受,而且打印机准备好接受下一数据,之后大约5μs时间以后,BUSY信号变为低电平,之后约5μs信号变高。对打印机的控制是通过查询方式实现的,根据打印机工作时序,将打印机控制过程分为3个状态,打印机控制程序基于这3个状态,采用VHDL语言的有限状态机编写实现。时序与状态转换如图3所示。
2.2 打印机控制命令及程序设计
RD-E型微型打印机提供了39条打印命令,打印命令与多数打印机兼容。其中,汉字打印命令其格式由16进制数表示,则为x“1B”x“3 8”x“n”。在连续3次接收数据后若接收到的是该命令,打印机将根据n值的不同选择不同点阵的汉字。在汉字打印方式中,打印机接收的汉字代码是2个字节对应一个汉字的标准机内码,即打印机每接收2个字节的机内码可调出一个汉字。打印机先接收机内码的高位字节,再接收低位字节。设计中,由于欲打印的数据分 16×16和12×12两种点阵汉字,所以n值设置为0或4,当n=O选择16×16点阵汉字打印,n=4选择12×12点阵汉字印,n的默认值为0。另一条命令是纸给进命令,即换行命令,其格式用16进制数表示为:x“OA”打印机打印当前缓冲器里的数据,并向前走纸一行,如果缓冲器里没有数据,则只执行向前走纸一行。打印空格或空行命令,其格式用16进制数表示为:x“1B”x“6 6”x“M”x“n”。如果M=O,该命令将打印n个空格;如果M=1,该命令将打印n个空行。由于打印数据必须与表头的栏目一一对应,而且每行打印的字符点阵不会完全相同,所以编程过程中对空格数的控制是需要花功夫的,调试时便出现过打印的已处理数据与表头不对应的情况。由于打印机内嵌选择字符集1和自定义字符集2,打印的数据中含有自定义字符集中的字符,所以还需选择打印输出字符集数据。字符集选择由命令x“1B”x“36"和x“1B”x“37”来实现。回车命令的命令字为x“0D”。打印机收到本命令后,即对缓冲区内的命令和字符进行处理,并按要求打印缓冲区内的全部字符或汉字。
打印机内置的汉字代码为标准汉字内码,高字节数值范围A1H~F7H,对应1~87区汉字;低字节数值范围A1H~FEH,对应每一区中的汉字位码1~94。汉字的区位码与机内码之间相互计算的方法为:
区码转换为16进制数,位码转换为16进制数
机内码高字节=区码+AOH
机内码低字节=位码+AOH
例如电阻的“阻”字区位码为5572,即55区,第2个字,其机内码为D7E8,将55(十进制)转为37(16进制),37H+AOH=D7H;将 72(十进制)转为48(16进制),48H+AOH=E8H,所以对表头要打印的汉字将其区位码转换成内码后存储起来,按先高字节,后低字节的顺序,在打印命令之后写入打印机即可。
软件设计在FPGA内部综合生成2个内部存储器,表头数据存储于一个存储器中,对现场采集的数据独立保存于另一个存储器中,根据判别条件,由打印机控制模块分时读出存储器的数据并写入打印机显示。控制系统原理如图4所示。
图4中,mapy模块是按键防抖动模块,clk-conv是时钟分频模块,得到打印控制块和随机存储器所需的时钟。随机存储器SRAM1和SRAM2是利用FPGA内部资源综合生成的,SRAM1中固化好了打印数据的表头数据,只需控制读即可。设计中为了编程方便,仅仅将SRAM2源码稍作修改即生成 SRAM1,实际可以设计ROM代替。SRAM2用来存储打印机前端数据采样与处理单元处理的数据,并在打印控制模块(printer)的控制下,分时送入打印机缓存。打印控制模块是核心,它不仅查询打印机的工作状态,控制打印机打印缓冲区数据,还负责读出SRAM中的数据,并写入打印机。
2.3 系统功能仿真与分析
微型打印机控制块(图4中printer块)的功能仿真图如图5所示。clk是系统时钟,busy,ack,stb,dout是微型打印机的并行接口信号,currem_state表示工作时状态之间的转换关系。由图可以看到,当busy=O时,状态sO进入s1,系统对stb置位后,数据由dout输出,状态转移到s2,s2有足够的延时;当ack为低电平时,状态转移回到s0状态,等待下一次数据传输。实际上数据在s1状态时就应该输出,但是图中所示却在s2状态开始时输出,这是因为设计有限状态机时,采用的是莫尔状态机的基本思想,它属于异步输出状态机,输出仅仅为当前状态的函数,所以这类状态机在输入发生变化时还需要下一个时钟的到来。打印机实际打印效果如图6所示。
3 结语
利用VHDL硬件描述语言设计系统软件,通过FPGA控制微型打印机工作。本微型打印机与FPGA组成打印系统后,FPGA将显示数据写入FPGA内部设计的SRAM中,FPGA与微型打印机进行数据交换后,将欲打印数据读出并与控制命令一起按打印顺序送到微型打印机打印缓冲区中,完成打印输出。设计的打印系统携带方便,实时性高。