具体实施方式
一个典型的12英寸打印头由一个或多个打印引擎/控制器(PEC)控制(如下所述),实现在A4和信纸页面上的全页宽打印。在现有打印环境中,最多使用6个彩色墨水通道,它们是:·CMY,用于普通彩色打印·K,用于打印黑色文本和黑色内容·IR(红外),用于支持标记的应用·F(定色剂),用于高速打印
可以使用单个芯片实现与打印头接口的打印引擎/控制器。该芯片必须具有4个基本功能:·通过串行接口(例如IEEE 1394)接收压缩的页面数据·具有从压缩数据产生页面的打印引擎。该打印引擎必须具备下列功能:扩展页面图像、抖动连续色调层、把黑色层复合到连续色调层上、增加红外标记(可选)、以及向打印头发送结果图像。·提供一个控制打印头和步进电机的打印控制器·提供两个标准的低速串行口,用于与两个QA芯片通信。需要注意的是,必须提供两个串口,而不能是一个串口,这样才能保证在鉴权过程中的高度安全性。
由于Memjet打印头的页宽特点,必须以恒定的速度打印每个页面,以防止产生可见的瑕疵。这意味着不能改变打印速度来配合输入数据速率。因此,这种打印方式需要把文档光栅化和文档打印分离开来,这样才能以恒定速率向打印头提供数据。必须首先把页面内容完全光栅化,然后才能进行打印。为了满足这个要求,可以在内存中存储每个光栅化的页面图像的压缩数据。文档光栅化和文档打印的分离还允许在提前对简单页面进行光栅化,以便留出时间对比较复杂的页面进行光栅化。
由于连续色调图像由随机抖动重构而黑色文本和线图形从点阵直接重构,所以压缩后的页面图像格式都包含一个分离的前景双层黑色层和一个背景连续色调层。在连续色调层被抖动处理后,黑色层被复合到连续色调层上(虽然连续色调层也可能有黑色成分)。最后,可以把必要的Netpage标记(使用红外或黑色墨水打印)加入到页面上,产生打印输出。
RIP软件/硬件对页面描述进行光栅化,并压缩光栅化后的页面图像。
然后,每个压缩的页面图像被保存到内存中。页面描述中的抖动矩阵选择区域被光栅化为一个连续色调分辨率双层位图,然后被无损地压缩到可以忽略不计的大小,它构成压缩页面图像的一部分。打印页面的红外(IR)层还可以包含一定密度的Netpage标记。
图1所示为从计算机系统向打印页面发送文档的数据流。在11处接收到文档,然后文档被装载到存储缓冲器12中,在存储缓冲器12中产生页面布局,并增加所需的对象。从存储缓冲器12中输出的页面在13中被光栅化,在14中被压缩,然后被送到打印引擎控制器10中。打印引擎控制器10接收压缩的页面图像,并保存在存储缓冲器15中,然后,存储缓冲器15中存储的压缩的页面图像被送到页面扩展器16中,并被还原为非压缩的页面图像。在17中,对连续色调层施加所需的抖动。在18中,黑色双层图像层被复合到连续色调层上,在19中,向复合后的图像加入红外标记。然后,在20中,复合后的页面数据被打印出来,形成页面21。
在管道的第一个阶段中,打印引擎/控制器扩展以JPEG格式压缩的连续色调CMYK层(见下文),扩展以Group 4传真格式压缩的双层抖动矩阵选择图(见下文),并扩展以Group 4传真格式压缩的双层黑色层(见下文),所有扩展工作都以并行方式完成。同时,标记编码器从压缩的页面图像编码双层IR标记数据。在管道的第二个阶段中,打印引擎/控制器使用根据抖动矩阵选择图选择的抖动矩阵抖动连续色调CMYK层,把双层黑色层复合到所得到的双层K层上,并向页面增加IR层。在需要时,打印引擎/控制器还在C、M、Y、K、或IR通道中的每个点的位置上产生定色剂层。在管道的最后一个阶段中,打印引擎/控制器通过打印头接口利用打印头打印双层CMYK+IR数据(见下文)。
图2所示为打印引擎/控制器10与总体打印机系统体系的关系示意图。打印机系统可能包含的部件有:
·一个打印引擎/控制器(PEC):一个PEC芯片10或芯片集负责接收压缩的页面数据,并把数据存储到存储缓冲器24中,执行页面扩展、黑色层复合,并把点数据发送给打印头23。PEC芯片10或芯片集还可以与QA芯片25、26通信,从而提供一种获得打印头特性数据的方法,以保证最佳打印效果。PEC是本发明的主体。
·一个存储缓冲器:存储缓冲器24用于存储压缩的页面图像,并且在打印特定页面的过程中存储临时数据。存储缓冲器的构造和原理是现有技术,在使用本发明的PEC时,可以利用相关的各种标准的芯片和技术。
·一个主QA芯片:主芯片25与可更换墨盒QA芯片26配合使用。QA单元的构造和原理是一种现有技术,在使用本发明的PEC时,可以利用相关的各种现有QA过程。例如,在我们的同类美国专利申请中描述了一种QA芯片:
USSN |
我们的备案号 |
我们的标题 |
TBA |
AUTH01 |
验证协议和系统 |
09/112,763 |
AUTH02 |
用于保护芯片免受IDD波动冲击的电路 |
09/112,737 |
AUTH04 |
保护片上存储器(闪存和RAM)的方法 |
09/112,761 |
AUTH05 |
芯片的防篡改方法 |
09/113,223 |
AUTH06 |
鉴权物理对象的系统 |
TBA |
AUTH07 |
验证协议和系统 |
TBA |
AUTH08 |
验证协议和系统 |
09/505,003 |
AUTH09 |
消耗品的鉴权协议和系统 |
09/517,608 |
AUTH10 |
消耗品的鉴权协议和系统 |
09/505,147 |
AUTH11 |
消耗品的鉴权协议和系统 |
09/505,952 |
AUTH12 |
对存储在闪存中的数值的非法更改 |
TBA |
AUTH13 |
处理安全数据的系统 |
09/516,874 |
AUTH14 |
带有防电源冲击的鉴权芯片 |
TBA |
AUTH15 |
秘密数据的保护处理 |
QA芯片通信功能最好包含在打印引擎/控制器芯片的总体功能中,因为它在图像扩展和驱动物理打印头方面有一定的作用。通过嵌入QA芯片的通信功能,可以保证打印页面时不会发生缺墨现象。嵌入在打印头组件中的QA最好使用一个鉴权芯片实现。由于它是主QA芯片,所以只包含鉴权密钥,不包含用户数据。但是,该芯片必须与墨盒的QA芯片匹配。墨盒中的QA芯片储存保证最佳打印质量所需的信息,它是使用一个鉴权芯片实现的。
打印引擎/控制器芯片最好带有一个简单的微控制器CPU核心35以执行下列功能:·在打印页面过程中通过串行接口36执行QA芯片鉴权协议。·在打印过程中通过并口91控制步进电机(步进电机需要5KHz的处理频率)·在打印过程中同步打印引擎/控制器芯片的各部分·提供与外部数据请求(编程寄存器等)的一种接口方法·提供与打印头段低速数据请求(例如读取向量属性和写入脉冲参数)的一种接口方法·提供向外部DRAM写入横向和纵向打印标记的一种方法
图3所示为打印引擎的体系结构示意图。打印机引擎的页面扩展和打印管道由一个高速串行接口27(例如标准的IEEE 1394接口)、一个标准的JPEG解码器28、一个标准的Group 4 Fax解码器、一个定制的半色调器/合成器单元29、一个定制的标记编码器30、一个行装载器/格式器单元31、以及一个连接打印头33的定制接口32构成。解码器28,88和编码器30向半色调器/合成器单元29缓冲。标记编码器30根据协议向页面增加红外标记或页面标记,协议与页面的使用有关。讨论标记的内容已经超出了本发明的范围。
打印引擎以双缓冲方式工作。一个页面从高速串行接口27通过DRAM接口89和数据总线90被装载到DRAM 34中,同时,已装载的前一个页面被从DRAM 34读出,并被通过打印引擎管道传送。当完成页面的打印时,刚刚装入的页面成为被打印页面,同时通过高速串行接口27向DRAM34装入一个新页面。在第一个阶段,管道扩展所有JPEG压缩的连续色调(CMYK)层,并扩展所有两个Group 4传真压缩的双层数据流。上述两个数据流是一个黑色层(当然,打印引擎/控制器不知道是否为彩色,而且该双层层可以定向到任何输出墨水)以及一个蒙罩(该蒙罩用于为连续色调的抖动选择抖动点阵,见下文的说明)。在第二个阶段,上述数据被并行地加入标记,以便随后以红外(IR)或黑色墨水渲染。最后,在第三个阶段中,对连续色调层进行抖动处理,并把位置标记和双层点层复合到抖动后的双层层上。然后,数据流被很好地调整,以便在打印头中的重合段之间产生平滑的渐变效果,同时补偿打印头中的被堵喷嘴。在此阶段最多可以生成6个通道的双层数据。但是需要注意,并不是全部6个通道都出现在打印头上。例如,打印头可能只是CMY的,此时K被推入CMY通道,而IR被忽略。另外,如果没有IR墨水(或者出于测试目的),位置标记也可以被打印到K中。所得到的双层CMYK-IR点数据被缓冲并格式化,然后被通过一套行缓存器(见下文的说明)输出到打印头上。大多数行缓存器可以在芯片DRAM34中实现。在最后一个阶段中,通过打印头接口32打印上述6个通道的双层点数据。
图4所示的半色调器/合成器单元(HCU)29把半色调和连续色调(通常是CMYK)层合并为一个双层,并把Spot 1双层复合到适当的半色调连续色调层上。如果打印机中没有K墨水,那么HCU 29可以把K适当地映射为CMY点。它还根据抖动矩阵选择图中的相应数值逐点选择抖动矩阵。HCU 29的输入是(从JPEG解码器单元)通过缓存器37输入的一个扩展的连续色调调层,通过缓存器38输入的一个扩展的双层Spot 1层,通过缓存器39输入的一个扩展的抖动矩阵选择位图(通常与连续色调层的分辨率一样),以及通过缓存器40输入的全点分辨率的标记数据。HCU 29最多可以使用从外部DRAM34读取的两个抖动矩阵。由HCU 29向行装载器/格式单元(LLFU)41的输出是一套打印机分辨率双层图像行,最多可以达到6个颜色平面。连续色调层一般是CMYK或CMY,而双层Spot 1层是K。
图5中更详细地显示了HCU单元。在启动后,HCU不断运行,直到检测到一个页面结束条件或通过其控制寄存器被明确停止。HCU的第一个任务是把从缓存器平面(例如42)中接收并存储到各个比例单元(例如比例单元43)中的数据在水平和垂直方向上同时缩放为打印机的分辨率。
比例单元提供了在水平和垂直方向上把连续色调数据或双层数据缩放为打印机分辨率的一种方法。缩放是通过把上述两个方向上的数据值复制为该值的整数倍而实现的。缩放数据的处理过程是一种现有技术。
页边单元57向比例单元43提供两个控制位:前进点和前进行。前进点位允许状态机为同一个点数据生成多个实例(用于页边和为打印头中的重叠段创建点数据)。前进行位允许状态机控制特定点行的结束时间,从而根据打印机的页边;截断数据。它还使比例单元不必执行特殊的行结束逻辑。比例单元的输入数据是一个整行缓存器。该行被重复使用比例因子次,以便通过行复制实现垂直方向的缩放,在每一行中,每个值被重复使用比例因子次,以便通过像素复制实现水平方向的缩放。当输入行被重复使用比例因子次时(前进行位已经被设置为比例因子次),地址的输入缓存选择位被切换(双缓冲)。缩放单元的逻辑对于8位和1位的情况都是相同的,因为比例单元只产生地址。
由于每个连续色调层可以使用不同的分辨率,所以每个连续色调层被单独缩放。缓存器45中的双层Spot 1层和缓存器46中的抖动矩阵选择层也需要缩放。由于缓存器47中的双层标记数据是以正确的分辨率建立的,所以不需要缩放。缩放后的抖动矩阵选择位被抖动矩阵存取单元48用于从两个抖动矩阵中选择一个8位值。该8位值被输出到4个比较器中44、49-51,在这些比较器中,它们与特定的8位连续色调值相比较。实际抖动矩阵的产生与打印头的结构有关,而产生抖动矩阵的过程是一种现有技术。如果连续色调值大于或等于上述8位抖动矩阵值,那么就输出1,否则输出0。在52-56中,这些位与从页边单元57而来的inPage位(指示特定点是否在页面的可打印区域内)进行“与(AND)”操作。HCU中的最后一个步骤是合成步骤。对于6个输出层中的每一层,都有一个单点合并器单元(例如单元58),每个单点合并器单元使用6个输入值。每个点合并器单元的输出位是上述输入位的合并值。这样,点颜色就能够被放入到任何输出颜色平面中(包括用于测试的红外颜色平面),黑色被合并到青色中、洋红色和红色(CMY)中(如果打印头中没有黑色墨水),而标记点数据被放入到一个可见平面中。定色剂颜色层也可以立即生成。点再生单元(DRU)59负责把为特定颜色层产生的点流组织到32位数值中,这样,输出内容被按段排列,而在每一段中,输出内容被按点排列。由于叠加段的点不是以段顺序生成的,所以还需要进行稍许调整。
页边单元57向比例单元43提供两个控制位:前进点和前进行。前进点位允许状态机为同一个点数据生成多个实例(用于页边和为打印头中的重叠段创建点数据)。前进行位允许状态机控制特定点行的结束时间,从而根据打印机的页边;截断数据。它还使比例单元不必执行特殊的行结束逻辑。
比较器单元带有一个简单的8位“大于”比较器。该比较器用于确定8位连续色调值是否大于或等于8位抖动矩阵值。因此,比较器单元使用两个8位输入,并产生一个1位长度的输出。
图6中更详细地显示了点合并器单元。点合并器单元提供了一种把双层抖动数据、Spot 1颜色以及标记数据与实际打印头的输出墨水映射的方法。每个点合并器单元使用6个1位输入,产生一个1位长度的输出,该输出值代表颜色平面的输出点。在60处的输出位是输入位的合并值。这样,点颜色可以被放入到任何输出颜色平面中(包括用于测试的红外颜色平面),黑色被合并到青色中、洋红色和红色(CMY)中(如果打印头中没有黑色墨水),而标记点数据被放入到一个可见平面中。定色剂颜色层可以通过简单地合并所有输入位生成。点合并器包含一个6位ColorMask寄存器61,该寄存器中的值作为6个输出位的掩码。每个输出位与相应的ColorMask寄存器位进行“与(AND)”操作,然后,把所得到的6位进行“或(OR)”操作,形成最终的输出位。
图7中所示为点再生单元(DRU),该单元负责为特定颜色平面把生成的位流组织到为32位数值中,这样,输出内容被按段排列,而在每一段中,输出内容被按点排列。由于叠加段的点不是以段顺序生成的,所以还需要进行稍许调整。DRU带有一个32位移位寄存器,一个普通的32位寄存器、以及一个普通的16位寄存器。一个5位计数器跟踪所处理的位数。抖动矩阵存取单元(DMAU)发出的点前进信号被用于指令DRU输出具体位值。
图7中的寄存器(A)62每个周期移位一次。它包含32个由点合成器单元(DMU)最近产生的点。每过32个周期,寄存器A 62中的全部32位值被复制到寄存器B 63中,复制动作由DRU状态机64通过一个简单的5位计数器产生的WriteEnable信号触发。在WriteEnable脉冲的同时,寄存器B 63中的16位奇位(1,3,5,7等)被复制到寄存器C 65中。然后,一个32位多路器根据状态机中的2位在下列3个输出中做出选择:·寄存器B中的全部32位·由寄存器A中的16个偶数位(0,2,4,6等)和寄存器B中的16个偶数位构成的一个32位值。寄存器A的16个偶数位构成该32位值的0-15位,而寄存器B中的16个偶数位构成该32位值的16-31位。·由寄存器B中的16个奇数位(1,3,5,7等)和寄存器C中的16位构成的一个32位数值。寄存器C中的位构成该32位值的0-15位,而寄存器B中的16个奇数位构成该32位值的16-31位。
DRU的状态机如表1所示。状态机的起始状态为0,每隔32个周期改变状态。在一个32周期过程中,一个no重叠位为该32周期累计所有dot advance位的“与(AND)”值(周期0的no重叠=dot advance,周期1-31的no重叠=no重叠AND dot advance)。表1.DRU的状态机
状态 |
No重叠 |
输出 |
输出有效 |
注释 |
下一个状态 |
0 |
X |
B |
0 |
起始状态 |
1 |
1 |
1 |
B |
1 |
正常的非重叠 |
1 |
1 |
0 |
B |
1 |
A包含第一个重叠 |
2 |
2 |
X |
偶数A,偶数B |
1 |
A包含第二个重叠B包含第一个重叠 |
3 |
3 |
X |
C,奇数B |
1 |
C包含第一个重叠B包含第二个重叠 | |
图5中的页边单元(MU)57负责根据当前页的页边距把从抖动矩阵存取单元(DMAU)获得的前进点和前进行信号转化为一般控制信号。它还负责生成页面端条件。MU的计数器保存着当前页的点和行的数值。在一页开始时,这两个值都为0。每次当MU从DMAU接收一个点提前信号时,点计数器加1。当MU从DMAU接收到行提前信号时,行计数器加1,而点计数器被置0。在每个周期内,把当前行和点值与页边值进行比较,然后根据这些页边值输出点提前、行提前,和页边内信号。DMAU只包含HCU的实际存储要求。
图8中所示为行装载器/格式单元(LLFU)。LLFU从HCU接收点信息,为特定的打印行把点装载到适当的缓存器中(某些在芯片中,某些在外部DRAM34中),并把这些点数据格式化为打印头所需的顺序。图9为一个LLFU的外部接口的高级模块图。向LLFU的输入67是一组32位字和一个DataValid位,这些数据都由HCU产生。输出68是一组90位的值,代表6种颜色的15个打印头段的最大值。并不是所有输出位都有效,这与打印头中实际使用的颜色数有关。
本文中所述的打印头的喷嘴部分由两排喷嘴构成,也就是说,同一种颜色的奇数和偶数点在不同的行上打印,偶数点用于行L,而奇数点用于行L-2。另外,在一个颜色的点与另一种颜色的点之间有若干行。因为HCU同时计算相同点位置的6个颜色平面,所以必须为每个颜色平面延迟点数据,直到同一个点定位到相应的彩色喷嘴上。
每个缓冲行的大小取决于打印头的宽度。由于每个打印引擎/控制器为多达15个打印头段产生点数据,所以单个奇数缓冲行或偶数缓冲行由15套640点组成,总数据量为9600位(1200字节)。例如,color 6奇数点所需的缓存器为45KB。
图10是颜色N OESplit(见图9的Oesplit 70)的模块图,图9中的每个缓存器E、F、71、72的模块图可以在图10和图11中找到。缓存器EF是一种双缓存机制,用于向图3中显示的打印头接口(PHI)32传输数据。因此,缓存器E和F具有相同的结构。在点行的处理过程中,当上述缓存器E、F中一个用于写数据时,另一个用于读数据。这两个缓存器在接收到从PHI发来的行同步信号时进行逻辑交换。缓存器E和F都由6个子缓存器构成,一个子缓存器对应一个颜色,如图11所示。颜色1的子缓存器编号为73。每个子缓存器的容量是2400B,足以储存15个1280点/段的段。由于内存是以32位方式读写的,所以每个子缓存器有600个地址(需要10个地址位)。在每个颜色的子缓存器中,所有偶数点都被放在奇数点的前面。如果有未用的空间(用于少于15个段的打印),那么未用空间应位于每个颜色的子缓存器的末端。每个子缓存器实际使用的存储量与打印引擎/控制器实际编址的端数量直接相关。对于一个15段打印头,由1200B个偶数点,后跟1200B个奇数点,没有未用空间。所使用的子缓存器的数量与打印头所用的颜色数直接相关。所支持的最多颜色数为6。
每个缓存器E、F的寻址编码电路可以保证在一个特定周期中对所有6个子缓存器进行一次32位访问——可以从所有6个缓存器读取数据,也可以向其中的某个缓存器写入数据。从每个颜色缓存器中读取的32位中,只有一位被选择用来构成6个输出位的输出。这个过程在图11中示出。地址的15位中,10位地址用于选择32位数据,5位地址用于从所选的32位数据中选择1位,从而获得要读取的1位数据。每个子缓存器73-78都有自己的WriteEnable行,因此,一个32位值可以在给定周期内写入特定的颜色缓存器。这些WriteEnable行是通过上述WriteEnable输入与ColorSelect的解码形式的“与(AND)”操作实现的。行79的DataIn的32位是共享的,因为实际上只有一个缓冲器接受数据。
用于从缓存器E和F中读取数据的地址是直接生成的。每个周期产生一个用于为特定段取上述6位数值(1位/颜色)的位地址。通过向当前位地址上加640,可以转到下一个段中的对应点。加640而不是1280是因为,在缓存器中奇数和偶数点是分离的。对上述动作重复NumSegments次,可以取回代表偶数点的数据,然后把这些位传送给PHI。当NumSegments=15时,位数为90(15×6位)。然后,为奇数点重复上述过程。因此,完整的偶数/奇数位生成过程需要重复动作640次,每次需对起始地址加1。采取这种方法,所有点数据都在640×2×NumSegments个周期中被以打印头所需要的顺序传递到PHI中。当NumSegments=15时,要经历19200个周期。需要注意的是,不管在打印头中实际使用的颜色数是多少,在给定读取周期中,都会产生6位数值(每位用于1个颜色缓存器)。
另外,我们为写入到图9中的90位Transfer寄存器90产生TWriteEnable控制信号。由于LLFU在PHI之前开始,我们必须从PHI传送Advance脉冲前的第一个值。我们还必须为第一个Advance脉冲产生下一个值。方法是在NumSegments周期后把第一个值传送给Transfer寄存器,然后停止NumSegments个周期,等待Advance脉冲启动下一个NumSegments周期组。当第一个Advance脉冲到达时,LLFU将与PHI同步。
单个点行的读取过程在下面的伪代码中说明:
DoneFirst=FALSE
WantToXfer=FALSE
For DotInSegment0=0 to 1279
If(DotInSegment0:bit0==0)
CurrAdr=DotInSegment0(high bits)(puts in range 0 to
639)
EndIf
XfersRemaining=NumSegments
Do
WantToXfer=(XfersRemaining==0)
TWriteEnable=(WantToXfer AND NOT DoneFirst)OR
PHI:ADVANCE
DoneFirst=DoneFirst OR TWri teEnable
Stall=WantToXfer AND(NOT TWriteEnable)
SWriteEnable=NOT(Stall)
If(SWriteEnable)
Shift Register=Fetch 6 bits from
EFSense[ReadBuffer]:CurrAdr
CurrAdr=CurrAdr+640
XfersRemaining=XfersRemaining-1
EndIf
Until(TWriteEnable)
<dp n="d18"/>
EndFor
Wait until BufferEF Write process has finished
EFSense=NOT(EFSense)
当读进程从E或F向PHI传送数据时,一个写进程正在准备另一个缓存器中的下一个点行。
被写入E或F的数据是由HCU产生的颜色1数据以及从缓存器D(由DRAM提供数据)提供的color 2-6数据。每当HCU的OutputValid被置为真时,颜色1数据就被写入EF中;在其它时间,color 2-6数据被从寄存器C中写入EF。
图9中的缓存器OE181是一个32位寄存器,它用于存储某个HCU为颜色1产生的连续32个点的集合。虽然点在页面上是连续的,但是奇数和偶数点不是同时打印的。
缓存器AB 82采用一种双缓存机制,它为颜色1把奇数点数据延迟2个点行。因此,缓存器A和B的结构是相同的。在点行的处理过程中,一个点行被从缓存器中读取,其中一个点行被读取,然后被写入。当整个点行处理完成后,这两个缓存器互换逻辑。一个1位标志ABSense确定从哪个缓存器中读取以及向哪个缓存器写入。
每当输出有效控制标志被设置为真时(在第一个标志发送后,每隔32个周期设置一次),HCU提供颜色1的32位数据。这32位数据为一个点行定义了一个连续的32点集,其中有16个偶数点(位0、2、4等),16个奇数点(位1、3、5等)。输出有效控制器标志作为OE1寄存器81的WriteEnable控制标记。我们每隔2个OutputValid信号处理一次HCU数据。HCU颜色1的16个偶数位被与寄存器OE1的16个偶数位合并,产生32位的偶数颜色1数据。同样,HCU的16个奇数位被与寄存器OE1的16个奇数位合并,产生32位的奇数颜色1数据。在收到第一个OutputValid信号时,我们读取缓存器AB的数据,把奇数数据传送给缓存器EF中的颜色1,如图11中的73。在收到第二个OutputValid信号时,我们把奇数数据的32位写入上述缓存器AB中,然后把偶数数据的32位写到缓存器EF的颜色1中。
每当OutputValid被设置为真时,HCU就为每个颜色平面提供32位数据。这种动作每隔32个周期出现一次(不包括在特定启动时间内)。这32位数据为一个点行定义了一个连续的32点,其中包含16个偶数点(位0、2、4等)和16个奇数点(位1、3、5等)。
虽然缓存器OE1(图10中的83)用于为颜色1存储一个32位值,但是缓存器OE2到OE6分别用于为color 2到color 6存储一个32位值。正如颜色1的点每隔64个周期(每隔两个OutputValid标志)被分为代表颜色1的奇数点的32位数据和代表颜色1的偶数点的32位数据一样,其它颜色平面的点也被划分为偶数和奇数点。
但是,点数据被延迟若干行,然后被通过缓存器CD(图9中的84)输出到DRAM中,而不是直接写入缓存器EF中。当特定行的点被写入DRAM时,前一行的点被从DRAM中读出,并被写入缓存器EF(71,72)。这个过程必须与把颜色1写入缓存器EF的过程交错进行。
每次从HCU收到一个OutputValid标志时(如图10中的85行),颜色N的32位数据就被写入缓存器OEN 83。每次收到第二个OutputValid标志时,合并后的64位数据就被写入颜色缓存器N 86。对于颜色平面2-6,这个过程是并行进行的。颜色缓存区N 86含有40套64位数据(320B),以便为两个完整的段存储点数据。这样,前一个段的数据(包括奇数和偶数点)在一个整段生成时间(20×64=1280周期)内被输出到DRAM中。写入操作的地址是直接生成的。行87的ColorNWriteEnable信号每隔两个OutputValid标志产生一次。地址从0开始,每隔两个OutputValid标记增加1,直到39。当地址到达39时,它将被重置为0,而不是步进到40,这样可以实现双缓冲方案。只要在OutputValid标记出现之间不发生读操作,上述工作就一直进行,并且前一个段的数据可以在产生单个段的数据的时间内被写入到DRAM中。下面的伪代码说明了上述过程:
adr=0
firstEncountered=0
While(NOT AdvanceLine)
If(HCU_OutputValid)AND(firstEncountered))
ColorNWriteEnable=TRUE
ColorNAdr=adr
If(adr==39)
adr=0
Else
adr=adr+1
EndIf
Else
ColorNWriteEnable=FALSE
EndIf
If(HCU_OutputValid)
firstEncountered=NOT(firstEncountered)
EndIf
EndWhile
读操作的地址生成过程比较复杂一些,因为它与DRAM读写(包括读和写)、缓存器EF的读写、以及颜色1的生成时间有关。读操作的地址生成过程在下面进一步说明。
缓存器C、D、E、F和颜色N的地址生成都与DRAM读写的时间有关,并且不能影响与缓存器E和F有关的颜色1的处理。地址生成的基本原理是,把颜色N(奇数点或偶数点)的一个段的数据从DRAM中通过缓存器CD传送给缓存器EF,当从DRAM中读出数据时,根据ColorBufferN中的值替换上述点,同样,对奇数和偶数点中的每种颜色执行相同的过程。当累积了一个完整段的所有点数据后(需要20个64周期),重新开始上述过程。当把给定行的所有段的数据在寄存器与DRAMA之间传输完成后,把该颜色的DRAM的当前地址步进1次,直到把该颜色的点行的特定数据从DRAM中读回。在本处理方法中,DRAM与一种FIFO非常相似。最终的结果是,颜色N(偶数或奇数点)被从DRAM中读入缓存器D,同时颜色N(前述偶数或奇数点)被复制到缓存器C中。向缓存器C复制数据需要20或21个周期,具体周期数取决于OutputValid标志是否在20次传输过程中出现。当上述两个操作都完成后(通常,DRAM存取是一种较慢的工作),过程的第二部分开始。也就是说,把缓存器C中的数据写入到DRAM中(写到上述读操作的同一个地点),并且把缓存器D中的数据复制到缓存器EF中(同样,由于正在传输颜色1的数据,所以当OutputValid标志出现时,不会传输颜色N的数据)。当上述两个操作完成后,为颜色N(奇数或偶数点)执行相同的过程,然后为每个剩余的颜色也执行相同的过程。上述的完整双过程被重复执行10次。然后,为下一行的处理更新DRAM中存储的每个当前行的地址。
上述的地址生成过程可以视为NumSegments需要10个(20×32位读操作+20×32位写操作)。下面的伪代码可以说明这种地址生成过程:
EFStartAdr=0
<dp n="d22"/>
Do NumSegments times:
For CurrColor=0 to MaxHal fColors
DRAMStartAddress=ColorCurrAdr[CurrColor]
While reading 640 bits from DRAMStartAddress into D(>=20
cycles)
ColorNAdr=0
While(ColorNAdr!=20)
If(NOT HCU_OutputValid)
Transfer ColorNBuffer[ColorNAdr|CurrColor_bit0]
to C[ColorNAdr]
ColorNAdr=ColorNAdr+1
EndIf
EndWhile
EndWhile-wait until read has finished
While writ ing 640 bits from C into DRAMStartAddress(>=20
cycles)
ColorNAdr=0
EFAdr=EFStartAdr
While(ColorNAdr!=20)
If(NOT HCU_OutputValid)
Transfer D[ColorNAdr]to EF[CurrColor|EFAdr]
If((ColorNAdr==19)AND(CurrColor==
NumHal fColors))
<dp n="d23"/>
EFStartAdr=EFAdr+1
Else
EFAdr=EFAdr+1
EndIf
ColorNAdr=ColorNAdr+1
EndIf
EndWhile
EndWhile-wait until write has finished
If(DRAMStartAddress==DRAMMaxVal)
ColorCurrAdr[currColor]=round up DRAMStartAddress to
next 1KByte page
Else
ColorCurrAdr[currColor]=DRAMStartAddress+640 bits
EndIf
If(Segment==maxSegments)
If(ColorCurrRow[CurrColor]==
ColorMaxRow[CurrColor])
ColorCurrRow[currColor]=ColorStartRow[currColor]
ColorCurrAdr[currColor]=ColorStartAdr[currColor]
Else
ColorStartRow[currColor]=ColorCurrRow[currColor]
+ 1
EndIf
EndIf
<dp n="d24"/>
EndFor
EndDo
Wait until next Advance signal from PHI
需要注意的是,MaxHalfColors寄存器应小于需要对奇数颜色和偶数颜色单独处理的颜色(但不包括颜色1)数。例如,对于一个标准的6颜色打印系统,需要处理的总颜色数(包括奇数颜色和偶数颜色)为10(colors 2-6的奇数和偶数色),所以应该把MaxHalfColors设置为9。
LLFU需要2个NumSegments周期来为PHI准备数据的第一个180位。因此,必须在已经LLFU启动2个NumSegments周期的时间后才能启动打印头和开始第一个LineSync脉冲。这样Transfer的初始值才有效,也才能向Transfer寄存器中装入下90位数据。
打印头接口(PHI)是处理器向打印头装载要打印点的途径,它控制着实际的点打印过程。它从LLFU接收数据,并把数据输出给打印头。必须能处理各种打印头宽度和格式。PHI的内部结构应支持6种打印颜色、每次传输8个段、以及2个段组。这样才能满足能够以全页宽打印A4/信封幅面的15段(8.5英寸)打印机的要求。
组合打印头的特征化向量可以从串行接口读回。特征化向量可包含被堵打印嘴的信息以及相对段的错排数据。通过每个打印头段的低速串行总线可以查询每个打印头段的信息,查询结果返回各个段的特征化向量。从多个打印头芯片产生的特征化向量经过合并后产生整个多段打印头的喷嘴缺陷列表,这样,在打印中打印引擎可以补偿有缺陷的喷嘴。如果有缺陷的喷嘴的数量较少,那么经补偿后的打印结果与不含有缺陷的喷嘴的打印头的打印效果没有明显差别。
每个打印头段的特征化向量为384位,包含:·标志和打印头段的信息(共64位),包括序列号和段中的颜色数。·相对于前一个段的错排数据(16位,0=第一个段)·其余位为有缺陷的喷嘴的列表(长度可变)。
有缺陷的喷嘴的列表的长度是可变的。每个有缺陷的喷嘴数据的结构如下:·5位计数(0=列表尾)·3位颜色·计数×11位,每个有缺陷的喷嘴都有一个记录
总体来说,打印头段的连接如表12所示。需要注意的是,当存在多个颜色时,某些连接是重复的。
表12.打印头段的连接
名称 |
针对多颜色段重复 |
功能 |
D[n] |
是 |
图像数据的通道 |
SClk |
否 |
串行数据传输时钟 |
NPSync |
否 |
喷嘴相同步 |
PLL |
否 |
锁相环时钟 |
Ten |
否 |
启用并行传输 |
Reset |
否 |
控制复位 |
SCl |
否 |
用于控制的I2C串行时钟 |
SD |
否 |
用于控制的I2C串行数据 |
CCEn[n] |
否 |
启用控制芯片[n] |
Gnd |
否 |
模拟接地 |
Sense |
否 |
模拟感应输出 |
V- |
是 |
供给反向驱动装置 |
V+ |
是 |
供给正向驱动装置 |
Vss |
是 |
供给反向逻辑 |
Vdd |
否 |
供给正向逻辑 |
21mm长的打印头段在300μm中心距上可以具有64个结合垫。其中的24个结合垫是向驱动装置提供的V-电源,20个是向驱动装置提供的V+电源,其余的20连接是CMOS逻辑电源、信号和数据连接。表13中详细说明了这些连接:表13.6颜色段的连接
# |
名称 |
功能 |
1-6 |
V- |
供给反向驱动装置 |
7 |
Vss |
供给反向逻辑 |
8 |
D1[n] |
图像数据[n]的通道1(6通道打印头的定色剂) |
9 |
D2[n] |
图像数据[n]的通道2(6通道打印头的红外墨水) |
10 |
SClk |
串行数据传输时钟 |
11 |
Vdd |
供给正向逻辑 |
12-16 |
V+ |
供给正向驱动装置 |
17-22 |
V- |
供给反向驱动装置 |
23 |
NPSync |
喷嘴相同步 |
24 |
D3[n] |
图像数据[n]的通道3(6通道打印头的黑色墨水) |
25 |
D4[n] |
图像数据[n]的通道4(6通道打印头的黄色墨水) |
26 |
PLL |
锁相环时钟 |
27 |
TEn |
启用并行传输 |
28-32 |
V+ |
供给正向驱动装置 |
33-38 |
V- |
供给反向驱动装置 |
39 |
Reset |
控制复位 |
40 |
D5[n] |
图像数据[n]的通道5(6通道打印头的品红墨水) |
41 |
D6[n] |
图像数据[n]的通道6(6通道打印头的青色墨水) |
42 |
SCl |
用于控制的I2C串行时钟 |
43 |
SD |
用于控制的I2C串行数据 |
44-48 |
V+ |
供给正向驱动装置 |
49-54 |
V- |
供给反向驱动装置 |
55 |
Vdd |
供给正向逻辑 |
56 |
Gnd |
模拟接地 |
57 |
CCEn[n] |
启用控制芯片[n] |
58 |
Vss |
供给反向逻辑 |
59 |
Sense |
模拟感应输出 |
60-64 |
V+ |
供给正向驱动装置 |
一个多段打印头通常由若干个相同的打印头段构成。这些打印头段通常为21毫米宽,它们被制造在一起或制造后组装在一起,以组成所需宽度的打印头。打印头段可以根据需要重叠设置,以实现段之间的平滑过渡。每个21毫米打印头段在页面的相应部分上打印1600dpi的双层点,它们联合产生最终的图像。虽然每个段产生最终图像的1280个点,但是每个点都由彩色墨水的组合构成。例如,可以把15个打印头段并排起来实现12英寸宽的打印头。每个段都带有一个引入区、一个中央区、以及一个引出区。每个打印头段的引出区对应着下一个打印头段的引入区。
图12中用两个重叠段106、107所示为一个打印头段的3个区域。需要注意的是,段S106的引出区对应段S+1 107的引入区109。段的中央区是没有重叠的区域(106的110和107的111)。虽然本图显示的打印头段是垂直错排的,但是实际上错排有一定的角度,这样两个打印头段才能在垂直方向上排列。
在下文中,我们假设打印头是由上述若干个打印头段构成的。我们还假设这些打印头段被划分为G个段组,其中最大的段组中有L个段,以实现数据载入。我们假设打印头的激发机制是所有打印头段同时激发,并且在同一时刻只有一个段提供关于共用三态总线的反馈信息。在上述假定的基础上,表15中列出了打印头的外部连接。
表15.打印头的连接
名称 |
针脚 |
描述 |
Dn |
CL |
向段0到L-1的C移位寄存器输入 |
SClk |
G |
SClk[N](ShiftRegisterClock N)上的一个脉冲从Dn线路向段组N中的L段装入当前值。 |
NPSync |
1 |
NPSync上的一个脉冲启动所有打印头段打印一行 |
PLL |
1 |
用于在打印头中产生计时信号的锁相环时钟 |
Ten |
1 |
从移位寄存器向内部NozzleEnable位(每个喷嘴1位)并行传送数据 |
Reset |
1 |
控制复位 |
SCl |
1 |
用于控制的I2C串行时钟 |
SD |
1 |
用于控制的I2C串行数据 |
CCEn |
G |
CCEn N上的脉冲与D1[n]上的数据进行“与”运算的结果为段组N中的段n选择感应线路 |
Sense |
1 |
模拟感应输出 |
Gnd |
1 |
模拟感应接地 |
V- |
多个,取决于颜色数 |
供给反向驱动装置 |
V+ | |
供给正向驱动装置 |
Vss |
供给反向逻辑 |
Vdd |
供给正向逻辑 |
请参考图5,图中的HCU提供了使用两个不同的抖动矩阵抖动的方法,这两个抖动矩阵由抖动矩阵选择图选择。抖动矩阵存取单元(DMAU)48为每个循环提供了适当的抖动值。另外,DMAU还把抖动复制给多个重叠的Memjet打印头段。DMAU的作用只是为打印头中的输出点位置提供适当的8位抖动值。
如果整个Memjet打印头是由单片集成电路制成的,那么只需要一个抖动矩阵(例如64×64)就足够了。但是,Memjet打印头通常是由多个重叠的段构成的。段重叠可以实现从一个Memjet段向另一个Memjet段的平滑过渡,而不会产生可见的锐边瑕疵。另外,由于各段的位置安排的问题,这些段不需要精确地与打印点对齐。一个普通的抖动矩阵无法处理过渡,也无法处理段之间的亚点水平的对齐问题。使用打印引擎/控制器进行打印的方案是使用从Memjet打印头获得的特征化向量,并构造一套与打印头有关的抖动矩阵。每个段都可认为是具有一个引入区、一个中央区和一个引出区。每段的引出区与下一个段的引入区相对应。段的中央区是没有任何重叠的区域。
图12中通过显示两个重叠段106、107表示一个打印头段的3个区域。需要注意的是,段S106的引出区对应着段S+1 107的引入区109。对于任何数量的打印头段,我们可认为各段的中央区的抖动矩阵是相同的,但是段S的引出区和段S+1的引入区应按照两个段之间的排列方式配对。虽然多个打印引擎/控制器可以控制同一个页面的打印,但是一个特定的打印引擎/控制器只控制特定数量的打印头段,而另一个打印引擎/控制器只控制另一些打印头段。因此,由一个打印引擎/控制器控制的段组的第一个段的引入区实际上对应着由另一个打印引擎/控制器控制的段组的最后一段的引出区。
抖动矩阵的全部目的是使重叠区的亮度水平和点增益特征与正常区域的亮度水平和点增益特征一致。为此,需要为打印头段定义一套由打印引擎/控制器使用的抖动矩阵。这些抖动矩阵总称为多段抖动矩阵。
·中央区抖动矩阵是一个普通的抖动矩阵,它对于所有段都是相同的(由于段之间的排列问题,特定点行的第一个点的抖动矩阵值可能与期望的位置不一致)。
·应为每个段对的重叠区域使用引入/引出抖动矩阵。还需要为由打印引擎/控制器控制的所有段的集合提供一个引入和引出。引入/引出矩阵的宽度等于重叠区域的两个段的总点数。该值应在32到48之间(与16到24的重叠宽度对应)。一个段的引入/引出抖动矩阵和相邻段的引出矩阵配合使用,并计入了重叠区域的亚点调整问题以及重叠区域开始和结束时中央区域抖动矩阵的位置问题。
·还应提供第一个段的引入抖动矩阵以及最后一个段的引出抖动矩阵。它们与由打印引擎/控制器管理的其它段中的矩阵对应。
多段抖动矩阵按行组织。总行数等于抖动矩阵的高度。每一行都以双缓存方式从外部DRAM装入到本地DMAU中。当一个点行(相对于多段抖动矩阵的当前行)被生成时,多段抖动矩阵的下一行被载入。在从HCU状态机接收“前进行(advance line)”的信号时,抖动矩阵行缓冲区相互交换。
图13所示为多段抖动矩阵的一行的成分。
多段抖动矩阵的行的宽度取决于重叠尺寸和段数。假设中央区抖动矩阵的宽度是64,重叠区宽度为32点,有15个段,那么一共应该有64+32+32+(14×(32+32))个入口,每个入口为8位,总大小=1024字节。
DRAM要求在64KB存储区内每行为1KB,总共64行(抖动矩阵的高度)。每次输出一行时,DMAU必须从DRAM装载上述一行。对于每秒30000行的最高打印速度,装载量为30MB/秒左右。
DMAU实际上支持两个多段抖动矩阵,具体使用哪个抖动矩阵由抖动矩阵选择位确定。当Matrix2Valid 1位寄存器被置位时,使用第二个抖动矩阵。因此,在最高打印速度时,DRAM存储要求为128KB,DRAM访问要求总带宽为60MB/秒。所以在每个缓冲区1024B的情况下,DMAU包含4个行缓冲区,并使用15个偏移量寄存器作为进入中央区抖动矩阵的初始入口(每个段使用一个入口)。
地址生成的过程可以用下列伪代码描述:
DblBufferSelect=0
MatrixLineStartAddress=0(refers to 64KByte-aligned address of
<dp n="d32"/>
start of Matrix1)
Load Matrix 1 address pointed to by MatrixLineStartAddress
If(Matrix2Valid)
Load Matrix 2,address pointed to by MatrixLineStartAddress+
64KBytes
EndIf
Do until end-of-page
currAdr=64
lineAdvance=0
dotAdvance=0
dot=1
segment=1
While(NOT lineAdvance)
CalculateEntry
EndWhile
DblBufferSelect=NOT DblBufferSelect
MatrixLineStartAddress=(MatrixLineStartAddress+1)AND 63
Load Matrix 1 address pointed to by MatrixLineStartAddress
Load Matrix 2,address pointed to by MatrixLineStartAddress+
64KBytes
EndDo
其中,“Calculate Entry”是一个单循环过程,它可以由下面的伪代码描述。需要注意的是,如果Matrix2Valid寄存器被清除,那么不管抖动矩阵选择图的值是什么,将始终使用第一个抖动矩阵。
Output matrix value read from:
DblBufferSelect,DitherMatrixSelect AND Matrix2Valid,
CurrAdr
Output dotAdvance=NOT(((dot<32)AND(segment NOT==0)AND
(dot0==0))OR((dot>1248)AND(segment NOT=numSegments))AND
(dot0==0))
Output lineAdvance=((segment==numSegments)AND(dot==1280))
If((dot<32)OR(dot>1248))
CurrAdr=CurrAdr+1
Else If(dot==1248)
CurrAdr=NextOverlapAdr
Else If(dot==32)
NextOverlapAdr=CurrAdr
CurrAdr=CentralAreaFi rstDotDitherOffset[segment]
Else
CurrAdr=(CurrAdr+1)AND 63
EndIf
If(dot==1280)
dot=1
segment=segment+1
Else
dot=dot+1
EndIf
需要注意的是,点和段计数器用于对点进行计数,并且只与非重合区、第一个段的引入区以及最后一个段的引出区域中的实际段/点的组合情况对应。在重叠阶段,交错点对应着段S和段S+1。因此,“dotAdvance”信号只在此阶段中每隔1个点(第2个点)给出。
通过每个打印头段的低速串行总线可以查询每个打印头段的信息,查询结果返回各个段的特征化向量。从多个打印头芯片产生的特征化向量经过合并后产生整个多段打印头的喷嘴缺陷列表,这样,在打印中打印引擎可以补偿有缺陷的喷嘴。如果有缺陷的喷嘴的数量较少,那么经补偿后的打印结果与不含有缺陷的喷嘴的打印头的打印效果没有明显差别。
每个打印头段的特征化向量为384位,包含:·标志和打印头段的信息(共64位),包括序列号和段中的颜色数。·相对于前一个段的错排数据(16位,0=第一个段)·其余位为有缺陷的喷嘴的列表(长度可变)。
有缺陷的喷嘴的列表的长度是可变的。每个有缺陷的喷嘴数据的结构如下:·5位计数(0=列表尾)·3位颜色·计数×11位,每个有缺陷的喷嘴都有一个记录
淡入/淡出抖动矩阵不仅用于引入引出。它们是一起定义的,当按照错排的重叠方案使用它们时,可以保证在重叠区域维持恒定的点增益。这样,两个段之间不必要按点对齐。
段之间的错排是很重要的。对于不是按点对齐的两个段,第一个段上的点不是完全与第二个段上的点对齐。因此,第二个段上的两个点可能与第一个段的一个点重叠。如果第一个段上的某个点与第二个段上的某个点同时打印,那么在最终的打印结果上可能产生一个颜色加重的点。如果在第一个段上的某个点打印时,第二个段上的重叠点都不打印,那么最终打印结果上会出现一个半点。第一种情况会在页面上产生一个加重的色条,而第二种情况会在页面上产生一个较浅的颜色条,这两种情况都不是我们所希望的。
解决上述错排问题的一个方案是采用一个能够弥补上述错排情况的抖动单元,使重叠区域中维持恒定的点增益,这样才不会在打印页面上产生颜色较重的区域或颜色条。由于有两个段,所以要使用两个抖动单元。一个作为淡出单元,一个作为淡入单元。这两个单元必须同时使用,以产生恒定的点增益。很明显,不同的错排方案需要不同的抖动单元对。由半点错排产生的重叠与1/4点错排产生的重叠不同。因此每种错排方案都需要特定的抖动单元对。如果知道公共抖动单元从哪里开始重叠,那么可以更好地产生抖动单元对。
由于上述错排问题,当到达重叠区域的末尾时,还需要知道是否使用公共抖动单元中的预期位置(如果点之间能够完美地对准),或者是否需要使用抖动单元的另一列。因此,要使用一个偏移量来指定在特定段重叠对的末尾应衔接公共抖动单元的哪个部分。
因此,使用段错排有两个目的,第一个目的是为重叠区域产生抖动单元对。产生抖动单元对的目的是把公共抖动单元中的某个已知位置与抖动单元的所选列衔接。对于点之间完美对齐的段,抖动单元的所选列是预期的列,对错点错排的段,所选列是一个邻近列。因此,错排用于确定进入公共抖动单元的偏移量。这种情况一个例子是:对于每个段重叠区域,都有一个特定的抖动矩阵对,该抖动矩阵对还计入了公共抖动单元中的错排和位置。有很多种方法能够产生这些抖动单元,这是一种现有技术。可以为每个打印头错排对一次产生抖动单元。也可以为所有打印头一次产生抖动单元。例如,可以为多达100个点的错排产生一个详尽的抖动单元对列表。这个工作需要产生100×64个抖动单元对以及100×64个偏移量值——总共6400套数据。假设一个重叠区域占32个点,且抖动单元的高度为64,每个抖动单元对的数据量为4KB,那么总共需要12.5MB数据。这些数据可以存储在打印机驱动程序的安装光碟上(或其它媒质上)。在打印机驱动程序的安装过程中,可以根据连接的打印头的错排情况选择正确的抖动单元,对于一个15段的打印头,总共需要64KB数据。对于这种情况,只需要一次性产生抖动单元。通过模拟训练抖动单元产生技术,可以产生实际所需的6400个抖动单元(假设错排的范围为100个点)。“拟和函数”是一种简单的点增益计算。模拟训练的目的是尽量减少与标准抖动单元相比的点增益差异。
上述描述的目的只是说明本发明的较佳实施例,不应构成对本发明的任何限制。本领域的技术人员可以在本发明的特定实例基础上很容易地实现各种变化,但按照本发明进行的任何等价修改或修饰都应属于本
发明的范围。