具有集成电路器件的打印鼓
技术领域
本发明涉及打印机技术领域,而且公开了一种用于图像打印机等的打印鼓。本发明特别公开了一种包括集成电路器件的打印鼓。背景技术
最近,作为传统照相机和照相胶片技术的适当替代技术,已经建议了数字打印技术。传统的胶片和照相技术依赖于具有大量预格式化底片的胶卷,拉出的底片通过摄影系统,而且在其上成像摄影系统拍摄的图像的负片图像。胶卷用完后,将胶片回卷到胶片盒中,然后,将它送到处理间,对该底片进行处理和显影,以产生一套相应的正片照片。
不幸的是,这种系统具有大量显著缺陷。首先,显然,所使用的化学物质对光非常敏感,而且照射在胶卷上的光会导致胶片曝光。因此,需要在完全控制光成像的光敏环境下操作它们。这样就产生了繁杂的技术要求,从而增加了开销。此外,胶片处理技术需要采用“底片”,而且通过利用化学处理试剂进行复杂的卤化银处理等,对“正片”相纸进行后续处理。这通常非常麻烦、复杂而且昂贵。此外,由于非常普及,所以这种系统产生了标准化的特定尺寸的胶片格式,而且上述技术的灵活性通常可能最小。
最近,已经引入了全数码相机。这些相机设备通常采用与处理芯片相连的电荷耦合器件(CCD)或其他形式的光敏器件,处理芯片又连接到介质存储器,并控制该介质存储器,该介质存储器可以取可拆卸磁卡的形式。在这种类型的设备中,利用CCD捕获图像,并将该图像存储到磁存储器中。稍后,可以将捕获的图像或各图像下载到计算机设备上,然后,打印出供观看。数码相机的缺陷在于,不能立即访问图像,而需要进一步对它进行后处理,即,将它装载到计算机系统上,进一步的后处理过程通常有碍于立即、方便使用。
因此,通常需要一种操作方便、简单、有效的改进型相片图像生成设备。此外,还需要一种可以在其上有效再现图像的简单形式的便携式、立即打印介质。
在本专利申请中,公开了与设置了该打印鼓的打印介质和介质颜料一起使用验证芯片提供信息。本申请人已经认识到,非常值得提供一种利用打印鼓至少可以一起提供涉及介质颜料的信息的装置。利用适当加密技术,这可以用于防止售后再充。在打印技术领域内众所周知,这种售后再充已经成为打印行业内深感忧虑的原因。
发明内容
根据本发明的一个方面,提供了一种打印鼓,该打印鼓包括:
外壳;以及
集成电路器件,位于外壳上,该集成电路器件具有存储电路系统,该存储电路系统承载至少与该打印鼓的序列号、介质以及介质着色剂之一有关的数据。
根据本发明的另一个方面,提供了一种用于确定打印鼓的介质着色剂的方法,该方法包括读取位于打印鼓外壳上的集成电路器件的存储电路系统的步骤,该存储电路系统承载与介质着色剂有关的数据。
根据本发明的第三方面,提供了一种打印鼓,该打印鼓包括:
外壳;
介质着色剂供应装置,位于外壳内,而且含有一定量的介质着色剂;以及
集成电路器件,位于外壳上,该集成电路器件具有存储电路系统,该存储电路系统承载与介质着色剂有关的数据。
根据本发明的第四方面,提供了一种用于确定打印鼓的介质的方法,该方法包括读取位于打印鼓外壳上的集成电路器件的存储电路系统的步骤,该存储电路系统承载与打印鼓的介质有关的数据。
根据本发明的第五方面,提供了一种打印鼓,该打印鼓包括:
外壳;
介质供应装置,位于外壳内,而且含有一定量的介质;以及
集成电路器件,位于外壳上,该集成电路器件具有存储电路系统,该存储电路系统承载与介质有关的数据。
根据本发明的第六方面,提供了一种用于确定打印鼓的介质和介质着色剂的方法,该方法包括读取位于打印鼓外壳上的集成电路器件的存储电路系统的步骤,该存储电路系统承载与打印鼓的介质着色剂和介质有关的数据。
根据本发明的第七方面,提供了一种打印鼓,该打印鼓包括:
外壳;
介质和介质着色剂供应装置,位于外壳内,而且分别含有一定量的介质和一定量的介质着色剂;以及
集成电路器件,位于外壳上,该集成电路器件具有存储电路系统,该存储电路系统承载与介质着色剂和介质有关的数据。
根据本发明的第八方面,提供了一种用于打印鼓的验证芯片,该打印鼓具有:外壳;介质着色剂供应装置,位于外壳内,而且含有一定量的介质着色剂;以及馈送机构,位于外壳内,用于将介质着色剂送到打印机构,该验证芯片包括:
集成电路器件,可以安装在外壳内,该集成电路器件具有存储电路系统,该存储电路系统插入与介质着色剂有关的数据。
根据本发明的第九方面,提供了一种用于打印鼓的验证芯片,该打印鼓具有:外壳;介质供应装置,位于外壳内,而且含有一定量的介质;以及馈送机构,位于外壳内,用于将介质送到打印机构,该验证芯片包括:
集成电路器件,可以安装在外壳内,该集成电路器件具有存储电路系统,该存储电路系统插入与介质有关的数据。
根据本发明的第十方面,提供了一种用于打印鼓的验证芯片,该打印鼓具有:外壳;介质着色剂和介质供应装置,位于外壳内,而且分别含有一定量的介质着色剂和一定量的介质;以及馈送机构,位于外壳内,用于将介质着色剂和介质送到打印机构,该验证芯片包括:
集成电路器件,可以安装在外壳内,该集成电路器件具有存储电路系统,该存储电路系统插入与介质着色剂和介质有关的数据。
现在利用例子参考附图说明本发明。不应该将下面描述的特定性质理解为是对该发明内容的广泛性质的任何形式的限制。
附图说明
尽管存在属于本发明范围的任何其他形式,但是将参考附图,仅作为例子说明本发明的优选形式,附图包括:
图1示出根据优选实施例构造的Artcam设备;
图2是主Artcam电子部件的原理框图;
图3是Artcam中央处理器的原理框图;
图3(a)更详细示出VLIM矢量处理器;
图4更详细示出处理单元;
图5更详细示出ALU 188;
图6更详细示出进模块;
图7更详细示出出模块;
图8更详细示出寄存器模块;
图9更详细示出交叉开关1;
图10更详细示出交叉开关2;
图11更详细示出读取进程模块;
图12更详细示出读取进程模块;
图13更详细示出桶形移位器模块;
图14更详细示出加法器/逻辑模块;
图15更详细示出乘法模块;
图16更详细示出I/O地址发生器模块;
图17示出像素存储格式;
图18示顺序读迭代器进程;
图19示出方框方式读迭代器进程;
图20示出方框方式写迭代器进程;
图21示出垂直带方式读/写迭代器进程;
图22示出垂直带方式读/写迭代器进程;
图23示出生成顺序进程;
图24示出生成顺序进程;
图25示出生成垂直带进程;
图26示出生成垂直带进程;
图27示出像素数据结构;
图28示出像素处理进程;
图29示出显示器控制器的原理框图;
图30示出CCD图像组织;
图31示出逻辑图像存储格式;
图32示出内部图像存储器存储格式;
图33示出图像棱锥存储格式;
图34示出采样Artcard的进程的时间线(time line);
图35示出超级采样进程;
图36示出读转动的Artcard的进程;
图37示出解码Artcart所需步骤的流程图;
图38示出一个Artcart的左角的放大图;
图39示出一个检测目标;
图40示出用于检测目标的方法;
图41示出用于计算两个目标之间的距离的方法;
图42示出形心偏移的进程;
图43示出一种形式的形心查用表;
图44示出形心更新进程;
图45示出用于优选实施例的Δ处理查用表;
图46示出解扰Artcard数据的进程;
图47示出一系列点的放大图;
图48示出点卡的数据面;
图49示出一个数据块布局的原理图;
图50示出一个数据块;
图51和52示出图50所示数据块的各部分的放大图;
图53示出一个目标结构;
图54示出数据块的目标结构;
图55示出目标相对于数据区的边界时钟区的位置关系;
图56示出数据块取向列;
图57示出数据块的点阵列;
图58示出用于RS编码的数据结构的原理图;
图59示出典型RS编码;
图60示出RS编码进程;
图61示出数据块内的编码数据布局;
图62示出采样替换Artcard的采样进程;
图63以放大形式示出采样转动的替换Artcard的例子;
图64示出扫描进程;
图65示出扫描进程中的可能扫描分布;
图66示出符号错误的可能性与RS块错误之间的关系;
图67示出解码进程的流程图;
图68示出解码进程的进程使用图;
图69示出解码过程中的数据流步骤;
图70更详细示出读进程;
图71更详细示出检测替换Artcard的开始的进程;
图72更详细示出提取位数据的进程;
图73示出解码进程采用的分段进程;
图74更详细示出寻找目标的解码进程;
图75示出定位目标过程采用的数据结构;
图76示出Lancos 3函数结构;
图77示出用于示出时钟标记和边界区的、部分放大的数据块;
图78示出解码位图像的各处理步骤;
图79示出解码位图像的数据流步骤;
图80示出优选实施例的去扰进程;
图81示出卷积器的一种实现形式;
图82示出卷积进程;
图83示出合成进程;
图84更详细示出常规合成进程;
图85示出采用翘曲映像的翘曲进程;
图86示出翘曲双线性内插进程;
图87示出跨距计算进程;
图88示出基本跨距计算进程;
图89详细示出跨距计算进程的一种实现形式;
图90示出读图像棱锥平面进程;
图91示出利用棱锥表进行双线性内插;
图92示出直方图收集进程;
图93示出彩色转换进程;
图94示出彩色变换进程;
图95更详细示出彩色空间变换进程;
图96示出计算输入坐标的进程;
图97示出利用反馈的合成进程;
图98示出广义缩放进程;
图99示出X缩放进程中的比例;
图100示出Y缩放进程中的比例
图101示出镶嵌进程;
图102示出子像素平移进程;
图103示出合成进程;
图104示出利用反馈的合成进程;
图105示出利用输入图像中的颜色的铺砌进程;
图106示出利用反馈的铺砌进程;
图107示出利用纹理替换的铺砌进程;
图108示出利用输入图像中的颜色的铺砌进程;
图108示出利用输入图像中的颜色的铺砌进程;
图109示出不利用反馈施加纹理的进程;
图110示出利用反馈施加纹理的进程;
图111示出转动CCD像素的进程;
图112示出内插绿子像素的进程;
图113示出内插蓝子像素的进程;
图114示出内插红子像素的进程;
图115示出在奇数像素行0度转动情况下的CCD像素内插进程;
图116示出在偶数像素行0度转动情况下的CCD像素内插进程;
图117示出彩色变换到Lab彩色空间的进程;
图118示出计算1/√X的进程;
图119更详细示出计算1/√X的实现过程;
图120示出利用块形映像的Normal计算进程;
图121示出利用块形映像的照度计算进程;
图122更详细示出利用块形映像的照度计算进程;
图123示出利用定向光计算L的进程;
图124示出利用全向光和电光源计算L的进程;
图125示出利用全向光和电光源计算L的一种实现形式;
图126示出用于计算N·L点积的进程;
图127更详细示出用于计算N·L点积的进程;
图128示出用于计算R·V点积的进程;
图129更详细示出用于计算R·V点积的进程;
图130示出衰减计算输入和输出;
图131示出衰减计算的实际实现过程;
图132示出锥形因数的曲线图;
图133示出半阴影计算进程;
图134示出半阴影计算进程使用的角度;
图135示出半阴影计算的输入和输出;
图136示出半阴影计算的实际实现过程;
图137示出环境计算的输入和输出;
图138示出环境计算的实际实现过程;
图139示出扩散计算的实际实现过程;
图140示出扩散计算的输入和输出;
图141示出扩散计算的实际实现过程;
图142示出镜面计算的输入和输出;
图143示出镜面计算的实际实现过程;
图144示出镜面计算的输入和输出;
图145示出镜面计算的实际实现过程;
图146示出只环境计算的实际实现过程;
图147示出光计算的进程概况;
图148示出对于一个无穷远光源的典型照度计算过程;
图149示出对于全向光源不利用块形映像的典型照度计算过程;
图150示出对于全向光源利用块形映像的典型照度计算过程;
图151示出对于电光源不利用块形映像的典型照度计算过程;
图152示出利用相关块形映像对图像施加一个电光源的进程;
图153示出一个打印头的逻辑布局;
图154示出打印头接口的结构;
图155示出转动Lab图像的进程;
图156示出打印图像的像素格式;
图157示出混色处理;
图158示出产生8位输出的进程;
图159示出卡阅读器的透视图;
图160示出卡阅读器的分解透视图;
图161示出Artcard阅读器的特写镜头;
图162示出打印卷和打印头的透视图;
图163示出打印卷的第一分解透视图;
图164示出打印卷的第二分解透视图;
图164A示出根据本发明的打印鼓形式的打印卷和打印头的另一个实施例的三维立体图;
图164B示出图164A所示打印鼓的三维立体剖视图;
图164C示出图164A所示打印鼓的三维立体分解图;
图164D示出图164A所示打印鼓的墨水盒构成部分的三维立体分解图;
图164E示出图164A所示打印鼓的空气过滤器的三维立体图;
图165示出打印卷验证芯片;
图166示出打印卷验证芯片的放大图;
图167示出单验证芯片数据协议;
图168示出双验证芯片数据协议;
图169示出第一只存在协议;
图170示出第二只存在协议;
图171示出第三数据协议;
图172示出第四数据协议;
图173示出最长周期LFSR的原理框图;
图174示出时钟限制过滤器的原理框图;
图175示出窜改检测线的原理框图;
图176示出扩界nMOS晶体管;
图177示出从窜改检测线引出多个“异或”。
图178示出窜改线如何覆盖芯片的噪声发生器电路系统;
图179示出FET实现的常规方式;
图180示出优选实施例的FET实现的变换方式;
图181示出验证芯片的原理框图;
图182示出典型内存映像;
图183示出常数内存映像的例子;
图184示出RAM内存映像的例子;
图185示出闪速存储器变量内存映像的例子;
图186示出闪速存储器程序内存映像的例子;
图187示出状态机各部件之间的数据流和关系;
图188示出I/O单元的各部件之间的数据流和关系;
图189示出算术逻辑运算单元的原理框图;
图190示出RPL单元的原理框图;
图191示出ALU的ROR模块的原理框图;
图192示出程序计数器单元的方框图;
图193示出存储单元的方框图;
图194示出地址发生器单元的原理框图;
图195示出JSIGEN单元的原理框图;
图196示出JSRGEN单元的原理框图;
图197示出DBRGEN单元的原理框图;
图198示出LDKGEN单元的原理框图;
图199示出RPLGEN单元的原理框图;
图200示出VARGEN单元的原理框图;
图201示出CLRGEN单元的原理框图;
图202示出BITGEN单元的原理框图;
图203列出存储在打印卷验证芯片上的信息;
图204示出存储在Artcam验证芯片上的数据;
图205示出打印头脉冲表征进程;
图206示出打印头墨水供应机构的剖视分解透视图;
图207示出墨水头供应单元的底部透视图;
图208示出墨水头供应单元的底部侧面剖视图;
图209示出墨水头供应单元的顶部透视图;
图210示出墨水头供应单元的顶部侧面剖视图;
图211示出打印头的一小部分的透视图;
图212示出打印头单元的分解透视图;
图213示出Artcam相机的内部部分的顶部侧面透视图,它示出了展平的各部分;
图214示出Artcam相机的内部部分的底部侧面透视图,它示出了展平的各部分;
图215示出Artcam相机的内部部分的第一顶部侧面透视图,它示出了装在Artcam内的各部分;
图216示出Artcam相机的内部部分的第二顶部侧面透视图,它示出了装在Artcam内的各部分;
图217示出Artcam相机的内部部分的第二顶部侧面透视图,它示出了装在Artcam内的各部分;
图218示出明信片打印卷的背面部分;
图219示出印出图像后,明信片打印卷上的相应正面图像;
图220示出准备好供消费者购买的一种形式的打印卷;
图221示出全部Artcam应用的各软件/硬件模块的布局;
图222示出相机管理器的各软件/硬件模块的布局;
图223示出图像处理管理器的各软件/硬件模块的布局;
图224示出打印机管理器的各软件/硬件模块的布局;
图225示出图像处理管理器的各软件/硬件模块的布局;
图226示出文件管理器的各软件/硬件模块的布局;
图227示出替换形式的打印卷的部分剖视透视图;
图228示出图227所示打印卷的左侧分解透视图;
图229示出一个打印卷的右侧分解透视图;
图230示出打印卷的核心部分的部分剖视分解透视图;以及
图231示出打印卷的内部核心部分的第二分解透视图。
具体实施方式
图1示出根据优选实施例构造的数字图像处理相机系统。相机单元1包括用于插入完整打印卷(未示出)的装置。相机单元1包括用于检测相机捕获的图像3的区域图像传感器2。可以任选设置第二区域图像传感器,以成像景像3,从而任选产生立体照相输出效果。
相机1可以包括任选彩色显示器5,用于显示传感器2检测的图像。在将简单图像显示在显示器5上时,可以按下按钮6,从而从相机单元1输出打印图像8。以下被称为“Artcard”9的一系列卡的一面上含有编码信息,而其另一面上含有因为Artcard 9产生的特定影响而失真的图像。将Artcard 9插入位于相机1的侧面的Artcard阅读器10中,然后,在插入后,产生输出图像8,输出图像8的失真方式与Artcard 9的表面上出现的失真方式相同。因此,利用该简单用户界面,希望产生特定效果的用户可以将多个Artcard 9之一插入Artcard阅读器10中,然后,利用按钮19拍摄图像3的照片,从而获得相应的失真输出图像8。
除了用于显示相机单元的内部胶卷上的、包括印出数量的信息性信息的简单LCD输出显示器15外,相机单元1还可以包括多个其他控制按钮13、14。此外,利用CHP开关17,可以控制不同的输出格式。
现在参考图2,图2示出相机单元1的内部硬件的原理图。该内部硬件基于Artcam中央处理单元(ACP)31。
Artcam中央处理器31
Artcam中央处理器31提供了许多构成系统的“核心”的许多功能。优先将ACP 31实现为复杂、高速、片上CMOS系统。推荐采用具有某些全定制区域的标准单元设计。制造0.25微米CMOS的过程有助于实现要求的密度和速度以及合理的小芯片面积。
ACP 31提供的功能包括:
1.控制并数字化区域图像传感器2。3D立体形式的ACP需要2个与为了实现立体效果设置的任选图像传感器4相连的区域图像传感器接口。
2.区域图像传感器补偿、重新格式化以及图像增强。
3.存储器33的存储器接口以及对存储器33的管理。
4.为了从Artcard 9读取数据而设置的Artcard阅读器线性图像传感器的接口、控制以及模数变换。
5.从数字化的编码Artcard图像中提取原始Artcard数据。
6.对Artcard编码数据进行RS(Reed-Solomon)检错和纠错。Artcard 9的编码表面包括关于如何处理图像以产生在Artcard 9的图像失真表面上显示的效果的信息。该信息是脚本形式的,下面将该脚本称为“Vark脚本”。运行在ACP 31内的解释器利用Vark脚本产生要求的效果。
7.在Artcard 9上解释Vark脚本。
8.正如Vark脚本规定的那样进行图像处理。
9.控制用于输纸36、调焦透镜38、自动聚焦39以及Artcard驱动器37的各种马达。
10.控制切纸刀致动器40以操作切纸刀41从打印卷42上切下照片8。
11.半色调处理要打印的图像数据。
12.适当时,将打印数据送到打印头44。
13.控制打印头44。
14.控制送到打印头的墨水压力。
15.控制任选闪光灯单元56。
16.读取并使相机内的各种传感器(包括相机取向传感器46、自动聚焦47以及Artcard插入传感器49)动作。
17.读取并使用户界面按钮6、13、14动作。
18.控制状态显示器。
19.对彩色显示器5设置取景器以便预览图像。
20.利用电源管理电路51,控制系统的功率消耗,包括ACP的功率消耗。
21.对通用计算机提供外部通信52(利用部分USB)。
22.对打印卷验证芯片53读取和存储信息。
23.为了进行文本修改,与任选小键盘57通信。
24.与选择的小键盘57进行通信,以进行文本修改。
石英晶体58
石英晶体58用作系统时钟的频率基准。由于系统时钟非常高,所以ACP 31包括锁相环时钟电路,以提高从晶体58获得的频率。
图像检测
区域图像传感器2
区域图像传感器2利用其透镜将图像变换为电信号。它既可以是电荷耦合器件(CCD),又可以是有源像素传感器(APS)CMOS图像扇区。当前,可用CCD通常具有较高的图像质量,但是,CMOS成像器当前正在得到迅猛发展。CMOS成像器最终有希望比具有小像素面积的CCD大致廉价,而且可以插入驱动电路系统中进行信号处理。还可以在CMOS制品上制造它们,CMOS制品正在过渡到12”圆片。通常在6”圆片制品上制造CCD,而在经济上不允许变成12”制品。因此,CCD成像器与CMOS成像器之间制造成本的差别很可能增大,进一步支持CMOS成像器。然而,当前,CCD可能是最佳选择。
利用1500×1000区域图像传感器,Artcam单元将产生适当结果。然而,诸如750×750的较小传感器足以满足许多市场。Artcam不如传统数码相机对图像传感器分辨率敏感。这是因为包含在Artcard 9上的许多风格是以使分辨率欠佳的方式处理图像。例如,如果为了模拟被变换为印象派油画的效果,而使图像失真,可以采用具有最小效果的低原始图像分辨率。通常不被注意的低分辨率输入图像的其他例子包括产生高失真图像的图像翘曲、图像的多倍缩影拷贝(例如,护照照片)、为了具有基底金属浮雕外观进行的诸如块形映像的纹理处理以及合成为结构化景像的合成照片。
低分辨率图像传感器的这种容限是降低Artcam单元1相机的制造成本的重要因素。具有低成本750×500图像传感器的Artcam产生的效果通常比具有非常高成本的1500×1500图像传感器的传统数码相机的效果好。
任选立体3D图像传感器4
3D形式的Artcam单元1具有用于进行立体处理的附加图像传感器4。该图像传感器与主图像传感器相同。用于驱动任选图像传感器的电路系统可以包括ACP芯片31的标准部分,以减少增加设计成本。作为一种选择,可以设计单独3D Artcam ACP。这种选择可以降低主流单传感器Artcam的制造成本。
打印卷验证芯片53
小型芯片53包括在每个打印卷42上。该芯片替代诸如高级照相系统胶片盒的其他形式相机胶片单元上的条形码、光传感器和光轮以及ISO/ASA传感器。
该验证芯片还提供其他特性:
1.存储不是用机械方法和光学方法从APS卷检测的数据的数据。
2.符合高分辨率的剩余介质长度。
3.防止低劣仿制打印卷拷贝的验证信息。
验证芯片53含有1024位的闪速存储器,其中的128位是验证密钥,而其中的512位是验证信息。验证芯片53还包括加密电路,以确保不能直接访问该验证密钥。
打印头44
Artcam单元1可以采用任何彩色打印技术,它足够小、功率足够低、速度足够块、质量足够高而且成本足够低,它还与打印卷兼容。以下将具体说明相关打印头。
喷墨打印头的规范:
图像类型 |
二值(Bi-level)、混色 |
彩色 |
CMY处理彩色 |
分辨率 |
1600 dpi |
打印头长度 |
“页宽”(100mm) |
打印速度 |
每张照片2秒 |
任选墨水压力控制器(来示出)
墨水压力控制器的功能取决于插入Artcam的喷墨打印头44的类型。对于某些喷墨方式,可以省略使用墨水压力控制器,因为墨水压力就是大气压力。其他类型的打印头需要稳定正墨水压力。在这种情况下,压力控制器包括泵和压力变换器。
其他打印头可以需要超声波变换器,以使墨水压力规则振荡,通常以约100KHz的频率振荡。在这种情况下,ACP 31控制该振荡的频率、相位以及振幅。
输纸马达36
输纸马达36使打印纸以较恒定的速度从打印卷42内出来通过打印头。马达36是被降速到适当速度以驱动用于移动打印纸的辊轴的小型马达。为了实现高图像质量,需要高质量的马达和机械齿轮,因为机械噪声或其他振动影响打印点的行间距。
输纸马达驱动器60
马达驱动器60是用于将APC 31输出的数字马达控制信号放大到适于驱动马达36的电平的小型电路。
拉纸传感器
拉纸传感器50检测用户在打印过程中尝试从相机单元内拉照片。APC 31读该传感器50,并在满足条件时,激励切纸刀41。插入拉纸传感器50以在操作过程中使该相机更能“确保安全”。如果在打印过程中,用户用力拉出打印纸,则可能损坏(在极端情况下)打印卷42的打印机构44。由于容许在完全输出“pod”照片之前从Polaroid相机内拉出“pod”照片,所以公众习惯于这样做。因此,他们不可能注意不要拉打印纸的打印指示。
在切纸刀41在检测到拉动而切断打印纸后,Artcam优先重新启动照片打印过程。
可以将拉纸传感器实现为一串测量传感器,或者实现为用于检测在拉动打印纸时打印纸主动辊产生的转矩偏转的微小起伏畸变的光传感器。推荐后者实现的光传感器,因为它成本低。
切纸刀致动器40
切纸刀致动器40是用于使切纸刀41在照片的末端切断打印纸,或者在激活拉纸传感器50时切断打印纸的小型致动器。
切纸刀致动器40是用于将APC输出的切纸刀控制信号放大到切纸刀41要求的电平的小型电路。
Artcard 9
Artcard 9是Artcam单元的程序存储介质。如上所述,该程序是Vark脚本形式的。Vark是专门对Artcam单元开发的功能强大的图像处理语言。Artcard 9分别含有一个Vark脚本,从而定义一种图像处理风格。
VARK语言优先是非常专用的图像处理语言。因为是非常专用的图像处理语言,所以大致可以减少将细节存储到卡上所需的存储器的数量。此外,还可以从实质上更加容易地编写程序、增强效果。该语言优先包括用于处理许多图像处理功能的工具,图像处理功能包括利用翘曲映像的图像翘曲、卷积、查色表、粘贴图像、对图像附加噪声、图像增强滤波、着色算法、画笔抖动和操作边缘检测滤波、铺砌、利用光源照射、块形映像、文本、表面检测属性和对象检测属性、字体、包括三维字体、任意复杂性预润色图标。下面将进一步说明Vark语言解释器的操作细节。
因此,利用所创建的语言定义的语言构造,可以对任意图像产生新效果,而且可以在Artcard上的廉价存储器构造它们,之后将它们分销到相机所有者。此外,可以在该卡的一面上设置用于说明存储在该卡的另一面上的特定VARK脚本对任意捕获图像的效果的例子。
利用这种系统,可以分销相机技术,而无需非常担心该技术行将过时,因为所设置的VARK解释器被插入相机设备中,设置了独立于使用情况的设备,因此可以随时完全改变基础技术。此外,在建立新滤波器时,可以更新VARK脚本,而且可以以廉价方式分销该VARK脚本,例如通过简单的卡对卡读取。
Artcard 9是一个与信用卡(86mm长×54mm宽)具有同样格式的白色薄塑料片。利用高分辨率喷墨打印机对Artcard的两侧进行打印。假定该喷墨打印机技术与Artcam使用的喷墨打印机技术相同,具有1600dpi(63dpmm)分辨率。Artcard 9的主要特征是制造成本低。可以以高速将Artcard制造成宽塑料薄片。在该塑料薄片的两侧喷涂亲水染料固定层。同时,利用“页宽”彩色喷墨打印机对该塑料薄片的两侧进行打印。然后,切割该塑料薄片,并冲压成各卡。在该卡的一面上打印Artcard9对检测图像所具有的效果的人易懂图解表示。这可以是利用存储在该卡的背面的Vark脚本处理的简单标准图像。
在该卡的背面打印可以被解码为Vark脚本的点阵,Vark脚本确定图像处理顺序。打印区为80mm×50mm,给出总数15,876,000点。该点阵至少可以表示1.89兆字节的数据。为了实现高可靠性,该点阵中插入了外延检错和纠错。这样允许该卡的相当大部分被损伤表面、损坏、起折痕或弄脏,而不对数据完整性产生影响。所使用的数据编码方法是RS编码方法,有一半数据专门用于纠错。这样允许在每个Artcard 9上具有用于存储纠错数据的967千字节存储器。
线性图像传感器34
Artcard线性传感器34将上述Artcard数据图像变换为电信号。与区域图像传感器2、4相同,既可以利用CCD,又可以利用APS CMOS技术制造线性图像传感器。图像传感器34的有效长度是50mm,等于Artcard9上的数据阵列的宽度。为了满足奈奎斯特采样原理,线性图像传感器34的分辨率必须至少是到达该图像传感器的Artcard光学图像的最高空间频率的二倍。实际上,如果图像传感器分辨率大致高于该分辨率,则数据检测将更加容易。选择4800dpi(189dpmm)的分辨率,提供总数9,450像素。该分辨率要求5.3μm的像素传感器间距。这可以利用交错排列的4行20μm像素传感器简单实现。
线性图像传感器安装在特殊封装内,该特殊封装包括通过光导管(未示出)照亮Artcard 9的LED 65。
Artcard阅读器光导管可以是具有许多功能的模制光导管:
1.利用所有内部小反射面,它将LED发出的光散射到整个卡宽度上。
2.利用集成圆柱形透镜,它将光聚焦到Artcard 9的16μm宽的条上。
3.利用模制的微透镜阵列,它将Artcard反射的光聚焦到线性图像传感器像素上。
下面将进一步解释Artcard阅读器的运行过程。
Artcard阅读器马达37
Artcard阅读器马达以较恒定速度推进Artcard通过线性图像传感器34。由于在Artcard阅读器中包括精度极高的机械部件成本效益不好,所以马达37是被降速到适当速度以驱动一对辊轴的标准小型马达,该对辊轴移动Artcard 9。速度的变化、噪声以及其他振动将影响原始图像数据,所以为了可靠读取Artcard数据,APC 31内的电路系统包括对这些效应的外延补偿。
在退出Artcard时,反向驱动马达37。
Artcard马达驱动器61
Artcard马达驱动器61是用于将APC 31输出的数字马达控制信号放大到适于驱动马达37的电平的小型电路。
卡插入传感器49
卡插入传感器49是在将卡插入卡阅读器34时用于检测卡的存在的光传感器。该传感器49输出信号后,APC 31初始化卡阅读过程,包括激励Artcard阅读器马达37。
退卡按钮16
用户利用退卡按钮16(参考图1)退出当前Artcard,以便可以插入另一张Artcard。APC 31检测到按下该按钮,然后,使Artcard阅读器马达37反转以退出该卡。
卡状态指示器66
设置卡状态指示器66以向用户指示Artcard阅读过程的状态。它可以是标准双色(红/绿)LED。在卡被成功阅读,并验证了数据完整性时,LED持续亮起绿。如果该卡是错误的,则LED亮起红。
如果利用1.5V电池而不利用3V电池对相机供电,则电源电压低于正向电压,使绿LED熄灭,LED灯不亮。在这种情况下,红LED不能使用,或者可以由还对Artcam内要求较高电压的其他电路供电的电压泵(voltage pump)对LED供电。
64兆位DRAM 33
为了实现各种各样的图像处理效果,相机使用8兆字节存储器33。可以利用一个64兆位存储器芯片设置它。当然,随着存储器技术的发展,可以替换为增加的Dram存储器容量。
要求高速存取存储器芯片。可以利用Rambus DRAM(每秒500兆字节的猝发访问速率)或者利用采用新公开标准的诸如双数据速率(DDR)SDRAM或Synclink DRAM的芯片实现该高速访问存储器芯片。
相机验证芯片
除了其内存储的信息不同之外,相机验证芯片54与打印卷验证芯片53相同。相机验证芯片54具有3个主要用途:
1.用于提供用于将验证码与打印卷验证芯片进行比较的安全装置;
2.用于提供用于产生诸如相机的序列号的信息的存储器;
3.用于提供用于存储用户信息的小容量非易失性存储器。
显示器
Artcam包括任选彩色显示器5和小型状态显示器15。与某些数码相机或摄像机录像机(camcorder)使用的显示器类似,最低成本的消费类相机可以包括诸如小型TFT LCD 5的彩色图像显示器。彩色显示器5是这些类型的Artcam的主要成本元件,而且显示器5和背照是主要功率消耗装置。
状态显示器15
与当前设置在卤化银相机和数码相机上的状态显示器类似,状态显示器15是基于LCD的小型无源分段。其主要功能是显示打印卷42内剩余的打印数量以及诸如闪光灯状态和电池状态的各种标准相机特征的图标。
彩色显示器5
彩色显示器5是全运动图像显示器,它用作取景器、用于检验要打印的图像以及用作用户界面显示器。显示器5的成本与其面积近似成正比,因此大显示器(即,对角线4”)单元局限于昂贵型号的Artcam单元。约1”的诸如彩色摄像机录像机取景器TFT的小显示器可以有效用于中型Artcam。
可变焦距镜头(未示出)
Artcam可以包括可变焦距镜头。它可以是标准电子控制可变焦距镜头,它与标准电子相机使用的电子控制可变焦距镜头相同,而且它与袖珍相机可变焦距镜头类似。标准型号的Artcam单元可以包括标准可互换35mm SLR镜头。
自动聚焦马达39
自动聚焦马达39改变可变焦距镜头的焦点。该马达是被降速到适当速度以驱动自动聚焦机构的小型马达。
自动聚焦马达驱动器63
自动聚焦马达驱动器63是用于将APC 31输出的数字马达控制信号放大到适于驱动马达39的电平的小型电路。
变焦马达38
变焦马达38使前可变焦距透镜向内和向外移动。该马达是被降速到适当速度以驱动变焦机构的小型马达。
变焦马达驱动器62
变焦马达驱动器62是用于将APC 31输出的数字马达控制信号放大到适于驱动该马达的电平的小型电路。
通信
ACP 31含有用于与个人计算机进行通信的通用串行总线(USB)接口52。不是所有型号的Artcam均包括USB连接器。然而,USB电路52所需的硅面积小,因此该接口可以包括在标准ACP内。
任选键盘57
Artcam单元可以包括任选小键盘57,用于使用户定制Artcard规定的文本。出现在Artcart图像上的任何文本均可以被编辑,即使它是复杂的3D金属光泽字体。该小键盘包括一行用于显示原始文本和被编辑的文本的字母数字LCD。该键盘可以是标准附件。
ACP 31含有用于将数据传送到小键盘和从小键盘传送数据的串行通信电路。
电源
Artcam单元使用电池48。根据Artcam选择,它或者是3V锂电池、1.5V AA碱性电池,或者是其他电池设置。
电源管理单元51
功率消耗是Artcam的重要设计制约。最好是既可以使用标准相机电池(例如3V锂电池),又可以使用标准AA或AAA碱性电池。尽管Artcam单元的电子电路比35mm照片相机复杂得多,但是功率消耗却不需要那么高。可以利用在不使用时,关闭所有单元,精心管理Artcam的电源。
最主要的耗电装置是ACP 31、区域图像传感器2、4、打印机44的各种马达、闪光灯单元56以及任选彩色显示器5,下面将分别对每个部分进行说明:
1.ACP:如果利用0.25μm CMOS制造,并以1.5V运行,则ACP功率消耗可以非常低。ACP芯片的各部分的时钟可以非常低。在不使用时,可以关闭ACP芯片的各部分的时钟,实际上减少了待命电流消耗。对于打印的每张照片,仅全部使用ACP约4秒钟。
2.区域图像传感器:仅在用户手指按在按钮上时,才对区域图像传感器供电。
3.仅在实际打印时,将打印机功率送到打印机。对于每张照片,这约需要2秒钟。即使如此,仍应该采用适当的低功率消耗打印方法。
4.Artcam所需的马达均是低功率小型马达,而且对于每张照片,它们通常仅被激活几秒钟。
5.闪光灯单元45仅用于某些照片。可以利用具有合理电池寿命的3V锂电池容易地提供其功率消耗。
6.任选彩色显示器5是主要耗电装置,这有两个原因:在使用相机的全部时间内,必须接通它,而且如果采用液晶显示器,需要背照。为了实现可接受的电池寿命,插入彩色显示器的相机要求更大的电池。
闪光灯单元56
闪光灯单元56可以是用于消费类相机的标准小型电子闪光灯。
ACP 31概述
图3更详细示出Artcam中央处理器(ACP)31。Artcam中央处理器对Artcam提供所有处理能力。它是针对0.25微米CMOS工艺设计的,具有接近一百五十万个晶体管,面积约为50mm2。ACP 31的设计复杂,但是利用数据通路编译技术、宏小区以及IP核心,可以减少设计工作。ACP31含有:
RISC CPU核心72
4路并行VLIW矢量处理器74
直接RAMbus接口81
CMOS图像传感器83
CMOS线性图像传感器接口88
USB串行接口52
红外线键盘接口55
数字LCD接口84,以及
彩色TFT LCD接口88
用于程序存储器70的4兆字节闪速存储器70
RISC CPU、直接RAMbus接口81、CMOS传感器接口83以及USB串行接口52可以是售主供应的核心。ACP 31意在以200MHz的时钟速度、以外部3V而内部1.5V的电压运行,以将功率消耗降低到最小。CPU核心仅需要以100MHz运行。下面的两个方框图示出ACP 31的两个示意图:
处于隔离状态的ACP 31的示意图
典型Artcam示出与其余Artcam硬件相连的ACP 31的高级示意图。
图像存取
如上所述,DRAM接口81负责在ACP芯片的其他客户部分与RAMBUSDRAM之间实现连接。实际上,DRAM接口内的每个模块均是地址发生器。
ACP处理的图像有3种逻辑类型。它们是:
CCD图像,是从CCD捕获的输入图像。
内部图像格式—Artcam设备在内部使用该图像格式。
打印图像—Artcam打印的输出图像格式
这些图像通常在色空间、分辨率以及输出和输入色空间方面不同,而且不同的相机,它们也不同。例如,低端相机上的CCD图像可以是不同的分辨率,或者其彩色特性与高端相机使用的彩色特性不同。然而,对于所有相机,所有内部图像格式在色空间方面的格式相同。
此外,关于哪个方向是“上”,可以改变这3种图像类型。相机的物理取向使人们知道肖像或风景图像,而且这必须通过处理来保持。因为此原因,始终正确取向内部图像,然后,在打印过程中,对从CCD获得的图像进行旋转。
CPU核心(CPU)72
为了运行Vark图像处理语言解释器,而且为了执行Artcam通用操作系统的工作,ACP 31插入32位RISC CPU 72。各种各样的CPU核心适于:它可以是其处理能力足以执行要求的核心计算和控制功能、其速度足以满足客户的预期的任何处理器核心。适当核心的例子是:LSI Logic生产的MIPS R4000核心,StrongARM核心。不需要在不同的Artcam模块之间保持指令集连续。因为对于每个新指令集,可以简单重新编译Vark解释器,所以可以保持Artcam的兼容性,而不考虑未来处理器的进步和变化。因此,还可以自由开发ACP 31体系结构。不同的制造商可以制造不同的ACP 31芯片设计,而无需许可或者端接该CPU核心。该设备独立性避免了象PC市场中出现的锁定Intel那样,锁定芯片销售商。CPU以一个周期时间为10纳秒的100MHz运行。尽管VLIW矢量处理器74负责大多数时限操作,但是为了运行Vark解释器,它必须足够快。
程序高速缓存72
尽管程序代码存储在片上闪速存储器70上,但是良好紧缩型闪速存储器70不可能以CPU要求的10纳秒周期时间运行。因此,对于获得良好性能,需要小型高速缓存。对于总共512字节,每行32字节的16个高速缓存行足以。将在程序高速缓存72小节说明程序高速缓存72。
数据高速缓存76
为了获得良好性能,要求使用小型数据高速缓存76。主要因为使用RAMbus DRAM,所以存在该要求,RAMbus DRAM可以以猝发方式提供高速数据,但是对于1位存取却无效。CPU对内存高速缓存系统进行存取,这样可以柔性管理CPU数据高速缓存76的容量。为了获得良好性能,推荐采用最小的16高速缓存行(512字节)。
CPU内存模型
Artcam的CPU内存模型包括32MB区域。在基本型号的Artcam内,在设置至多16MB的非片上存储器的情况下,它包括8MB的非片上物理RDRAM。在ACP 31是存在用作程序存储器的4MB闪速存储器70,而且,最后,4MB地址空间映像到ACP 31的各种寄存器和控件。这样,以下是
Artcam的内存映像:
内容 |
大小 |
基本Artcam DRAM |
8MB |
扩充DRAM |
8MB |
程序存储器(在ACP 31的闪速存储器70上) |
4MB |
为了扩充保留的程序存储器 |
4MB |
ACP 31寄存器和内存映像I/O |
4MB |
保留 |
4MB |
合计 |
32MB |
解码地址的直通方式是使用地址位23-24:
如果清除位24,则该地址在后16MB范围内,因此可以由DRAM和数据高速缓存76满足。在大多数情况下,DRAM只有8MB,但是为了满足更高内存模型Artcam,对它分配16MB。
如果置位位24,而清除位23,则该地址表示闪速存储器70的4兆字节范围,而且由程序高速缓存72满足。
如果位24=1,而且位23=1,则CPU内存解码器68将该地址翻译为通过低速总线存取AC内的请求分量。
闪速存储器70
ACP 31含有用于存储Artcam程序的4兆字节闪速存储器70。可以设想闪速存储器70的紧缩系数比掩膜ROM的紧缩系数高,而且对测试相机程序代码具有更高的灵活性。闪速存储器70的缺陷是存取时间,它的速度不够快,不能满足CPU的100MHz的运行速度(10纳秒周期时间)。因此,快速程序指令高速缓存77用作CPU与慢速闪速存储器70之间的接口。
程序高速缓存72
为了获得良好性能,要求小型高速缓存。因为用于存储程序代码的慢速闪速存储器70,所以存在该要求。对于总数512字节,16个每个32字节的高速缓存行足以。程序高速缓存72是只读高速缓存。CPU程序使用的数据通过CPU内存解码器68,而且如果地址在DRAM内,则通过通用数据高速缓存76。这种分离可以使CPU独立于VLIW矢量处理器74运行。如果给定进程对数据要求低,则因此而完全可以在高速缓存外部运行。
最后,CPU可以从程序高速缓存72读取数据,而非纯粹读取程序指令。这样可以从闪速存储器70装载表、VLIW的微码等。程序高速缓存72提供具有被置位的位24和被清除的位23的地址。
CPU内存解码器68
CPU内存解码器68是用于满足数据存取要求的简单解码器。该解码器将数据地址变换为通过内部低速总线的内部ACP寄存器存取,因此使得内存映像ACP寄存器的I/O。CPU内存解码器68仅解释其位24被置位、其位23被清除的地址。在CPU内存解码器68内不进行高速缓存处理。
DRAM接口81
Artcam使用的DRAM是以1.6GB/秒运行的单通道64兆位(8MB)RAMbus RDRAM。单通道(16位数据通路)控制器对RDRAM进行存取。RDRAM还具有几种用于低功率运行的有用运行模式。尽管Rambus规范描述了一种以可以实现高于95%效率进行随机32字节传送的系统,但是如果仅使用32字节的一部分,则这是不正确的。对同一个设备在进行两次写入之后进行两次读取的效率超过86%。总线从写转变为读需要初期等待时间,而且因为存在延迟写机构,所以可以进一步提高效率。关于写,写屏蔽可以写入特定子集的字节。可以利用内部高速缓存“脏数位”设置这些写屏蔽。Rambus直接RDRAM的远景摄影(upshot)是容易实现的>1GB/秒的吞吐量,与良好利用32传送知识组合的每次写(大多数进程)的多次读,预期传送速率>1.3GB/秒。每隔10纳秒,可以将16字节传送到核心,或者从该核心传送16字节。
DRAM组织
下面是基本模型(8MB RDRAM)Artcam的DRAM组织结构:
内容 |
大小 |
程序暂时存储器 |
0.50MB |
Artcam数据 |
1.00MB |
CMOS传感器捕获的照片图像 |
0.50MB |
打印图像(压缩的) |
2.25MB |
扩展照片图像的一个通道 |
1.50MB |
一个通道的1个图像棱锥(Image Pyramid) |
1.00MB |
中间图像处理 |
1.25MB |
合计 |
8MB |
注意:
未压缩的打印图像需要4.5MB(某个通道1.5MB)。为了在8MB模型中容纳其他对象,需要压缩打印图像。如果以4∶1压缩色度通道,则它们仅分别需要0.375MB。
在此描述的内存模型假定一个8MB RDRAM。Artcam的其他模型可以具有更大的内存,因此不需要压缩打印图像。此外,如果内存更大,则可以一次性对更大部分的最终图像进行处理,因此有可能提高速度。
请注意,退出或者插入Artcard使保存打印图像、扩展照片图像的1个通道以及图像棱锥的5.5MB区域无效。用于解码Artcard数据的Artcard接口可以安全使用该空间。
数据高速缓存76
ACP 31具有专用CPU指令高速缓存77和通用数据高速缓存76。数据高速缓存76对CPU、VLIW矢量处理器74以及显示器控制器88发出的所有DRAM请求进行处理(读出和写入数据)。根据存储器的用途以及算法定时要求,这些请求可以具有非常不同的提问文件。例如,VLIW进程可能正在处理线性存储器内的图像,对于该图像中的每个值在表中查找值。这样几乎不需要高速缓存大量图像,但是可以要求高速缓存整个查用表,因此不需要真正进行内存存取。因为这些不同的要求,所以数据高速缓存76智能确定高速缓存。
尽管Rambus DRAM接口81可以以非常高的速度进行内存存取(平均吞吐量为25纳秒32字节),但是它不能有效处理一字节请求。为了缩短有效内存等待时间,ACP 31含有128个高速缓存行。每个高速缓存行是32字节宽。因此,数据高速缓存76的总存储量为4096字节(4KB)。将128高速缓存行配置为16个可编程大小的组。16个组均必须是一组相邻高速缓存行。CPU负责确定对每组分配多少个高速缓存行。根据简单的最近最少使用算法,填充每组高速缓存行。根据CPU数据请求,数据高速缓存76对其地址的位24被清除的内存存取请求进行处理。如果位24被清除,则该地址在后16MB范围内,因此,可以由DRAM和数据高速缓存76满足该要求。在大多数情况下,DRAM仅有8MB,但是分配16MB以满足更高内存模型Artcam。如果置位位24,则数据高速缓存76忽略该地址。
由高速缓存组0满足所有CPU数据请求。对于良好CPU性能,推荐最小的16个高速缓存行,但是CPU可以对高速缓存组0指定任意数量(除了0之外)的高速缓存行。根据当前要求,分配剩余高速缓存组(1至15)。这意味着分配到VLIW矢量处理器74或显示器控制器88。例如,要求永久可用的256字节查用表需要8个高速缓存行。写出顺序图像仅要求2至4个高速缓存行(根据所产生的记录的大小,以及写请求是否正被写延迟非常多个周期)。与每个高速缓存行字节有关的是脏数位,在将存储内容写入DRAM时,该脏数位用于产生写屏蔽。与每个高速缓存行有关的是另一个脏数位,该脏数位指出是否写入了任意高速缓存行字节(因此,在可以重新使用该高速缓存行之前,必须将该高速缓存行写回DRAM)。请注意,两个不同的高速缓存组可以存取内存中的同一个地址,而且可以不同步。VLIW程序记录器负责确保这不成问题。例如,可以优先合理地使高速缓存组负责读出图像,使另一个高速缓存组负责再将修改的图像写回内存。如果顺序读、写各图像,则以这种方式分配高速缓存行有利。总共8条总线182将VLIW矢量处理器74连接到数据高速缓存76。每条总线分别连接到I/O地址发生器。(每个处理单元178具有2个I/O地址发生器189、190,而VLIW矢量处理器74具有4个处理单元。所以,总线总数为8)在任意给定周期中,除了对CPU高速缓存组(组0)存取的一个32位(4字节)外,还允许通过8条VLIW矢量处理器74总线,对剩余高速缓存组4次同时存取16位(2字节)。数据高速缓存76负责公平处理各请求。在给定周期中,至多处理对特定高速缓存组的一个请求。如果在VLIW矢量处理器74内具有8个地址发生器189、190,则每个地址发生器均可能查询各高速缓存组。然而,2个或者更多个地址发生器189、190可以而且偶尔还负责对同一个高速缓存组进行存取。CPU负责确保对高速缓存组分配正确数量的高速缓存行,而且确保VLIW矢量处理器74内的各地址发生器189、190正确定位特定高速缓存组。上述数据高速缓存76可以使显示器控制器88和VLIW矢量处理器74同时活动。如果认为永远不会出现这两个部件同时运行,则总共9个高速缓存组就足够了。CPU可以使用高速缓存组0,而VLIW矢量处理器74和显示器控制器88可以共享剩余8个高速缓存组,所以仅需要3位(而不是4位)来确定哪个高速缓存组满足特殊请求。
JTAG接口85
标准JTAG(联合测试指令组(Joint Test Action Group))接口包括在ACP 31内用于进行测试。因为芯片的复杂性,所以需要各种各样的测试技术,包括BIST(内部自测试)和功能块隔离。对于整个芯片测试电路系统,假定芯片面积的开销为10%。测试电路系统不属于本专利申请文件的范围。
串行接口
USB串行端口接口52
它是一个标准USB串行端口,它连接到内部芯片低速总线上,因此CPU可以控制它。
键盘接口65
它是标准低速串行端口,它连接到内部芯片低速总线上,因此CPU可以控制它。设计它以便任选连接到键盘,从而允许输入简单数据,以便用户定制打印。
验证芯片串行接口64
有两个标准低速串行端口,它们连接到内部芯片低速总线,因此CPU可以控制它们。具有2个端口的原因是为了利用单独导线连接到相机上验证芯片和打印卷验证芯片。仅利用1条导线使得兼容打印卷制造商可以设计其中不产生验证码,而巧妙地使相机使用相机内的验证芯片产生的代码的芯片。
并行接口67
并行接口将ACP 31连接到各静态电信号。CPU可以分别控制这些连接,因为通过低速总线内存映像I/O。下表列出连接到并行接口的一系列连接:
内容 |
方向 |
引脚 |
输纸步进马达 |
出 |
4 |
Artcard步进马达 |
出 |
4 |
变焦步进马达 |
出 |
4 |
切纸刀马达 |
出 |
1 |
闪光灯触发器 |
出 |
1 |
状态LCD分段驱动器 |
出 |
7 |
状态LCD公共驱动器 |
出 |
4 |
Artcard照明LED |
出 |
1 |
Artcard状态LED(红/绿) |
进 |
2 |
Artcard传感器 |
进 |
1 |
拉纸传感器 |
进 |
1 |
取向传感器 |
进 |
2 |
按钮 |
进 |
4 |
|
合计 |
36 |
VLIW输入和输出FIFO 78、79
VLIW输入和输出FIFO是用于在各进程与VLIW矢量处理器74之间进行通信的8位宽FIFO。这两个FIFO均在VLIW矢量处理器74的控制下,但是可以被CPU清除和查询(例如:状态)。
VLIW输入FIFO 78
为了利用VLIW矢量处理器74处理数据,客户将8位数据写入VLIW输入FIFO 78。客户包括图像传感器接口、Artcard接口以及CPU。通过将数据简单写入FIFO,并让VLIW矢量处理器74执行所有硬性工作,这些处理进程可以分别摆脱处理。使用客户使用的VLIW输入FIFO 78的例子是图像传感器接口(ISI 83)。ISI 83从图像传感器获取数据,然后,将它写入FIFO。VLIW进程从FIFO中取出它,将它变换为正确图像数据格式,将它写入DRAM。因此,ISI 83变得非常简单。
VLIW输出FIFO 79
VLIW矢量处理器74将8位数据写入客户可以读取它的VLIW输出FIFO 79内。客户包括打印头接口和CPU。通过从FIFO简单读取已经被处理的数据,并让VLIW矢量处理器74执行所有硬性工作,这两个客户可以摆脱处理。还可以在每次将数据设置到VLIW输出FIFO 79内时,中断CPU,以便在CPU可用时,使CPU处理数据,而非持续轮询FIFO。使用客户使用的VLIW输出FIFO的例子是打印头接口(PHI 62)。VLIW进程获取数据,将它转动到正确方向,彩色变换它,以及根据打印头的要求混色获得的图像。PHI 62从VLIW输出FIFO 79读取混色的格式化8位数据,并将它简单送到位于ACP 31外部的打印头。因此,PHI 62变得非常简单。
VLIW矢量处理器74
为了满足Artcam的高处理要求,ACP 31含有VLIW(超长指令字)矢量处理器。VLIW处理器是并行工作的、通过交叉开关183连接的一组4个相同处理单元(PU例如,178)。在每个周期内,每个PU,例如178可以执行4个8位乘法、8个8位加法、3个32位加法、I/O处理以及各种逻辑运算。微编码PU例如178,而且PU例如178分别具有两个地址发生器189、190,以便利用所有可用周期进行数据处理。为了提供紧密交互的VLIW处理器,通常使4个PU例如178同步。如果以200MHz定时,则VLIW矢量处理器74以12Gop(每秒120亿个操作)的速度运行。调整指令以实现图像处理功能,例如翘曲、艺术画笔、复杂合成照明、彩色变换、图像滤波以及图像合成。利用台式计算机,这些功能可以被加速2个数量级。
如图3(a)的详图所示,VLIW矢量处理器74是4个PU例如178,它们以这样的方式与交叉开关183相连,以致每个PU例如178将两个输入送到交叉开关183,并可以从交叉开关183获得两个输出。两个公共寄存器形成PU例如178的控制与同步机构。2条总线连接到每个PU例如178情况下(每个I/O地址发生器1条总线),8条高速缓存总线182允许通过数据高速缓存76与DRAM实现连通性。每个PU例如178包括ALU 188(含有用于处理数据的大量寄存器和一些算术逻辑)、某种微码RAM 196以及连接到外部(包括其他ALU)的接线。本机PU状态机以微码方式运行,而且它是利用其控制PU例如178的装置。每个PU例如178含有两个I/O地址发生器189、190,两个I/O地址发生器189、190用于控制DRAM(通过数据高速缓存76)与ALU 188(通过输入FIFO和输出FIFO)之间的数据流。地址发生器可以读、写数据(各种格式的具体图像)以及表,而且可以模拟DRAM内的FIFO。可以在软件控制下,定制各种格式,但是不能微编码各种格式。通过16位输入FIFO,将从数据高速缓存76获取的数据送到ALU 188。将输出数据写入16位宽输出FIFO,然后从该16位宽输出FIFO写入数据高速缓存76。最后,所有PU例如178共享一个8位宽VLIW输入FIFO 78和一个8位VLIW输出FIFO 79。低速总线连接可以使CPU对PU例如178内的寄存器读和写更新微码,而且还对VLIW矢量处理器74内的所有PU例如178共享的公共寄存器进行读和写。现在参考图4,可以看到一个PU例如178内的更详细内部情况,以下将顺序详细说明各部件和控制信号:
微码
每个PU例如178含有微码RAM 196以保存该特定PU例如178的程序。在CPU负责装载微码的情况下,不是将微码存储到ROM内,而是将微码存储到RAM内。对于芯片上同样的空间,这样交换将任何一个功能的最大尺寸降低到RAM的尺寸,但是又允许以微码方式写入无限数量的功能。利用微码实现的功能包括Vark加速、Artcard读取以及打印。对于ACP 31,VLIW矢量处理器74解决方案有几个优点:
降低了硬件设计复杂性
因为降低了复杂性,所以降低了硬件风险
硬件设计不依赖于在专用硅上实现的所有Vark功能性
总体减小芯片的空间(因为可以将大量进程实现为微码)
在不与硬件设计发生冲突时,可以将功能性附加到Vark(利用微码)。
大小和内容
CPU装载到微码RAM196用于控制每个PU例如178的是128个字,其中每个字是96位宽。下表简要列出用于控制PU例如178的各单元的微码大小:
处理块 |
大小(位) |
状态输出 |
3 |
分支处理 |
11 |
进 |
8 |
出 |
6 |
寄存器 |
7 |
读出 |
10 |
写入 |
6 |
桶形移位器 |
12 |
加法器/逻辑 |
14 |
乘/插值 |
19 |
合计 |
96 |
如果利用128个指令字,则每个PU例如178的所有微码RAM 196是12,288位,或刚好1.5KB。由于VLIW矢量处理器74包括4个同样的PU例如178,所以这等于6,144字节,刚好6KB。将微码字中的一些位直接用作控制位,而对其他位解码。请参考详细解释微码字的每位的各单元描述。
PU例如178之间的同步
每个PU例如178含有4位同步寄存器197。它是用于确定哪些PU例如178一起工作的掩膜,而且对起一个进程作用的相应PU例如178分别设置1位。例如,如果所有PU例如178均起一个进程的作用,则4个同步寄存器197分别具有被设置的所有4位。如果分别存在2个PU例如178的两个异步进程,则两个PU例如178具有设置在其同步寄存器197内(与它们对应)的2位,而另外两个PU例如178具有设置在其同步寄存器197(与它们对应)内的另外2位。
以两种基本方式使用同步寄存器197:
以同步方式停止和开始
挂起进程中的执行过程
停止进程和开始进程
CPU负责装载微码RAM 196,而且负责装载第一指令的执行地址(通常是0)。在CPU开始执行微码时,它从规定地址开始。
仅在同步寄存器197所有位被设置在公共同步寄存器197内时,才执行微码。因此,CPU安装所有PU例如178,然后,利用对公共同步寄存器197的一个写过程,开始或者停止各进程。
该同步方案使得可以在作为进程停止和开始的各PU例如178上异步运行多个进程,而不是同时在一个PU例如178上运行多个进程。
挂起进程中的执行过程
在给定的周期内,PU例如178可能需要对FIFO进行读、写(根据当前微码指令的操作码)。如果FIFO在读请求方面是空,或者在写请求方面是满,则不能完成FIFO请求。因此,PU例如178将断言其SuspendProcess控制信号198。将所有PU例如178输出的SuspendProcess信号反馈到所有PU例如178。同步寄存器197与4个SuspendProcess位进行“与”运算,而且如果结果不是0,则不设置PU例如178寄存器写使能(WriteEnable)或FIFO选通。因此,在该周期内,与不能完成其任务的PU例如178形成同一个进程组PU例如178不能使其寄存器或FIFO更新。这种简单技术保持给定进程组同步。在每个后续周期,PU例如178的状态机试图重新执行位于同一个地址的微码指令,而且将进行这样做,直到成功。当然,如果需要,CPU可以对公共同步寄存器197进行写入以停止整个进程。该同步方案可以使任意组合的PU例如178一起工作,关于因为还未准备好要读或写的数据而引起的挂起,每组仅影响与其共同工作的PU例如178。
控制与分支处理
在每个周期内,PU例如178的ALU 188内的4个基本输入与计算单元(读、加法器/逻辑、乘法/插值以及桶形移位器)分别产生两个状态位:0标志和负标志,这两个状态位指出该周期内的运算结果是0还是负。在每个周期,利用PU例如178输出的微码指令,选择这4个状态位之一。将这4个状态位(每个PU例如178的ALU 188 1位)组合为4位公共状态寄存器200。在下一个周期中,PU例如178的微码程序可以分别从公共状态寄存器200中选择其中一位,然后,根据状态位的值,分支到另一个微码地址。
状态位
每个PU例如178的ALU 188含有许多输入和计算单元。每个单元产生两个状态位:负标志和0标志。在特定单元断言1位三态状态位总线上的值时,PU例如178输出这两个状态位之一。PU例如178输出一个状态位,然后,与其他PU例如178状态位组合在一起更新公共状态寄存器200。用于确定输出的状态位的微码具有以下形式:
#位 |
说明 |
2 |
选择待输出其状态位的单元00=加法器单元01=乘法/逻辑单元10=桶形移位单元11=阅读器单元 |
在ALU 188内,利用送到每个处理器单元模块的不同使能位,将2位选择处理器模块值解码为4个1位使能位。将状态选择位(选择0或负)送到所有单元以确定将哪位输出到状态位总线上。
在微码内进行分支处理
每个PU例如178含有7位程序计数器(PC),该7位程序计数器(PC)保存正在执行的当前微码地址。正常程序执行过程是线性的,从一个周期中的地址N移动到下一个周期中的地址N+1。然而,在每个周期,微码程序均能够分支到不同位置,或者能够测试公共状态寄存器200输出的状态位,然后分支。用于确定下一个执行地址的微码具有下面的形式:
#位 |
说明 |
2 |
00=NOP(PC=PC+1)01=始终进行分支10=如果状态位被清除,进行分支11=如果状态位被置位,进行分支 |
2 |
从状态字中选择状态位 |
7 |
要分支到的地址(绝对地址,00-7F) |
11 |
合计 |
ALU 188
图5更详细示出ALU 188。ALU 188的内部是许多由微码程序控制的专用处理模块。该专用处理模块包括:
读模块202,用于从输入FIFO接收数据
写模块203,用于通过输出FIFO发送数据
加法器/逻辑模块204,用于进行加和减、比较以及逻辑运算
乘法/插值模块205,用于进行多种类型的插值和乘法/累加
桶形移位模块206,用于在需要时,移位数据
进模块207,用于从外部交叉开关183接收数据
出模块208,用于将数据送到外部交叉开关183
寄存器模块215,用于将数据保存到临时存储器中
4个专用32位寄存器保存4个主要处理模块的结果:
M寄存器209保存乘法/插值模块的结果
L寄存器209保存加法器/逻辑模块的结果
S寄存器209保存桶形移位器模块的结果
R寄存器209保存读模块202的结果
此外,还有两个用于传送数据的内部交叉开关213和214。在下面的小节中,将进一步扩展各处理模块以及关于每个模块的微码定义。请注意,在模块内解码微码,以将控制信号送到其内的各单元。
PU例如178之间的数据传送
每个PU例如178能够通过外部交叉开关交换数据。PU例如178获得两个输入,然后,将两个值输出到外部交叉开关。这样,在一个周期内,可以获得用于处理的两个操作数,但是,实际上,在下一个周期之前,不能使用它。
进模块207
图6示出该模块,该模块含有两个寄存器,In
1和In
2,它们用于从外部交叉开关接收数据。可以在每个周期装载该寄存器,或者保持该寄存器不变。将用于在8个输入之间进行选择的选择位输出到外部交叉开关183。该微码具有下面的形式:
#位 |
说明 |
1 |
0=NOP1=从交叉开关装载In1 |
3 |
从外部交叉开关选择输入1 |
1 |
0=NOP1=从交叉开关装载In2 |
3 |
从外部交叉开关选择输入2 |
8 |
合计 |
输出模块208
与输入模块配套的是输出模块108。图7更详细示出该输出模块。输出模块含有两个寄存器Out
1和Out
2,在每个周期,它们输出到外部交义开关供其他PU例如178使用。写单元还可以将Out
1或Out
2之一写入与ALU 188相连的输出FIFO之一。最后,两个寄存器可以用作交叉开关213的输入,因此,交叉开关213可以将寄存器值用作ALU 188内的其他单元的输入。在每个周期内,可以根据微码选择,更新两个寄存器之一。装载到规定的寄存器的数据可以是M、L、S以及R(交叉开关2214选择的)之一的D
0至D
3(交叉开关1213选择的)之一、2个可编程常数之一或固定值0或1。用于输出模块的微码具有下面的形式:
1 |
0=NOP1=装载寄存器 |
1 |
选择寄存器以进行装载[Out1或Out2] |
4 |
选择输入[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、0、1] |
6 |
合计 |
ALU 188内的本机寄存器和数据传送过程
如上所述,ALU 188含有4个专用32位寄存器,用于保存4个主要处理模块的结果:
M寄存器209保存乘法/插值模块的结果
L寄存器209保存加法器/逻辑模块的结果
S寄存器209保存桶形移位器模块的结果
R寄存器209保存读模块202的结果
CPU直接对这些寄存器进行存取,而其他单元可以通过交叉开关2214选择它们作为输入端。有时需要对一个或者多个周期的操作进行延迟。寄存器模块含有4个32位寄存器D
0至D
3,用于在处理过程中保存临时变量。在每个周期内,可以更新寄存器之一,而通过交叉开关213(它还包括In
1、In
2、Out
1和Out
2),所有寄存器对其他单元进行输出以便使用它们。CPU直接对这些寄存器进行存取。装载到规定的寄存器的数据可以是M、L、S以及R(交叉开关2214选择的)之一的D
0至D
3(交叉开关1213选择的)之一、2个可编程常数之一或固定值0或1。图8更详细示出寄存器模块215。用于寄存器的微码具有下面的形式:
#位 |
说明 |
1 |
0=NOP1=装载寄存器 |
2 |
选择寄存器以装载[D0至D3] |
4 |
选择输入[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、0、1] |
7 |
合计 |
交叉开关1 213
图9更详细示出交叉开关1 213。交叉开关213用于在输入In1、In2、Out1、Out2、D0-D3中进行选择。交叉开关1 213产生7个输出:3个输出到乘法/插值单元,2个输出到加法器单元,1个输出到寄存器单元,1个输出到出单元。用于交叉开关1 213的控制信号来自使用交叉开关输入的各单元。不存在对交叉开关1 213独立的特定微码。
交叉开关2 214
图10更详细示出交叉开关2 214。交叉开关2 214用于在通用ALU 188寄存器M、L、S和R中进行选择。交叉开关2 214产生6个输出:2个输出到乘法/插值单元,2个输出到加法器单元,1个输出到寄存器单元,1个输出到出单元。用于交叉开关2 214的控制信号来自使用交叉开关输入的各单元。不存在对交叉开关2 214独立的特定微码。
PU例如178与DRAM或外部进程之间的数据传送
再参考图4,通过外部交叉开关,PU例如178互相直接共享数据。它们还将数据送到外部进程以及DRAM,并从外部进程以及DARM接收数据。每个PU例如178具有2个I/O地址发生器189、190,用于将数据送到DRAM,并从DRAM接收数据。通过I/O地址发生器的输出FIFO例如186,PU例如178可以将数据送到DRAM,或者通过I/O地址发生器的输入FIFO187,从DRAM接收数据。这些FIFO在PU例如178的本机上。还存在一种以在所有ALU之间共享的公共VLIW输入FIFO 78和公共VLIW输出FIFO79的形式将数据传送到外部进程和从外部进程传送数据的机制。VLIW输入FIFO和VLIW输出FIFO仅有8位宽,而且用于打印、Artcard读取、将数据送到CPU等。本机输入FIFO和输出FIFO是16位宽。
读模块
图5所示的读处理模块202负责更新ALU 188的R寄存器209,R寄存器209保存VLIW微编码进程的外部输入数据。在每个周期,读单元均可以从公共VLIW输入FIFO 78(8位)或两个本机输入FIFO(16位)之一进行读出。产生32位值,然后,然后,将该数据的一部分或全部送到R寄存器209。在图11中可以看到该过程。下表中描述了用于读模块的微码。请注意,为了帮助解码,仔细选择某些位模式的解释。
#位 |
说明 |
2 |
00=NOP01=从VLIW输入FIFO 78读出10=从本机FIFO 1读出11=从本机FIFO 2读出 |
1 |
多少个有效位0=8位(附加0或符合扩展)1=16位(仅对本机FIFO读出有效) |
1 |
0=作为不带符号数据进行处理 |
|
(附加0)1=作为带符号数据进行处理(在从FIFO读出时,进行符合扩展) |
2 |
将数据向左移位多少:00=0位(不改变)01=8位10=16位11=24位 |
4 |
更新R的哪字节(高位字节至低位字节)4位中的每位表示R上的1字节写使能 |
10 |
合计 |
写模块
在每个周期,写过程模块既可以对公共VLIW输出FIFO 79进行写,又可以对两个本机输出FIFO之一进行写。请注意,由于在给定周期,仅对1个FIFO进行写,所以仅将一个16位值输出到所有FIFO,后8位送到VLIW输出FIFO 79。微码以该值的方式控制哪个FIFO选通。在图12中可以更详细看到数据选择过程。出模块输出原始值Out
1和Out
2。它们仅是两个寄存器。用于写模块的微码具有下面的形式:
#位 |
说明 |
2 |
00=NOP01=对VLIW输出FIFO 79进行写 |
|
10=对本机输出FIFO 1进行写11=对本机输出FIFO 2进行写 |
1 |
选择输出值[Out1或Out2] |
3 |
选择部分输出值进行写(32位=4字节ABCD)000=0D001=0D010=0B011=0A100=CD101=BC110=AB111=0 |
6 |
合计 |
计算模块
每个ALU 188分别具有两个计算处理模块,即,加法器/逻辑处理模块204以及乘法/插值处理模块205。此外,还存在桶形移位器模块以帮助这些计算模块。在流水线运行过程中,寄存器模块215中的各寄存器可以用作临时存储器。
桶形移位器
图13更详细示出桶形移位器处理模块206,而且桶形移位器处理模块206由加法器/逻辑或乘法/插值处理模块的输出,或者这些模块(ALU寄存器L和M)在先前周期的结果获得其输入。可以在两个方向之一,将选择的32位桶形移位任意位数(需要时,具有符合扩展),然后,输出到ALU 188的S寄存器209。下表列出桶形移位器处理模块的微码。请注意,为了帮助解码,仔细选择某些位模式的解释。
#位 |
说明 |
3 |
000=NOP001=向左移位(不带符号)010=倒置011=向左移位(带符号)100=向右移位(带符号、不舍入)101=向右移位(不带符号、舍入)110=向右移位(带符号、不舍入)111=向右移位(带符号、舍入) |
2 |
选择输入以进行桶形移位00=乘法/插值结果01=M10=加法器/逻辑结果11=L |
5 |
要移位的#位 |
1 |
255的上整数 |
1 |
0的下整数(带符号数据) |
12 |
合计 |
加法器/逻辑模块204
图14更详细示出加法器/逻辑处理模块,加法器/逻辑处理模块用于简单的32位加法/减法、比较以及逻辑运算。在一个周期中,可以这些单独的加法、比较或逻辑运算,将结果存储到ALU 188的寄存器209中。有两个原始操作数A和B,这两个原始操作数是从两个交叉开关之一或从4个常数寄存器选择的。一个交叉开关选择过程使得可以使用先前周期的算术运算的结果,而第二个交叉开关选择过程可以存取该ALU 188或另一个ALU 188先前计算的操作数。CPU是可以对4个常数(K
1-K
4)进行写存取的唯一单元。在其中要求进行诸如(A+B)×4的运算的情况下,加法器的直接输出可以用作桶形移位器的输入,而且可以被向左移位2位,而无需首先锁存到L寄存器209上。还可以将加法器的输出用于乘法单元用于进行乘法—累加运算。下表列出加法器/逻辑处理模块的微码。请注意,为了帮助解码,仔细选择某些位模式的解释。加法器/逻辑单元的微码位解释:
#位 |
说明 |
4 |
0000=A+B(进位=0)0001=A+B(进位=执行先前运算)0010=A+B+1(进位=1)0011=A+1(增量A)0100=A-B-1(进位=0)0101=A-B(进位=执行先前运算)0110=A-B(进位=1)0111=A-1(减量A) |
|
1000=NOP1001=ABS(A-B)1010=MIN(A,B)1011=MAX(A,B)1100=A“与”B(A和B均可以被倒置,参看以下内容)1101=A“或”B(A和B均可以被倒置,参看以下内容)1110=A“异或”B(A和B均可以被倒置,参看以下内容)1111=A(A可以被倒置,参看以下内容) |
1 |
如果逻辑运算:0=A=A则1=A=NOT(A)如果加法运算:0=B不带符号则1=A带符号 |
1 |
如果逻辑运算:0=B=B则1=B=NOT(B) |
|
如果加法运算:0=B不带符号则1=B带符号 |
4 |
选择A[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、K3、K4] |
4 |
选择B[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、K3、K4] |
14 |
合计 |
乘法/插值模块205
图15更详细示出乘法/插值处理模块,乘法/插值处理模块是一组4个8×8内插器单元,该内插器单元每个周期可以进行4次单独8×8插值,或者可以组合在一起进行一个16×16乘法。这样就可以在一个周期内进行至多4次线性内插、一次双线性内插、或一半三线性内插。将内插或乘法结果存储到ALU 188的M寄存器209中。有两个原始操作数A和B,从ALU 188中的任意通用寄存器,或者从乘法/插值处理模块内部的4个可编程常数中选择这两个原始操作数。每个内插器模块分别起简单8位内插器的作用[结果=A+(B-A)f],或者起简单8×8乘法器[结果=A*B]的作用。在运算是内插时,将A和B看作4个8位数A
0至A
3(A
0是低位字节)以及B
0至B
3。Agen、Bgen以及Cgen负责对内插单元的输入进行排序,以便它们与所执行的运算匹配。例如,为了进行双线性内插,必须将4个值分别乘以不同因数,然后,对结果求和,而16×16位乘法需要是0的因数。下表列出加法器/逻辑处理模块的微码。请注意,为了帮助解码,仔细选择某些位模式的解释。加法器/逻辑单元的微码位解释:
#位 |
说明 |
4 |
0000=(A10*B10)+V0001=(A0*B0)+(A1*B1)+V0010=(A10*B10)-V0011=V-(A10*B10)0100=利用f0内插A0、B00101=利用f0内插A0、B0,利用f1内插A1、B10110=利用f0内插A0、B0,利用f1内插A1、B1,利用f2内插A2、B20111=利用f0内插A0、B0,利用f1内插A1、B1,利用f2内插A2、B2,利用f3内插A3、B31000=插入16位级1[M=A10*f0]1001=插入16位级2[M=M+(A10*f0)]1010=利用f级1[M=A0f0+A1f1+A2f2+A3f3]三线性内插A1011=利用f级2[M=M+A0f0+A1f1+A2f2+A3f3]三线性内插A1100=利用f级1[M=A0f0+A1f1]双线性内插A1101=利用f级2[M=M+A0f0+A1f1]双线性内插A |
|
1110=利用f完全[M=A0f0+A1f1+A2f2+A3f3]双线性内插A1111=NOP |
4 |
选择A[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、K3、K4] |
4 |
选择B[In1、In2、Out1、Out2、D0、D1、D2、D3、M、L、S、R、K1、K2、K3、K4] |
如果执行乘法: | |
4 |
选择V[In1、In2、Out1、Out2、D0、D1、D2、D3、K1、K2、K3、K4、加法器结果、M、0、1] |
1 |
将A看作带符号 |
1 |
将B看作带符号 |
1 |
将V看作带符号 |
如果执行内插 | |
4 |
选择f的基础[In1、In2、Out1、Out2、D0、D1、D2、D3、K1、K2、K3、K4、X、X、X、X] |
1 |
从P1或P2中选择内插f代Pn被看作f内的#小数位如果Pn=0,则f在表示0至1的0至255范围内 |
2 |
倒置 |
19 |
合计 |
利用同样的4位选择V和f,但是V的后4个选项通常不具有f值的意义。利用因数1或0进行内插没有意义,而且先前的乘法结果或当前结果未必是有意义的f值。
I/O地址发生器189、190
图16更详细示出I/O地址发生器。VLIW进程不直接存取DRAW。通过2个分别具有其自己的输入FIFO和输出FIFO的I/O地址发生器189、190进行存取。PU例如178从两个本机输入FIFO之一读取数据,而将数据写入两个本机输出FIFO之一。I/O地址发生器分别负责从DRAW读出数据以及将数据存储到其输入FIFO内,PU例如178可以对该输入FIFO进行读出,而且I/O地址发生器分别负责从其输出FIFO(PU例如178将数据存储到该输出FIFO)取出数据,然后将数据写入DRAW。I/O地址发生器是负责产生地址并对通过数据高速缓存76在DRAM内检索数据和存储数据进行控制的状态机。在CPU软件的控制下,用户可以定制该I/O地址发生器,但是不能微编码它。该地址发生器产生两大类地址:
图像迭代器,用于以各种方式迭代(读、写或者既读又写)图像上的所有像素
表I/O,用于随机存取图像中的像素、表中的数据,并用于模拟DRAM内的FIFO
I/O地址发生器189、190分别具有到数据高速缓存76的总线逻辑,每个PU例如178实现两条总线连接,而且在整个VLIW矢量处理器74上总共有8条总线。数据高速缓存76能够适应4个PU例如178在每个周期发出的最多8个请求。输入FIFO和输出FIFO是8个入口深的16位宽FIFO。在后面的小节中将对各种方式的地址生成过程(图像迭代器和表I/O)进行说明。
寄存器
I/O地址发生器具有一组用于控制地址生成过程的寄存器。寻址模式还确定了如何格式化数据、如何将数据送到本机输入FIFO以及如何解释本机输出FIFO输出的数据。CPU可以通过低速总线对I/O地址发生器的各寄存器进行存取。第一组寄存器确定I/O发生器的内务处理参数:
寄存器名称 |
#位 |
说明 |
复位寄存器 |
0 |
对该寄存器进行写入使任何操作暂停,而将各0写入I/O发生器的所有数据寄存器。不清除输入FIFO和输出FIFO。 |
启动寄存器 |
0 |
根据当前设置,对该寄存器进行写入再启动计数器。例如,如果I/O发生器是读迭代器,而且该迭代器当前处在该图像的中途,则对启动寄存器进行写将使得再从图像的起始开始读。在I/O发生器运行时,置位状态寄存器的有效位。 |
停机寄存器 |
0 |
对该寄存器进行写停止任何当前活动,并清除状态寄存器的有效位。如果有效位已经被清除,则对该寄存器进行写无效。 |
继续寄存器 |
0 |
对该寄存器进行写使I/O发生器根据当前设置继续工作。不复位计数器,也不清除各FIFO。在I/O发生器活动时,对该寄存器进行写无效。 |
ClearFIFOsOnGo寄存器 |
1 |
0=在对启动寄存器位进行写时,不清除FIFO。1=在对启动寄存器位进行写时,清除FIFO。 |
状态寄存器具有下面的值:
寄存器名称 |
#位 |
说明 |
现用 |
1 |
0=当前待用1=当前现用 |
保留 |
7 | |
高速缓存处理
几个寄存器用于控制高速缓存机制,规定哪个高速缓存组用于输入、输出等。关于高速缓存组的更多信息,请参考数据高速缓存76小节。
寄存器名称 |
#位 |
说明 |
CacheGroup 1 |
4 |
确定高速缓存组以读取数据 |
CacheGroup 2 |
4 |
确定哪个高速缓存组写入数据,而且对于ImagePyramidLookup I/O模式,确定该高速缓存用于读取平面信息表(LevelInformation Table) |
图像迭代器=顺序自动存取像素
软件算法和硬件算法的原始图像像素存取方法使用图像迭代器。图像迭代器对图像通道内的各像素的高速缓存进行寻址和存取,然后,对其客户进行读、写或者既进行读又进行写。迭代器的客户从本机输入FIFO读取像素,或者通过本机输出FIFO写像素。
读图像迭代器以特定顺序读整个图像,将像素数据保存到本机输入FIFO。每次在客户从输入FIFO读出像素时,读迭代器(通过数据高速缓存76)将图像的下一个像素保存到该FIFO。
写图像迭代器以特定顺序写像素,以写出整个图像。客户将像素写到输出FIFO,反过来,写图像迭代器读取该像素,然后,通过数据高速缓存76将它们写入DRAM。
通常,VLIW进程使其输入限制到读迭代器,而使其输出限制到相应写迭代器。根据PU例如178微码程序透视(perspective),FIFO是DRAM的有效接口。不关心用于进行存储的实际方法(除了数据的逻辑排序)。尽管我们注意到未有效限制FIFO的长度,但是,实际上,FIFO具有有限长度,而且存储和检索数据存在延迟,特别是在几个存储器的存取发生竞争时。为了满足图像处理算法中的大多数普通寻址要求,存在各种图像迭代器。在大多数情况下,存在每个读迭代器的相应写迭代器。下表列出各不同迭代器:
读迭代器 |
写迭代器 |
顺序读 |
顺序写 |
方框方式读 |
- |
垂直带方式读 |
垂直带方式写 |
4位寻址模式寄存器用于确定迭代器类型:
位# |
寻址模式 |
3 |
0=该寻址模式是迭代器 |
2至0 |
迭代器模式001=顺序迭代器010=方框方式(只读)100=垂直带方式变量剩余位模式 |
存取特定寄存器用作:
寄存器名称 |
本机名称 |
说明 |
AccessSpecific1寄存器 |
标志 |
标志用于读和写 |
AccessSpecific2寄存器 |
XBoxSize |
确定方框方式读的X方向的大小。有效值是3、5和7 |
AccessSpecific3寄存器 |
YBoxSize |
确定方框方式读的Y方向的大小。有效值是3、5和7 |
AccessSpecific4寄存器 |
BoxOffset |
仅在方框方式读期间,一个像素中心与另一个像素中心的偏差。常见值是1,但是其他常见值包括2、4、8…。更详细情况,请参考方框方式读。 |
标志寄存器(AccessSpecific1)含有许多标志,该标志用于确定影响读和写数据的因数。标志寄存器具有下面的组成:
标记 |
#位 |
说明 |
ReadEnable |
1 |
从DRAM读取数据 |
WriteEnable |
1 |
将数据写入DRAM[对于方框方式无效] |
PassX |
1 |
将X(像素)纵坐标送回输入FIFO |
PassY |
1 |
将Y(行)纵坐标送回输入FIFO |
Loop |
1 |
0=不通过数据循环1=通过数据循环 |
Reserved |
11 |
必须是0 |
ReadEnable和WriteEnable的注释:
在置位ReadEnable时,I/O地址发生器起读迭代器的作用,因此,以特定顺序读图像,将像素设置到输入FIFO上。
在置位WriteEnable时,I/O地址发生器起写迭代器的作用,因此,以特定顺序写图像,从输出FIFO中取出像素。
在既置位ReadEnable又置位WriteEnable时,I/O地址发生器既起读迭代器的作用,又起写迭代器的作用,将像素读入输入FIFO中,并从输出FIFO中写出像素。仅在读像素后,写像素,即,写迭代器永远不比读迭代器快。每次在使用该模式时,应该注意确保利用VLIW微码在进处理过程与出处理过程之间实现平衡。请注意,通过在CacheGroup 1和Cachegroup 2内装载不同的值,可以对读和写规定单独高速缓存组。
PassX和PassY的注释:
如果既置位PassX,又置位PassY,则在X纵坐标之前,将Y纵坐标设置到输入FIFO内。
仅试图在清除ReadEnable位时,置位PassX和PassY。不是将各纵坐标送到地址发生器,而是直接将各纵坐标设置到输入FIFO内。各纵坐标前进,因为从FIFO中消除各纵坐标。
如果置位WriteEnable,则VLIW程序必须确保从输入FIFO读纵坐标与写入输出FIFO平衡,因为至多仅对纵坐标进行写(请参考上述ReadEnable和WriteEnable的注释)。
Loop的注释:
如果置位Loop位,则一旦它到达[EndPixel,EndRow]时,就在[StartPixel,StartRow]重新开始读。这最适合处理必须重复读数据的诸如卷积内核或色块单元矩阵的结构。
可以在保持一行历史的环境下使用具有被置位ReadEnable和WriteEnable的循环,但是在此,仅在写之前,用于进行读。关于FIFO效果(在以长度受限制方式进行读之前,进行写),利用正确的表I/O寻址模式代替图像迭代器。
仅具有被置位的WriteEnable的循环建立最后N个像素的写窗口。从写窗口读数据的异步进程可以使用该写窗口。Artcard读算法利用该模式。
顺序读迭代器和顺序写迭代器
图17示出像素数据格式。最简单的图像迭代器是顺序读迭代器和相应的顺序写迭代器。顺序读迭代器将通道中的像素从上到下一次性显示在一行上,而在该行上,从左到右显示各像素。不对客户显示填充字节。这对于必须对图像中的每个像素进行处理,但是不关心所处理的各像素的顺序,或者特别希望数据处于该顺序的算法最有用。与顺序读迭代器配套的是顺序写迭代器。客户将像素写入输出FIFO。利用正确高速缓存操作和正确填充字节,顺序写迭代器顺序读出有效图像。每个顺序迭代器分别需要对两个高速缓存行进行存取。在读时,尽管可以有一个高速缓存行显示32像素,但是可以从内存装载另一个高速缓存行。在写时,尽管可以将32像素填充到一个高速缓存行上,但是可以将另一个高速缓存行写入内存。对图像的每个像素独立进行操作的进程通常使用顺序读迭代器以获得各像素,而顺序写迭代器将新像素值写入其在目标图像内的相应位置。图18示出该进程。
在大多数情况下,原始图像与目标图像不同,并利用2个I/O地址发生器189、190表示原始图像和目标图像。然而,可以有效使原始图像与目标图像相同,因为仅读出给定输入像素一次。然后,在这种情况下,在正确置位ReadEnable和WriteEnable时,同样的迭代器既可以用于输入,又可以用于输出。为了实现最高效率,应该使用两个不同高速缓存组,一个用于读,另一个用于写。如果利用待通过顺序写迭代器写入的VLIW进程建立数据,则可以利用PassX和PassY标志产生坐标,然后,将该坐标送到输入FIFO。VLIW进程可以使用这些坐标,并正确产生输出数据。
方框方式读迭代器
方框方式读迭代器用于以最适于进行诸如通用滤波和卷积的操作的顺序显示像素。迭代器以围绕顺序读像素的方形框的方式显示像素值。在X和Y方向,该方形框被限制在1、3、5至7像素宽(置位XboxSize和YboxSize—它们必须在一维上是同样的值或1,而在另一维上是3、5或7)。图19示出该进程:
BoxOffet:该专用寄存器用于根据哪个输入像素将用作方形框的中心,确定子采样。常见值是1,这意味着,每个像素均可以用作方形框的中心。值“2”用于以4∶1的比例进行缩小,与建立图像棱锥的情况相同。利用前面的图中的像素地址,该方形框以像素0为中心,然后,以像素2、8和10为中心。方框方式读迭代器要求存取最多14(2×7)个高速缓存行。尽管由一组7行显示各像素,但是可以从内存中装载其他高速缓存行。
方框方式写迭代器
没有相应的方框方式写迭代器,因为仅在输入端需要倍增像素。使用方框方式读迭代器进行输入的进程最有可能使用顺序写迭代器进行输出,因为它们同步。一个良好的例子是卷积器(convolver),该卷积器读出N个输入像素来计算1个输出像素。图20示出过程流程图。在使用方框方式读迭代器时,原始图像和目标图像不应该占据同一个存储器,因为后续行上的图像要求初始值(不是最新计算的值)。
垂直带方式读迭代器和垂直带方式写迭代器
在某些例子中,需要以输出像素顺序写图像,但是又不知道与输出像素有关的输入像素中的相关方向。这样的例子是旋转。如果图像被旋转90度,而且在水平方向处理输出像素,则完全丧失高速缓存相关性。另一方面,如果我们一次对输出图像的一个高速缓存行宽度的各像素进行处理,然后对下一行进行处理(而不是对同一行上的高速缓存行上的下一个值得处理的像素进行处理),我们将对我们的输入图像像素获得高速缓存相关性。它还可能是已知输入像素中的“块”相关性(例如,彩色相关性)的情况,在这种情况下,读控制处理顺序,而待同步的写必须遵循同一个像素顺序。作为输入显示(垂直带方式读)的、或者预期输出(垂直带方式写)的像素顺序相同。对于该图像的所有行,顺序是行0的像素0至31,然后是行1的像素0至像素31等等,然后是行0的像素32至63,行1的像素32至63等等。在最后的垂直带中,不可能刚好是32像素宽。在这种情况下,仅将图像中的实际像素表示为输入或看作输入。图21输出该进程。
仅需要垂直带方式写迭代器的进程通常具有给出输出像素坐标的、映像输入像素坐标的方式。根据该映像存取输入图像像素,通过使“随机存取”阅读器上的高速缓存行满足该输入图像,确定相关性。通常,通过利用垂直带方式写迭代器设置PassX标志和PassY标志,产生坐标,如图22示出的进程简图所示。
使写迭代器与顺序读迭代器或方框方式读迭代器成对没有意义,但是在输入坐标与输出坐标之间不存在平凡映像时,垂直带方式写迭代器确实可以显著提高性能。
使垂直带方式读迭代器与垂直带方式写迭代器成对有意义。在这种情况下,如果输入图像与输出图像相同,则可以将它们二者指定到一个ALU 188。如果需要坐标,则其他迭代器必须与置位的PassX标志和PassY标志一起使用。垂直带方式读迭代器/垂直带方式写迭代器对输入FIFO显示像素,并从输出FIFO接收输出像素。在写时,插入正确填充位。为了实现良好性能,输入和输出分别最少需要2个高速缓存行。
表I/O寻址模式
通常,需要搜索表(例如图像)中的值。表I/O寻址模式提供了这种功能性,要求客户将索引/各索引设置到输出FIFO内。然后,I/O地址发生器处理该索引/各索引,正确搜索数据,并使搜索的值返回输入FIFO,供VLIW客户进行后续处理。
在以内插为目标的特定模式下,支持1D、2D和3D。为了降低VLIW客户端的复杂性,在AccessSpecific寄存器确定定点,并因此而确定应该将哪些位看作索引的整数部分的情况下,将索引值看作定点数。数据格式将通用图像特性的显示限制在,忽略PixelOffet寄存器,假定该数据在一行内是邻接的,而且每个数据单元可以仅有8位或16位。4位寻址模式寄存器用于确定I/O类型:
位# |
寻址模式 |
3 |
1=该寻址模式是表I/O |
2至0 |
000=1D直接搜索001=1D内插(线性)010=DRAM FIFO011=保留 |
|
100=2D内插(双线性)101=保留110=3D内插(三线性)111=搜索的图像棱锥 |
存取专用寄存器是:
寄存器名称 |
本地名称 |
#位 |
说明 |
AccessSpecific1 |
标志 |
8 |
用于读和写的通用标志。更多信息请参考下面的内容 |
AccessSpecific2 |
FractX |
8 |
X索引中小数位的位数 |
AccessSpecific3 |
FractY |
8 |
Y索引中小数位的位数 |
AccessSpecific4(后8位/接着12位或24位) |
FractZ |
8 |
Z索引中小数位的位数 |
ZOffset |
12或24 |
请参考下面的内容 |
FractX、FractY和FractZ用于根据索引产生地址,并根据有效位和整数部分/小数部分,解释该索引的格式。仅在所索引的表的维数需要时,定义各种参数。1D表仅需要FractX,2D表需要FractX和FractY。Fract_值分别包括相应索引的小数位的位数。例如,X索引可以是格式5:3。这可以表示5位整数和3位小数。因此,可以将FractX设置为3。简单的1D搜索可以具有格式8:0,即,根本没有小数部分。因此,FractX可以是0。ZOffset仅要求3D搜索,而且有两种不同的解释。将在3D表搜索小节更全面对此进行说明。标志寄存器(AccessSpecific1)含有许多用于确定影响读(在一种情况下,是写)数据的因数的标志。标志寄
存器具有下面的组成:
标记 |
#位 |
说明 |
ReadEnable |
1 |
从DRAM读取数据 |
WriteEnable |
1 |
将数据写入DRAM[仅对1D直接搜索有效] |
DataSize |
1 |
0=8位数据1=16位数据 |
Reserved |
5 |
必须是0 |
除了ID直接搜索和DRAM FIFO,所有表I/O模式
仅支持读,而不支持写。ID直接搜索支持3种模式:
只读,其中ReadEnable位被置位,而WriteEnable位被清除
只写,其中ReadEnable位被清除,而WriteEnable位也被清除
读出—修正—写入,其中ReadEnable位和WriteEnable位均被置位
在下面的1D直接搜索小节,对各不同模式进行了说明。DRAM FIFO模式仅支持1种模式:
读写模式,其中ReadEnable位和WriteEnable位均被置位
将在下面的DRAM FIFO小节,对该模式进行说明。DataSize标志确定该表中每个数据单元的读写是8位还是16位。仅支持两种数据大小。根据该进程的要求,可以以两种方式之一产生32位单元:
同时从2个16位表中进行读取,并组合该结果。如果定时存在问题,这是方便,但是它的缺点是,占用2个I/O地址发生器189、190,而且CPU不能分别读出32位单元,作为32位项目。
分两次从16位表中读出并组合该结果。因为仅进行1次搜索,这是分别,但是必须产生不同的索引,并将它送到查用表。
一维结构
直接搜索
直接搜索就是简单索引到一维查用表中。通过对标志寄存器内的正确位进行置位,客户可以在3种存取方式中进行选择:
只读
只写
读出—修正—写入
只读
客户将定点索引X送到输出FIFO,而将Table[Int(X)]的8位或16位值返回输入FIFO。索引的小数部分完全被忽略。如果越限,则DuplicateEdge标志确定是返回边缘像素还是返回ContantPixel。地址生成过程是直通的:
如果DataSize指出8位,则X是桶形向右移位FractX位,并将结果与该表的基址ImageStart相加。
如果DataSize指出16位,则X是桶形向右移位FractX位,并将向左移位1位的结果(位0变成0)与该表的基址ImageStart相加。
将结果地址上的8位或16位数据设置到输入FIFO内。地址生成过程占用一个周期,而将请求的数据从高速缓存传送到输出FIFO也占用一个周期(假定高速缓存命中)。例如,假如我们正在其中每个项目为16位的、256个项目的表中搜索数值,而且该索引是8:4的12位定点格式。FractX应该是4,而DataSize应该是1。在将索引送到查用表时,我们向右移位4位,然后,将向左移位1位的结果与ImageStart相加。
只写
客户将定点索引X送到输出FIFO,然后,将被写入该表的规定位置的8位或16位值送到该输出FIFO。完全传送占用2个周期。一个周期用于地址生成过程,一个周期用于将数据从FIFO传送到DRAM。在将索引设置到FIFO内的VLIW进程与将待写入的数值设置到FIFO内之间,可以存在任意个周期。以与只读模式相同的方式,进行地址生成过程,但是,代替从该地址读取数据,而将从输出FIFO读取的数据写入该地址。如果该地址位于表范围之外,则从FIFO中删除该数据,不将它写入DRAM。
读出—修正—写入
客户将定点索引X送到输出FIFO,而将Table[Int(X)]上的8位或16位值返回输入FIFO。然后,将设置在输出FIFO内的下一个数值写入Table[Int(X)],代替先前返回的数值。因此,一般处理循环就是进程从某个位置读取、修改数值以及将它写回。总时间是4个周期:
由索引产生地址
从表返回数值
以某种方式修改数值
将它写回该表
不存在其中客户以比如“从X读取”或“写入X”的标志形式进行传送的专用读模式/写模式。通过写入初始值,客户可以模拟“从X读取”,而通过简单忽略返回值,客户可以模拟“写入X”。然而,不鼓励使用这种模式,因为每个动作均最少占用3个周期(不需要修改),而且利用两个数据存取过程代替一个数据存取过程,正如专用读模式和写模式所设置的那样。
插值表
除了对于给定定点索引X返回两个值而非一个值之外,该插值表与读模式中的直接搜索相同。返回的数值是Table[Int(X)]和Table[Int(X+1)]。如果两个索引之一越限,则DuplicateEdge标志确定是返回边缘像素还是返回ConstantPixel。除了根据8位或16位数据,第二地址仅是地址1+1或2,地址生成过程与直接搜索过程相同。将请求数据传送到输出FIFO占用2个周期(假定高速缓存命中),但是在一个16位取指令中,实际上可以将两个8位数值从该高速缓存返回地址发生器。
DRAM FIFO
读/写1D表的一种特殊情况是DRAM FIFO。通常,需要具有采用DRAM、具有给定长度的模拟FIFO以及有关高速缓存。利用DRAM FIFO,显然,客户不索引到该表,而是对输出FIFO进行写,就象它是FIFO的一端,并从输入FIFO读出,就象它是同一个逻辑FIFO的另一端。2个计数器对模拟FIFO中的输入位置和输出位置就象跟踪,并在需要时,将它们高速缓存到DRAM。客户需要对标志寄存器内的ReadEnable位和WriteEnable位进行置位。
使用DRAM FIFO的例子是保存某个数值的一行历史值。在处理开始之前,写入初始历史值。由于一般进程经过一行,所以从FIFO中检索先前行上的值,并将该行的值设置到FIFO内(在处理下一行时,该行就变成先前行)。只要输入与输出总体上互相匹配,则输出FIFO应该始终是满的。因此,对于这种类型的FIFO,不存在有效存取延迟(除非总FIFO长度非常短,比如3或4字节,但是这样就达不到FIFO的目的了。)
二维表
直接搜索
不支持二维直接搜索。因为对于双线性内插过程,预期2D搜索的所有情况均被存取,所以已经实现了特殊双线性搜索。
双线性搜索
这种搜索对于双线性内插2D表中的数据是必不可少的。已知定点X坐标和Y坐标(以Y、X的顺序设置在输出FIFO内),则在搜索之后,返回4个值。这4个值(顺序)是:
Table[Int(X),Int(Y)]
Table[Int(X)+1,Int(Y)]
Table[Int(X),Int(Y)+1]
Table[Int(X)+1,Int(Y)+1]
返回的这4个值的顺序提供了最佳高速缓存相关性。如果该数据是8位的,则在低位字节处于第一数据单元内的情况下,在两个周期中的每个周期,返回2个数值。如果该数据是16位的,则每个周期一项地,在4个周期内返回4个数值。地址生成过程占用2个周期。第一个周期使桶形向右移位FrantY位的索引(Y)乘以RowOffset,然后将该乘法结果与ImageStart相加。第二个周期使X索引向右移位FrantX位,然后,或者将结果(对于8位数据),或者将向左移位1位的结果(对于16位数据)与第一周期获得的结果相加。这样获得地址Adr=Table[Int(X),Int(Y)]的地址:
Adr=ImageStart
+ShiftRight(Y,FractY)*RowOffset)
+ShiftRight(X,FractX)
为了用于取出后续项目,我们将Adr的拷贝保存到AdrOld内。
如果数据是8位的,则时限是2个周期的地址生成过程,然后,是2个周期的数据返回过程(每个周期2个表项目)。
如果数据是16位的,则时限是2个周期的地址生成过程,然后,是4个周期的数据返回过程(每个周期1个表项目)。
下面的两个表示出8位大小的数据和16位大小的数据的地址计算方法:
周期 |
在从Adr取出2×8位数据时的计算过程 |
1 |
Adr=Adr+RowOffset |
2 |
<准备下一次搜索> |
周期 |
在从Adr取出2×16位数据时的计算过程 |
1 |
Adr=Adr+2 |
2 |
Adr=AdrOld+RowOffset |
3 |
Adr=Adr+2 |
4 |
<准备下一次搜索> |
在这两种情况下,地址生成过程的第一个周期可以覆盖将X索引插入FIFO的过程,因此有效时限可以低至1个周期的地址生成过程和4个周期的返回数据过程。如果生成索引的过程是该结果之前的两个步骤,则不存在有效地址生成时间,而仅以适当速率产生数据(每组2个或者4个周期)。
三维搜索
直接搜索
因为对于三线性内插过程,预期3D搜索的所有情况均被存取,所以已经实现了特殊三线性搜索。首先是直通查用表,其次是图像棱锥的三线性内插。
三线性搜索
这种搜索可用于诸如彩色变换表的3D数据表。标准图像参数确定数据的一个XY平面,即,每个平面包括ImageHeight行,每行含有RowOffset字节。在大多数情况下,假定邻接平面,一个XY平面是另一个XY平面后面的ImageHeight×RowOffset字节。不假定或者计算该偏差,CPU上的程序必需以12位ZOffset寄存器的形式提供该偏差。在这种形式的搜索过程中,已知Z、Y、X顺序的3个定点索引,则从查用表中顺序返回8个数值:
Table[Int(X),Int(Y),Int(Z)]
Table[Int(X)+1,Iht(Y),Int(Z)]
Table[Int(X),Int(Y)+1,Iht(Z)]
Table[Int(X)+1,Int(Y)+1,Int(Z)]
Table[Int(X),Int(Y),Int(Z)+1]
Table[Int(X)+1,Int(Y),Int(Z)+1]
Table[Int(X),Int(Y)+1,Int(Z)+1]
Table[Int(X)+1,Int(Y)+1,Int(Z)+1]
返回的这8个值的顺序提供了最佳高速缓存相关性。如果该数据是8位的,则在低位字节处于第一数据单元内的情况下,在4个周期中的每个周期,返回2个数值。如果该数据是16位的,则每个周期一项地,在8个周期内返回4个数值。地址生成过程占用3个周期。第一个周期使桶形向右移位FrantZ位的索引(Z)乘以12位ZOffset,然后将该乘法结果与ImageStart相加。第二个周期使桶形向右移位FrantY位的索引(Y)乘以RowOffset,然后将该乘法结果与先前周期的结果相加。第二个周期使X索引向右移位FrantX位,然后,或者将结果(对于8位数据),或者将向左移位1位的结果(对于16位数据)与第二周期获得的结果相加。这样获得地址Adr=Table[Int(X),Int(Y),Int(Z)]的地址:
Adr=ImageStart
+ShiftRight(Z,FractZ)*ZOffset)
+ShiftRight(Y,FractY)*RowOffset)
+ShiftRight(X,FractX)
为了用于取出后续项目,我们将Adr的拷贝保存到AdrOld内。
如果数据是8位的,则时限是2个周期的地址生成过程,然后,是2个周期的数据返回过程(每个周期2个表项目)。
如果数据是16位的,则时限是2个周期的地址生成过程,然后,是4个周期的数据返回过程(每个周期1个表项目)。
下面的两个表示出8位大小的数据和16位大小的数据的地址计算方法:
周期 |
在从Adr取出2×8位数据时的计算过程 |
1 |
Adr=Adr+RowOffset |
2 |
Adr=AdrOld+ZOffset |
3 |
Adr=Adr+RowOffset |
4 |
<准备下一次搜索> |
周期 |
在从Adr取出2×16位数据时的计算过程 |
1 |
Adr=Adr+2 |
2 |
Adr=AdrOld+RowOffset |
3 |
Adr=Adr+2 |
4 |
Adr,AdrOld=AdrOld+ZOffset |
5 |
Adr=Adr+2 |
6 |
Adr=AdrOld+RowOffset |
7 |
Adr=Adr+2 |
8 |
<准备下一次搜索> |
在这两种情况下,地址生成过程的各周期可以覆盖将各索引插入FIFO的过程,因此一个one-off搜索的有效时限可以低至1个周期的地址生成过程和4个周期的返回数据过程。如果生成索引的过程是该结果之前的两个步骤,则不存在有效地址生成时间,而仅以适当速率产生数据(每组4个或者8个周期)。
搜索的图像棱锥
在利用画笔画图、铺砌以及翘曲处理期间,需要计算图像中特定面积上的平均颜色(average color)。而不计算每个给定面积的值,这些函数使用图像棱锥。在该专利申请文件的DRAM接口81一章中的内部图像格式小节对图像棱锥的结构做了详细说明。本小节涉及根据排序的3个定点索引:平面(Z)、Y和X,寻址棱锥上的给定像素的方法。请注意,图像棱锥搜索假定8位数据项,因此完全忽略DataSize标志。在规定了Z、Y和X后,通过输入FIFO,返回下面的8像素:
位于平面Int(Z)上的[Int(X),Int(Y)]的像素
位于平面Int(Z)上的[Int(X)+1,Int(Y)]的像素
位于平面Int(Z)上的[Int(X),Int(Y)+1]的像素
位于平面Int(Z)上的[Int(X)+1,Int(Y)+1]的像素
位于平面Int(Z)+1上的[Int(X),Int(Y)]的像素
位于平面Int(Z)+1上的[Int(X)+1,Int(Y)]的像素
位于平面Int(Z)+1上的[Int(X),Int(Y)+1]的像素
位于平面Int(Z)+1上的[Int(X)+1,Int(Y)+1]的像素
返回这8像素作为4×16位项目,将X项和X+1项与高位字节/低位字节(hi/lo)组合在一起。例如,如果定标坐标(X,Y)是(10.4,12.7),则返回的头4像素是:(10,12)、(11,12)、(10,13)以及(11,13)。在坐标位于有效范围之外时,客户选择边缘像素复制,或者通过DuplicateEdgePixel寄存器和ConstantPixel寄存器(仅使用后8位),返回恒定颜色值。在构造了图像棱锥时,存在从灰度平面0坐标到平面Z坐标的简单映像。该方法仅将X坐标或Y坐标向右移位Z位。除了为了检索该坐标的整数部分已经移位许多位之外,还必须这样做(即,分别对X纵坐标和Y纵坐标向右移位FractX位和FractY位)。为了发现图像棱锥的给定平面的ImageStart和RowOffset值,将24位ZOffset寄存器用作平面信息表的指针。该表是记录阵列,每个记录表示以平面号排序的棱锥平面。每个记录含有从ImageStart到棱锥的该平面的16位偏差ZOffset(由于不显示该偏差的后6位,所以64字节对准地址)以及该平面的12位ZRowOffset。该表的单元0含有0 ZOffset,而且ZRowOffset等于通用寄存器RowOffset,因为它仅指向全副图像。应该将该表的单元N的ZOffset值与ImageStart相加,以产生该图像棱锥的平面N有效ImageStart。该表的单元N内的RowOffset值含有平面N的RowOffset值。在使用该寻址模式之前,运行在CPU上的软件必须正确建立该表。在此,在逐个周期的描述中概括说明实际地址生成过程:
周期 |
装载寄存器 |
来自地址 |
其他操作 |
0 |
- |
- |
ZAdr=ShiftRight(Z,FractZ)+ZOffsetZInt=ShiftRight(Z,FractZ) |
1 |
ZOffset |
ZAdr |
ZAdr+=2YInt=ShiftRight(Y,FractY) |
2 |
ZRowOffset |
ZAdr |
ZAdr+=2YInt=ShiftRight(Y,FractY)Adr=ZOffset+ImageStart |
3 |
ZOffset |
ZAdr |
ZAdr+=2Adr+=ZrowOffset*YIntXInt=ShiftRight(X,FractX) |
4 |
ZAdr |
ZAdr |
Adr+=ShiftRight(XInt,ZInt)ZOffset+=ShiftRight(XInt,1) |
5 |
FIFO |
Adr |
Adr+=ZrowOffsetZOffset+=ImageStart |
6 |
FIFO |
Adr |
Adr=(ZAdr*ShiftRight(YInt,1)+ZOffset |
7 |
FIFO |
Adr |
Adr+=Zadr |
8 |
FIFO |
Adr |
<用于下一次检索的周期0> |
通过利用一个桶形移位器、2个加法器以及一个16×16乘法/加法单元产生24位,可以实现上述地址生成过程。尽管在某些周期进行了2次移位,但是它们不是具有同样的移位值(即,两次使用桶形移位器的输出),就是移位1位,它们可以是硬布线的。需要下面的内部寄存器:ZAdr、Adr、ZInt、YInt、XInt、ZRowOffset以及ZImageStart。_Int寄存器最大仅需要8位,而其他寄存器至多可以24位。由于这种存取方法仅从图像棱锥读取数据,而将数据写入图像棱锥,所以CacheGroup2用于搜索图像棱锥地址表(通过ZAdr)。CacheGroup1用于搜索图像棱锥本身(通过Adr)。地址表约有22项(根据原始图像大小),每项4位。因此,应该对CacheGroup2分配3或4个高速缓存行,而应该尽可能多地对CacheGroup1分配高速缓存行。返回一组数据的时限是8个周期,假定在运行过程中,周期8与周期0重叠,即,在周期8内发生下一个请求的周期0。这是可以接受的,因为周期0不进行内存存取,而且周期8没有特定操作。
利用VLIW矢量处理器74生成坐标
与写迭代器有关的某些函数需要正在部分处理流水线中处理的当前像素的X和/Y坐标。还需要在正在处理的每行或每列的末尾进行特殊处理。在大多数情况下,PassX和PassY标志应该足以完全产生所有坐标。然而,如果存在特殊要求,则可以使用下面的函数。对于一个周期的生成过程,可以将计算过程扩展到许多ALU上,而对于多个周期的生成过程,可以在一个ALU 188执行计算过程。
生成顺序[X,Y]
在进程是根据顺序读迭代器顺序处理像素(或者产生像素并将它们写入顺序写迭代器)时,下面的进程可以用于产生X、Y坐标,代替图23所示的PassX和PassY标志。
坐标发生器在X纵坐标进行计数直到ImageWidth,而且在Y纵坐标,每个ImageWidth像素增量计数一次。图24示出实际进程,其中利用软件设置下面的常数:
常数 |
值 |
K1 |
ImageWidth |
K2 |
ImageHeight(任选) |
下面的寄存器用于保存临时变量:
变量 |
值 |
Reg1 |
X(每行均从0开始) |
Reg2 |
Y(从0开始) |
下面概述技术要求
一般 |
0 |
3/4 |
2 |
1/2 |
0 |
0 |
合计 |
0 |
3/4 |
2 |
1/2 |
0 |
0 |
生成垂直带方式[X,Y]
在进程正在处理像素以将它们写入垂直带方式写迭代器,而且因为某种原因而不能使用PassX和PassY标志时,图25所示的进程可以用于生成X、Y坐标。坐标发生器仅在X纵坐标进行计数直到ImageWidth,而且在Y纵坐标,每个ImageWidth像素增量计数一次。图26示出实际进程,其中利用软件设置下面的常数:
常数 |
值 |
K1 |
32 |
K2 |
ImageWidth |
K3 |
ImageHeight |
下面的寄存器用于保存临时变量:
变量 |
值 |
Reg1 |
StartX(从0开始,每个垂直带方式一次递增32) |
Reg2 |
X |
Reg3 |
EndX(从32开始,每个垂直带方式一次递增32直到ImageWidth的最大值) |
Reg4 |
Y |
下面概述技术要求
技术要求 |
*+ |
+ |
R |
K |
LU |
迭代器 |
一般 |
0 |
4 |
4 |
3 |
0 |
0 |
合计 |
0 |
4 |
4 |
3 |
0 |
0 |
每个垂直带方式进行一次的计算(2个加法,其中一个加法具有有关MIN)不包括在一般时限统计中,因为它们实际上不是每个像素时限的一部分。然而,在对特定函数的微码进行编程时,的确需要考虑到它们。图像传感器接口(ISI 83)
图像传感器接口(ISI 83)从CMOS图像传感器获取数据,并将它存储到DRAM中供使用。图像传感器的宽高比是3∶2,典型分辨率为750×500个采样,产生375K(每个像素8位)。每个2×2像素块具有图27所示的结构。ISI 83是用于将包括帧同步脉冲和像素时钟脉冲的控制信息送到图像传感器以读取图像的状态机。从图像传感器读取像素,并将读取的像素设置到VLIW输入FIFO 78内。然后,VLIW可以处理和/或存储该像素。图28进一步示出该过程。与VLIW程序一起使用ISI 83,VLIW程序将检测的照片图像存储到DRAM中。处理过程分2个步骤:
小型VLIW程序从FIFO读取像素,然后,通过顺序写迭代器,将它们写入DRAM。
根据拍照时相机的取向,将DRAM内的照片图像旋转90、180或270度。
如果旋转0度,则步骤1仅将照片图像写入最终照片图像位置,而不执行步骤2。如果旋转不是0度,则将该图像写入临时存储区(例如,写入打印图像存储区),然后,将在步骤2旋转的图像写入最终照片图像位置。步骤1是非常简单的微码,它从VLIW输入FIFO 78获取数据,然后,将它们写入顺序写迭代器。利用加速Vark仿射变换函数,实现步骤2的旋转。为了降低设计复杂性而且为了再用对图像已经要求的Vark仿射变换旋转逻辑,在步骤2执行该处理过程。这是可以接受的,因为在接近0.03秒内完成这两个步骤,Artcam的操作员几乎感觉不到0.03秒的时间。尽管如此,读进程仍受到传感器速度的限制,读整个帧占用0.02秒,而旋转该图像接近占用0.01秒。
取向对于在检测的照片图像与内部格式图像之间进行变换非常重要,因为R、G和B像素的相对位置随取向发生变化。在打印期间,为了使处理图像处于打印的正确取向,还必须旋转处理图像。3D型号的Artcam具有2个图像传感器,它们的输入被复用到一个ISI 83(不同微码,但是是同一个ACP 31)。因为每个传感器分别是帧存储器,所以可以同时获取两个图像,然后一次一幅地将它们传送到内存。
显示器控制器88
在Artcam上的“拍摄(Take)”按钮被按下一半时,TFT将显示图像传感器输出的当前图像(通过简单VLIW进程变换的)。一旦完全按下该拍摄按钮,则显示拍摄的图像。在用户按下打印按钮并开始进行图像处理时,TFT被关闭。一打印了图像,就再一次接通该TFT。在引入了平板显示器的这种型号的Artcam中,采用显示器控制器88。典型显示器是分辨率为240×160像素的TFT LCD。图29输出显示器控制器88的结构。显示器控制器88的状态机含有用于控制同步生成过程而且用于控制是否应该在此刻激活(利用TFT使能信号)TFT的寄存器,在同步生成过程中,(通过专用高速缓存组通过数据高速缓存76从DRAM中)取出显示图像。通过低速总线,CPU可以对这些寄存器进行写。在RGB TFT上显示240×160像素要求每个像素3个分量。利用3个分别用于R、G和B输出信号的DAC,显示从DRAM取出的图像。由于图像刷新速率为每秒30帧(每秒60个字段),所以显示器控制器88要求数据传送速率为:
240×160×3×30=3.5MB/秒
与其他系统相比,该数据速率低。然而,在增强图像处理期间,它已经够高了,可以使VLIW程序减速。TFT的一般工作原理应该能反映该情况。
图像数据格式
如上所述,DRAM接口81负责在ACP芯片的其他客户部分与RAMBUSDRAM之间实现连接。实际上,DRAM接口内的每个模块均是地址发生器。
ACP处理的图像有3种逻辑类型。它们是:
CCD图像,是从CCD捕获的输入图像。
内部图像格式—Artcam设备在内部使用该图像格式。
打印图像—Artcam打印的输出图像格式
这些图像通常在色空间、分辨率以及输出和输入色空间方面不同,而且不同的相机,它们也不同。例如,低端相机上的CCD图像可以是不同的分辨率,或者其彩色特性与高端相机使用的彩色特性不同。然而,对于所有相机,所有内部图像格式在色空间方面的格式相同。
此外,关于哪个方向是“上”,可以改变这3种图像类型。相机的物理取向使人们知道肖像或风景图像,而且这必须通过处理来保持。因为此原因,始终正确取向内部图像,然后,在打印过程中,对从CCD获得的图像进行旋转。
CCD图像组织
尽管可以使用许多不同的CCD图像传感器,但是假定CCD本身是750×500图像传感器,它产生375,000字节(每个像素8位)。每个2×2像素块具有图30所示的结构。
在内存中给定的行邻接的情况下,存储在DRAM内的CCD图像具有连续像素。图像传感器接口83负责从CCD获取提取,并将它存储到正确取向的DRAM内。因此,被旋转0度的CCD图像具有第一行G、R、G、R、G、R…,和第二行B、G、B、G、B、G…等。
以交错方式存储各像素,因为为了变换为内部图像格式,需要所有彩色分量。
应该注意,ACP 31没有假定CCD像素格式,因为实际上,不同的Artcam用于成像的CCD始终不同。利用主微码控制利用硬件进行的所有处理过程,以扩展ACP 31的用途。
内部图像组织
内部图像通常包括多个通道。Vark图像可以包括,但是并不局限于:
Lab
Labα
LabΔ
αΔ
L
L、a和b相当于Lab色空间的各分量,α是无光通道(matte channel)(用于合成),Δ是块形映像通道(在画笔画图、铺砌以及照射期间使用它)。
VLIW处理器74要求以平面结构组织各图像。因此,将Lab图像存储为3个单独内存块:
一块用于L通道,
一块用于a通道,以及
一块用于b通道,
在每个通道块内,对于给定的行,邻接存储各像素(附加某些任选填充字节),而且一行接着一行存储各行。
参考图31,图31示出存储逻辑图像100的一种典型形式。以平面方式存储逻辑图像100,该平面方式具有一个接着一个存储的L101、a102和b103彩色分量。作为一种选择,可以以压缩格式存储逻辑图像100,该压缩格式具有未压缩的L分量101和压缩的A分量105以及压缩的B分量106。
参考图32,在存储行(n+1)的各像素(111)之前,一起存储行n的各像素110。因此,将图像存储到一个通道内的邻接存储器内。
在8MB内存模型内,需要在色度通道内压缩完成所有处理的最终打印图像。色度通道的压缩比可以是4∶1,这样可以使总压缩比为12∶6,或2∶1。
除了最终打印图像之外,通常不对Artcam内的图像进行压缩。因为内存的制约,通过以2∶1的比例分别压缩这些通道,可以选择软件压缩色度通道内的最终打印图像。如果这样进行了压缩,则必须通知可以用于打印图像的PRINT Vark函数调用对被压缩的规定的色度通道进行处理。PRINT函数是唯一知道如何处理被压缩的色度通道的函数,然而,它仅处理固定的2∶1压缩比。
尽管可以压缩图像,然后对压缩图像进行处理以产生最终打印图像,但是并不推荐这样做,因为这样会降低分辨率。此外,应该仅对图像压缩一次,作为印出之前的最终级。尽管实际上检测不到压缩,但是多次压缩会使图像显著降质。
剪贴图像组织
ACP 31不显式支持存储在Artcard上的剪贴图像。软件负责从当前Artcard上获取任意图像,并将该数据组织成ACP已知的形式。如果图像被压缩存储在Artcard上,则软件负责对它们进行解压缩,因为没有专用硬件支持解压缩Artcard图像。
图像棱锥组织
在用于处理图像的画笔画图、铺砌以及翘曲处理期间,通常需要计算图像中特定面积上的平均颜色(average color)。而不计算每个给定面积的值,这些函数使用图像棱锥。如图33所示,事实上,图像棱锥是多分辨率像素映像(multi-resolutionpixel-map)。原始图像115是1∶1表示。在每维上进行低通滤波和以2∶1进行子采样产生1/4原始图像大小的图像116。继续该进程直到利用一个像素表示整个图像。利用原始内部格式图像构造图像棱锥,而且图像棱锥是原始图像(1/4+1/16+1/64+…)的大小的1/3。对于1500×1000的原始图像,相应的图像棱锥接近1/2 MB。利用专用Vark函数构造图像棱锥,而且该图像棱锥用作其他Vark函数的参数。
打印图像组织
同时需要整个处理图像,以便打印它。然而,打印图像输出可以包括CMY混色图像,而且仅是瞬时图像格式,在打印图像功能性中可以使用它。然而,应该注意,需要从内部色空间到打印色空间进行彩色变换。此外,例如,对于具有不同墨水特性的相机内的不同打印卷,可以将彩色变换调节为不同的彩色变换。利用专用深褐色调色Artcard,或者利用深褐色色调打印卷(因此,所有Artcard均以深褐色色调工作),可以实现深褐色输出。
色空间
如上所述,根据不同的图像类型,Artcard使用了3种色空间。
ACP没有比色空间(specific color space)的直接知识。相反,它利用客户色空间变换表,在CCD色空间、内部色空间以及打印机色空间之间进行变换:
CCD:RGB
内部:Lab
打印机:CMY
从ACP 31中删除色空间变换可以使:
不同的CCD用于不同的相机
不同的墨水(始终用于不同打印卷上)用于同样的相机
选择CCD与设计ACP通路分离
严格确定色空间以便精确进行彩色处理
Artcard接口87
在Artcard从线性图像传感器下面通过时,Artcard接口(AI)从线性图像传感器获取数据,并将该数据存储到DRAM内供使用。图像传感器每个扫描线产生11,000个8位采样,以4800dpi采样该Artcard。AI是用于将包括LineSync脉冲和PixelClock脉冲的控制信息送到线性传感器以读取图像的状态机。从线性传感器读取像素,然后,将它们设置到VLIW输入FIFO 78内。这样,VLIW就可以处理并/或者存储各像素。
AI仅具有几个寄存器:
寄存器名称 |
说明 |
NumPixels |
传感器行上的像素数量(接近11,000) |
状态 |
打印头接口的状态寄存器 |
PixelsRemaining |
保留在当前行内的字节数 |
动作 | |
复位 |
对该寄存器进行写复位AI,停止任何扫描并将0装载到所有寄存器。 |
扫描 |
利用非零值对该寄存器进行写置位状态寄存器的扫描位,而且使Artcard接口扫描周期开始。利用0 |
|
对该寄存器进行写停止扫描过程,并清除状态寄存器内的扫描位。扫描周期使AI将NumPixels字节从传感器传送到VLIW输入FIFO 78,从而正确产生PixelClock信号。完成NumPixels字节后,提供LineSync脉冲,并重新开始扫描周期。PixelsRemaining寄存器保存要读到当前扫描线上的大量剩余字节。 |
请注意,在初始化扫描寄存器之前,CPU应该清除VLIW输入FIFO 78。以下解释状态寄存器的位:
位名称 |
位 |
说明 |
扫描 |
1 |
如果被置位,则AI当前正在扫描,将从记录在PixelsRemaining寄存器内的当前行传送剩余的大量字节要。如果被清除,则AI当前未扫描,因此不将像素传送到VLIW输入FIFO 78。 |
Artcard接口(AI)87
Artcard接口(AI)87负责从Artcard阅读器34获取Artcard图像,然后,将它解码为原始数据(通常是Vark脚本)。具体地说,AI 87从Artcard扫描仪线性CCD 34接收信号,检测在该卡上打印的位模式,以及将该位模式变换为原始数据,从而校正阅读错误。
如果未插入Artcard 9,则由Artcam打印的图像仅是检测的、被任何标准图像处理例程清除的照片图像。Artcard 9是在打印照片之前,用户可以利用它修改照片的装置。利用将特定Artcard 9插入Artcam内的简单操作,用户可以确定对照片图像执行的复杂图像处理。
如果未插入Artcard,则以标准方式处理照片图像,从而产生打印图像。在将一个Artcard 9插入Artcam时,对照片图像施加Artcard效果,以产生打印图像。
在取出(退出)Artcard 9时,打印图像回复以标准方式处理的照片图像。在用户按下按钮退出Artcard时,将事件排列在运行在Artcam中央处理器31上的操作系统保持的事件队列中。在处理事件时(例如,在进行了当前打印之后),出现以下情况:
如果当前Artcard有效,则将打印图像标记为无效,并将“处理标准”事件排列在事件队列中。在最终处理事件时,将对照片图像执行标准图像处理操作,以产生打印图像。
马达开始退出Artcard,并将特定时间的“马达停止”事件附加到事件队列中。
插入Artcard
在用户插入Artcard 9时,Artcard传感器49检测它,从而通知ACP72。这样使得软件将“插入Artcard”事件插入事件队列中。在处理事件时,出现几种情况:
将当前Artcard标记为无效(与“未”相反)。
将打印图像标记为无效。
Artcard马达37开始装载Artcard。
指示Artcard接口87读Artcard。
Artcard接口87从Artcard扫描仪线性CCD 34接收信号,检测在该卡上打印的位模式,对检测的位模式中的错误进行纠错,从而在DRAM内产生有效Artcard数据块。
从Artcard CCD读取数据—一般研究
如图34所示,在从该卡读取像素数据时,数据卡读取过程有4个处理阶段。这4个处理阶段是:
阶段1:检测Artcard上的数据区
阶段2:根据CCD像素,检测Artcard上的位模式,并作为字节写入
阶段3:解扰字节模式并对该字节模式进行”异或”运算
阶段4:解码数据(RS(Reed-Solomon)解码)
如图35所示,为了满足奈奎斯特法则,必须至少以二倍的打印分辨率采样Artcard 9。实际上,最好以高于该分辨率的更高速率进行采样。在每维上,优先以打印点分辨率的3倍速率,在230上采样像素,因此需要9像素确定一个点。这样,如果Artcard 9的分辨率是1600dpi,而传感器34的分辨率是4800dpi,则使用50mm CCD图像传感器在每列产生9450像素。因此,如果我们需要2MB点数据(每个点9像素),则这样需要2MB*8*9/9450=15,978列=接近16,000列。当然,如果点不准确对准采样的CCD,则最糟糕而且最可能的情况是在16像素区(4×4)231上检测点。
Artcard 9可以因为热损伤而翘曲,因为插入Artcard阅读器的差别而稍许转动(比如最多1度),而且因为阅读器马达37的速度的波动而使实际数据速率稍许存在差别。这些变化导致从该卡上读出的数据列不能作为相应像素数据列。如图36所示,Artcard 9转动1度可能导致从该卡的列上读取的像素成为166列上的像素。
最后,应该以对操作员合理的时间读Artcard 9。Artcard上的数据覆盖了大部分Artcard表面,因此时限问题受限于Artcard数据本身。1.5秒的读时间足以进行Artcard读。
应该在1.5秒内装载Artcard。因此,必须在1.5秒内从CCD 34内读取全部16,000列的像素数据,即,每秒10,667列。因此,读一列的可用时间是1/10667秒,或93,747纳秒。可以一次一列地将像素数据写入DRAM,而与正在读取像素数据的任何处理过程完全无关。
利用8个高速缓存行减少了将一列数据(9450/2字节,因为读过程可以是每个像素4位,从而得出每字节2×4位像素)写入DRAM的时间。如果每次写出4行,则可以独立对4个存储体进行写入,因此缩短了重叠等待时间。这样,在11,840ns内可以写入4725字节(4725/128*320ns)。因此,将给定列的数据写入DRAM花费的时间仅占用不到13%的可用带宽。
解码Artcard
简单查看数据大小显示,如果保持线性CCD 34读取的全部Artcard像素数据(如果以3×3阵例读取每位,则是140MB),则不可能使该处理过程适应8MB的内存33。因为此原因,应该实时进行线性CCD的读取过程、位映像的解码过程以及未位映像进程(在Artcard 9通过线性CCD34时),而且这些进程必须有效工作,而无需使整个数据存储器可用。
在插入Artcard 9时,所存储的旧打印图像和任何放大的照片图像就无效了。新Artcard 9可以含有根据当前捕获的照片图像产生新图像的方向。旧打印图像无效,而保存放大的照片图像数据的和图像棱锥的存储区也无效,从而留下不止5MB的存储区,该5MB的存储区可以用作读处理期间的暂时存储器。严格地说,在Artcard读处理期间,将要写入Artcard原数据的1MB存储区也可以用作暂时存储器,只要在进行RS解码时,该1MB存储区仍空闲即可。在此描述的读处理过程不使用该额外1MB存储区(最终目标数据除外)。
还应该注意,去扰处理过程需要2组2MB存储区,因为在原位不能进行去扰过程。幸运的是,5MB暂时存储区的存储空间足以进行该处理过程。
现在,参考图37,图37示出解码Artcard数据所需各步骤的流程图220。这些步骤包括读取Artcard 221内的数据,解码读取的数据,以产生相应的被“异或”运算的编码加扰位映像数据223。接着,对该数据进行检测板“异或”运算,以产生编码加扰数据224。对该数据进行去扰227,以产生数据225,然后,对该数据进行RS解码以产生原始原数据226。作为一种选择,去扰和“异或”运算可以一起进行,因此不需要单独传送数据。以下将进一步详细说明上述每个步骤。正如以上参考图37所述,因此,Artcard接口具有4个阶段,头两个阶段是时限的,而且从CCD读取像素数据时,必须进行这两个阶段:
阶段1:检测Artcard上的数据区
阶段2:根据CCD像素,检测Artcard上的位模式,并作为字节写入
阶段3:解扰字节模式并对该字节模式进行”异或”运算
阶段4:解码数据(RS(Reed-Solomon)解码)
下面将更详细说明这4个阶段:
阶段1:在Artcard通过CCD 34时,AI必须通过鲁棒检测Artcard上位于该数据区左侧的特殊目标,检测数据区的开始。如果未检测到,则将该卡标记为无效。必须在Artcard 9通过CCD 34时进行实时检测。
如果需要,可以实现旋度不变。在这种情况下,目标在Artcard的右侧重复,但是是在右下角,而不是在右上角。这样,如果以“错误”方式插入该卡,则目标以正确取向结束。可以改变下面的阶段3,以检测数据取向,并计算可能旋度。
阶段2:一旦确定了数据区,就开始主读处理过程,从而使像素数据从CCD进入“Artcard数据窗口”,从该窗口中检测位,将检测的位组装成字节以及在DRAM内构造字节图像(byte-image)。必须在Artcard通过CCD时这样做。
阶段3:一旦从Artcard数据区中读取了所有像素,则可以通知Artcard马达37,然后,对该字节图像进行解扰和”异或”运算。尽管不需要实时性能,但是为了不使操作员厌烦,该处理过程应该足够快。该处理过程必须获得2MB的加扰位图像(bit-image),并将去扰/”异或”运算的位图像写入单独2MB图像。
阶段4:Artcard读处理过程的最后一个阶段是RS解码过程,在该RS解码过程中,将2MB位图像解码为1MB有效Artcard数据区。此外,在不要求实时性能时,对于操作员,仍需要快速解码。如果解码过程有效,则将该卡标记为有效。如果该解码失败,而尝试对位图像中数据的复制数据进行解码,则重复该过程直到成功,或者直到不再存在位图像中数据的复制图像。
上述4个阶段的处理过程需要4.5MB的DRAM。对阶段2的输出保留2MB,而对阶段1和2期间的暂时数据保留0.5MB。剩余的2MB空间至少可以保存每列4725字节的440列。实际上,阶段1算法之前几列是正被读出的像素数据,而在最糟糕情况下,阶段2后面的约180列良好地位于440列范围内。
现在,将更详细说明每个阶段的实际操作过程。
阶段1-检测Artcard上的数据区
该阶段涉及鲁棒检测Artcard 9上的左侧数据区。通过精确检测打印在该卡的左侧上的特殊目标,可以精确检测该数据区。这些目标是专门设计的,即使转动到达1度,仍可以容易地检测它。
参考图38,图38示出Artcard 9的放大的左侧。卡的该侧被分割为16个带239,该带具有位于每条带的中心的目标例如241。各条带是逻辑的,即,不存在接近单独带的行。参考图39,图39示出一个目标241。目标241是含有一个白点的印刷黑方块。想法是首先尽可能多地检测目标241,然后,将至少8个检测的白点位置连接成一条逻辑直线。如果可以这样做,则数据区243的开始距离该逻辑线的距离是固定距离。如果不能这样做,则作为无效,退出该卡。
如图38所示,卡9的高度是3150点。以距离数据区左上角244 24点的固定距离设置目标(目标0)241,因此它很好地落入16个192点(576像素)的等大小区域239中的第一个等大小区域内,而没有目标落入该卡的最后一个像素区域内。为了容易检测,目标241必须足够大,而为了在该卡转动1度时,不到该区域高度的外面,该目标241还必须足够小。该目标的适当大小是具有白点242的31×31点(93×93检测像素)黑方块241。
在转动1度的最糟糕情况下,每57像素发生1列位移。因此,在590像素大小的带中,我们不能将我们的符号的任意部分设置到该带的顶部或底部的大约12像素上,或者说,如果该卡处于最糟糕转动的情况下,则在CCD读取时间,可能在错误带上检测到它们。
因此,如果矩形的黑色部分是57像素高(19点),则我们可以确信利用CCD至少可以读取同一列上的9.5个黑像素(最糟糕情况是一半这种像素位于一列,一半这种像素位于下一列)。为了确保在同样列上至少读取20个黑点,必须具有20点的高度。为了在黑点开始处的边缘上提供用于检错的空间,必须将点数增加到31,以目标的局部坐标(15,15),在白点的两侧提供15点。31点是容易落入576像素带内的91像素,该91像素在每列最多承受3像素位移。
因此,每个目标均是分别具有如下成分的31×31点(93×93像素)的块:
每个分别具有15列31个黑点的列(45列93像素的像素宽度列)
1列15个黑点的列(45像素),之后是白点(3像素),再后是15个黑点(45像素)
每个分别具有15列31个黑点的列(45列93像素的像素宽度列)
检测目标
不是通过检测点,而是通过一次一行读像素列,检测各目标。需要在给定带内查找许多包括大量邻接黑像素的列,以建立目标的左侧。接着,预期可以检查位于其他黑列的中心的白区域,最后,检查位于目标中心左侧的黑列。
为了在读像素过程中获得良好高速缓存性能,需要8个高速缓存行。在使用其他4个高速缓存行时,利用4个子读过程,每次逻辑读过程填充4个高速缓存行。这样可以有效用掉13%的可用DARM带宽。
如图40所示,用于检测目标的检测机构FIFO使用滤波器245、行程编码器246以及FIFO 247,为了进行随机存取,FIFO 247需要用于顶部3个单元(S1、S2和S3)的专用布线。
一次一个地处理各输入像素列,直到发现所有目标,或者直到处理了特定数量的列。为了处理列,从DRAM读取像素,读取的像素通过滤波器245以检测0或1,然后被行程编码246。将位值和同样位值的邻接位的数量设置到FIFO 247中。FIFO 249内的每个项目均是8位的,即,用于保存行程的7位250,用于保存被检测位的位值的1位249。
行程编码器246仅对576像素(192点)区域内的邻接像素进行编码。
可以以任何随机顺序对FIFO 247内的顶部3个单元进行存取。根据下表,这些项目的行程(像素)被过滤成3个值:短、中等以及长:
短 |
用于检测白点 |
行程<6 |
中等 |
用于检测位于目标中心的白点之上或之下的黑点的游程长度 |
16<=行程<48 |
长 |
用于检测位于目标中心的左侧和右侧的黑点的行程 |
行程>=48 |
查看FIFO 247的3个顶部项目,存在3种感兴趣的特殊情况:
情况1 |
S1=白长S2=黑长S3=白中等/长 |
我们已经检测了位于中心白点的左侧或右侧的黑列。 |
情况2 |
S1=白长S2=黑中等S3=白短先前的8列是情况1 |
如果我们处理了情况1的一系列列,我们就有可能检测该列上的白点。我们知道下一个项目将是黑点(或者它可能包括在白S3项目内),但是不知道黑像素的数量。需要在下一个FIFO前移之后进行检验来验证(请参考情况3)。 |
情况3 |
先前(Prev)=情况2S3=黑中等 |
我们已经检测到部分白点。我们可以预测到这些中的约3个,并因此而预测到情况1的某些更多个列。 |
优先保存每个区域带中的下列信息:
TargetDetected |
1位 |
BlackDetectCount |
4位 |
WhiteDetectCount |
3位 |
PrevColumnStartPixel |
15位 |
TargetColumn纵坐标 |
16位(15:1) |
TargetRow纵坐标 |
16位(15:1) |
合计 |
7字节(为了便于寻址,舍入到8字节) |
合计为7字节。如果假定总数为8字节,可以使地址生成更容易。因此,16个项目需要16*8=128字节,适于4个高速缓存行。地址范围应该在0.5MB暂时DRAM存储区内,因为其他阶段使用剩余的4MB数据区。
在开始处理给定像素列时,将寄存器值S2StartPixel 254复位为0。由于该FIFO内的项目从S2前移到S1,还将它们与现有S2StartPixel值相加255,给出S2内当前确定的游程长度的准确像素位置。在FIFO中分别查看感兴趣的3种情况,S2StartPixel可以用于确定目标黑区的开始(情况1和情况2),以及位于目标中心的白点的开始(情况3)。下面是用于处理各列的算法:
1 |
TargetDetected[0-15]:=0BlackDetectCount[0-15]:=0WhiteDetectCount[0-15]:=0TargetRow[0-15]:=0TargetColumn[0-15]:=0PrevColStartPixel[0-15]:=0 |
|
CurrentColumn:=0 |
2 |
Do ProcessColumn |
3 |
CurrentColumn++ |
4 |
If(CurrentColumn<=LastValidColumn)Goto 2 |
下面是处理列的过程(处理列)中包括的各步骤
1 |
S2StartPixel:=0FIFO:=0BlackDetectCount:=0WhiteDetectCount:=0ThisColumnDetected:=FALSEPrevCaseWasCase2:=FALSE |
2 |
If(!TargetDetected[Target])&(!ColumnDetected[Target])ProcessCasesEndIf |
3 |
PrevCaseWasCase2:=Case=2 |
4 |
Advance FIFO |
下面是3种(处理情况)情况中每种情况的处理过程:
情况1:
BlackDetectCount[target]<8ORWhiteDetectCount[Target]=0 |
Δ:=ABS(S2StartPixel-PrevColStartPixel[Target])If(0<=Δ<2) |
|
BlackDetectCount[Target]++(max value=8)ElseBlackDetectCount[Target]:=1WhiteDetectCount[Target]:=0EndIfPrevColStartPixel[Target]:=S2StartPixelColumnDetected[Target]:=TRUEBitDetected=1 |
BlackDetectCount[target]>=8WhiteDetectCount[Target]!=0 |
PrevColStartPixel[Target]:=S2StartPixelColumnDetected[Target]:=TRUEBitDetected=1TargetDetected[Target]:=TRUETargetColumn[Target]:=CurrentColumn-8-(WhiteDetectCount[Target]/2) |
情况2:
除了置位用于识别情况3的“PrevCaseWasCase2”标志外,未记录特殊处理过程(请参考上述处理列的步骤3)
情况3:
PrevCaseWasCase2=TRUEBlackDetectCount[Target]>=8WhiteDetectCount=l |
If(WhiteDetectCount[Target]<2)TargetRow[Target]=S2StartPixel+(S2RunLength/2)EndIfΔ:=ABS(S2StartPixel-PrevColStartPixel[Target])If(0<=Δ<2)WhiteDetectCount[Target]++ElseWhiteDetectCount[Target]:=1EndIfPrevColStartPixel[Target]:=S2StartPixelThisColumnDetected:=TRUEBitDetected=0 |
在结束处理给定列时,将当前列与进行目标检测的最多列数进行比较。如果超过了允许的列数,则需要检验已经发现了多少个目标。如果发现的目标不到8个,则认为该卡无效。
处理目标
检测到目标后,应该对它们进行处理。所有目标是有效的,或者它们中的某些是有效的。某些目标还可能被错误检测。
该处理阶段是确定一条通过尽可能多个目标的中心的数学线。该数学线通过的目标越多,就越有把握发现目标位置。将极限设置为8个目标。如果该数学线至少通过8个目标,则认为它是正确的。
采用强力直通式方法是完全正确的,因为有时间这样做(如下所述),降低复杂性使得测试更容易了。需要确定目标0与目标1之间的数学线(如果认为这两个目标均有效),然后,确定有多少个目标落在这条数学线上。之后,确定目标0与目标2之间的数学线,然后,重复该过程。最后,我们对目标1与2之间、目标1与3之间等,直到最后的目标14与15之间的数学线进行同样的处理。假定已经发现了所有目标,我们需要执行15+14+13+…=90组计算(每组计算需要16次测试=1440次实际计算),然后,选择沿其具有最多个目标的数学线。下面是用于计算目标位置的算法:
TargetA:=0
MaxFound:=0
BestLine:=0
While(TargetA<15)
If(TargetA is Valid)
TargetB:=TargetA+1
While(TargetB<=15)
If(TargetB is valid)
CurrentLine:=line between TargetA and TargetB
TargetC:=0;
While(TargetC<=15)
If(TargetC valid AND TargetC on line AB)
TargetsHit++
EndIf
<dp n="d102"/>
If(TargetsHit>MaxFound)
MaxFound:=TargetsHit
BestLine:=CurrentLine
EndIf
TargetC++
EndWhile
EndIf
TargetB++
EndWhile
EndIf
Targe tA++
EndWhile
If(MaxFound<8)
Card is Invalid
Else
Store expected centroids for rows based on BestLine
EndIf
如图34所示,在上面的算法中,为了由目标A 261和目标B确定CurrentLine 260,需要计算目标261、262之间的Δrow(264)和Δcolumn(263)以及目标A的位置。这样,通过增大Δrow和Δcolumn,可以从目标0移动到目标1等。可以将发现的目标N的位置(如果是实际发现的)与在该数学线上计算的目标N的预期位置进行比较,而且如果它在容差范围内,则确定目标N在该数学线上。
为了计算Δrow和Δcolumn:
Δrow=(row目标A-row目标B)/(B-A)
Δcolumn=(column目标A-column目标B)/(B-A)然后,计算目标0的位置:
row=row目标A-(A*Δrow)
column=column目标A-(A*Δcolumn)
将(row,column)与实际row目标0和column目标0进行比较。为了从一个预期目标移动到下一个预期目标(例如,从目标0移动到目标1),我们仅将Δrow和Δcolumn分别与行和列相加。为了检验每个目标是否在该数学线上,我们必须计算目标0的预期位置,然后,对每个目标纵坐标进行一次加法和一次比较。
在结束将全部16个目标与最多90条数学线进行比较时,结果是最佳数学线通过有效目标。如果该数学线至少通过8个目标(即,MaxFound>=8),就可以说已经找到足够目标,可以形成数学线,因此,可以处理该卡。如果最佳数学线通过的目标不到8个,则认为该卡无效。
结果算法进行180次除法以计算Δrow和Δcolumn,进行180次乘法/加法以计算目标0位置,然后进行2880次加法/比较。我们必须执行该处理过程的时间就是读取36列像素数据占用的时间=3,374,892ns。即使不考虑进行加法比进行乘法花费的时间短,仍需要在3,374,892ns内进行3240次数学运算。对每个运算提供接近1040ns的时间,或104个周期。因此,可以安全地对各目标进行全部处理,从而降低了设计的复杂性。
根据数据边缘边界和时钟标记(clockmark)的更新形心
步骤0:定位数据区
在行和列上,从目标0(图38所示的241)到数据区的左上边界244预定固定距离,然后,进一步确定从目标0(图38所示的241)到垂直时钟标记276的1点的列。因此,我们利用先前步骤求得的目标A、Δrow和Δcolumn(Δrow和Δcolumn指目标之间的距离)计算目标0的形心或预期位置,如上所述。
由于从目标0到数据区的固定像素偏移与目标之间的距离有关(目标之间有192点,目标0与数据区243之间有24点),所以仅将Δrow/8与目标0的形心列坐标相加(各点的宽高比为1∶1)。这样,可以将顶部坐标定义为:
columnDotColumn Top=column 目标0+(Δrow/8)
rowDotColumn Top=row目标0+(Δcolumn/8)
接着,通过利用目标之间的点数除Δrow和Δcolumn,可以更新Δrow和Δcolumn,从而给出一列中各点之间(而不是目标之间的)的像素数:
Δrow=Δrow/192
Δcolumn=Δcolumn/192
我们还将currentColumn寄存器(请参考阶段2)设置为-1,以便在步骤2之后,在阶段2开始时,使currentColumn寄存器从-1递增到0。
步骤1:写出初始形心增量(Δ)和位历史
这里仅包括阶段2所需的写建立信息。
这是通过对每行的所有Δrow和Δcolumn项目以及位历史写0实现的。实际上,位历史是预期位历史,因为知道在时钟标记列276的左侧是边界列277,而在该边界列277之前是白区。因此,位历史是011、010、011、010等。
步骤2:根据读取的实际像素更新形心
根据预期的时钟标记和数据边界,在步骤1建立位历史。现在,通过将预期数据与实际像素值进行比较,可以更准确设置(它们的初始值为0)每个点行的实际形心。通过仅执行阶段2的步骤3,可以实现形心更新机制。
阶段2-根据读出的像素,检测Artcard中的位模式,然后将它们作为字
节写入
由于Artcard 9中的点最少需要所表示的3列上的9个检测像素,所以对每个检测的像素列进行点检测计算也没什么用。最好计算处理平均点出现值(average dot occurrence)所需时间的平均值,这样形成最多可用处理时间。这样使得在从Artcard中读取3列数据所花费的时间内,可以处理Artcard 9上的点列。尽管最有可能的情况是利用4列来表示点,但是第4列是一个点的最后一列,而且是下一个点的第一列。因此,处理仅局限于3列。
由于在13%的可用时间内,将CCD输出的像素写入DRAM,所以83%的时间可以用于处理各点的1列,即,(93,747*3)的83%=281,241ns的83%=233,430ns。
在可用时间内,需要检测3150点,然后,将它们的位值写入内存的原数据区。
因此,处理过程需要下面的步骤:
对于Artcard上的各点的每列:
步骤0:进入下一个点列
步骤1:检测Artcard点列的上部和下部(检验时钟标记)
步骤2:处理点列,从而检测各位并正确存储它们
步骤3:更新形心
由于我们正在处理Artcard的逻辑点列,而且这些逻辑点列至少可以位移165像素,所以最糟糕的情况是,在至少将165列写入DRAM之前,我们不能处理第一列。因此,在读处理过程终止后,阶段2用完同样的时间。最糟糕情况下的时间是:165*93,747=15,468,255ns或0.015秒。
步骤0:进入下一个点列
为了进入各点的下一列,我们将Δrow和Δcolumn与dotColumnTop相加,以给出位于该列顶部的点的形心。我们第一次这样做时,正处于位图像数据区左侧的时钟标记列276上,因此,进入第一列数据。由于Δrow和Δcolumn指列中各点之间的距离,指点列之间的移动,所以需要将Δrow与columndotColumnTop相加以及将Δcolumn与rowdotColumnTop相加。
为了跟踪正在处理什么列号,将列号存储在被称为currentColumn的寄存器中。每次在传感器进展到下一个点时,需要递增currentColumn寄存器。在第一次递增时,它从-1递增到0(请参考阶段1的步骤0)。currentColumn寄存器确定何时终止读处理过程(在到达maxColumn时),而且一旦所有8位被写入该字节(每8个点列一次),还用于使DataOut指针进展到字节信息的下一列。后3位确定处于当前字节内的位。对整个列写入同样的位。
步骤1:检测Artcard点列的顶部和底部
为了处理Artcard中的点列,需要检测列的顶部和底部。该列形成该列的顶部与底部之间的直线(局部翘曲等除外)。首先,dotColumnTop指向时钟标记列276。仅获取预期值,将它写入位历史,然后,进入步骤2,步骤2的第一个任务是将Δrow值和Δcolumn值与dotColumnTop相加,以到达该列的第一数据点。
步骤2:处理Artcard的点列
如果列的顶部和底部的形心在各像素坐标上,所以在因为翘曲等可能发生微小变化的情况下,该列应该形成它们之间的直线。
假定在列的顶部开始进行处理(位于顶部形心坐标上),而且向下移动到该列的底部,则给出后续预期点形心:
row下一个=row+Δrow
column下一个=column+Δcolumn
这样就给出该列下一个点的预期形心的地址。然而,为了考虑到局部翘曲和错误,根据在给定行中发现该点的最后时间,加另一个Δrow和Δcolumn。这样,就可以考虑到由连接该列的顶部和底部的直线产生的、累积成最大偏移的某个百分比的小偏移。
因此,对每行保存2个值,但是将它们存储在单独的表中,因为在该阶段的步骤3使用行历史。
*Δrow和Δcolumn(2@4位分别=1字节)
*行历史(每行3位,每字节存储2行)
对于每行,均需要读Δrow和Δcolumn,以确定形心的变化。读处理占据5%的带宽和2个高速缓存行:
76*(3150/32)+2*3150=13,824ns=5%的带宽
一旦确定了形心,就需要检验形心周围的像素,以检测点的状态,并因此而检验该位的值。在最糟糕情况下,点覆盖4×4像素区。然而,由于我们以该点分辨率的3倍进行采样,所以检测该点的状态以及位值所需的像素数比这少得多。仅要求一次存取3列像素列。
在因为1%的转动而发生像素偏移的最糟糕情况下,每57个像素行,形心偏移1列,但是由于点的直径是3个像素,所以对于171个像素行(3*57),给定列有效。由于一字节中含有2个像素,所以每个缓存的读内容(4个高速缓存行)中的有效字节数的最糟糕情况是86(读取的128个中的)。
一检测到该位,就必须将它写入DRAM。将8列中的各位作为一组邻接字节存储,以将DRAM的延迟降低到最小。由于给定点列中的所有位均与数据字节中的下一个位位置对应,所以读取该字节的旧值,对新位进行移位或“或”运算,然后,将该字节写回。
读/移位和“或”运算/写处理需要2个高速缓存行。
在我们更新位历史时,需要对给定行读和写位历史。每行仅需要3个历史位,因此可以在一字节内存储2行历史。读/移位和“或”运算/写处理需要2个高速缓存行。下表概括说明位检测过程和存储过程所需的总带宽:
读形心Δ |
5% |
读3列像素数据 |
19% |
将检测的位读/写入字节缓冲器 |
10% |
读/写位历史 |
5% |
| |
合计 |
39% |
检测点
通过检验3个像素值并从查用表中获得该结果,可以实现检测给出形心的点的值(并因此检测到位值)的处理过程。该处理过程非常简单,而且示于图42。点290具有约1.5个像素的半径。因此,不考虑像素内的形心的实际位置,保持形心的像素291应该是100%的该点的值。如果形心精确地位于像素291的中心,则形心像素之上的像素292和之下的像素293,以及形心像素的左侧的像素294和右侧的像素295将含有大多数该点的值。形心距离像素295正中心越远,不止中心像素具有100%的点覆盖范围的可能性越大。
尽管图42仅示出在中心的左侧和下方不同的各形心,但是,显然,中心上方和右侧的形心保持同样的关系。在情况1,形心刚好位于中间像素295的中心。中心像素295完全被点覆盖,而其上方、下方、左侧以及右侧的像素也被该点良好覆盖。在情况2,形心位于中间像素291的中心的左侧。中心像素仍被该点完全覆盖,而该中心左侧的像素294现在被该点完全覆盖。上方像素292和下方像素293仍被良好覆盖。在情况3,形心位于中间像素291的中心的下方。中心像素291仍被点291完全覆盖,而中心下方的像素现在完全被该点覆盖。中心的左侧像素294和右侧像素295仍被该点良好覆盖。在情况4,形心位于中间像素的左侧和下方。中心像素291仍被该点完全覆盖,而中心左侧的像素294和中心下方的像素293被该点完全覆盖。
为了选择3代表像素并判定该点的值,用于更新形心的算法使用形心距离中间像素291的中心的距离:
像素1:含有形心的像素
像素2:如果形心的X坐标(列值)<1/2,则该像素是位于像素1左侧的像素,否则该像素是位于像素1右侧的像素。
像素3:如果形心的Y坐标(行值)<1/2,则该像素是位于像素1上方的像素,否则该像素是位于像素1下方的像素。
如图43所示,将每个像素的值输出到预计算的查用表301。将这3个像素填充到12位查用表内,该12位查用表输出表示该点的值—即表示该点在其上还是不在其上的一位。在芯片固定时间(chip definitiontime),建立查用表301,而且可以将该查用表301编译到约500个门上。该查用表可以是简单的阈值表,但是中心像素(像素1)权重非常高的情况除外。
步骤3:更新该列中每行的形心Δs
Δs处理过程的原理是利用先前位历史在当前列中每行上预期的形心位置产生“理想”点。将实际像素(CCD输出的)与预期“理想”像素进行比较。如果二者匹配,则实际形心位置必须精确位于预期位置,因此形心Δs必须有效,而且无需更新。否则,为了使预期形心位置最适合实际数据,需要执行改变形心Δs的处理过程。新形心Δs将用于处理下一列中的点。
作为步骤2的后续处理过程,更新形心Δs,因为以下原因:
为了降低设计的复杂性,因此作为阶段1的步骤2,执行该处理过程,存在足够的剩余带宽,可以使它再用DRAM缓冲器,以及
为了确保在开始该处理过程时,更新形心所需的所有数据可用,而无需特殊流水线作业。
将形心Δ分别表示为Δcolumn、Δrow,以降低复杂性。
尽管给定点的直径是3个像素,但是很可能出现在4×4像素区内。然而,一个点的边缘因此而与下一个点的边缘位于同一个像素内。因为此原因,形心更新过程不仅仅需要关于给定的一个点的信息。
图44示出具有给定形心311的先前列中的一个点310。在该例中,点310在4个像素列312-315上扩展Δ,而事实上,部分先前点列的点(坐标=(Prevcolumn,CurrentRow))进入当前行上的点的当前列。如果当前行和当前列上的点是白色的,则预期先前点列最右侧的像素列314取低值,因为只有从先前列的点(当前列的点是白点)获得的点信息。由此我们可以看出,像素列315内的像素值越大,形心就约应该向右。当然,如果右侧的点也是黑色的,则不能调节形心,因为不能获得信息子像素。点坐标(PrevColumn,CurrentRow)上,左侧的点、该点的上部和下部亦如此。
由此我们可以说,最多可以获得5个像素列和像素行。通过分别确定行和列形心Δs,将它们作为同一个问题进行处理,仅转动90度,可以简化这种情况。
首先确定水平情况,如果预期像素与检测像素不匹配,则需要改变列形心Δs。根据位历史,已知对当前点列、先前点列以及先前第一(previous-1)点列上的当前行计算的位值。还知道预期形心位置。如果读取的是“理想”的,则利用这两条信息,可以产生20位预期位模式。20位位模式表示水平方向上5个像素中每个像素的预期Δ值。头四位字节表示最左边的点的最右边像素。接着的3个四位字节表示横跨在先前列上的点310的中心上的3个像素,最后一个四位字节表示(当前列上的)最右边的点的最左像素317。
如果预期信息位于该像素的中心,则可以根据下表预测20位模式:
位历史 |
预期像素 |
000001010011100101110 |
000000000D0DFD00DFDDD0000D000DDDFD0 |
根据该位是0或1,中心点左侧和右侧的像素分别是0或者D。根据该位是0或1,中心的3个像素分别是000或DFD。这些值取决于给定像素的点占据的实际面积。根据形心距离像素的正中心的距离,我们预测数据被稍许位移,实际上,这种稍许位移仅影响中心像素两侧上的像素。由于存在16种可能性,所以可以将距离中心的距离除以16,然后,利用该数值位移预期像素。
一确定了20位5像素预期值,就可以将其与读取的实际像素进行比较。这可以通过从逐个像素读取的实际像素中减去预期像素,最后将该差值加在一起以根据预期Δ值获得距离来实现。
图45示出上述算法的一种实现形式,它包括:查用表320,用于接收位历史322和中心小数部分323并输出324相应20位数,从中心像素输入326中减去321该20位数以产生像素差327。
对预期形心执行该处理过程,而且在形心向左或者向右移位1个数量的Δcolumn时执行一次该处理过程。将与实际像素具有最小差值的形心看作“赢家”,并因此而更新Δcolumn(有希望“不改变”)。因此,对于每个点列,Δcolumn的变化不超过1。
对垂直像素重复该处理过程,并因此而更新Δrow。
在此存在大量并行作用域。根据对ACP单元31选择的时钟速率,以串行方式(因此,可以以连续时钟周期检测3个不同的Δ)或者以其中同时检测全部3个Δ的并行方式设置这些单元。如果时钟速率足够快,则不需要并行设置。
带宽利用率
需要读出Δs的旧Δs,然后,再将它们写出。这占用10%的带宽:
2*(76(3150/32)+2*3150)=27,648ns=10%的带宽
在更新其Δs时,需要读出位历史。每字节含有2行的位历史,因此占用2.5%的带宽:
(76(3150/2)/32+2*(3150/2))=4,085ns=2.5%的带宽
在因为1%的转动而发生像素偏移的最糟糕情况下,每57个像素列,形心移位1列,但是由于点的直径是3个像素,所以给定的像素列对171个像素行(3*57)有效。由于一字节含有2个像素,所以高速缓存读中的有效字节数的最糟糕情况是86(读取的128个中的)。因此,最糟糕情况下,5列的时限是31%的宽度。
5*(((9450/(128*2))*320)*128/86)=88,112ns=31%的带宽
下表概括说明更新形心Δ所需的总带宽:
读/写形心Δ |
10% |
读位历史 |
2.5% |
读5列像素数据 |
31% |
| |
合计 |
43.5% |
阶段2的内存使用率:
在阶段2处理过程中,对2MB位图像DRAM存储区进行读出和写入。对2MB像素数据DRAM存储区进行读。
0.5MB暂时DRAM存储区用于存储行数据,即:
形心阵列 |
24位(16:8)*2*3150=18,900字节 |
位历史阵列 |
3位*3150项目(每字节2的项目)=1575字节 |
阶段3-对原数据进行去扰和“异或”运算
返回去参考图37,解码中的下一个步骤是对原数据进行去扰和“异”运算。从Artcard获取的2MB字节图像处于被“异”运算的加扰形式。必须对它进行去扰和再“异”运算,以检索RS解码器在阶段4所需的位图像。
参考图46,去扰处理过程330取出2MB加扰字节图像331,然后,写入去扰2MB图像332。不能在原位合理执行该处理过程,因此使用2组2MB存储区。加扰数据331以符号块顺序排列在16×16阵列中,符号块0(334)具有随机顺序的所有代码字中的所有符号0。符号块1具有随机顺序的所有代码字中的所有符号1,等等。由于仅有255个符号,所以当前未使用第256个符号块。
线性反馈移位寄存器用于确定符号块例如334内的位置与它所在的什么代码字例如355之间关系。在产生原始Artcard图像时,只要使用同一个籽数,它就工作。实际上,对分别具有0xAA和0x55的其他源线上的字节进行“异”运算是自由的(在时间方面),因为时间瓶颈正在等待DRAM准备好读/写非顺序地址。
实际上,去扰“异”运算处理过程的时限是2 MB随机字节读和2MB随机字节写,即2*(2MB*7ns+2M3*2ns)=327,155,712ns,即,大约0.33秒。假定该时限不进行高速缓存操作。
阶段4-RS解码
该阶段是一个循环,在该循环中,迭代位图像中的所有数据拷贝,将它们送到RS解码模块,直到成功进行了解码,或者直到没有要解码的拷贝。
所使用的RS编码器可以是适于被编程的VLIW处理器,或者是诸如LSI逻辑的L64712的单独硬布线核心。L64712具有每秒50兆位的吞吐量(约每秒6.25MB),因此不是2MB读和1MB写内存存取时间(顺序存取为500MB/秒),而是RS解码器的速度限制了时间。因此,最糟糕情况占用的时间是1/6.25ns=约0.32秒。
阶段5-运行Vark脚本
因此,读Artcard 9并对它进行解码花费的总时间接近2.15ns。实际上,对用户的视延迟仅0.65秒(阶段3和阶段4的总时间),因为1.5秒之后,Artcard停止移动。
一装载了Artcard,就必须解释Artvark脚本,而不是立即运行该脚本,仅在按下“打印”按钮13(参考图1)时,才运行该脚本。运行该脚本花费的时间根据该脚本的复杂性变化,而且必须考虑到按下打印按钮与实际打印之间的可感延迟。
替换Artcard格式
当然,其他Artcard格式也是可以的。现在,将说明一种替换Artcard格式,该格式具有许多更优的特征。以下将说明该替换Artcard格式、将用户数据映像到该替换Artcard上的点的机制以及用于资源稀少的嵌入式系统的快速替换Artcard读算法。
替换Artcard概述
替换Artcard既可以用于嵌入式系统又可以用于PC应用,从而对大量数据或配置信息提供了用户友好的界面。
尽管替换Artcard的背面具有同样的可视外貌,而与应用无关(因为它存储数据),但是可以独立使用替换Artcard的正面。必须在本专利申请的上下文中向用户讲清楚。
替换Artcard技术也可以与打印分辨率无关。将数据作为点存储到卡上的原理仅意味着,如果可以在同样的空间内设置更多的点(通过提高分辨率),则这些点可以表示更多的数据。优选实施例假定使用在作为样品Artcard的86mm×55mm的卡上打印的1600dpi,但是确定其他卡尺寸和/或其他打印分辨率的替换等效布局和数据大小非常简单。不考虑打印分辨率,读技术保持不变。考虑到所有解码和其他开销后,替换Artcard可以以最高1600dpi的打印分辨率最多存储1兆字节的数据。替换Artcard可以高于1600dpi的打印分辨率存储兆字节数据。下面的两个表概括说明替换Artcard在特定打印分辨率情况下的有效数据存储能力:
替换Artcard的格式
因此,为了有助于恢复数据,专门设计替换Artcard上的数据结构。该小节描述替换Artcard的数据(背)面的格式。
点
替换Artcard的数据面上的点可以是单色的。例如,以要求的预定打印分辨率打印在白色背景上的黑点。因此,在物理上,“黑点”不同于“白点”。图47示出白点和黑点的各种例子的放大图。为了使模糊读环境下的动态范围最大,优先选择白色背景上的黑点的单色解决方案。尽管以特定间隔打印黑点(例如,1600dpi),但是,为了在邻接打印点时产生连续线,点本身稍许大些。在图47所示典型图像中,点不会象实际情况那样因为扩散而合并在一起。黑凹陷的外部更平滑。尽管优选实施例描述的替换Artcard系统允许灵活的不同点大小,但是,为了获得最佳效果,应该更仔细研究特定打印技术的精确点大小和墨水/打印性能。
在描述该Artcard实施例的过程中,术语“点”指替换Artcard上的物理打印点(墨水、热、电子照相、卤化银等)。在替换Artcard阅读器扫描替换Artcard时,为了每组奈奎斯特规则,至少以双倍打印分辨率采样各点。术语“像素”指替换Artcard阅读器输出的采样值。例如,在以4800dpi扫描1600dpi点时,在点的每个方向有3个像素,或者对于每个点有9个像素。以下将进一步说明采样处理过程。
参考图48,图48示出数据面1101,它是替换Artcard的采样。每个替换Artcard含有被白色边界区域1103包围的“活动”区域1102。白色边界1103不含有数据信息,但是替换Artcard阅读器可以利用它校准白电平。活动区域是数据块例如1104的阵列,其中每个数据块与下一个数据块分离开8个白点例如1106的间隙。根据打印分辨率,替换Artcard上的数据块的数量发生变化。在1600dpi替换Artcard上,该阵列可以是8×8。每个数据块1104具有627×394点的大小。如果块间间隙1106是8个白点,则替换Artcard的活动面积是5072×3208点(在1600dpi时为8.1mm×5.1mm)。
数据块
现在,参考图49,图49示出一个数据块1107。替换Artcard的活动区域包括同样结构的数据块1107的阵列。每个数据块具有下面的结构:被时钟标记1109包围的数据区域1108、边界1110以及目标1111。数据区域保存编码数据本身,而出现的时钟标记、边界和目标专门用于定位数据区域,并确保从该区域内准确恢复数据。
每个数据块1107具有627×394点的大小。在该数据块中,595×384点的中心区是数据区域1108。周围的点用于保存时钟标记、边界和目标。边界和时钟标记
图50示出数据块,图51和52示出该数据块的放大的边缘部分。如图51和52所示,在每个数据块中有两个5点高的边界与时钟标记区域1170、1177:一个在该数据区域之上,一个在该数据区域之下。例如,上部5点高的区域包括:外部黑点边界线1112(沿数据块的长度延伸)、白点分离线1113(用于确保边界线是独立的)以及3点高的时钟标记组1114。时钟标记在白行与黑行之间交替,以位于距离数据块的两端的第8列的黑时钟标记开始。在时钟标记点与数据区域内的点之间不存在间隔。
时钟标记是对称的,因为,如果替换Artcard被转动180度插入,遇到同样的相对边界/时钟标记区域。边界1112、1113意在供替换Artcard阅读器使用,在从数据区域读取数据时,替换Artcard阅读器利用它保持垂直跟踪。时钟标记1114意在在从数据区域读取数据时保持水平跟踪。要求利用各点的白线将边界与时钟标记分离开,因为在读期间,产生模糊。这样,边界变成两侧有白的黑线,从而在读时具有良好频率响应。除了水平方向之外,在白与黑之间交替的时钟标记具有相同的效果,而垂直方向不除外。如果任何替换Artcard阅读器意在利用时钟标记和边界进行跟踪,则它们必须定位这些时钟标记和边界。下一个小节说明用于指出时钟标记、边界和数据的方向的目标。
目标区域内的各目标
如图54所示,在每个数据块内存在两个15点宽的目标区域1116、1117:一个在数据区域的左侧,一个在数据区域的右侧。用于定向的一列点将该目标区域与数据区域分离。目标区域1116、1117的用途是指出时钟标记、边界以及数据区域的方向。每个目标区域包括6个目标例如1118,所设计的6个目标例如1118容易被替换Artcard阅读器发现。现在,参考图53,图53示出一个目标1120的结构。每个目标1120是一个具有中心结构1121和行程编码目标号1122的15×15点的黑方块。中心结构1121是一个简单的白十字,而目标号分量1122仅是2列白点,每列白点具有用于表示目标号的每个部分的2点的长度。因此,目标号1的目标id 1122具有2点的长度,目标号2的目标id 1122具有4点的宽度,等等。
如图54所示,排列目标,以便它们不随卡的插入方向而发生转动变化。这意味着,左侧目标和右侧目标相同,除了转动180度外。在左侧目标区域1116内,以这样的方式排列目标,即,分别从顶部到底部排列目标1至6。在右侧目标区域内,以这样的方式排列目标,即,从底部到顶部排列目标号1至6。目标号id始终处于最接近数据区域的中间位置。图54所示的放大图部分清楚地示出了除转动180度之外,右侧目标如何仅与左侧目标相同。
如图55所示,以中心分离开55点的情况下,目标1124、1125特别设置在目标区域内。此外,在上部时钟标记区域内,从目标1(1124)的中心到第一时钟标记点1126的距离为55点,而在下部时钟标记区域(未示出)内,从该目标的中心到第一时钟标记点的距离为55点。这两个区域内的第一黑时钟标记均直接根据目标中心开始(第8点的位置是15点宽的目标的中心)。
图55所示的简化原理示意图示出在上部边界/时钟标记区域内,目标中心之间的距离以及从目标1(1124)到第一黑时钟标记(1126)之间的距离。由于从上部目标和下部目标到该时钟标记的距离均为55点,而且替换Artcard的两侧是对称的(转动180度),所以可以从左到右或从右到左阅读该卡。尽管与读方向无关,但是,为了从数据区域内提取数据,的确需要确定取向。
取向列
如图56所示,在每个数据块内存在两个1点宽的取向列1127、1128:一个位于数据区域的正左侧,一个位于数据区域的正右侧。为了对替换Artcard阅读器提供取向信息,所以包括取向列。数据区域的左侧(左侧目标的右侧)是一列白点1127。数据区域的右侧(右侧目标的左侧)是一列黑点1128。由于目标不发生转动变化,所以这两列点可以使替换Artcard阅读器确定替换Artcard的取向—是否以正确方式、或从后到前插入该卡。从替换Artcard阅读器的观点出发,假定点不降质,则存在2种可能性:
●如果数据区域左侧的各点的列是白,而数据区域的右侧的列是黑,则阅读器知道该卡以它被写入的同样方式被插入。
●如果数据区域左侧的各点的列是黑,而数据区域的右侧的列是白,则阅读器知道该卡以向后的方式被插入,而且数据区接近被转动。该阅读器必须采取正确动作以从替换Artcard正确恢复信息。
数据区域
如图57所示,数据块的数据区域分别包括384点的595列,所以总共228,480点。必须解释和解码这些点以产生原始数据。每个点代表一位,因此228,480点代表228,480位,或28,560字节。下面是每个点的解释:
然而,实际解释由点获得的各位需要理解从原始数据到替换Artcard的数据区域上的各点的映像。
从原始数据到数据区域点的映像
现在,将说明取出最大为910,082字节的原始数据并将它映像到1600dpi替换Artcard上的64数据块的数据区域内的各点的处理过程。为了从替换Artcard上的各点提取原始数据,替换Artcard阅读器反转该处理过程。初看起来,将数据映像到各点微不足道:二进制数据包括各1和各0,因此可以仅将黑点和白点写到卡上。然而,该解决方案不允许出现,墨水褪色,卡的各部分因为污物、污垢甚或划痕被损伤。如果不进行检错编码,就没有办法检测从该卡检索的数据是否正确。而且,如果不进行冗余编码,就没有办法校正检测到的错误。因此,映像处理过程的目的就是非常健全地进行数据恢复,而且使得替换Artcard能够知道它正确读取了数据。
将原始数据文件映像到数据区域点的过程包括3个基本步骤:
●冗余编码原始数据
●以确定性方式混洗编码数据,以降低替换Artcard的局部损伤产生的影响。
●将被混洗、被编码的数据作为点写到替换Artcard的数据块上
下面的各小节详细检验这些步骤中的每个步骤。
利用RS编码过程进行冗余编码
将数据映像到替换Artcard点主要取决于所采用的冗余编码的方法。为了能够处理突发错误,而且能够有效利用最低冗余度进行检错和纠错,优先选择RS编码过程。在诸如Wicker,S.and Bhargava,V.,1994,Reed-Solomon Codes and their Applications,IEEE Press、Rorabaugh,C,1996,Error Coding Cookbook,McGraw-Hill.Lyppens,H.,1997,Reed-Solomon Error Correction,Dr.Dobb’s Journal,January1997(Volume 22,Issue 1)的权威著作中对RS编码进行了充分讨论。
可以使用RS编码的各种不同参数,包括不同符号大小和不同的冗余度级。优先使用下面的编码参数:
●m=8
●t=64
使m=8意味着符号大小是8位(1字节)。这还意味着,每个RS编码块的大小n为255字节(28-1符号)。为了校正至多t个符号,最终块大小中的2t符号必须与冗余符号相交。使t=64意味着,如果它们存在错误,则可以对每块纠错64字节(符号)。因此,每个255字节块具有128(2×64)冗余字节,而剩余的127字节(k=127)用于保存原始数据。这样:
●n=255
●k=127
实际结果是,将127字节的原始数据进行编码为255字节块的RS编码数据。将编码的255字节块存储到替换Artcard上,之后,替换Artcard阅读器再将它解码为原始的127字节。数据块的数据区域的一列上的384点可以保存48字节(384/8)。595个这些列可以保存28,560字节。这样总计112 RS块(每块具有255字节)。完全替换Artcard的64数据块可以保存总共7168 RS块(如果每个RS块255字节,则为1,827,840字节)。7,168 RS块中的两个RS块被反向,以便用于控制信息,但是剩余的7166RS块用于存储数据。由于每个RS块保存127字节的实际数据,所以替换Artcard上可以保存的数据总量为910,082字节(7166×127)。如果原始数据小于该数量,则可以对该数据进行编码,以适应准确数量的RS块,然后,可以复制编码块,直到使用了所有7166 RS块。图58示出所采用的编码过程的总体形式。
两个控制块1132、1133分别含有用于解码剩余的7166 RS块的同样的编码信息:
整个消息中的RS块的数量(存储lo/hi的16位),以及
消息中最后一个RS块中的数据字节的数量(8位)
在剩余的31字节被保留并被设置为0的情况下,将这两个数量重复32次(占用96字节)。然后,分别RS编码每个控制块,从而使127字节的控制信息变换为255字节的RS编码数据。
将控制块存储两次,以增加完好保存它的机会。此外,在采用RS编码时,重复控制块内的数据特别重要。在未被破坏的RS编码块中,数据的头127字节刚好是原始数据,而且如果控制块不能被解码(不止64符号被破坏),则在尝试恢复原始消息时,可以查看它们。因此,如果控制块不能被解码,则在确定2个解码参数的最可能值时,可以检验3字节的集。不能确保可以恢复,但是利用冗余度,提供了一个良好的机会。比如,控制块的最后159字节被毁坏,而头96字节非常完好。查看头96字节显示重复数字集。这些数字可以切实用于解码7,166 RS块中的消息的剩余部分。
作为例子,假定数据文件刚好含有9,967字节的数据。所要求的RS块的数量是79。全部使用头78 RS块,这样就占用9,906字节(78×127)。第79块仅具有61字节的数据(剩余的66字节全部是0)。
替换Artcard可以包括7,168 RS块。头2块可以是控制块,接着的79块可以是编码数据,接着的79块可以是编码数据的复制品,接着的79块可以是编码数据的另一个复制品,等等。在将79 RS块存储90次后,剩余的56 RS块可以是从编码数据的79块开始的头56块的另一个复制品(不再存储编码数据的最终23块,因为替换Artcard上没有足够空间)。图59示出在被RS编码之前,每个控制块数据内的127字节的十六进制表示。
加扰编码数据
假定所有编码块均被邻接存储在内存中,在替换Artcard上最多可以存储1,827,840字节的数据(2控制块和7,166信息块,总共7,168 RS编码块)。然而,在该阶段,最好不将数据直接存储到替换Artcard,或者,实际上,一个RS块的所有255字节一起位于该卡上。导致该卡物理损伤的任何污物、污垢或色斑均可能破坏一个RS块上64个以上的字节,这样可能使该块不可恢复。如果没有该RS块的复制品,则整个替换Artcard不能被解码。
该解决方案利用了替换Artcard上存在大量字节,而且该替换Artcard具有合理物理尺寸的事实。因此,可以加扰数据,从而确保一个RS块内的各符号互相之间不非常接近。当然,卡降质后的不正常情况可能导致RS块不能被恢复,但是总体来说,加扰数据可以使该卡更加鲁棒。所选择的加扰解决方案简单,图14示出其原理图。将RS块中的所有字节0设置在一起1136,然后,将所有字节1设置在一起,等等。这样,存在7,168字节0,因此存在7,168字节1,等。替换Artcard上的每个数据块可以存储28,560字节。因此,替换Artcard上的64数据块中的每个数据块中的每个RS块中存在大约4字节。
利用这种加扰解决方案,完全破坏替换Artcard上的16个完整数据块将导致每个RS块产生64个符号错误。这意味着,如果对替换Artcard不存在其他破坏,即使不存在数据的复制品,仍可以完全恢复整个数据。将加扰编码数据写入替换Artcard
一旦原始数据被RS编码、复制以及加扰,就有1,827,840字节的数据被存储到替换Artcard上。替换Artcard上的64数据块中的每个数据块存储28,560字节。
仅将数据写入替换Artcard数据块,以便第一个数据块含有加扰数据的头28,560字节,第二个数据块含有接着的28,560字节,等。
如图61所示,在数据块中,从左到右逐列写出该数据。因此,数据块中最左边的列含有28,560字节的加扰数据的头48字节,而最后一列含有28,560字节的加扰数据的最后48字节。在一列中,一次一位地,从顶部到底部写出各字节,从而从位7开始,而以位0结束。如果该位被置位(1),则将黑点设置在替换Artcard上,如果该位被清除(0),则不设置任何点,使它保留该卡的白色背景颜色。
例如,通过对要存储到替换Artcard上的7,168 RS编码块进行加扰,可以产生一组1,827,840字节的数据。将数据的头28,560字节写入第一数据块。将该头28,560字节中的头48字节写入该数据块的第一列,将接着的48字节写入接着的一列,等等。假定该28,560字节中的头2字节是十六进制D3 5F。将该头2字节存储到数据块的列0上。首先,存储字节0的位7,然后,存储位6,等等。这样,存储字节1的位7,直到存储字节1的位0。由于将每个“1”存储为黑点,而将每个“0”存储为白点,所以在替换Artcard上可以将这两个字节表示为下面的一组点:
●D3(1101 0011)变成:黑、黑、白、黑、白、白、黑、黑
●5F(0101 1111)变成:白、黑、白、黑、黑、黑、黑、黑
解码替换Artcard
该小节说明以准确、鲁棒方式从替换Artcard提取原始数据的过程。具体地说,假定采用上面一章描述的替换Artcard格式,而且描述了一种从替换Artcard提取原始预编码数据的方法。
对解码替换Artcard产生部分影响的一般因素有几个。
用户
替换Artcard的用途是存储用于不同应用的数据。用户将替换Artcard插入替换Artcard阅读器,而且希望在“合理的时间”内装载数据。从用户的观点出发,马达传送装置将替换Artcard移动到替换Artcard阅读器内。这不被看作难以预料的延迟,因为替换Artcard在运动。替换Artcard停止之后的任何时间均被看作延迟,而且在任何替换Artcard读解决方案中,应该将该时间缩短到最短。最好在运动时,读整个替换Artcard,这样在卡停止运动时,就不存在可感延迟。
对于优选实施例,实际装载替换Artcard的合理时间被确定为1.5秒。在替换Artcard停止运动之后,用于附加解码的时间应该最短。由于替换Artcard的活动区域覆盖了替换Artcard的大部分表面,所以可以将时间集中在该区域上。
采样点
为了满足奈奎斯特规则,必须利用CCD阅读器等,至少以二倍打印分辨率采样替换Artcard上的点。实际上,以比该速率高的速率进行采样更好。在替换Artcard阅读器环境下,优先以3倍的其打印分辨率,在每个方向采样点,从而需要9像素确定一个点。如果替换Artcard点的分辨率是1600dpi,则替换Artcard阅读器的图像传感器必须以4800dpi扫描各像素。当然,如果点未完全对准采样传感器,则最糟糕而且最可能的情况是在4×4像素区上进行检测,如图62所示。
每个采样像素是1字节(8位)。每个像素中最下面的2位含有显著噪声。因此,解码算法必须是容许噪声的。
对准/转动
用户将替换Artcard不发生任何转动、完全对准插入替换Artcard阅读器是极不可能的。阅读器入口和马达传送夹紧装置的特定物理制约有助于确保,一插入替换Artcard,替换Artcard就与CCD保持原始插入角。转动角最大优先为1度,如图63所示。因为读处理过程出现抖动和马达振动,所以角度可能稍许出现某些偏差,但是假定这实际上仍在1度的限度内。
替换Artcard的物理尺寸是86mm×55mm。在86mm在CCD之下通过时,1度的转动使该卡的有效高度增加1.5mm(86sin1°),这样就影响了要求的CCD长度。
1度转动对替换Artcard读处理过程的影响是,CCD的一条扫描线包括替换Artcard的大量不同点列。图63中的放大图示出这种情况,图63示出像素列上各点的偏移。尽管在该图中进行了放大,但是实际偏移是,每57像素最多1像素列的位移。
在替换Artcard未发生转动时,可以在3像素扫描线上读取一列点。替换Artcard转动越多,局部影响越大。读取的点越多,转动影响的作用就越长。随着这两个因数的增大,进行读取以产生替换Artcard的一列上的给定一组点所需的像素扫描线的数量越来越大。下表示出对于特定替换Artcard结构中的一列点需要多少像素扫描线。
区域 |
高度 |
0°转动 |
1°转动 |
活动区域 |
3208点 |
3像素列 |
168像素列 |
数据块 |
394点 |
3像素列 |
21像素列 |
为了读整个替换Artcard,需要读87mm(86mm+因为1°转动产生的1mm)。在4800dpi时,这包括16,252像素列。
CCD(或其他线性图像传感器)长度
CCD本身的长度必须适应:
-替换Artcard的物理高度(55mm),
-实际插入替换Artcard时的垂直倾斜(1mm)
-至多1度的插入转动(86sin1°=1.5mm)
这些因素综合在一起产生57.5mm的总长度。
在替换Artcard阅读器中的替换Artcard图像传感器CCD以4800dpi扫描时,一条扫描线10,866像素。为了简洁起见,该数字舍入到11,000像素。替换Artcard的活动区域的高度为3208点,它包括9,624像素。数据区域的高度为384点,它包括1,152像素。
DRAM容量
最理想的是,用于替换Artcard的读和解码过程的存储量最小。替换Artcard阅读器的典型配置是内存资源珍贵的嵌入式系统。转动的影响,使这更成为问题。如上所述,替换Artcard转动越多,有效恢复原始点所需的扫描线就越多。
在算法复杂性、用户可感延迟、鲁棒性以及内存利用率之间存在一种折衷方案。最简单的阅读器算法是仅扫描整个替换Artcard,然后,处理全部数据,不存在实时制约。这样不仅需要大量预留内存,而且花费的时间比同时进行替换Artcard读处理过程的阅读器算法花费的时间长。
读和解码替换Artcard所需的实际存储量是保存编码数据所需空间存储量以及暂时空间(1-2KB)存储量的二倍。对于1600dpi替换Artcard,这意味着,需要4MB内存。下面的算法描述中将详细说明内存利用率。
传送速率
为了进行时限研究,需要假定DRAM带宽,而且在某种程度上影响算法设计,特别是因为替换Artcard阅读器通常是嵌入式系统的一部分。
假定采用Rambus Inc,Oct 1997,Direct Rambus TechnologyDisclosure确定的标准Rambus直接RDRAM体系结构,它的峰值数据传送速率为1.6GB/s。假定效率为75%(容易实现),则平均为1.2GB/s的数据传送速率。因此,存取16字节的块的平均时间为12ns。
脏数据
可以将物理损伤的替换Artcard插入阅读器。替换Artcard可能被划伤、或者被污物或污垢弄脏。替换Artcard阅读器不能完好地读取所有内容。因为脏数据影响周围的清洁点,所以模糊使脏数据的作用更糟糕。
模糊环境
将模糊引入替换Artcard读环境的方式有两种:
●因为CCD离开替换Artcard的自然距离,而产生的自然模糊。
●替换Artcard的翘曲
在重叠CCD输出的检测数据时,替换Artcard图像出现自然模糊。可以利用模糊,因为重叠确保检测数据中不存在高频,而且不存在CCD丢失的数据。然而,如果CCD像素覆盖的面积太大,则会非常模糊,而且不能满足恢复数据所需的采样。图64是示出重叠检测数据的原理图。
在替换Artcard因为热损伤而稍许产生翘曲时,出现另一种形式的模糊。当在垂直方向发生翘曲时,替换Artcard与CCD之间的距离将不是固定的,而且在这些区上,模糊程度将发生变化。
对替换Artcard选择黑点和白点,以对模糊读环境,提供最佳动态范围。在尝试确定给定的点是黑点还是白点时,模糊可能产生问题。
随着模糊的加重,周围点对给定点的影响也越大。因此,特定点的动态范围减小。对分别被所有可能组的点包围的白点和黑点进行研究。9点被弄模糊,而采样中心点。图65示出黑点和白点的结果中心点值的分布。
该附图意在表示模糊。从0到约180的曲线1140示出黑点的范围。从75到250的曲线1141示出白点的范围。然而,越模糊,则两条曲线向该范围的中心的偏移越多,因此,交叉面积越大,这意味着,更难以确定给定点是黑点还是白点。不清楚交叉中心点的像素值,即,该点是黑点或白点的可能性相同。
随着模糊的加重,读误码的似然性就提高。幸运的是,RS解码算法可以正确处理至多t个符号错误。图65是对于给定的特定符号差错率不能恢复的替换Artcard RS块的数字预测的数字(number predictednumber)。请注意,RS解码解决方案如何良好工作,然后又大致降质的。如果不存在RS块的复制品,则对于不能恢复的数据,仅1块出现错误。当然,具有块的复制品,提高了替换Artcard解码的机会。
图66仅示出对应于错误中的RS块数量的符号(字节)错误。在可以处理的、可以与对该卡形成的破坏量相比的模糊量之间存在折衷方案。由于利用RS解码器进行所有检错和纠错,所以每个可以被处理的RS数据块具有有限错误。
替换Artcard解码过程概述
如上所述,在用户将替换Artcard插入替换Artcard阅读单元时,马达传送装置理想地使替换Artcard通过单色线性CCD图像传感器。以3倍打印分辨率,在每个方向采样该卡。替换Artcard阅读硬件和软件对至多1度的转动、因为马达传送装置产生的抖动和振动以及因为替换Artcard到CCD的距离的变化产生的模糊进行补偿。利用在此描述的综合方法,从采样图像中提取数据的数字位图像。RS解码过程对替换Artcard上原数据中至多25%的任意分布数据破坏进行校正。从1600dpi卡上提取大约1MB的校正数据。
图67示出解码过程中的各步骤。
解码处理过程需要下面的处理步骤:
●以3倍打印分辨率,扫描1144替换Artcard(例如,以4800dpi,扫描1600dpi替换Artcard)。
●从该卡的扫描数据中提取1145数据位映像。
●如果向后插入替换Artcard,则反向1146位映像。
●去扰1147编码数据。
●根据位映像,RS解码1148数据。
算法概述
阶段1-实时位图像提取过程
简单将可用内存(4MB)与保存1600dpi替换Artcard的所有扫描像素所需的内存(172.5MB)进行比较说明,除非多次读卡(不现实的选择),否则必须在替换Artcard通过CCD时,在运动中,实时从像素数据中提取位映像。在该阶段必须完成两个任务:
●以4800dpi扫描替换Artcard
●从在该卡上扫描的数据中提取数据位映像
在提取了整个位图像之前,不能对该位图像进行转动和去扰。因此,需要分配用于保存提取的位图像的存储区。位图像容易存储在2MB内,留下2MB用于提取处理过程。
不是仅在检查从CCD获得的当前扫描线像素时,提取位图像,但是可以对替换Artcard分配用作窗口的缓冲器,用于存储读取的最后N条扫描线。内存要求不允许以这样的方式存储整个替换Artcard(需要172.5MB),但是分配2MB用于存储190像素列(每个扫描线占据不到11,000字节)可以使位图像提取处理过程更简单。
因此,4MB内存可以用作:
●2MB用于提取的位图像
●~2MB用于扫描像素
●1.5KB用于阶段1的暂时数据(在算法要求时)
由于替换Artcard通过CCD并被实际装载花费的时间是1.5秒,所以阶段1花费的时间是1.5秒。
阶段2-从位图像中提取数据
一旦提取了位图像,就必须对它进行去扰并潜在转动180°。然后,必须对它进行解码。阶段2不要求实时进行,因为替换Artcard已经停止运动,而且我们只关心用户察觉的历时。因此,阶段2包括对替换Artcard进行解码的剩余任务:
●重新组织位图像,如果替换Artcard被向后插入,则使它反向
●去扰该编码数据
●根据位图像RS解码该数据
阶段2的输入端是2MB位图像缓冲器。在原位不能进行去扰和转动,所以需要2MB缓冲器。不再需要在阶段1用于保存扫描像素的2MB缓冲器,而且该2MB缓冲器可以用于存储转动的去扰数据。
RS解码任务获取去扰位图像,然后,将它解码为910,082字节。可以在原位进行解码,也可以在规定的任何其他位置进行解码。解码处理过程不需要任何附加存储器缓冲区。
因此,4MB内存用作:
●2MB用于提取的位图像(从阶段1获得的)
●~2MB用于去扰的、潜在转动的位图像
●<1 KB用于阶段2的暂时数据(在算法要求时)
阶段2花费的时间取决于硬件,而且受到RS解码过程花费的时间的限制。利用诸如LSI逻辑的L64712的核心,或者等效于CPU/DSP组合,估计阶段2花费0.32秒。
阶段1-提取位图像
阶段1是该算法的实时阶段,而且涉及在利用CCD进行扫描时,从替换Artcard提取位图像。
如图68所示,可以将阶段1划分为2个异步进程流。第一异步进程流仅是从CCD实时读取替换Artcard像素,将该像素写入DRAM。第二异步进程流包括检验像素,并提取位。第二进程流本身被划分为2个进程。第一进程是全局进程,涉及定位替换Artcard的开始。第二进程是位图像提取本身。
图69利用数据/进程透视图示出数据流。
时限
对于整个1600dpi替换Artcard,需要读取最多16,252像素列。假定整个替换Artcard的总时间是1.5秒,这意味着,在这些各进程的过程中,每个像素列最多92,296ns。
进程1-从CCD读像素
CCD以4800dpi扫描替换Artcard,然后,每列产生11,000一字节像素采样。该进程仅从CCD获取数据,然后,将它写入DRAM,这完全独立于从DRAM读取像素数据的任何其他进程。图70示出所包括的步骤。
将像素邻接写入2MB缓冲器,该2MB缓冲器可以保存190列全列像素。该缓冲器始终保存最近读取的190列。因此,要读取像素数据的任何进程(例如进程是进程3)均必须首先知道到何处查找给定的列,其次,为了确保获取的数据实际保存到该缓冲器内,它必须足够快。
进程1使当前扫描线数(CurrentScanLine)对其他进程有效,因此它们可以确保它们不试图对还未被读的扫描线上的像素进行存取。
将一列数据(11,000字节)写入DRAM花费的时间是:
11,000/16*12=8,256ns
因此,进程1仅使用不到9%的可用DRAM带宽(8256/92296)。
进程2-检测替换Artcard的开始
该进程涉及定位所扫描的替换Artcard上的活动区。该级的输入是从DRAM获得的像素数据(进程1存储到DRAM的)。输出是在输入到进程3要求的、替换Artcard上的头8个数据块的一组界限。在图71可以看出该进程的高度概括。
在插入后,替换Artcard可以具有1mm的垂直倾斜。如果转动1度,则增加1.5mm的垂直倾斜(86sin1°)。因此,存在2.5mm的总垂直倾斜。在1600dpi,这等于大约160点的倾斜。由于一个数据块仅394点高,所以该倾斜刚好低于一半的数据块。为了更好地估计数据块位于何处,需要检测替换Artcard本身。
因此,进程2包括两部分:
●定位替换Artcard的开始,而且如果发现替换Artcard的开始,则
●根据替换Artcard的开始,计算头8个数据块的界限。
定位替换Artcard的开始
位于替换Artcard区之外的扫描像素是黑的(该表面可以是黑色塑料,或者某种其他非反光面)。替换Artcard区的边界是白色的。如果逐个处理像素列,而且将高速像素过滤成黑色或白色,则从黑色到白色的过渡点将标记替换Artcard的开始。下面是最高级进程:
for(Column=0;Column<MAX_COLUMN;Column++)
{
Pixel=ProcessColumn(Column)
if(Pixel)
return(Pixel,Column) //success!
}
return failure // no alternat ive Artcard found
ProcessColumn函数简单。使扫描列上的两个区上的像素通过阈值过滤器,以确定它们是黑色的还是白色的。然后,可以等待特定数量的白像素,而且一旦检测到给定数量的白像素,就宣告替换Artcard的开始。下面的伪码示出处理像素列的逻辑。如果在该列期间,未检测到替换Artcard,则返回0。否则,返回检测位置的像素数。
// Try upper region first
count=0
for(i=0;i<UPPER_REGION_BOUND;i++)
{
if(GetPixel(column,i)<THRESHOLD)
{
count=0 //pixel is black
<dp n="d136"/>
}
else
{
count++ //pixel is white
if(count>WHITE_ALTERNATIVE ARTCARD)
return i
}
}
//Try lower region next.Process pixels in reverse
count=0
for(i=MAX_PIXEL_BOUND;i>LOWER_REGION_BOUND;i--)
{
if(GetPixel(column,i)<THRESHOLD)
{
count=0 // pixel is black
}
else
<dp n="d137"/>
{
count++ //pixel is white
if(count>WHITE_ALTERNATIVE ARTCARD)
return i
}
}
//Not in upper bound or in lower bound.Return failure
return O
计算数据块界限
在该级,已经检测到替换Artcard。根据替换Artcard的转动,或者检测到替换Artcard的顶部,或者检测到替换Artcard的下部。进程2的第二步骤确定检测到哪个部分,然后正确设置阶段3的数据块界限。
检查阶段3发现它对数据块分段界限进行处理:每个数据块具有StartPixel和EndPixel,以确定在何处查找目标,从而定位数据块的数据区域。
如果该像素值位于卡的上半部分,则可以仅将它用作第一StartPixel界限。如果该像素值位于该卡的下半部分,则可以向后移动,以使该像素值是最后分段的EndPixel界限。前进或者后退替换Artcard数据大小,从而建立具有适当界限的每个分段。现在,准备好从替换Artcard提取数据。
//Adjust to become first pixel if is lower pixel
if(pixel>LOWER_REGION_BOUND)
{
pixel-=6*1152
if(pixel<0)
pixel=0
}
for(i=0;i<6;i++)
{
endPixel=pixel+1152
segment[i].MaxPixel=MAX_PIXEL_BOUND
segment[i].SetBounds(pixel,endPixel)
pixel=endPixel
}
在进程3确定MaxPixel值,而SetBounds函数仅设置利用0和MaxPixel限幅的StartPixel和EndPixel。
进程3-从像素提取位数据
这是替换Artcard阅读器算法的核心。该进程涉及从CCD像素数据中提取位数据。根据进程2产生的而在进程3保存的暂时信息,该进程从本质上利用像素数据建立位图像。在图72中可以看到该进程的高度概括。
进程3不是仅读替换Artcard的像素列,并确定什么像素属于什么数据块,而是以相反的方式工作。它知道到何处查找给定数据块的像素。这是通过将逻辑替换Artcard分割为8个分段实现的,每个分段含有8个数据块,如图73所示。
所示的各分段与逻辑替换Artcard匹配。实际上,替换Artcard很可能被转动某个角度。各分段保持锁定逻辑替换Artcard结构,因此,它与转动无关。给定分段可以具有两种状态之一:
●LookingForTargets:在该状态下,还未确定该分段的精确数据块位置。通过扫描位于分段界限指出的界限上的像素列数据,定位各目标。一旦利用目标定位了数据块,而且界限被设置为黑和白,该状态就变更为ExtractingBitImage。
●ExtractingBitImage:在该状态下,数据块被精确定位,而且一次一点列地提取位数据,并将它们写入替换Artcard位图像。数据块时钟标记的后面给出精确点恢复,而与转动无关,因此,忽略分段界限。一旦提取了整个数据块,就根据当前位置,对下一个数据块计算新分段界限。该状态变更为LookingForTargets。
在提取了全部64个数据块时,完成该进程,从每个区域提取8个数据块。
每个数据块包括595列数据,每个数据分别具有48字节。优先以48字节,分别提取数据块的2个取向列,这样每个数据块提取总数28,656字节。为了简洁起见,可以将2 MB存储器分割为64×32k存储块(chunk)。将给定分段的第n数据块存储到位置:
StartBuffer+(256k*n)
分段的数据结构
8个分段分别具有有关数据结构。将确定每个分段的数据结构存储到暂时数据区。该数据结构可以是下表所示的结构:
数据名称(DataName) |
解释 |
CurrentState |
确定分段的当前状态。可以是下面的状态之一:LookingForTargetsExtractingBitImage初始值是LookingForTargets |
|
在LookingForTargets期间使用: |
StartPixel |
分段的上部像素界限。由进程2初设 |
EndPixel |
分段的下部像素界限。由进程2初设 |
MaxPixel |
任何扫描线的增大像素数。对于每个分段,将它设置为同样的值:10,866。 |
CurrentColumn |
在查找目标时,确定像素列。 |
FinalColumn |
确定最后像素列以查看目标 |
LocatedTargets |
指向一系列定位目标 |
PossibleTargets |
指向一组指针,该指针指向表示当前调查的像素形状的目标结构,该 |
|
像素形状可能是目标。 |
AvailableTargets |
指向一组指针,该指针指向当前未使用的目标结构。 |
TargetsFound |
迄今为止在该数据块中发现的目标的数量 |
PossibleTargetCount |
PossibleTargets列表中的单元数量 |
AvailabletargetCount |
AvailableTargets列表中的单元数量 |
|
在ExtractingBitImage期间使用的: |
BitImage |
用于存储下一个数据块的DRAM内的位图像数据区的开始:分段1=X,分段2=X+32k等等每次在状态从ExtractingBitImageData变更为LookingForTargets时,前进256k |
CurrentByte |
用于存储下一个提取字节的BitImage内的偏移 |
CurrentDotColumn |
保存当前时钟标记/点列号。在状态从LookingForTargets变更为ExtractingBitImage时,设置为8。 |
UpperClock |
当前上部时钟标记/边界的坐标(列 |
|
/行) |
LowerClock |
当前下部时钟标记/边界的坐标(列/行) |
CurrentDot |
当前点列的当前数据点的中心。初设到数据列的第一点(最上)的中心。 |
DataDelta |
对CurrentDot加什么(列/像素)以前进到下一个点的中心。 |
BlackMax |
高于其时,点肯定是白点的像素值 |
WhiteMin |
低于其时,点肯定是白点的像素值 |
MidRange |
与由黑或白获得的似然性相同的像素值。在所有开始未确定点时,利用该值确定它。低于该值的像素是黑像素,高于该值的像素是白像素。 |
进程3的最高级
进程3仅通过每个分段进行迭代,根据分段的当前状态,对一条线进行处理。伪码是直通的:
blockCount=0
while(blockCount<64)
for(i=0;i<8;i++)
{
fini shedBlock=segment[i].ProcessState()
if(finishedBlock)
blockCount++
}
如果在特定时间之后,进程3还未终止,就必须利用外部控制过程暂停该进程。只有在不能提取数据时,才出现这种情况。简单机制是,在进程1已经结束读替换Artcard后,开始递减计数。如果此时,进程3还未结束,则不能恢复替换Artcard的数据。
CurrentState=LookingForTargets
通过一次一个像素列地读像素列,检测各目标,而不通过检测(StartPixel与EndPixel之间)给定像素带内的点,来检测特定像素模式。一次一列地处理像素列,至多或者发现了所有目标,或者处理了特定数量的列。此时,可以处理各目标,而且可以利用时钟标记定位数据区。状态变更为ExtractingBitImage,以通知该数据现在被提取。如果未定位足够的有效目标,则忽略该数据块,跳跃到肯定位于丢失的数据块内的列,然后,再开始在下一个数据块内查找各目标的进程。这可以在下面的伪码中看到:
finishedBlock=FALSE
if(CurrentColumn<Processl.CurrentScanLine)
{
ProcessPixelColumn()
CurrentColumn++
}
<dp n="d144"/>
if ((TargetsFound==6)||(CurrentColumn>LastColumn))
{
if(TargetsFound>=2)
ProcessTargets()
if (TargetsFound>=2)
{
BuildClockmarkEstimates()
SetBlackAndWhiteBounds()
CurrentState=ExtractingBitImage
CurrentDotColumn=-8
}
else
{
//data block cannot be recovered. Look for
//next instead. Must adjust pixel bounds to
//take account of possible 1 degree rotation.
finishedBlock=TRUE
SetBounds(StartPixel-12,EndPixel+12)
<dp n="d145"/>
BitImage+=256KB
CurrentByte=0
LastColumn+=1024
TargetsFound=0
}
}
return finishedBlock
ProcessPixelColumn
在规定的界限(StartPixel与EndPixel之间)内处理每个像素列,以搜索用于识别各目标的特定像素模式。上述图54示出一个目标(目标号2)的结构:
从像素的观点出发,可以利用下面的内容识别目标:
●左侧黑区域,是包括大量邻接黑像素以建立该目标的第一部分的大量像素列。
●目标中心,是位于其他黑列的中心的白区域
●第二黑区域,目标中心之后的两个黑点列
●目标号,是利用其程度确定目标号的、黑色包围的白区域
●第三黑区域,是目标号之后的2个黑列
图74示出要求的进程的概况。
由于识别仅取决于黑像素或白像素,所以每列上的像素1150通过过滤器1151,以检测黑或白,然后对其进行行程编码1152。然后,将游程长度送到状态机1153,状态机1153存取最后3个游程长度和第四最后颜色。根据这些值,可能的目标通过每个识别级。
GatherMin&Max进程1155仅保持在处理该分段期间遇到的最小像素值和增大像素值。一旦为了设置BlackMax、WhiteMin以及MidRange值而定位了目标,就可以使用这些增大像素值和最小像素值。
在其搜索目标的过程中,每个分段保持一组目标结构。尽管该目标结构本身在内存中不移动,但几个分段变量指向指针表,指针指向指向目标结构。在此,重复示出这3个指针:
LocatedTargets |
指向一组表示定位目标的目标结构 |
PossibleTargets |
指向一组指针,该指针指向表示当前调查的像素形状的目标结构,该像素形状可能是目标。 |
AvailableTargets |
指向一组指针,该指针指向当前未使用的目标结构。 |
这些分别是与该系列指针中的每个指针有关的计数器:TargetsFount、PossibleTargetCount以及AvailableTargetCount。
在装载替换Artcard之前,将TargetsFount和PossibleTargetCount设置为0,而将AvailableTargetCount设置为28(正在调查的可能具有的目标结构的最大数量,因为目标边界的最小尺寸为40像素,而且数据区大约1152像素)。图75示出目标指针布局的例子。
在发现了可能的新目标时,从AvailableTarget列表1157中取出它们,更新目标数据结构,将指向该结构的指针附加到PossibleTarget列表1158中。在完成验证了目标时,将它附加到LocatedTargets列表1157。因此,在任何时间始终存在在列表之间移动的、循环方式的28目标指针。
目标数据结构1160可以具有下面的形式:
数据名称 |
解释 |
CurrentState |
目标搜索的当前状态 |
DetectCount |
目标处于给定状态多长时间的计数 |
StartPixel |
目标在何处开始?该目标的所有像素行均应该在该像素值的容差范围内开始。 |
TargetNumber |
哪个目标号是这个(根据读什么) |
Column |
最佳估计目标的中心列纵坐标 |
Pixel |
最佳估计目标的中心像素纵坐标 |
然后,寻目标每块1162(参考图74)内的ProcessPixelColumn函数逐个检查所有游程长度,将该游程与现有的可能目标进行比较(通过StartPixel),或者如果事先不知道而发现了潜在目标,则建立新可能目标。就一切情况而论,仅在S0.color是白色,而S1.color是黑色时,进行该比较。
以下将说明ProcessPixelColumn的伪码。在确实识别了第一目标时,可以确定对各目标检验的最后一列在离开它的最大距离内。对于1°的转动,该最大距离是18像素列。
pixel=StartPixel
t=0
target=PossibleTarget[t]
while((pixel<EndPixel)&&(TargetsFound<6))
{
if((S0.Color==white)&&(S1.Color==black))
{
do
<dp n="d148"/>
{
keepTrying=FALSE
if
(
(target !=NULL)
&&
(target->AddToTarget(Column,pixel,S1,S2,S3))
)
{
if (target->CurrentState==IsATarget)
{
Remove target from PossibleTargets List
Add target to LocatedTargets List
TargetsFound++
if (TargetsFound==1)
FinalColumn=Column+MAX_TARGET_DELTA}
}
else if (target->CurrentState==NotATarget)
<dp n="d149"/>
{
Remove target from PossibleTargets List
Add target to AvailableTargets List
keepTrying=TRUE
}
else
{
t++ //advance to next target
}
target=PossibleTarget[t]
}
else
{
tmp=AvailableTargets[0]
if (tmp->AddToTarget(Column,pixel,S1,S2,S3)
{
Remove tmp from AvailableTargets list
Add tmp to PossibleTargets list
<dp n="d150"/>
t++ //target t has been shifted right
}
}
}while(keepTrying)
}
pixel+=S1.RunLength
Advance S0/S1/S2/S3
}
AddToTarget是寻目标每块内的函数,它确定是否可以将特定游程附加到给定目标:
●如果游程在目标开始位置的容差内,则该游程直接与当前目标有关,并因此可以附加到它。
●如果游程在目标之前开始,则假定现在目标仍良好,但是与该游程不相关。因此,该目标保持不变,而FALSE的返回值告知调用者(caller)未附加该游程。随后,该调用者可以检验该游程,以检查它是否使其自己的整个新目标开始。
●如果游程在目标之后开始,则假定该目标不再是可能目标。该状态被变更为NotATarget,然后,返回返回值TRUE。
如果将该游程附加到目标,则根据当前状态以及S1、S2和S3内的一组游程,执行特定动作。下面是AddToTarget伪码:
MAX_TARGET_DELTA=1
<dp n="d151"/>
if(CurrentState!=NothingKnown)
{
if(pixel>StartPixel) //run starts after target
{
diff=pixel-StartPixel
if(diff>MAX_TARGET_DELTA)
{
CurrentState=NotATarget
return TRUE
}
}
else
{
diff=StartPixel-pixel
if(diff>MAX_TARGET_DELTA)
return FALSE
}
}
<dp n="d152"/>
runType=DetermineRunType(S1,S2,S3)
EvaluateState(runType)
StartPixel=currentPixel
return TRUE
下面是以DetermineRunType识别的像素游程的类型:
像素游程的类型 |
类型 |
如何识别(S1始终为黑色) |
TargetBorder |
S1=40<RunLength<50S2=white run |
TargetCenter | S1=15<RunLength<26S2=white run with[RunLength<12]S3=black run with[15<RunLength<26] |
TargerNumber |
S2=white run with[RunLength<=40] |
根据当前状态和游程类型,EvaluateState过程采取动作。
下面以列表形式示出各动作:
CurrentState |
像素游程类型 |
动作 |
NothingKnown |
TargetBorder |
DetectCount=1CurrentState=LeftOfCenter |
LeftOfCenter |
TargetBorder |
DetectCount++if(DetectCount>24)CurrentState=NotATarget |
TargetCenter |
DetectCount=1CurrentState=InCenterColumn=currentColumnPixel=currentPixel+S1.RunLength |
|
CurrentState=NotATarget |
InCenter |
TargetCenter |
DetectCount++tmp=currentPixel+S1.RunLengthif(tmp<Pixel)Pixel=tmpif(DetectCount>13)CurrentState=NotATarget |
TargetBorder |
DetectCount=1CurrentState=RightOfCenter |
CurrentState |
像素游程类型 |
动作 |
| |
CurrentState=NotATarget |
RightOfCenter |
TargetBorder |
DetectCount++if(DetectCount>=12)CurrentState=NotATarget |
TargetNumber |
DetectCount=1CurrentState=InTargetNumberTargetNumber=(S2.RunLength+2)/6 |
|
CurrentState=NotATarget |
InTargetNumber |
TargetNumber |
tmp=(S2.RunLength+2)/6if(tmp>TargetNumber)TargetNumber=tmpDetectCount++if(DetectCount>=12)CurrentState=NotATarget |
TargetBorder |
if(DetectCount>=3)CurrentState=IsATargetelseCurrentState=NotATarget |
CurrentState |
像素游程类型 |
动作 |
| |
CurrentState=NotATarget |
IsATarget orNotATarget |
- |
- |
处理目标
以它们所在位置的顺序存储定位目标(位于LocatedTargets列表中)。根据替换Artcard的转动,这些目标将处于递增像素顺序或处于递减像素顺序。此外,从目标恢复的目标号可能是错误的。我们可能还恢复了错误目标。在可以获得时钟标记估计值之前,需要处理该目标,以确保丢弃无效目标,而如果存在错误(例如,因为污物而破坏目标号),则有效目标使目标号固定。包括两个主要步骤:
●将目标分类为递增像素顺序
●定位并固定错误目标号
第一步骤简单。目标检索的性质意味着,该数据应该已经被分类为递增像素或递减像素。简单交换分类确保,如果已经正确分类6个目标,则不利用交换进行最多14次比较。如果数据未被分类,则利用3次交换进行14次比较。下面的伪码示出分类进程:
for(i=0;i<TargetsFound-1;i++)
{
<dp n="d156"/>
oldTarget=LocatedTargets[i]
bestPixel=oldTarget->Pixel
best=i
j=i+1
while(j<TargetsFound)
{
if(LocatedTargets[j]->Pixel<bestPixel)
best=j
j++
}
if(best!=i)//move only if necessary
LocatedTargets[i]=LocatedTargets[best]
LocatedTargets[best]=oldTarget
}
}
定位和固定错误目标号仅稍许复杂些。假定逐个发现的N个目标分别是正确的。将其他目标与该“正确”目标进行比较,而且如果目标N是正确的,对需要变更的目标的数量进行计数。如果变更的数量是0,则所有目标必须已经是正确的。否则,将对于其他目标需要最少变更的目标用作变更的基础。如果在与“正确”目标的像素位置和目标号进行比较时,给定目标的目标号和像素位置不相关,保存变更。变更可以意味着更新目标的目标号,它也可以意味着消除目标。可以假定递增目标具有递增顺序的像素(由于它们已经被分类)。
kPixelFactor=1/(55*3)
bestTarget=0
bestChanges=TargetsFound+1
for(i=0;i<TotalTargetsFound;i++)
{
numberOfChanges=0;
fromPixel=(LocatedTargets[i])->Pixel
fromTargetNumber=LocatedTargets[i].TargetNumber
for(j=1;j<TotalTargetsFound;j++)
{
toPixel=LocatedTargets[j]->Pixel
deltaPixel=toPixel-fromPixel
if(deltaPixel>=0)
deltaPixel+=PIXELS_BETWEEN_TARGET_CENTRES/2
<dp n="d158"/>
else
deltaPixel-=PIXELS_BETWEEN_TARGET_CENTRES/2
targetNumber=deltaPixel*kPixelFactor
targetNumber+=fromTargetNumber
if
(
(targetNumber<1)||(targetNumber>6)
||
(targetNumber != LocatedTargets[j]->
TargetNumber)
)
numberOfChanges++
}
if (numberOfChanges<bestChanges)
{
bestTarget=i
bestChanges=numberOfChanges
<dp n="d159"/>
}
if(bestChanges<2)
break;
}
在大多数情况下,该函数将利用bestChanges=0终止,这意味着,不需要变更。否则,需要进行变更。在与targetNumber进行比较之前,进行变更的功能性与计数各变更(上述伪码中的)相同。变更应用程序是:
if((targetNumber<1)||(targetNumber>TARGETS_PER_BLOCK))
{
LocatedTargets[j]=NULL
TargetsFound--
}
else
{
LocatedTargets[j]->TargetNumber=targetNumber
}
在变更循环结束时,需要压缩LocatedTargets列表,并移除所有NULL目标。
在该过程结束时,可能没有几个目标。现在,可以利用保留的任何目标(至少需要2个目标)定位时钟标记和数据区域。
根据目标建立时钟标记估计值
如上述图55所示,上部区域的第一个时钟标记点1126离开第一目标1124的中心55点(这与目标中心之间的距离相同)。该时钟标记点的中心再远离第一时钟标记点1点,而黑边界线1123再远离第一时钟标记点4点。下部区域的第一个时钟标记点刚好离开上部区域的第一时钟标记点1126 7目标距离(7×55点)。
不能假定已经定位了目标1和6,因此,需要利用最上面的目标和最下面的目标以及目标号确定正在使用哪个目标。在此,至少需要2个目标。此外,目标中心仅是实际目标中心的估计值。所以要更精确定位目标中心。目标中心是被黑色包围的白色。因此,我们希望求得像素大小和列大小的局部最大值。这包括重构连续图像,因为该最大值不大可能精确对准完整边界(我们的估计值)。
在围绕该目标的中心构造连续图像之前,需要求得2个目标中心的更好估计值。现有目标中心实际上是目标中心的边界框的左上坐标。检查确定目标的中心的区域上的像素以及找到具有最大值的像素是一个简单进程。具有同样最大像素值的像素可能不止一个,但是估计中心值仅需要一个像素。
伪码是直通的,而且分别对2个目标执行该伪码:
CENTER_WIDTH=CENTER_HEIGHT=12
maxPixel=0x00
for(i=0;i<CENTER_WIDTH;i++)
for(j=0;j<CENTER_HEIGHT;j++)
<dp n="d161"/>
{
p=GetPixel(column+i,pixel+j)
if(p>maxPixel)
{
maxPixel=p
centerColumn=column+i
centerPixel=pixel+j
}
}
Target.Column=centerColumn
Target.Pixel=centerPixel
该进程结束时,目标中心坐标指向目标中最白的像素,该像素应该位于实际中心的应该像素内。求得目标中心的更精确位置的进程包括重构该目标的7个扫描线限幅(scanline slice)的连续信号,3个扫描线限幅位于估计的目标中心的两侧。然后,利用求得的7个最大值(这7个像素方向限幅中每个像素方向限幅具有一个最大值)重构列方向上的连续信号,从而定位该方向上的最大值。
// Given estimates column and pixel,determine a
// betterColumn and betterPixel as the center of
//the target
<dp n="d162"/>
for(y=0;y<7;y++)
{
for(x=0;x<7;x++)
samples[x]=GetPixel(column-3+y,pixel-3+x)
FindMax(samples,pos,maxVal)
reSamples[y]=maxVal
if(y==3}
betterPixel=pos+pixel
}
FindMax(reSamples,pos,maxVal)
betterColumn=pos+column
FindMax是用于重构基于采样点的原始1维信号,并返回最大值的位置以及求得的最大值的函数。使用信号重构/重采样的方法是Lanczos3windowed sinc函数,如图76所示。
Lanczos3 windowed sinc函数从正在重构的方向取7个(像素)采样,这7个采样以估计位置X为中心,即它们位于X-3、X-2、X-1、X、X+1、X+2、X+3。利用间隔分别为0.1的X-1至X+1重构点,然后,确定哪个点最大。是最大值的位置变成新中心。因为内核的性质,对于X与X+1之间的各点,卷积内核仅需要6个项目。在X-1与X之间采用6个点,在X与X+1之间采用6个点,因此为了获得从X-1到X+1的像素值,总共需要7个点,因为所需的某些像素相同。
如果给出其最上面的目标和其最下面的目标的精确估计值,则以下可以计算上部区域和下部区域的第一时钟标记点的位置:
TARGETS_PER_BLOCK=6
numTargetsDiff=to.TargetNum-from.TargetNum
deltaPixel=(to.Pixel-from.Pixel)/numTargetsDiff
deltaColumn=(to.Column-from.Column)/numTargetsDiff
UpperClock.pixel=from.Pixel-(from.TargetNum*deltaPixel)
UpperClock.column=from.Column-(from.TargetNum*deltaColumn)
// Given the first dot of the upper clockmark,the
//first dot of the lower clockmark is straightforward.
LowerClock.pixel=UpperClock.pixel+
((TARGETS_PER_BLOCK+1)*deltaPixel)
LowerClock.column=UpperClock.column+
((TARGETS_PER_BLOCK+1)*deltaColumn)
这样使我们获得了第一时钟标记点。需要使列位置再远离数据区1点,以到达时钟标记的中心。还需要使像素位置再远离4点,以到达边界线的中心。ΔColumn和ΔPixel的伪码值取决于55点的距离(目标之间的距离),因此,在附加到时钟标记坐标之前,必须分别以1/55和4/55分别对这些Δ进行缩小。这可以被表示为:
kDeltaDotFactor=1/DOTS_BETWEEN_TARGET_CENTRES
deltaColumn*=kDeltaDotFactor
deltaPixel*=4*kDeltaDotFactor
UpperClock.pixel-=deltaPixel
UpperClock.column-=deltaColumn
LowerClock.pixel+=deltaPixel
LowerClock.column+=deltaColumn
现在,UpperClock和LowerClock是直接符合目标中心的有效时钟标记估计值。
设置黑和白像素/点范围
在从数据区提取数据之前,需要确定黑点和白点的像素范围。将在搜索目标期间遇到的最下像素和最大像素分别存储到WhiteMin和BlackMax,但是对于数据提取过程,这不表示这些变量的有效值。它们仅用作存储装置。下面的伪码示出根据遇到的最小像素和最大像素获得WhiteMin和BlackMax的良好值的方法:
MinPixel=WhiteMin
MaxPixel=BlackMax
MidRange=(MinPixel+MaxPixel)/2
WhiteMin=MaxPixel-105
BlackMax=MinPixel+84
CurrentState=ExtractingBitImage
ExtractingBitImage状态是其中已经利用目标精确定位了数据块,而且当前正在一次一个点列地提取位数据,并将提取的位数据写入替换Artcard位图像的状态。数据块时钟标记/边界提供精确点恢复,而与转动无关,因此可以忽略分段界限。一旦提取了整个数据块(每个数据块597列48字节的列;595列数据+2取向列),根据当前位置,对下一个数据块计算新分段界限。状态变更为LookingForTargets。
处理给定点列的过程包括两个任务:
●第一任务是利用时钟标记定位数据的特定点列。
●第二任务是查找用于每点一位地组合位值的点列。
仅在已经从替换Artcard上读出该列的数据并将它送到DRAM时,可以执行这两个任务。这可以通过检验进程1在处理哪个扫描线,然后将它与时钟标记列进行比较来确定。如果点数据在DRAM内,则在使该时钟标记进展到下一个点列的估计值之前,可以更新时钟标记,然后,从该列提取数据。下面具有特殊函数的伪码给出该进程的概况,下面解释该特殊函数:
finishedBlock=FALSE
if((UpperClock.column<Processl.CurrentScanLine)
&&
(LowerClock.column<Processl.CurrentScanLine))
{
DetermineAccurateClockMarks()
DetermineDataInfo()
<dp n="d166"/>
if(CurrentDotColumn>=0)
ExtractDataFromColumn()
AdvanceClockMarks()
if(CurrentDotColumn==FINAL_COLUMN)
{
finishedBlock=TRUE
currentState=LookingForTargets
SetBounds(UpperClock.pixel,LowerClock.pixel)
BitImage+=256KB
CurrentByte=0
TargetsFound=0
}
}
return finishedBlock
定位点列
在可以读点并提取数据之前,需要定位给定点列。这是利用下面的时钟标记/边界线以及数据块的上部边界和下部边界实现的。利用等效于锁相环的软件确保,即使时钟标记已经被破坏,仍可以良好估计时钟标记位置。图77示出典型数据块的左上角,左上角显示存在延伸到目标区、白行然后延伸到黑边界线的3点高时钟标记1166。
首先,提供第一黑时钟标记位置的中心的估计值(根据目标位置)。利用黑边界1168确定精确垂直位置(像素),而利用时钟标记例如1166获得精确水平位置(列)。这些均反映在UpperClock位置和LowerClock位置上。
获取时钟标记估计值,然后,通过检查其附近的像素数据,重构连续信号并确定准确中心。由于将这两个方向分割为时钟标记和边界,所以这是需要执行两次的、简单的一维进程。然而,在存在与其对应存储的黑时钟标记时,仅每隔一个点列执行一次该进程。对于白时钟标记,仅使用估计值,而且就此为止。作为一种选择,可以根据边界对每个点列更新像素坐标(因为它始终存在)。实际上,足以隔列(具有黑时钟标记)更新两个纵坐标,因为正在采用的分辨率非常好。因此该进程变成:
//Turn the estimates of the clockmarks into accurate
//positions only when there is a black clockmark
//(ie every 2nd dot column,starting from-8)
if(Bit0(CurrentDotColumn)==0) //even column
{
DetermineAccurateUpperDotCenter()
DetermineAccurateLowerDotCenter()
}
如果存在大于给定容差(MAX_CLOCKMARK_DEVIATION)的偏差,则忽略求得的信号,而且仅允许与估计值的偏差是最大容差的偏差。在这方面,功能性与锁相环的功能性相同。因此,利用下面的伪码实现
DetermineAccurateUpperDotCenter:
//Use the estimated pixel position of
//the border to determine where to look for
//a more accurate clockmark center.The clockmark
//is 3 dots high so even if the estimated position
//of the border is wrong,it won’t affect the
//fixing of the clockmark position.
MAX_CLOCKMARK_DEVIATION=0.5
diff=GetAccurateColumn(UpperClock.column,
UpperClock.pixel+(3*PIXELS_PER_DOT))
diff-=UpperClock.column
if(diff>MAX_CLOCKMARK_DEVIATION)
diff=MAX_CLOCKMARK_DEVIATION
else
if(diff<-MAX_CLOCKMARK_DEVIATION)
diff=-MAX_CLOCKMARK_DEVIATION
UpperClock.column+=diff
<dp n="d169"/>
//Use the newly obtained clockmark center to
//determine a more accurate border position.
diff=GetAccuratePixel(UpperClock.column,UpperClock.pixel)
diff-=UpperClock.pixel
if(diff>MAX_CLOCKMARK_DEVIATION)
diff=MAX_CLOCKMARK_DEVIATION
else
if(diff<-MAX_CLOCKMARK_DEVIATION)
diff=-MAX_CLOCKMARK_DEVIATION
UpperClock.pixel+=diff
除了从边界到时钟标记的方向是反方向之外(-3点,而非+3点),DetermineAccurateLowerDotCenter相同。
GetAccuratePixel和GetAccurateColumn是仅根据一维的透视,确定精确点中心以给出坐标的函数。确定精确点中心是重构信号,然后找到在其上求得最小信号值的位置的进程(这与定位目标中心不同,定位目标中心是定位信号的最大值,因为目标中心是白色的,而不是黑色的)。对于本应用程序,选择进行信号重构/重采样的方法是Lanczos3 windowedsinc函数,正如以上参考图76所述。
时钟标记或边界在某种程度上被破坏,或者被划伤是可能的。如果通过重采样检索的新中心值与估计值之差大于容差,则将该中心值改变最大容差。如果它是无效位置,则应该足够近,以便用于进行数据检索,而且未来的时钟标记重新使该位置同步。
确定第一数据点的中心和与后续点的Δ
一旦确定了精确UpperClock和LowerClock位置,就可以计算第一数据点(CurrentDot)的中心以及附加到该中心位置以进展到该列上的后续点的Δ量(DataDelta)。
要做的第一件事情是计算该点列的Δ。这可以通过简单将LowerClock减去UpperClock,然后除以两点之间的点数获得的。实际上,可以乘以点数的倒数,因为对于替换Artcard,它是常数,而且乘运算更快。在计算像素方向和列方向的Δ时,可以采用不同的常数。像素的Δ是两个边界之间的距离,而列的Δ是两个时钟标记的中心之间的距离。因此,函数DetermineDataInfo有两个部分。伪码给出第一部分:
kDeltaColumnFactor=1/(DOTS_PER_DATA_COLUMN+2+2-1)
kDeltaPixelFactor=1/(DOTS_PER_DATA_COLUMN+5+5-1)
delta=LowerClock.column-UpperClock.column
DataDelta.column=delta*kDeltaColumnFactor
delta=LowerClock.pixel-UpperClock.pixel
DataDelta.pixel=delta*kDeltaPixelFactor
现在,可以确定列的第一数据点的中心。从时钟标记的中心到第一数据点的中心之间存在2点的距离,而从边界的中心到第一数据点的中心之间存在5点的距离。因此,伪码给出该函数的第二部分:
CurrentDot.column=UpperClock.column+(2*DataDelta.column)
CurrentDot.pixel=UpperClock.pixel+(5*DataDelta.pixel)
查找点列
由于通过利用锁相环跟踪时钟标记,已经定位了点列,所以剩下的工作只有采样位于该列下面的每个点的中心的点列。将变量CurrentDot点确定在当前列的第一点的中心。通过仅加DataDelta(2次加法运算:1次用于列纵坐标,另一次用于像素纵坐标),就可以到达该列的下一个点。取给定坐标(双线性内插)的点的采样,然后,确定表示该点的中心的像素值。之后,利用该像素值确定该点的位值。然而,可以利用同一个点线的两个周围点的中心值范围内的像素值,实现更好位调整。
可以确信被提取的点列上的各点的所有像素当前均位于DRAM内,以便如果该线(时钟标记)的两端在DRAM内,则这两个时钟标记之间的各点必须在DRAM内。此外,数据块高度足够低(仅384点高),以确保简单Δ足够大,从而穿过该线的长度。将卡分割为8数据块高的原因之一是,我们不能象处理一个数据块那样,在卡的整个高度上实现同样的硬性保证。
在下面的伪码中可以看到用于提取一条数据线(48字节)的高级进程。在存储每个字节时,dataBuffer指针递增,以确保连续存储连续字节和数据列。
bitCount=8
curr=0x00 // definitely black
next=GetPixel(CurrentDot)
for(i=0;i<DOTS_PER_DATA_COLUMN;i++)
{
<dp n="d172"/>
CurrentDot+=DataDelta
prev=curr
curr=next
next=GetPixel(CurrentDot)
bit=DetermineCenterDot(prev,curr,next)
byte=(byte<<1)|bit
bitCount--
if(bitCount==0)
{
*(BitImage|CurrentByte)=byte
CurrentByte++
bitCount=8
}
}
GetPixel函数获取点坐标(固定点)并采样4 CCD像素,以通过进行双线性内插获得中心像素值。
DetermineCenterDot函数获取像素值,该像素值表示位于正在确定其位值的点的两侧的点中心,而且DetermineCenterDot函数试图利用智能方法推测该中心点的位值的值。根据图64所示的广义模糊曲线,有3种共同情况要考虑。
●点的中心像素值低于WhiteMin,因此,它肯定是黑点。所以位值肯定是1。
●点的中心像素值高于BlackMax,因此,它肯定是白点。所以位值肯定是0。
●点的中心像素值处于BlackMax与WhiteMin之间的某个位置。该点可能是黑点,而且可能是白点。因此,该位值成为问题。可以设想许多解决方案来合理推测该位值。这些解决方案必须平衡好复杂性与精度,而且还必须考虑到,在某些情况下,不存在保用的解决方案。在其中作出错误位判定的情况下,该位的RS符合将是错误的,而且必须在阶段2的RS解码级进行纠错。
用于确定点的值是否在BlackMax与WhiteMin之间的解决方案并不太复杂,但是效果却良好。它使用位于该点的左侧和右侧的点中心的像素值,利用该值有助于确定该中心点的更可能值:
●如果两侧上的两个点位于MidRange的白色侧(平均点值),则可以推测,如果中心点是白色的,则它很可能是“固定”白色。它位于不确定区域内的事实说明该点是黑点,而且已经受到周围白点的影响,使得该值不确定。因此,假定点值是黑,则该点值是1。
●如果两侧上的两个点位于MidRange的黑色侧,则可以推测,如果该中心点是黑色的,则它很可能是“固定”黑。它位于不确定区域内的事实说明该点是白点,而且已经受到周围黑点的影响,使得该值不确定。因此,假定点值是黑,则该点值是1。
●如果一个点位于MidRange的黑色侧,而另一个点位于MidRange的白色侧,则仅利用中心点值进行判定。如果中心点位于MidRange的黑色侧,则选择黑色(点值1)。
下面示出该逻辑关系:
if(pixel<WhiteMin) //definitely black
bit=0x01
else
if(pixel>BlackMax) //definitely white
bit=0x00
else
if((prev>MidRange)&&(next>MidRange))//prob black
bit=0x01
else
if((prev<MidRange)&&(next<MidRange))//prob white
bit=0x00
else
if(pixel<MidRange)
bit=0x01
else
bit=0x00
由此,我们明白,利用周围像素值可以获得中心点状态值的良好表示。在此描述的解决方案仅使用同一行上的点,但是作为一种替换配置,使用一个点线历史(先前点线)也可以直通。
更新下一列的时钟标记
一旦确定了该列的第一数据点的中心,就不再需要时钟标记值了。在从该列检索了数据后,非常方便地更新它们,以便准备好处理下一列。由于时钟标记的方向垂直于该点列下面的各点的横向,所以可以利用像素Δ更新该列,然后,减去列Δ以更新两个时钟的像素:
UpperClock.column+=DataDelta.pixel
LowerClock.column+=DataDelta.pixel
UpperClock.pixel-=DataDelta.column
LowerClock.pixel-=DataDelta.column
这些是下一个点列的估计值。
时限
只要DRAM使用率不超过100%,就满足时限要求,而且附加利用该算法乘并行算法时限,DRAM使用率不超过100%。对进程l规定DRAM使用率,进程l以连续方式一次写入一个像素,占用9%的DRAM带宽。
本小节描述的时限说明,DRAM可以容易地满足替换Artcard阅读器算法的要求。因此,时限瓶颈是以逻辑速度实现算法,而非DRAM的存取过程。然而,可以考虑简单体系结构设计该算法,从而对于每个存储周期需要最少的逻辑运算。从该观点出发,只要如下面的子小节所述,能够实现执行状态机或等效CPU/DSP体系结构,就可以满足目标速度。
定位目标
通过读像素列界限内的像素,可以定位目标。每个像素最多读一次。假定行程编码器以足够快的速度运行,内存存取目标的位置上的界限。因此,该存取过程不比进程1的时限糟糕,这意味着9%的DRAM带宽使用率。
因此,目标定位期间(包括进程1)的总DRAM使用率是18%,这意味着,目标定位器将始终追上替换Artcard图像传感器像素阅读器。
处理目标
用于分类和检验目标号的时限没有意义。分别计算两个目标中心的较好评估值的过程包括12组12次像素读,所以总共144次读。然而,固定精确的目标中心具有意义,这样就需要2组评估过程。调整每个目标中心需要8组20个不同的6项目卷积内核。因此,总计8×20×6乘积=960。此外,还有7组7像素要检索,所以需要进行49次内存存取。因此,每个项目的总数是144+960+49+1153,它接近与像素列上的像素数相同(1152)。因此,每次像素评估过程消耗的时间是用别的办法处理像素行花费的时间。对于两个目标,我们实际上将时间花费在2个像素列。
在目标号之后的对于像素列上肯定识别目标。因为在取向列之前存在两个点列,所以存在6个像素列。实际上,目标定位进程处理了所有第一像素列,但是根本不处理剩余的5个像素列。因此,在2/5可用时间内,可以定位数据区,而不与任何其他处理时间相冲突。
剩余的3/5的可用时间对于用于分配黑像素和白像素的范围的没有意义的任务、最多占用两个机器周期的任务足够了。
提取数据
根据时限,有两部分要考虑:
●获得精确时钟标记值和边界值
●提取点值
仅每隔一个点列,将时钟标记值和边界值相加。然而,每次在更新时钟标记估计值以变得更精确时,必须评估20个不同的6项目卷积内核。平均每个点列有2个不同的6项目卷积内核(每2个点列有4个不同的6项目卷积内核)。根据边界更新像素纵坐标仅需要同一条像素扫描线上的7像素。然而,更新列纵坐标需要不同列上的7像素,因此是不同的扫描线。假定最糟糕情况是高速缓存未命中所有扫描线项目而两个高速缓存未命中同一个扫描线上的像素的,这样总共8个高速缓存未命中。
对于每个点,提取点信息的过程仅包括4次像素读(而不是用于确定点的9次)。考虑到1152像素(384点)的数据区,通过仅读4像素点,而不是9个,最多可以保存72次高速缓存读。最糟糕的情况是,转动1°,在这种情况下,每57像素存在一个像素的位移,这样仅给出稍许糟糕的保存。
然后,可以肯定地说,在最糟糕情况下,我们读的高速缓存行的数量比数据区上的像素占据的高速缓存行数量多。因此,该存取过程不比进程1的时限差,这意味着9%的DRAM带宽使用率。
因此,数据提取期间(包括进程1)的总DRAM使用率是18%,这意味着,数据提取器始终可以追上替换Artcard图像传感器像素阅读器。这蕴含了处理目标进程,因为如果需要,利用较低效方法,可以处理目标,在提取数据进程期间仍可以快速追上。
阶段2—解码位图像
阶段2是替换Artcard数据恢复算法的非实时阶段。在阶段2开始时,从替换Artcard提取位图像。它表示从替换Artcard的数据区域读取的位。某些位是错误的,而且有可能因为在插入时替换Artcard发生转动,而使整个数据转动180°。阶段2涉及从该编码位图像中可靠提取原始数据。基本上要执行3个步骤,如图79所示:
●如果向后插入了替换Artcard,重新组织该位图像,使它反向
●去扰编码数据
●RS解码位图像中的数据
这3个步骤被分别确定为单独进程,而且连续执行这3个步骤,因为需要一个步骤的输出作为下一个步骤的输入。将头两个步骤组合为一个进程是直通的,但是为了清楚起见,在此,单独处理它们。
根据数据/进程透视图,阶段2具有图80所示的结构。
进程1和2的时限很可能是可以忽略不计的,在它们之间花费的时间不到1/1000秒。进程3(RS解码)花费的时间接近0.32秒,使得这成为阶段2所需的总时间。
如果需要重新组织该位图像,使它反向
DRAM内的位映像表示从替换Artcard检索的数据。然而,位映像是不连续的。它被分割为64个32k的存储块,每个数据块一个存储块。每个32k的存储块仅含有28,656有效字节:
最左侧取向列中的48字节
数据区域本身中的28560字节
最右侧取向列中的48字节
4112未使用字节
用于存储像素数据(阶段1的进程1存储的)的2MB缓冲器可以用于保存重新组织的位图像,因为在阶段2期间,不需要像素数据。在开始重新组织时,正确取向的邻接位图像位于2MB像素缓冲器内,准备好进行RS解码。
如果该卡被正确取向,则最左侧的取向列是白色,而最右侧的取向列是黑色。如果该卡被转动180°,则最左侧的取向列是黑色的,而最右侧的取向列是白色的。
确定该卡是否被正确取向的简单方法是,检查每个数据块,检验第一个和最后一个48字节数据,直到利用黑位与白位的绝对优势比值(overwhelming ratio)找到数据块。下面的伪码说明了该过程,如果该卡被正确取向,则返回TRUE,否则,则返回FALSE。
totalCountL=0
totalCountR=0
for(i=0;i<64;i++)
{
blackCountL=0
blackCountR=0
currBuff=dataBuffer
for(j=0;j<48;j++)
{
blackCountL+=CountBits(*currBuff)
currBuff++
}
currBuff+=28560
for(j=0;j<48;j++)
<dp n="d180"/>
{
blackCountR+=CountBits(*currBuff)
currBuff++
}
dataBuffer+=32k
if(blackCountR>(blackCountL*4))
return TRUE
if(blackCountL>(blackCountR*4))
return FALSE
totalCountL+=blackCountL
totalCountR+=blackCountR
}
return(totalCountR>totalCountL)
现在,必须根据该卡是否被正确取向,重新组织数据。最简单的情况是,正确取向该卡。在这种情况下,仅需要使数据稍许转动以消除取向列,并使整个数据邻接。这可以在原位非常简单地实现,如下面的伪码所述:
DATA_BYTES_PER_DATA_BLOCK=28560
to=dataBuffer
from=dataBuffer+48) //left orientation column
for(i=0;i<64;i++)
{
BlockMove(from,to,DATA_BYTES_PER_DATA_BLOCK)
from+=32k
to+=DATA_BYTES_PER_DATA_BLOCK
}
另一种情况是需要实际反向数据的情况。反向数据的算法非常简单,但是为了简洁起见,需要256字节的表Reverse,在该表中,Reverse[N]的值是倒位N。
DATA_BYTES_PER_DATA_BLOCK=28560
to=outBuffer
for(i=0;i<64;i++)
{
from=dataBuffer+(i*32k)
from+=48 //skip orientation column
from+=DATA_BYTES_PER_DATA_BLOCK-1//end of block
for(j=0;j<DATA_BYTES_PER_DATA_BLOCK;j++)
{
<dp n="d182"/>
*to++=Reverse[*from]
from--
}
}
这两个进程的定时可以忽略不计,占用不到1/1000秒:
●2MB邻接读(2048/16×12ns=1,536ns)
●2MB有效邻接字节写(2048/16×12ns=1,536ns)
去扰编码图像
现在,位图像是1,827,840个邻接的、正确取向的、但是被加扰的字节。必须去扰该字节以产生7,168个每个分别为255字节长的RS块。去扰进程是非常直通的,但是需要单独输出缓冲器,因为不能在原位进行去扰。图80示出用于处理去扰进程的存储器。
下面的伪码确定如何执行去扰进程:
groupSize=255
numBytes=1827840;
inBuffer=scrambledBuffer;
outBuffer=unscrambledBuffer;
for(i=0;i<groupSize;i++)
for(j=i;j<numBytes;j+=groupSize)
outBuffer[j]=*inBuffer++
该进程的时限可以忽略不计,它花费不到1/1000秒。
●2MB邻接读(2048/16×12ns=1,536ns)
●2MB非邻接字节写(2048/16×12ns=1,536ns)
该进程结束时,去扰数据准备好进行RS解码。
RS解码
读替换Artcard的最终部分是RS解码进程,在该进程中,将大约2MB的去扰数据解码为大约1MB的有效替换Artcard数据。
该算法一次解码一个RS块,而且可以在原位执行(如果要求),因为编码块比解码块大,而且冗余字节存储在数据字节的后面。
头2个RS块是控制块,该控制块含有关于将从位图像中提取的数据的大小的信息。必须首先解码该元信息,然后,利用结果信息解码该数据本身。解码该数据本身仅是一次解码一个数据块的情况。如果特定块不能解码,则可以使用复制数据块。
伪码说明了最高级RS解码:
// Constants for Reed Solomon decode
sourceBlockLength=255;
destBlockLength=127;
numControlBlocks=2;
//Decode the control information
if(!GetControlData(source,destBlocks,lastBlock))
return error
<dp n="d184"/>
destBytes=((destBlocks-1)*destBlockLength)+lastBlock
offsetToNextDuplicate=destBlocks*sourceBlockLength
//Skip the control blocks and position at data
source+=numControlBlocks*sourceBlockLength
//Decode each of the data blocks,trying
//duplicates as necessary
blocksInError=0;
for(i=0;i<destBlocks;i++)
{
found=DecodeBlock(source,dest);
if(!found)
{
duplicate=source+offsetToNextDuplieate
while((!found)&&(duplicate<sourceEnd))
{
found=DecodeBlock(duplicate,dest)
<dp n="d185"/>
duplicate+=offsetToNextDuplicate
}
}
if(!found)
blocksInError++
source+=sourceBlockLength
dest+=destBlockLength
}
return destBytes and blocksInError
DecodeBlock是采用m=8和t=64的标准RS块解码器。
GetControlData函数是直通的,只要不存在错误。该函数仅调用DecodeBlock,以便一次解码一个控制块,直到成功。然后,可以从解码数据的头3字节中提取控制参数(destBlocks存储在字节0和1)。如果存在解码错误,则该函数必须遍历32组3字节,并判定哪个是要校正的最可能设定值。一种简单方法是找到该3字节的2个连续等同拷贝,然后,宣告这些值是校正值。替换方法是对出现的不同组的3字节进行计数,然后,声明最常出现的3字节就是要校正的3字节。
进行RS解码花费的时间取决于实现过程。尽管可以使用专用核心执行RS解码进程(例如,LSI逻辑的L64712),但是根据应用,优先选择CPU/DSP组合,在嵌入式系统中,更常用CPU/DSP组合(通常利用解码数据做一些事情)。当然,利用CPU/DSP组合,解码时间必须足够快。
L64712的吞吐量为每秒50Mbit(约每秒6.25MB),因此该时间受限于RS解码器的速度,而非受限于最大2MB读和1MB写内存存取时间。因此,最糟糕情况下花费的时间(全部2MB均需要解码)是2/6.25s=大约0.32秒。当然,许多进一步改进是可以的,它们包括下面的内容:
读环境越模糊,给定点受周围点的影响就越严重。该优选实施例的当前读算法能够利用同一列上的周围点更好地判定点值。由于已经解码了先前列的点,所以在确定其像素值在不确定区域内的点的值时,可以使用先前列点历史。
初始级的不同概率用于完全消除它、使数据块的初始界限大于所需界限以及在ProcessingTargets函数中设置更强大的智能。这样可以降低总的复杂性。必须注意保持数据块独立。
此外,还可以使控制块机制更鲁棒:
●控制块可以是第一个控制块和最后一个控制块,而不使它们邻接(现在就是这种情况)。这样可以更好地防止出现某种故障连接破坏情况。
●第二改进是将附加冗余级/附加纠错级设置到控制块结构中,在RS解码步骤失败时,使用它。如果RS级失败,则像奇偶校验一样简单的一些事情可以提高控制信息的似然性。
阶段5运行Vark脚本
因此,读Artcard 9并对它进行解码花费的总时间接近2.15秒。实际上,对用户的视延迟仅0.65秒(阶段3和阶段4的总时间),因为1.5秒之后,Artcard停止移动。
一旦装载了Artcard,就必须解释Artvark脚本,而不是立即运行该脚本,仅在按下“打印”按钮13(参考图1)时,才运行该脚本。运行该脚本花费的时间根据该脚本的复杂性变化,而且必须考虑到按下打印按钮与实际打印之间的可感延迟。
如上所述,VLIW处理器74是数字处理系统,它用于加速计算量大的Vark功能。使利用CPU核心72以软件方式实现的功能与利用VLIW处理器74以硬件方式实现的功能实现相关平衡。VLIW处理器74的目的是支持所有Artcard风格以在对用户看起来不太慢时执行。随着CPU的速度变得更快、功能变得更强,需要硬件加速的功能也越来越少。VLIW处理器具有微编码ALU子系统,它可以使通用硬件加速下面的时限功能。
1)用于进行一般硬件处理的图像存取机制
2)图像卷积器(convolver)
3)数据驱动图像翘曲器
4)图像按比例缩放
5)图像镶嵌(tessellation)
6)仿射变换
7)图像合成器
8)彩色空间变换
9)直方图收集器
10)照射图像
11)画笔邮戳
12)直方图收集器
13)CCD图像到内部图像的变换
14)构造图像棱锥(翘曲器使用,而且用于画笔绘图)
下表概括说明,在ALU模型内实现时,每个Vark操作花费的时间。
以下说明利用AUL模型实现该功能的方法。
操作 |
操作速度 |
1500*1000图像 |
| |
1个通道 |
3个通道 |
图像合成 |
每个输出像素1个周期 | | |
图像卷积(convolve) |
每个输出像素k/3周期(k=内核大小)3×3卷积5×5卷积7×7卷积 | | |
图像翘曲 |
每个像素8周期 | | |
直方图收集 |
每个像素2周期 | | |
图像镶嵌过程 |
每个输出像素1周期 | | |
彩色搜索替换 |
每个像素1/2周期 | | |
彩色空间变换 |
每个像素8周期 | | |
将CCD图像变换为内部图像(包括彩色变换和比例) |
每个输出像素4周期 | | |
构造图像棱锥 |
每个输入像素1周期 | | |
比例 |
最大:每个输入像素2周期每个输出像素2周期每个输出像素2周期(仅以X比例) |
0.015s(最小) |
0.045s(最小) |
仿射变换 |
每个输出像素2周期 | | |
画笔转动/平移以及合成 | | | |
铺砌图像 |
每个输出像素4-8周期 |
0.015s至0.030s |
对于4个通道(Lab,纹理)0.060s至0.120s |
照射图像只环境照射直接光直接(bm)全向光全向(bm)点光点光(bm)(bm)=块形映像 |
每个像素的周期数 | | |
例如,变换CCD图像、收集直方图以及搜索彩色替换(用于进行图像增强)花费:每个像素9+2+0.5周期,即,11.5周期。对于1500×1000图像,它是172,500,000,即,每个分量大约0.2秒,即,全部3个分量0.6秒。增加简单的翘曲,总时间达到0.6+0.36秒,即,几乎1秒。
图像卷积器(convolver)
卷积是围绕中心像素的加权平均。该平均值可以是简单的和数、绝对值之和、和数的绝对值或者是在0舌位的和数。
图像卷积器是通用卷积器,通过改变大小可变系数内核内的值,可以实现各种功能。所支持的内核大小只有3×3、5×5以及7×7。
现在参考图82,图82示出卷积进程的例子340。方框方式读迭代器342输出送到卷积器进程341的像素分量值。迭代器342逐行提供图像数据,以及在每个行上,逐个像素提供图像数据。将卷积器341的输出送到顺序写迭代器344,顺序写迭代器344以有效图像格式存储结果图像。
系数内核346是位于DRAM内的查用表。以与方框方式读迭代器342同样的顺序,对该内核排列各系数。每个系数项目均是8位。简单的顺序读迭代器可以用于将它与内核346联系起来,从而提供系数。它利用等于内核大小的ImageWidth模拟图像,并设置循环选项,以便连续设置内核。
图81示出在ALU单元上实现卷积进程的一种方式。利用软件设置下面的常数:
控制逻辑用于对每个像素递减计数乘法/加法次数。在计数(在Latch2内累计)达到0时,所产生的控制信号用于写出当前卷积值(从Latch1),然后,复位该计数。这样,一个控制逻辑块可以用于大量并行卷积流。
在每个周期,乘法ALU可以执行一次乘法/加法,以插入像素的适当部分。因此,求所有值的和花费的周期数是内核内的项目数。由于这是计算限制,所以适于将图像分割为多个部分,然后,在不同的ALU单元内并行处理它们。
在7×7内核上,每个像素花费的时间是49周期,即,490ns。由于每个高速缓存行保存32像素,所以内存存取的可用时间是12,740ns((32-7+1)×490ns)。读7个高速缓存行以及写一个高速缓存行花费的时间最糟糕是1,120ns(8*140ns,对同一个DRAM存储体进行所有存取)。因此,利用给定的有限资源,可以并行处理至多10个像素。如果ALU的数量有限,则最多可以并行处理4个像素。因此,利用7×7内核进行卷积花费的时间是0.18375秒(1500*1000*490ns=183,750,000ns)。
在5×5内核上,每个像素花费的时间是25周期,即,250ns。由于每个高速缓存行保存32像素,所以内存存取的可用时间是7,000ns((32-5+1)×250ns)。读5个高速缓存行以及写一个高速缓存行花费的时间最糟糕是840ns(6*140ns,对同一个DRAM存储体进行所有存取)。因此,利用给定的有限资源,可以并行处理至多7个像素。如果ALU的数量有限,则最多可以并行处理4个像素。因此,利用5×5内核进行卷积花费的时间是0.09375秒(1500*1000*250ns=93,750,000ns)。
在3×3内核上,每个像素花费的时间是9周期,即,90ns。由于每个高速缓存行保存32像素,所以内存存取的可用时间是2,700ns((32-3+1)×90ns)。读3个高速缓存行以及写一个高速缓存行花费的时间最糟糕是560ns(4*140ns,对同一个DRAM存储体进行所有存取)。因此,利用给定的有限资源,可以并行处理至多l0个像素。如果ALU和读/写迭代器的数量有限,则最多可以处理4个像素。因此,利用3×3内核进行卷积花费的时间是0.03375秒(1500*1000*90ns/4=33,750,000ns)。因此,每个输出像素花费内核大小/3周期进行计算。下表概括说明实际
时限:
内核大小 |
计算输出像素花费的时间 |
以1500×1000处理1个通道的时间 |
以1500×1000处理3个通道的时间 |
3×3(9) |
3周期 |
0.045秒 |
0.135秒 |
5×5(25) |
81/3周期 |
0.125秒 |
0.375秒 |
7×7(49) |
61/3周期 |
0.245秒 |
0.735秒 |
图像合成器
合成就是利用褪光(matte)或通道适当调节背景和前景在最终图像中的比例,将前景图像与背景图像叠加在一起。优先支持两种风格的合成,即,正则合成(regular composition)和关联合成(associatedcompositing)。这两种风格的规则是:
正则合成:新值=前景+(背景-前景)a
关联合成:新值=前景+(1-a)背景
差别在于,对于关联合成,背景预乘褪光,而在正则合成中,没有这样做。图83示出合成进程的例子。
α通道具有对应于范围0至1的从0到1的值。正则合成
以以下形式实现正则合成:
前景+(背景-前景)*α/255
被X/255除近似等于被257X/65536除。图84更详细示出实现合成进程的过程,其中利用软件设置下面的常数:
由于需要4个迭代器,所以对于每个像素,合成进程需要1个周期,使用率只有ALU的一半。合成进程仅运行在一个通道上。为了与另一个图像合成3通道图像,合成器必须运行3次,每个通道运行一次。
合成一个全尺寸通道花费的时间是0.015s(1500*1000*10ns),即,合成3个通道花费0.045s。
为了近似表示被255除,可以乘以257,然后再除以65536。这还可以通过进行一次加法(256*x+x),然后忽略(除了四舍五入之外)该结果的最后16位实现。
如图42所示,合成进程需要3个顺序读迭代器352至353和1个顺序写迭代器355,而且结合乘法器ALU使用加法器ALU,利用伪码实现该合成进程。每个像素的合成时间是1个周期(10ns)。关联合成和正则合成需要不同的伪码,但是合成每个像素的平均时间相同。
合成进程仅运行在一个通道上。为了与另一个图像合成一个3通道图像,合成器必须运行3次,每个通道合成一次。因为对于每次合成,通道相同,所以每次都必须读它。然而,应该注意,在最佳情况下,传送(读或写)4×32字节高速缓存行花费320ns。对于每个像素合成过程,流水线平均花费1个周期,所以合成32像素花费32周期或320ns(以100MHz),因此,实际上是无开销读通道。因此,可以合成逐个通道:
1500*1000*320ns=15,040,000ns=0.015秒
因此,合成全尺寸3通道图像花费的时间是0.045秒。
构造图像棱锥
诸如翘曲、铺砌以及画笔画图的几个功能需要给定面积上像素的平均值。而不计算每个给定面积的值,所以这些功能优先使用图像棱锥。如上参考图33所述,图像棱锥360实际上是多分辨率像素映像。原始图像115是1∶1表示。在每维上以2∶1进行子采样产生1/4原始图像大小的图像。继续该进程直到利用一个像素表示整个图像。
利用原始图像构造图像棱锥,而且图像棱锥是原始图像(1/4+1/16+1/64+…)大小的1/3。对于1500×1000的原始图像,相应的图像棱锥大约1/2MB。
通过对每个方向,利用2像素,在进入卷积内核中心的4个输入图像像素之一上进行3×3卷积,可以构造图像棱锥。3×3卷积比仅计算4像素的平均值的精度高,而且其附加优点是,不同棱锥平面上的坐标的差别仅在于每个平面位移1位。
构造整个棱锥的过程取决于软件循环,对于棱锥的每个平面,该软件循环调用一次棱锥平面构造函数。
产生棱锥的平面1的时限是9/4*1/4倍输入图像分辨率,因为我们要产生是原始图像大小的1/4的图像。因此,对于1500×1000图像:
产生棱锥平面1的时限=9/4*750*500=843,750周期
产生棱锥平面2的时限=9/4*350*250=210,938周期
产生棱锥平面3的时限=9/4*188*125=52,735周期
等等
对于每个原始图像像素,总时间是3/4周期(图像棱锥是1/3倍原始图像大小,而每个像素占用9/4周期进行计算,即,1/3*9/4=3/4)。在这种情况下,1500×1000图像是1,125,000周期(以100MHz),即,0.011秒。该时限是对于一个彩色通道的,因此,3个彩色通道需要0.034秒的处理时间。
通用数据驱动图像翘曲器
ACP 31能够对输入图像进行图像翘曲处理。在理论上,图像翘曲的原理众所周知。一本关于翘曲处理的详尽教科书是George Wolberg编著的、IEEE Computer Society Press,Los Alamitos,California于1990年出版的“Digital Image Warping”。翘曲处理采用翘曲映像,翘曲映像形成通过Artcard馈送的部分数据。根据要求,任意确定翘曲映像的大小,然后,提供从输入像素映像到输出像素的信息。不幸的是,使用任意大小的翘曲映像存在许多问题,该图像翘曲器必须解决这些问题。
参考图85,大小为A×B的翘曲映像365包括特定大小的阵列值(例如,从0-255的8位值),该阵列值确定理论输入图像,该理论输入图像映像到具有同样阵列坐标索引的相应“理论”输出图像。不幸的是,输出图像例如366自己的大小为C×D,大小C×D又与输入图像完全不同,输入图像自己的大小可以为E×F。因此,需要便于重映像翘曲映像365,以便它可以用于输出图像366,从而对每个输出像素确定由其构造输出像素彩色数据的输入图像367的相应区或区域。对于输出图像366内的每个输出像素,可以首先根据翘曲映像365确定相应翘曲映像值。这可以包括,在输出图像像素映像到翘曲映像表365内的小数部分时,需要双线性内插周围翘曲映像值。这样处理的结果是,给出输入图像像素在“理论”图像内的位置,“理论”图像的大小由翘曲映像365内的每个数据值的大小确定。必须按比例重新缩放这些值,以便将理论图像映像到相应实际输入图像367。
为了确定数据值并获取输出图像以避免混叠效应,应该检验相邻输出图像像素,以确定对最终输出图像像素值产生影响的输入图像像素367的区域。在这方面,使用图像棱锥,在以下的说明中,图像棱锥就更加清楚易懂。
为了翘曲图像,图像翘曲器执行几项任务。
●按比例缩放翘曲映像,以匹配输出图像大小。
●在每个输出像素中表示的输入图像像素的区域的跨距
●根据输入的图像棱锥,利用三线性内插,计算最终输出像素值
缩放翘曲映像
如上所述,在数据驱动翘曲中,需要翘曲映像,该翘曲映像对每个输出像素描述相应输入图像映像的中心。不是具有应该上述翘曲映像,而是含有交织的x和y值信息,可以将X和Y坐标作为单独通道进行处理。
因此,优先存在两个翘曲映像:示出X坐标的翘曲处理的X翘曲映像和示出Y坐标的翘曲处理的Y翘曲映像。如上所述,翘曲映像365可以与被缩放的图像具有不同的空间分辨率(例如,32×32翘曲映像365可以充分描述1500×1000图像366的翘曲)。此外,可以利用与被翘曲处理的图像的大小对应的8位或16位值表示翘曲映像。
根据给定翘曲映像,在输入图像空间内产生点的过程包括几个步骤:
1.确定输出像素在翘曲映像内的相应位置
2.从翘曲映像中取出用于下一个步骤的值(这样,如果翘曲映像仅是8位值,则需要在分辨率域内进行缩放)。
3.双线性内插翘曲映像,以确定实际值
4.缩放该值以对应于输入图像域
通过利用比例因数(可以对X和Y不同)乘以输出图像的当前X/Y坐标,实现第一步骤。例如,如果输出图像是1500×1000,而且翘曲映像是150×100,则可以将X和Y缩小1/10倍。
从翘曲映像取出值需要对2个查用表进行存取。一个查用表指向X翘曲映像,而另一个查用表指向Y翘曲映像。查用表从查用表中或者读8位项目,或者读16位项目,但是始终返回16位值(如果原始值只有8位,则清除头8位)。
流水线中的下一个步骤是双线性内插搜索的翘曲映像值。
最后,缩放双线性内插获得的结果,以将它变换到与被翘曲处理的图像位于同一个域内。因此,如果翘曲映像范围是0至255,则将X放大1500/255倍,而将Y放大1000/255倍。
图86示出内插进程,利用软件设置下面的常数:
常数 |
值 |
K1 |
Xscale(将0-ImageWidth缩放到0-WarpmapWidth) |
K2 |
Yscale(将0-ImageHeight缩放到0-WarpmapHeight) |
K3 |
XrangeScale(将warpmap范围(例如0至255)缩放到0-WarpWidth) |
K4 |
YrangeScale(将warpmap范围(例如0至255)缩放到0-WarpHeight) |
使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1和LU2 |
WarpmapWidth×WarpmapHeight |
搜索的Warpmap。假定[X,Y],则返回进行双线性内插所需的4个项目。即使各项目只有8位,仍将它们作为16位返回(头8位是0)。传送时间是4个项目(每个项目2字节)。在使用两个查用表时,总时间是8个周期。 |
跨距计算
翘曲映像365内的点位于输入图像367的像素区域的中心。相邻输出图像像素的输入图像像素之间的距离表示范围的大小,而且可以利用跨距计算过程近似计算该距离。
参考图87,对于翘曲映像P1内给定的当前点,将同一条线上的先前点称为P0,而将位于同一位置的先前线上的点称为P2。我们确定P1与P0之间以及P1与P2之间在X和Y上的绝对距离。X和Y上的最大距离就是表示实际形状的矩形近似的跨距。
优先以垂直带方式输出顺序,处理各点,P0是该带的同一条线上先前点,而在P1是带内的线上的第一点时,则P0称为先前带的相应线上的最后一点。P2是同一条带的先前线上的点,所以可以将它保存到32项目历史合成器内。图88示出计算跨距进程的基础,图89示出该进程的细节。
使用下面的DRAM FIFO:
搜索 |
大小 |
详细说明 |
FIFO1 |
8 ImageWidth字节。[ImageWidth×2项目(每个项目32位)] |
P2历史/搜索(同一个FIFO内的X和Y)将P1设置到FIFO内,并再取出后面一行的同一个像素上的点作为P2。传送时间是4字节(2×32位,每16位1个周期) |
由于保存了32位精度的跨距历史,所以在1500像素宽图像被翘曲处理的情况下,需要12,000字节的临时存储器。
计算跨距364的过程使用2个加法器ALU(1个用于进行跨距计算,1个用于循环和对P0和P1历史进行计数),计算跨距364的过程占用以下7个周期:
1 |
A=ABS(P1x-P2x)将P1x存储到P2x历史中 |
2 |
A=ABS(P1x-P0x)将P1x存储到P0x历史中 |
3 |
A=MAX(A,B) |
4 |
A=ABS(P1y-P2y)将P1y存储到P2y历史中 |
5 |
A=MAX(A,B) |
6 |
B=ABS(P1x-P0x)将P1x存储到P0x历史中 |
7 |
A=MAX(A,B) |
历史缓冲器365、366是带高速缓存的DRAM。“先前线”(P2历史的)缓冲器366是32项目的跨距精度。“先前点”(P0历史的)。缓冲器365需要:1个寄存器,在大多数时间使用该寄存器(用于计算带中的线上的点1至点31);以及DRAM,用于缓存在计算带中的线上的点0时使用的一组历史值。
跨距历史的32位精度要求4个高速缓存行用于保存P2历史,2个高速缓存行用于保存P0历史。仅每隔8行32像素一次地,将P0历史写或读到(ImageHeight*4)字节的临时存储空间。因此,翘曲处理1500像素高图像需要6000字节临时存储器,以及总共6个高速缓存行。
三线性内插
确定了要均化的输入图像中的区域的中心和跨距后,翘曲进程的最终部分是确定输出像素的值。由于从理论上说,整个输入图像可以表示一个输出像素,所以它可能太花费时间了,以致实际上不能读并均化对输出像素产生影响的输入图像的特定区域。相反,利用输入图像的图像棱锥可以近似像素值。
如果跨距是1或者更小,则仅需要读靠近给定坐标的原始图像的像素,然后,进行双线性内插。如果跨距大于1,则必须读图像棱锥的两个适当平面,然后,进行三线性内插。在图像棱锥的两个平面之间进行线性内插并不一定绝对正确,但是给出了可接受的值(它过分表现结果图像的模糊性)。
参考图90,一般的说,对于给定的跨距“s”,需要读由In2s(370)和In2s(371)给出的图像棱锥平面。In2s仅解码s的最高置“1”位。为了确定分别位于棱锥的两个平面370、371上的像素的值,必须进行双线性内插,然后,在各平面之间进行内插。
如图91所示,为了获得最终输出值373,在在棱锥平面之间进行内插之前,需要首先在每个棱锥平面的X和Y上进行内插。
分配图像棱锥寻址模式以产生棱锥平面s和s+1上的像素坐标(x,y)。图像棱锥平面分别含有顺序排列在x上的各像素。因此,x上的读很可能被高速缓存命中。
因为输出图像的各局部区域通常与输入图像局部相关,所以可以获得合理的高速缓存相关性(然而,可能以不同的比例,但是在比例内相干)。由于不可能知道输入图像与输出图像之间的关系,所以为了最好地利用高速缓存相关性,我们要确保将输出像素写入垂直带中(利用垂直带方式写迭代器)。
利用4个乘法ALU和全部4个加法器ALU作为流水线而且假定不需要进行内存存取,平均可以在少至2个周期内完成三线性内插。但是由于根据图像棱锥获得所以内插值,所以内插速度完全取决于高速缓存相关性(更不用说,其他单元正忙于进行翘曲映像缩放和跨距计算)。因此,应该有尽可能多的高速缓存行可以用于图像棱锥读过程。使用2个乘法ALU,最快的速度是8个周期。
利用使用两条高速缓存行的垂直带方式写迭代器,将输出像素写入DRAM。因此,速度被限制到最小值,即每个输出像素8个周期。如果缩放翘曲映像需要8个或者更少的周期,则总速度不变。否则,吞吐量就是缩放翘曲映像花费的时间。在大多数情况下,缩放翘曲映像以便匹配照片的大小。
假定翘曲映像要求每像素8个或者更少的周期进行缩放,则变换图像的一个彩色分量花费的时间是0.12s(1500*1000*8周期*10ns每个周期)。
直方图收集器
直方图收集器是微码程序,它将图像通道作为输入,而产生直方图作为输出。每个通道像素的值分别在0-255范围内。因此,在直方图表中有256个项目,每个项目32位,足以容纳整个1500×1000图像的计数。
如图92所示,由于直方图表示整个图像的概况,所以顺序读迭代器378足以满足输入。可以完全高速缓存直方图本身,这样需要32高速缓存行(1k)。
伪码具有两个通路:初始化通路,用于将所有计数设置为0;以及“计数”级,对于从图像读取的每个像素,递增正确计数器。第一级需要具有用于进行初始化的直方图表377的地址的地址单元和一个加法器ALU。
相对微码地址 |
地址单元A=直方图的基址 |
加法器单元1 |
0 |
Write 0 toA+(Adder1.Out1<<2) |
Out1=AA=A-1BNZ0 |
1 |
停止处理 |
停止处理 |
第二级处理图像中的实际像素,而且使用4个加法器ALU:
|
加法器1 |
加法器2 |
加法器3 |
加法器4 |
地址单元 |
1 |
A=0 | | |
A=-1 | |
2BZ2 |
Out1=AA=pixel |
A=Adder1.Out1Z=pixelAdder1.Out1 |
A=Adr.Out1 |
A=A+1 |
Out 1=Read 4bytes from:(A+(Adder1.Out1<<2)) |
3 | |
Out1=A |
Out1=A |
Out1=AA=Adder3.0ut1 |
WriteAdder4.Out1 to:(A+(Adder 2.Out<<2) |
4 | | | | |
WriteAdder4.Out1 to:(A+(Adder 2.Out<<2) |
只要输入像素相同,就使用Add2周期2输出的0标志以停留在微码地址2。在它发生变化时,将新计数写入微码地址3,然后,处理过程回到微码地址2。如果没有要读的像素,则在结束时使用微码地址4。
级1花费256个周期,即,2560ns。级2根据像素值发生变化。在最糟糕情况下,如果每个像素与其相邻像素不同,则用于查用表替换的时间是每个图像像素2个周期。用于搜索的一个彩色的时间是0.03s(1500×1000×2周期每个像素×10ns每个周期=30,000,000ns)。用于3个彩色分量的时间是该值的3倍,即,0.09s。
彩色变换
只要以两种方式实现彩色变换:
查用表替换
彩色空间变换
查用表替换
如图86所示,变换像素的彩色的最简单方式之一是将任意复杂变换函数编码为查用表380。像素的彩色分量值用于搜索381像素的新分量值。对于从顺序读迭代器读取的每个像素,从新彩色表380读取其新值,然后,写入顺序写迭代器383。为了有效使用内存带宽,可以同时在两个二分之一图像上对输入图像进行处理。使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
256项目每个项目8位 |
替换[X]利用X的8个最高有效位检索该表得到的8位作为固定的点0:8 |
整个进程需要2个顺序读迭代器和2个顺序写迭代器。2个新彩色表需要8条高速缓存行,它们分别保存256字节(1个字节的256个项目)。
因此,用于查用表替换的平均时间是每个图像像素1/2周期。用于搜索的一个彩色的时间是0.0075s(1500×1000×1/2周期每个像素×10ns每个周期=7,500,000ns)。用于3个彩色分量的时间是该值的3倍,即,0.0225s。在软件的控制下,逐个处理每个彩色分量。
彩色空间变换
仅当在彩色空间之间移动时,需要进行彩色空间变换。在RGB彩色空间,捕获CCD图像,而在CMY彩色空间进行打印,然而,ACP 31的客户很可能在Lab彩色空间处理图像。通常,需要将所有输入彩色空间通道作为输入确定每个输出通道的分量值。这样,图94所示的385示出该逻辑进程。
很简单,Lab、RGB以及CMY之间的变换非常直通。然而,特定器件的各彩色分布可能显著不同。因此,为了适应未来的CCD、墨水以及打印机,根据彩色空间变换查用表,利用三线性内插,ACP 31进行彩色空间变换。
彩色相关性趋向于基于面积,而非基于线。为了有助于在三线性内插搜索期间高速缓存相关性,最好处理垂直带内的图像。因此,读386至388迭代器和写389迭代器是垂直带方式迭代器。
三线性彩色空间变换
对于每个输出彩色分量,需要一个将输入彩色空间映像到输出彩色分量的3D表。例如,为了将CCD图像从RGB变换为Lab,需要与CCD的物理特性校准的3表:
RGB->L
RUB->a
RGB->b
为了从Lab变换为CMY,需要与墨水/打印机的物理特性校准的3表:
Lab->C
Lab->M
Lab->Y
可以将8位输入彩色分量表示为定点数(3:5),以指向变换表。3位的整数给出索引,而5位小数用于内插。由于3位给出8个值,所以3个方向给出512个项目(8×8×8)。每个项目的大小是1位,这样每个表需要512字节。
因此,如图95所示,可以实现变换彩色空间的进程,采用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
8×8×8项目512项目每个项目8位 |
变换[X,Y,Z]利用X、Y和Z的3个最高位检索表从三线性索引地址单元返回8个项目将获得的8位表示为定点8:0传送时间是8个项目(每个项目1个字节) |
三线性内插返回8个值之间的内插值。每个8位值从该查用表返回均花费1个周期,因此总共需要8个周期。在每个周期使用2个乘法ALU时,三线性内插还花费8个周期。在该专利文件的ALU小节给出通用三线性内插信息。查用表的512字节适于设置到16条高速缓存行上。
因此,变换图像的一个彩色分量花费的时间是0.105s(1500*1000*7个周期*10ns每个周期)。变换3个分量花费0.415s。幸运的是,在印出期间,快速执行为印出而进行的彩色空间变换,因此不存在可感延迟。
如果单独变换各彩色分量,则不必覆盖写其输入彩色空间分量,因为要变换每个分量需要输入彩色空间的所有彩色分量。
由于仅利用一个乘法单元进行内插,所以作为一种选择,可以利用一条通路执行整个Lab->CMY变换。这样可能需要3个垂直带方式读迭代器、3个垂直带方式写迭代器,而且同时对3个变换表进行存取。在这种情况下,可以写回输入图像,因此不需要额外存储器。然而,对3个变换表进行存取,等于高速缓存每个的1/3,这样整个进程的等待时间就长。
仿射变换
在将图像与照片合成之前,可能需要转动、缩放以及平移它。如果该图像仅被平移,则可以更快地使用直接子像素平移函数。然而,可以将转动、放大以及平移全部插入一个仿射变换中。
作为加速函数可以包括通用仿射变换。仿射变换局限于2D,而且如果是缩小,则应该利用缩放函数与缩放输入图像。具有通用仿射变换函数可以一次一块地构造输出图像,而且可以缩短对图像进行大量变换花费的时间,因为可以同时进行所有变换。
需要客户提供变换矩阵,该矩阵应该是要求的变换的逆矩阵,即,对输出像素坐标应用该矩阵给出输入坐标。
2D矩阵通常被表示为一个3×3阵列:
由于第三列始终是[0,0,1],所以客户不需要规定它。但是,客户要规定a、b、c、d、e和f。
已知其左上角像素坐标是(0,0)的输出图像(x,y)内的坐标,则利用:(ax+cy+c,bx+dy+f)规定输入坐标。一旦确定了输入坐标,就可以采样输入图像,以得到像素值。双线性内插输入图像像素用于确定位于计算坐标的像素的值。由于仿射变换保存并行线,所以对于最佳平均输入图像高速缓存相关性,在32像素宽的输出垂直带内处理图像。
需要3个乘法ALU在两个周期内进行双线性内插。乘法ALU1和2分别在线Y和Y+1的X方向上进行线性内插,而乘法ALU3在乘法ALU1和2输出的数值之间进行线性内插。
由于在X上的输出线上向右移动,所以通过分别将“a”与当前X值相加,以及将“b”与当前Y值相加,2个加法器ALU计算实际输入图像坐标。在进展到下一条线时(或者是处理了最多32个像素后,位于垂直带内的下一条线,或者是新垂直带内的第一条线),更新X和Y,以预计算给定块的开始坐标值常数。
图96示出计算输入坐标的进程,其中利用软件设置下面的常数:
计算像素
一旦获得了输入图像坐标,就必须采样该输入图像。查用表用于返回规定坐标的值,以准备好进行双线性内插。图97示出基本进程,而且使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
图像宽度×图像高度每个项目8位 |
搜索的双线性图像[X,Y]利用X和Y的整数部分检索表。每2个周期,从双线性索引地址单元返回4个项目。将每个8位项目表示为定点8:0 |
| |
传送时间是2个周期(FIFO内的2个16位项目保存4个8位项目) |
仿射变换需要全部4个乘法单元和全部4个加法器ALU,而且利用良好的高速缓存相关性可以以平均每个输出像素2个周期实现仿射变换。该时限假定良好高速缓存相关性,这对于非扭曲图像是正确的。最糟糕的时限会严重扭曲图像,有意义的Vark脚本不可能含有严重扭曲图像。
因此,变换128×128图像花费的时间是0.00033秒(32,768周期)。如果这是具有4个通道的剪贴图像(包括通道),花费的总时间是0.00131秒(131,072周期)。
需要垂直带方式写迭代器输出像素。而不需要读迭代器。然而,由于存取输入图像像素花费的时间限制了仿射变换加速器,所以应该对从输入图像读取的像素分配尽可能多的高速缓存行。至少32个高速缓存行应该可用,优先是64个或者更多个高速缓存行。
缩放
缩放实际上是重采样图像。利用仿射变换函数可以放大图像。利用硬件加速缩放函数,可以对图像执行包括缩小的广义缩放。在X方向和Y方向单独进行缩放,因此可以在每个方向分别使用不同的比例因数。
广义缩放单元必须利用对齐过程匹配仿射变换比例函数。图98示出广义缩放进程。利用Fant的重采样算法实现X方向上的缩放,如图99所示。
其中利用软件设置下面的常数:
常数 |
值 |
K1 |
对X方向上的输出像素产生影响的输入像素的数量 |
K2 |
1/K1 |
下面的寄存器用于保存临时变量:
变量 |
值 |
Latch1 |
保留未使用的输入像素的数量(从1开始并递减) |
Latch2 |
保留的对当前输出像素产生影响的输入像素的数量(从K1开始并递减) |
Latch3 |
下一个像素(X方向上的) |
Latch4 |
当前像素 |
Latch5 |
用于输出像素(未缩放的)的累加器 |
Latch6 |
在X方向缩放的像素(输出) |
图100示出Y方向上所缩放进程,而且利用稍许改变的Fant子采样算法实现该进程,从而以X像素顺序进行处理。
其中利用软件设置下面的常数:
常数 |
值 |
K1 |
对Y方向上的输出像素产生影响的输入像素的数量 |
K2 |
1/K1 |
下面的寄存器用于保存临时变量:
变量 |
值 |
Latch1 |
保留未使用的输入像素的数量(从1开始并递减) |
Latch2 |
保留的对当前输出像素产生影响的输入像素的数量(从K1开始并递减) |
Latch3 |
下一个像素(Y方向上的) |
Latch4 |
当前像素 |
Latch5 |
在Y方向缩放的像素(输出) |
使用下面的DRAM FIFO:
搜索 |
大小 |
详细说明 |
FIFO1 |
ImageWidthOUT项目每个项目8位 |
1行已经在X方向缩放的图像像素1个周期的传送时间 |
FIFO2 |
ImageWidthOUT项目每个项目16位 |
1行已经在X方向缩放的图像像素2个周期的传送时间(每个周期1字节) |
镶嵌图像
镶嵌图像是一种铺砌形式。它包括在水平方向和垂直方向将专门设计的“瓷砖(tile)”拷贝多次,以形成第二(通常更大的)图像空间。在被镶嵌时,小瓷砖形成无缝画面。其一个例子是部分砖墙上的小瓷砖。这样设计它们,以便在被镶嵌时,它形成整个砖墙。请注意,在镶嵌过程中,没有缩放或子像素平移。
进行镶嵌的最高速缓存相关形式是逐行顺序输出图像,并在该行的时长内重复输入图像的同一行。在结束该行时,输入图像必须进展到下一行(并在输出行上将它重复多次)。
图101的390示出镶嵌函数的概况。建立顺序读迭代器392以连续读输入瓷砖的一行(StartLine是0,而EndLine是1)。将每个输入像素写入所有3个写迭代器393至395中。加法器ALU内的计数器397递减计数输出行上的像素数量,终止位于该行末端的序列。
在结束处理该行时,在重新开始伪码和顺序读迭代器,小型软件例程更新该顺序读迭代器的StartLine寄存器和EndLine寄存器(这样清除FIFO并重复行2的瓷砖)。不更新写迭代器393至395,它们仅保持对输出图像的各部分进行写。有效作用在于,瓷砖使一行在输出行上重复,然后,再在垂直方向重复瓷砖。
该进程未完全使用内存带宽,因为在输入图像中获得了良好的高速缓存相关性,但是它的确使镶嵌利用任意大小的瓷砖运行。该进程使用1个加法器ALU。如果3个写迭代器393至395分别对1/3的图像进行写(根据瓷砖大小的边界分割图像),则以每个输出图像像素值1/3周期的平均速度,执行整个镶嵌进程。对于1500×1000的图像,它等于0.005秒(5,000,000ns)。
子像素平移器
在将图像与背景合成之前,可能需要在X方向和Y方向将其平移子像素量。子像素变换可以在每个方向使图像的大小增加1个像素。图像外的区域值可以是客户确定的,例如是常数值(例如,黑色),或边缘像素复制。通常,使用黑色将更好。
图102示出子像素平移进程。利用下式定义给定方向上的子像素平移:
像素out=像素in*(1-平移)+像素in-1*平移
还可以将它表示为内插形式:
像素out=像素in-1+(像素in-像素IN-1)*平移
一起使用一个乘法ALU和一个加法器ALU实现一个(平均值)周期内插引擎是直通的。X方向和Y方向上的子像素平移需要2个内插引擎。
为了在Y方向进行子像素平移,需要2个顺序读迭代器400、401(一个正在读同一个图像中的另一行之前的行),而且需要一个顺序写迭代器403。
第一内插引擎(Y方向的内插)从两个流中接收数据对,并在它们之间进行线性内插。第二内插引擎(X方向的内插)接收其数据作为一个1维流并线性内插在各值之间。这两个引擎平均以1个周期进行内插。
内插引擎405、406平均均可以每个输出像素1个周期地进行子像素平移。因此,在需要2个乘法ALU和2个加法器ALU情况下,总时间是每个输出像素一个周期。
由子像素平移函数输出32像素花费的时间平均为320ns(32个周期)。这个时间足以对DRAM进行4全高速缓存行存取,因此在时限范围内,使用3个顺序迭代器最佳。
因此,子像素平移图像花费的总时间是输出图像的每个像素1个周期。要子像素平移的典型图像是128*128大小的瓷砖。输出图像大小是129*129。该进程占用129*129*10ns=166,410ns。
图像铺砌器(Tiler)函数还使用子像素平移算法,但是不需要写出子像素平移数据,而对它做进一步处理。
图像铺砌器
以软件形式实现铺砌图像的高级算法。一旦确定了设置的瓷砖,就必须合成正确着色的瓷砖。实际上,利用伪码ALU,以硬件形式将每个瓷砖合成到图像上。合成瓷砖的过程包括对背景图像进行纹理应用和彩色应用。在某些情况下,最好将附加到背景实际纹理数量与希望的纹理数量比较,并利用此缩放要施加的彩色。在这些情况下,必须首先施加纹理。
由于彩色应用功能性和纹理应用功能性在某种程度上是独立的,所以它们单独形成子函数。
下表概括说明不同纹理风格和着色风格的每4通道瓷砖合成的周期数:
|
固定颜色 |
像素颜色 |
替换纹理 |
4 |
4.75 |
25%背景+瓷砖纹理 |
4 |
4.75 |
平均高度算法 |
5 |
5.75 |
采用反馈的平均高度算法 |
5.75 |
6.5 |
瓷砖着色和合成
设置瓷砖,以便或者具有固定颜色(对于整个瓷砖),或者从输入图像中取每个像素值。此外,这两种情况均可以从纹理处理级获得反馈,以缩放不透明度(类似于细线化(thining)着色)。
可以将这4种情况的各步骤概况为:
●子像素平移瓷砖的不透明度值
●任选缩放瓷砖的不透明度(如果从纹理应用获得的反馈使能)
●确定像素的颜色(固定的,或者是从图像映像获得的)
●将像素合成到背景图像上。
为了将执行该函数花费的时间缩短到最短,分别处理这4种情况中的每种情况。下表描述了一个彩色通道的每种颜色合成风格的总时间:
铺砌颜色风格 |
没有从纹理得到反馈(每个像素的周期数) |
从纹理得到的反馈(每个像素的周期数) |
瓷砖的每个像素具有固定颜色 |
1 |
2 |
瓷砖具有从输入图像获得的每种像素颜色 |
1.25 |
2 |
固定颜色
在这种情况下,瓷砖具有利用软件确定的固定颜色。在ACP 31铺设一块瓷砖时,软件可以确定铺设并着色下一块瓷砖。
通过双线性内插被缩放的铺砌图像,可以确定瓷砖的颜色。可以产生并存储缩放的图像代替图像棱锥,而且每个项目瓷砖操作仅需要执行一次。如果瓷砖大小是128×128,则可以在每个方向将图像缩小128∶1倍。
没有反馈
当不存在对存储进行纹理处理获得的反馈时,在规定的坐标铺设瓷砖。瓷砖颜色用于每个像素颜色,而且由瓷砖的子像素平移不透明度通道获得合成的不透明度。在这种情况下,在铺砌通路之间,可以完全独立地处理彩色通道和纹理通道。
图103示出该进程的概况。利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖的子像素平移410。子像素平移的输出是将固定瓷砖颜色412与背景顺序读迭代器输出的背景图像合成411在一起时使用的标记。
利用1个乘法ALU和1个加法器ALU,在每个合成1个周期的平均时间内,可以实现合成。因此,需要3个乘法ALU和3个加法器ALU。需要4个顺序迭代器413至416,花费320ns读或写其内容。在以每个像素的平均周期数进行子像素平移和合成的情况下,有足够的时间读和写该缓冲器。
具有反馈
当存在纹理处理瓷砖产生的反馈时,在规定的坐标铺设瓷砖。瓷砖颜色用于每个像素的颜色,而且由利用反馈参数缩放的、瓷砖的子像素平移不透明度通道获得合成的不透明度。这样,必须在应用彩色值之前,计算纹理值。
图97示出该进程的概况。利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖的子像素平移。子像素平移的输出是根据从反馈顺序读迭代器420读取的反馈进行缩放的标记。将该反馈送到缩放器(Scaler)(1个乘法ALU)421。
利用1个乘法ALU和1个加法器ALU,在每个合成1个周期的平均时间内,可以实现合成422。因此,需要4个乘法ALU和4个加法器ALU。尽管在平均1个周期内可以实现整个进程,但是瓶颈仍然是内存存取,因为需要5个顺序迭代器。在充分缓存的情况下,平均时间是每个像素1.25周期。
输入图像中的颜色
对瓷砖内的像素进行着色的一种方式是从输入图像的像素中获取颜色。此外,对于合成存在两种可能性:具有纹理处理产生的反馈以及不具有纹理处理产生的反馈。
没有反馈
在这种情况下,仅由输入图像的相关像素获得瓷砖颜色。从移位的、瓷砖的不透明度通道子像素获得合成的不透明度。
图105示出该进程的概况。利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖的子像素平移425。子像素平移的输出是在将瓷砖的像素颜色(从输入图像428读取的)与背景图像429合成426在一起时使用的标记。
利用1个乘法ALU和1个加法器ALU,在每个合成1个周期的平均时间内,可以实现合成426。因此,需要3个乘法ALU和3个加法器ALU。尽管在平均1个周期内可以实现整个进程,但是瓶颈仍然是内存存取,因为需要5个顺序迭代器。在充分缓存的情况下,平均时间是每个像素1.25周期。
具有反馈
在这种情况下,仍由输入图像中的相关像素获得瓷砖颜色,但是合成的不透明度受在纹理处理通路期间实际应用的纹理高度的相对数量的影响。图106示出该进程。
利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖的子像素平移431。子像素平移的输出是根据从反馈顺序读迭代器432读取的反馈进行缩放431的标记。将该反馈送到缩放器(Scaler)(1个乘法ALU)431。
利用1个乘法ALU和1个加法器ALU,在每个合成1个周期的平均时间内,可以实现合成434。
因此,总共需要4个乘法ALU和3个加法器ALU。尽管在平均1个周期内可以实现整个进程,但是瓶颈仍然是内存存取,因为需要6个顺序迭代器。在充分缓存的情况下,平均时间是每个像素1.5周期。
瓷砖纹理处理
每块瓷砖具有由其纹理通道确定的表面纹理。必须对纹理进行子像素平移,然后,将它施加到输出图像上。纹理合成有3种风格:
替换纹理
25%背景+瓷砖纹理
平均高度算法
此外,平均高度算法还可以保存用于颜色合成的反馈参数。
下表概括说明每种纹理合成风格花费的时间:
铺砌颜色风格 |
每个像素的周期数(没有从纹理得到反馈) |
每个像素的周期数(从纹理得到反馈) |
替换纹理 |
1 |
- |
25%背景+瓷砖纹理值 |
1 |
- |
替换纹理
在该例中,瓷砖的纹理代替图像的纹理通道,如图107所示。利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖纹理的子像素平移436。将该子像素平移的输出直接送到顺序写迭代器437。
替换纹理合成花费的时间是每个像素1个周期。没有反馈,因为始终将100%的纹理值施加到背景。因此,不需要以任何特定顺序处理该通道。
25%背景+瓷砖纹理
在该例中,将瓷砖上的纹理与25%的现有纹理值相加。该新值一定大于或者等于原始值。此外,必须将新纹理值限幅为255,因为纹理通道只有8位。图108示出所采用的进程。
利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖纹理的子像素平移440。将该子像素平移440的输出送到加法器441,加法器441将它与背景纹理值的1/4 442相加。未用于子像素平移的2个加法器提供Min与Max函数444,然后,将输出写入顺序写迭代器445。
这种风格的纹理合成花费的时间是每个像素1个周期。没有反馈,因为考虑将100%的纹理值施加到背景(即使在255进行限幅)。因此,不需要以任何特定顺序处理该通道。
平均高度算法
在该纹理应用算法中,计算瓷砖下面的平均高度,然后,将每个像素的高度与该平均高度进行比较。如果像素的高度小于该平均值,则对该背景高度附加笔画(stroke)高度。因此,背景峰值细线化该笔画。强迫该高度增加最小数量,以防止背景将笔画应用细线化到0(然而,最小数量可以是0)。还在255限幅该高度,因为纹理通道的8位分辨率。
可以存在作为施加的纹理与预期施加的数量之间的差值的反馈。在应用瓷砖颜色时,该反馈量可以用作比例因数。
在这两种情况下,软件提供平均纹理,通过对缩放的纹理映像进行双线性内插,计算平均纹理。在应用当前瓷砖时,软件确定下一块瓷砖的平均纹理高度。软件必须提供要附加的最小厚度,通常,该最小厚度对整个铺砌进程是恒定的。
没有反馈
如果没有反馈,则仅将纹理施加到背景纹理上,如图109所示。
需要4个顺序迭代器,这意味着,如果可以在1个周期内对该进程进行流水线作业,则内存可以保持足够快。
利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖纹理的子像素平移450。为了在1个周期内完成全部运算,Min与Max函数451、452分别需要单独的加法器ALU。由于纹理的子像素平移已经使用了2个,所以剩下的对于1个周期的平均时间就不够了。
因此,处理1个像素的纹理的平均时间是2个周期。请注意,没有反馈,因此与合成的彩色通道顺序无关。
具有反馈
从理论上说,除了在纹理应用算法的标准处理之外,还需要记录实际施加的纹理的比例以外,这与没有反馈的情况相同。该比例可以用作之后将瓷砖颜色合成到背景图像上使用的比例因数。图110示出流程图,而且使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
256个项目每个项目16位 |
1/N利用N(范围在0至255之间)检索表将获得的16位表示为定点0:16 |
软件提供的1/N表460内的256个项目中的每个项目均是16位,因此需要16个高速缓存行连续保存。
利用2个乘法ALU和2个加法器ALU,在每个输出像素1个周期的平均时间内,可以实现瓷砖纹理的子像素平移461。为了在1个周期内完成全部运算,Min函数462和Max函数463分别需要单独的加法器ALU。由于纹理的子像素平移已经使用了2个,所以剩下的对于1个周期的平均时间就不够了。
因此,处理1个像素的纹理的平均时间是2个周期。必须对反馈数据区分配足够空间(瓷砖大小的图像通道)。必须在施加瓷砖颜色之前,施加纹理,因为在缩放瓷砖的不透明度时使用反馈。
CCD图像内插器
通过ISI 83(参考图3)从CCD获得的图像是750×500像素。在通过ISI捕获图像时,相机的取向用于将像素转动0、90、180或270度,以便图像的顶部为“上”。由于每个像素仅具有R、G或B彩色分量(而不是全部3个分量),所以在解释像素值时,必须考虑到它们被转动这个事实。根据相机的取向,每个2×2像素块具有图111所示的结构之一:
为了将CCD捕获的图像变换为进行处理的有用形式,需要对它进行几种处理:
●在CCD图像中,上内插低采样速率彩色分量(解释像素的正确取向)
从RGB彩色变换到内部彩色空间
●将内部空间图像从750×500放大到1500×1000。
●以平面格式写出该图像
为了能够进行翘曲处理,需要同时可以使用图像的整个通道。在低内存模型(8MB)中,只有够保存作为临时对象的、满分辨率的一个通道的空间。因此,对一个彩色通道进行彩色变换。该进程的限制因素是彩色变换,因为它包括从RGB到内部彩色空间的三线性内插,这是一个每个通道花费0.026ns的进程(750×500×7周期每个像素×10ns每个周期=26,250,000ns)。
重要的是,在缩放内部彩色空间图像之前,进行彩色变换,因为这样可以减少利用因数4放大的像素的数量(因此,缩短总处理时间)。
对所有变换的要求可能不适合ALU解决方案。因此,在两个阶段进行变换:
阶段1:在CCD图像中上内插低采样速率彩色分量(解释像素的正确取向)
从RGB到内部彩色空间进行彩色变换。
以平面格式写出图像
阶段2:将内部空间图像从750×500放大到1500×1000
分离出比例函数意味着,必须将小彩色变换图像与大彩色变换图像同时存储到内存中。可以将阶段1(0.5MB)的输出安全地写入通常为图像棱锥保留的存储区(1MB)。阶段2的输出可以是放大的通用CCD图像。分开缩放还可以利用仿射变换进行缩放,而且还可以具有可能不是简单的1∶2放大的不同CCD分辨率。
阶段1:上内插低采样速率彩色分量
为了对给定像素进行彩色变换,3个彩色分量(R、G和B)分别需要被上内插。有7个周期用于内插每个像素,因为彩色变换花费7个周期。
内插G是直通的,图112示出内插G的过程。根据取向,实际像素值G在奇数行上的奇数像素与偶数行上的偶数像素之间交替,以及在偶数行上的奇数像素与奇数行上的偶数像素之间交替。在这两种情况下,线性内插均是所需要的。如图113所示,内插R分量和B分量更复杂,因为正如从该附图看到的那样,要求在水平方向和垂直方向同时对3行像素进行存取,因此需要3个顺序读迭代器,每个顺序迭代器偏移一行。此外,利用每行的锁存器,对同一行上的先前像素进行存取。
因此,每个像素含有CCD输出的一个分量,而另外两个分量被上内插。在双线性内插一个分量时,线性内插另一个分量。由于内插因数是常数0.5,所以通过进行加法运算并向右移位1位(在1个周期内),就可以计算内插,而通过进行3次加法运算并向右移位2位(在3个周期内),就可以计算双线性内插。因此,利用一个乘法ALU,所需的总周期数是4。
图115示出将偶数行偶数像素(EL,EP)以及奇数行奇数像素(OL,OP)转动0度的情况,而图116示出将奇数行偶数像素(EL,OP)以及奇数行偶数像素(OL,EP)转动0度的情况。其他转动仅是这两种表示的不同形式。
彩色变换
利用与在通用彩色空间变换函数描述的方法相同的方法,实现从RGB到Lab的彩色空间变换。这是一个每个像素花费8个周期的进程。将参考图117说明阶段1的处理过程。
上内插RGB占用4个周期(1个乘法ALU),但是彩色空间变换每个像素占用8个周期,因为搜索传送时间。
阶段2
缩放图像
该阶段涉及将CCD分辨率(750×500)输出的图像内插成工作照片分辨率(1500×1000)。利用1∶2的比例,通过运行仿射变换可以进行放大。通用仿射变换的时限是每个输出像素2个周期,在这种情况下,意味着缩放时间历时0.03秒。
照射图像
一旦图像被处理,就可以利用一个或者多个光源照射它。光源可以是:
1.定向光源—距离无穷远,因此它以一个方向照射平行光
2.全向光源—在所有方向照射不聚焦的光
3.点光源—将聚焦光束照射到特定目标点。存在与点光源有关的锥形半阴影。
景物还可以具有有关块形映像,以使反射角发生变化。还可以选择环境光出现在照射景物上。
在加速照射的进程中,我们关心利用一个光源照射一个图像通道。多个光源每个通路一个光源地照射作为多个通路的一个图像通道。利用块形映像或者不利用块形映像,可以一次一个地对多个通道进行处理。
如果存在,则根据块形映像,计算像素上的法面矢量(N)。如果没有块形映像,则缺省法面矢量垂直于图像面,即,N=[0,0,1]。
视矢量V始终垂直于图像面,即,V=[0,0,1]。
对于定向光源,从像素到光源的光源矢量(L)是穿过整个图像的常数,因此对整个图像计算该光源矢量。对于全向光源(位于有限距离),对每个像素单独计算光源矢量。
根据:IakaOd,计算环境光的像素反射。
根据Phong模型:fattIp[kdOd(N·L)+ksOs(R·V)n],计算像素扩散和光源的镜面反射。
在该光源处于无穷远时,在整个图像上,光源光强是常数。
每种光源对像素具有3种作用
环境作用
扩散作用
镜面作用
可以利用下面的变量确定光源:
dL |
距离光源的距离 |
fatt |
随距离变化的衰减[fatt=1/dL 2] |
R |
归一化反射矢量[R=2N(N·L)-L] |
Ia |
环境光光强 |
Ip |
扩散光系数 |
ka |
环境反射系数 |
kd |
扩散反射系数 |
ks |
镜面反射系数 |
ksc |
镜面颜色系数 |
L |
归一化光源矢量 |
N |
归一化法面矢量 |
n |
镜面指数 |
Od |
对象的扩散颜色(即,图像像素颜色) |
Os |
对象的镜面颜色(kscOd+(1-ksc)Ip) |
V |
归一化视矢量[V=[0,0,1]] |
对每个彩色分量使用同样的反射系数(ka,ks,kd)。
给定像素的值等于环境作用加每种光的扩散作用与镜面作用之和。
照射计算的子进程
为了计算扩散作用和镜面作用,需要进行各种其他计算。这些计算是:
1/√X
N
L
N·L
R·V
fatt
fcp
还确定用于计算下面的作用的子进程:
环境作用
扩散作用
镜面作用
然后,可以将各子进程用于计算光源的总照度。由于只有4个乘法ALU,所以用于特定类型光源的伪码可以具有性能适当交织的子进程。
计算1/√X
Vark照明模型使用矢量。在许多情况下,对于进行归一化,重要的是计算矢量长度的倒数。计算长度的倒数就需要计算1/平方根[X]。
将该进程表示为如图118所示具有输入和输出的进程是合乎逻辑的。参考图119,通过搜索估计值,然后通过迭代一次下面的函数,进行计算:
Vn+1=1/2·Vn(3-XVn 2)
迭代次数取决于要求的精度。在这种情况下,仅要求16位精度。因此,该表可以具有8位精度,而且仅需要进行一次迭代。利用软件设置
使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
256个项目每个项目8位 |
1/平方根[X]利用X的8位最高有效位检索表将获得的8位表示为定点0:8 |
计算N
N是法面矢量。在不存在块形映像时,N是常数。在存在块形映像时,必须对每个像素计算N。
没有块形映像
在没有块形映像时,存在固定的法面矢量N,它具有下面的特性:
N=[XN,YN,ZN]=[0,0,1]
||N||=1
1/||N||=1
归一化的N=N
可以利用这些特性代替专门计算法线矢量以及1/||N||,因此可以优
化其他计算。
具有块形映像
如图120所示,在存在块形映像时,通过将X方向和Y方向的块形映像值进行比较,计算N。图120示出根据同一行和同一列上的像素计算像素P1的N的过程,但是不包括计算位于P1的值本身。通过乘以比例因数(X方向和Y方向的比例因数相同),可以使计算N的过程独立分解。可以将该进程表示为如图121所示的具有输入和输出的进程(ZN始终是1)。
由于ZN始终是1,所以还不归一化XN和YN(因为ZN=1)。延迟归一化N,直到计算了N·L之后,以便仅与1/||N||进行一次乘法,而不是3次乘法。
图122示出计算N的实际进程。
利用软件设置下面的常数:
常数 |
值 |
K1 |
ScaleFactor(使N独立分解) |
计算L
定向光源
在光源处于无穷远位置时,它具有有效固定光矢量L。归一化L,然后利用软件计算它,以致:
L=[XL,YL,ZL]
||L||=1
1/||L||=1
可以利用这些特性代替专门计算L以及1/||L||,因此可以优化其他计算。图123示出该进程。
全向光源和点光源
在该光源不处于无穷远位置时,L是从当前点P到光源P1的矢量。由于P=[XP,YP,0],则利用下式给出L:
L=[XL,YL,ZL]
XL=XP-XPL
YL=YP-YPL
ZL=-ZPL通过分别乘以||L||,归一化XL,YL和ZL。通过计算下式,计算1/||L||(供之后在进行归一化时使用):
V=XL 2+YL 2+ZL 2
然后,计算V-1/2。
在这种情况下,可以将计算L表示为如图124所示具有输入和输出的进程。
XP和YP是正在计算其照度的像素的坐标。ZP始终是0。
图125示出计算L的实际进程。
其中利用软件设置下面的常数:
常数 |
值 |
K1 |
XPL |
K2 |
YPL |
K3 |
ZPL 2(因为ZP是0) |
K4 |
-ZPL |
计算N·L
计算的矢量N与L的点积被定义为:
XNXL+YNYL+ZNZL
没有块形映像
在没有块形映像时,N是常数[0,0,1]。因此N·L减小到ZL。
具有块形映像
在存在块形映像时,就必须直接计算点积。不是从归一化的N分量中取出,而是在获取了非归一化的N与归一化的L的点积之后,进行归一化。或者利用软件归一化L(如果它是常数),或者利用计算L的进程归一化L。图126示出该进程。
请注意,不需要ZN作为输入,因为它被确定为1。然而,为了归一化该结果,需要||N||代替。图127示出用于计算N·L的一个实际进程。
计算R·V
为了进行镜面作用计算,需要R·V作为输入。由于V=[0,0,1],所以仅需要Z分量。因此R·V减小到:
R·V=2ZN(N·L)-ZL
此外,由于非归一化的ZN=1,所以归一化的ZN=||N||。
没有块形映像
在N是常数时(即,没有块形映像)是最简单的实现过程。由于N和V是常数,所以可以简化N·L和R·V:
V=[0,0,1]
N=[0,0,1]
L=[XL,YL,ZL]
N·L=ZL
R·V=2ZN(N·L)-ZL
=2ZL-ZL
=ZL
在L是常数时(定向光源),每当需要R·V时,总要利用软件以常数形式提供归一化的ZL。在L发生变化(全向光源和点光源)时,必须快速计算归一化的ZL。它是计算L进程的输出。
具有块形映像
在N不是常数时,计算R·V的进程仅是实现广义公式:
R·V=2ZN(N·L)-ZL。
图128示出各输入和输出,图129示出实际实现过程。
计算衰减因数
定向光源
在光源位于无穷远位置时,图像上的光强不发生变化。因此,衰减因数fatt是1。可以利用该因数优化进行无穷远光源的照度计算过程。
全向光源和点光源
在光源未处于无穷远位置时,光强可以根据下面的公式发生变化:
fatt=f0+f1/d+f2/d2。
适当设置系数f0、f1和f2,可以使光强以根据距离线性变化的常数衰减,或者以距离的平方衰减。
由于d=||L||,所以可以将计算fatt的过程表示为如图130所示具有下面的输入和输出的进程。
在图131中,定义了计算fatt的实际进程。
计算锥形半阴影因数
定向光源和全向光源
这两个光源是不聚焦的,因此,没有锥形或半阴影。因此,锥形—半阴影比例因数fcp是1。可以利用该常数优化进行定向光源和全向光源的照度计算过程。
点光源
点光源聚焦到特定目标点(PT)上。点光源的光强根据图像的特定点是在锥形、半阴影内,还是在锥形/半阴影区域外变化。
现在,参考图132,图132示出fcp根据半阴影位置变化的曲线图。在锥形470的内部,fcp是1,在半阴影471的外部,fcp是0。从锥形的边缘直到半阴影的末端,光强根据三次函数472变化。
图133和图134示出半阴影475和锥形476的各矢量的计算过程。
请看图134所示1维图像的表面,确定3个角度A、B和C。A是目标点479、光源478以及锥形的末端480之间的夹角。C是目标点479、光源478以及半阴影的末端481之间的夹角。对于给定的光源这两个夹角是固定的。B是目标点479、光源478以及正在计算的位置482之间的夹角,因此B随着图像上正在计算的每个点发生变化。
将范围A到C归一化为0到1,而且利用下面的公式求得B在该角度范围内的距离:
(B-A)/(C-A)
利用截断,可以强迫该范围在范围0到1内,而且该值用于搜索fcp的三次近似。
因此,可以将计算f
cp的过程表示为图135所示的具有输入和输出的进程,图136示出计算f
cp的实际进程,其中利用软件设置下面的常数:
常数 |
值 |
K1 |
XLT |
K2 |
YLT |
K3 |
ZLT |
K4 |
A |
K5 |
1/(C-A)·[MAXNUM if no penumbra] |
使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
64个项目每个项目16位 |
Arcos(X)单位与常数K5和K6的相同利用最高6位检索表线性内插2个项目的结果时限是2*8位*2个项目=4个周期 |
LU2 |
64个项目每个项目16位 |
光响应函数fcpF(1)=0,F(0)=1,其他的根据三次函数利用最高6位检索表(1:5)线性内插2个项目的结果时限是2*8位=4个周期 |
计算环境作用
不考虑对图像辐照的光量,对于每个像素一次性施加环境光作用,而且环境光作用不取决于块形映像。
可以将环境计算进程表示为图131所示的具有输入和输出的进程。如图138所示,实现该进程需要利用常数值(I
ak
a)乘以输入图像(O
d)中的每个像素,其中利用软件设置项目的常数:
计算扩散作用
辐照到表面上的每条光均产生扩散照度。利用下面的公式给出扩散照度:
扩散=kdOd(N·L)
有2种不同的实现过程可以考虑:
实现过程1—常数N和L
在N和L均为常数时(定向光源而且没有块形映像):
N·L=ZL
因此:
扩散=kdOd ZL
由于O
d是唯一的变量,所以图139示出用于计算扩散作用的实际进程,其中利用软件设置下面的常数:
实现过程2-非常数N和L
在或者N或者L是非常数(或者块形映像或者全向光源或点光源产生的照度)时,直接根据下面的公式,计算扩散:
扩散=kdOd(N·L)
可以将扩散计算进程表示为图140所示的具有输入的进程。可以利用计算N·L进程计算N·L,也可以将N·L设置为常数。图141示出计算扩散作用的实际进程,其中利用软件设置下面的常数:
计算镜面作用
辐照到表面上的每条光均产生镜面照度。利用下面的公式给出镜面照度:
镜面=ksOs(R·V)n
其中Os=kscOd+(1-ksc)IP
有2种不同的实现过程可以考虑:
实现过程1-常数N和L
在N和L均为常数时(定向光源而且没有块形映像),采用第一种实现过程。由于N、L和V均是常数,所以N·L和R·V也是常数:
V=[0,0,1]
N=[0,0,1]
L=[XL,YL,ZL]
N·L=ZL
R·V=2ZN(N·L)-ZL
=2ZL-ZL
=ZL
因此,可以将镜面计算过程减少到:
镜面=ksOsZL n
=ksZL n(kscOd+(1-ksc)IP)
=kskscZL nOd+(1-ksc)IP ksZL n
由于在镜面计算过程中,只有O
d是变量,所以可以将计算镜面作用的过程表示为图142所示的具有输入和输出的进程,而图143示出用于计算镜面作用的实际进程,其中利用软件设置下面的常数:
常数 |
值 |
K1 |
kskscZL n |
K2 |
(1-ksc)IP ksZL n |
实现过程2-非常数N和L
在或者N或者L是非常数(或者块形映像或者全向光源或点光源产生的照度)时,采用该实现过程。这意味着,必须提供R·V,因此还必须计算R·Vn。
可以将镜面计算进程表示为图144所示的具有输入和输出的进程,而图145示出用于计算镜面作用的实际进程,其中利用软件设置下面的常数:
常数 |
值 |
K1 |
ks |
K2 |
ksc |
K3 |
(1-ksc)IP |
使用下面的查用表:
搜索 |
大小 |
详细说明 |
LU1 |
32个项目每个项目16位 |
Xn利用整数R·V的最高5位检索表利用R·V的小数,线性内插2个项目的结果利用2次乘法进行内插从查用表中检索数据的时间是2*8位*2个项目=4个周期 |
当环境光是唯一照射光时
如果环境作用是唯一光源,则该进程非常直通,因为无需对任何东西附加环境光,图146示出其全部进程。我们将图像垂直分割为2个部分,而且通过复制环境光逻辑(因此使用总共2个乘法ALU和4个顺序迭代器),同时对这两个部分进行处理。因此,对于环境光辐照,时限是每个像素1/2周期。
典型的照射情况是一个或者多个光源照明的景物。在这些情况下,因为环境光计算成本如此低,环境计算包括在每个光源的处理过程中。要处理的第一光应该具有正确的Iaka设置,而后续光应该具有O值Iaka(以防止多环境作用)。
如果作为单独通路(而且不是第一通路)处理环境光,则需要将环境光附加到当前计算的值(需要对同一个地址计算读和写)。图147示出该进程的概况。
该进程使用3个图像迭代器,1个乘法ALU,而且平均每个像素占用1个正确。
无穷远光源
对于无穷远光源,图像上具有固定光源强度。因此,L和fatt均是常数。
没有块形映像
在没有块形映像时,存在固定法线矢量N[0,0,1]。利用常数N、L和f
att,可以显著降低照度的复杂性。图147示出在没有块形映像的情况下,照射一个定向光的进程,其中利用软件设置下面的常数:
对于一个无穷远光源,我们希望执行图148所示的逻辑运算,其中K
1至K
4是具有下面的值的常数:
常数 |
值 |
K1 |
Kd(NsL)=KdLZ |
K2 |
Ksc |
K3 |
Ks(NsH)n=KsHZ 2 |
K4 |
IP |
由于K2、K3和K4是常数,所以可以简化该进程。因为复杂性基本上在于计算镜面作用和扩散作用(使用3个乘法ALU),所以可以安全地利用第四乘法ALU附加环境计算。正在处理的第一无穷远光源可以具有实际环境光参数Iaka,而且所有后续无穷远光可以将Iaka设置为0。实际上,可以自由进行环境光计算。
如果该无穷远光源是辐照的第一光,则不需要包括其他光源产生的现有作用,图149示出这种情况,其中各常数具有下面的值:
常数 |
值 |
K1 |
Kd(LsN)=KdLZ |
K4 |
IP |
K5 |
(1-Ks(NsH)n)IP=(1-KsHZ n)IP |
K6 |
KscKs(NsH)n)IP=KscKsHZ nIP |
K7 |
Iaka |
如果无穷远光源不是辐照的第一光,必须包括先前处理的光产生的现有作用(同样的常数),图148示出这种情况。
在第一种情况下,需要2个顺序迭代器490、491,而在第二种情况下,需要3个顺序迭代器490、491和492(为了读先前光作用,需要额外迭代器)。在这两种情况下,应用没有块形映像的无穷远光源每个像素占用1个周期,包括选择辐照的环境光。
具有块形映像
在具有块形映像时,必须对每个像素计算法线矢量N,并应用固定光源矢量L。1/||N||还用于计算R·V,R·V作为计算镜面2进程的输入。利用软件设置下面的常数:
常数 |
值 |
K1 |
XL |
K2 |
YL |
K3 |
ZL |
K4 |
IP |
块形映像顺序读迭代器490负责读块形映像的当前行。它提供用于确定X方向上的倾斜的输入。块形映像顺序读迭代器491、492负责读当前行之上和之下的行。它们提供用于确定Y方向上的倾斜的输入。
全向光源
对于全向光源,照明矢量L和衰减因数fatt对于图像上的每个像素均发生变化。因此,必须对每个像素计算L和fatt。
没有块形映像
在没有块形映像时,存在固定法线矢量N[0,0,1]。尽管必须对每个像素计算L,但是N·L和R·V可以被简化为Z
L。在没有块形映像时,如图149所示,可以计算照射的全向光,其中利用软件设置下面的参数:
该算法选择包括先前光源的作用,而且该算法还包括环境光计算过程。环境光仅需要被包括一次。对于所有其他光通路,应该将计算环境进程中的适当常数设置为0。
所示的算法需要总共19次乘法/累加。计算L期间,搜索花费的时间是1个周期,而镜面作用期间,搜索花费的时间是4个周期。因此,5个周期的处理时间是可以实现的最好程度。在不能最佳微编码该函数的ALU的情况下,花费的时间增加到6个周期。对没有相关块形映像的图像照射全向光的速度是每个像素6个周期。
具有块形映像
在对具有相关块形映像的图像照射全向光时,需要计算N、L、N·L和R·V。图150示出将全向光照射到具有相关块形映像的图像上的进程,其中利用软件设置下面的常数:
该算法选择包括先前光源的作用,而且该算法还包括环境光计算过程。环境光仅需要被包括一次。对于所有其他光通路,应该将计算环境进程中的适当常数设置为0。
所示的算法需要总共32次乘法/累加。计算L和N期间,搜索花费的时间分别是1个周期,而镜面作用期间,搜索花费的时间是4个周期。然而,N和L所需的搜索相同(因此,2个LU实现3个LU)。8个周期的处理时间足够了。在不能最佳微编码该函数的ALU的情况下,花费的时间扩大到9个周期。对具有相关块形映像的图像照射全向光的速度是每个像素9个周期。
点光源
除了利用使光有效聚焦到目标周围的锥形/半阴影因数fcp修改衰减因数fatt外,点光源与全向光源相同。
没有块形映像
在没有块形映像时,存在固定法线矢量N[0,0,1]。尽管必须对每个像素计算L,但是N·L和R·V可以被简化为Z
L。图151示出对图像照射点光源,其中利用软件设置下面的参数:
该算法选择包括先前光源的作用,而且该算法还包括环境光计算过程。环境光仅需要被包括一次。对于所有其他光通路,应该将计算环境进程中的适当常数设置为0。
所示的算法需要总共30次乘法/累加。计算L期间,搜索花费的时间是1个周期,镜面作用期间,搜索花费的时间是4个周期,锥形/半阴影计算过程中搜索花费的时间是2组4个周期。
具有块形映像
在对具有相关块形映像的图像照射点光时,需要计算N、L、N·L和R·V。图152示出将一个点光照射到具有相关块形映像的图像上的进程,其中利用软件设置下面的常数:
该算法选择包括先前光源的作用,而且该算法还包括环境光计算过程。环境光仅需要被包括一次。对于所有其他光通路,应该将计算环境进程中的适当常数设置为0。所示的算法需要总共41次乘法/累加。
打印头44
图153示出一个打印头的逻辑布局,该打印头在逻辑上包括8个分段,每个分段分别将双值青色、深红色以及黄色打印到打印纸的一部分上。
装载用于打印的分段
在可以打印任何内容之前,必须利用6行数据,分别装载打印头的8个分段,这6行数据对应于最终输出图像中的下列关联行:
行0=线N,黄色,偶数点0、2、4、6、8、…
行1=线N+8,黄色,奇数点1、3、5、7、…
行2=线N+10,深红色,偶数点0、2、4、6、8、…
行3=线N+18,深红色,奇数点1、3、5、7、…
行4=线N+20,青色,偶数点0、2、4、6、8、…
行5=线N+28,青色,奇数点1、3、5、7、…
每个分段打印打印纸上的不同部分。每个分段打印一种颜色的750点,一行上的375个偶数点以及另一行上的375个奇数点。8个分段具有对应于下面的位置的点:
分段 |
第一点 |
最后一点 |
0 |
0 |
749 |
1 |
750 |
1499 |
2 |
1500 |
2249 |
3 |
2250 |
2999 |
4 |
3000 |
3749 |
5 |
3750 |
4499 |
6 |
4500 |
5249 |
利用一位在打印头分段中表示每个点。必须通过将数据设置到分段的BitValue引脚上,一次一位地装载数据,然后,根据BitClock,将它们记录到移位寄存器。由于该数据被装载到移位寄存器,所以装载位的顺序必须正确。可以以最高10MHz的速率将数据记录到打印头上。
一旦装载了所有位,就必须将它们并行传送到打印头输出缓冲器,准备好打印。该传送过程是利用分段的ParallelXferClock引脚上的一个脉冲实现的。
控制打印
为了节省能源,不必同时打印打印头上的所有点。一组控制线启动打印特定点。根据速度和/或需用功率,诸如ACP的外部控制器可以改变一次打印的点数以及打印脉冲的时长。
每个分段具有5条NozzleSelect线,解码这5条NozzleSelect线以便每行选择32组喷嘴。由于每行具有375个喷嘴,所以每组含有12个喷嘴。还有2条BankEnable线,分别用于颜色的奇数行和偶数行。最后,每个分段具有3条ColorEnable线,分别用于C、M和Y颜色。ColorEnable线之一上的脉冲使颜色的规定行上的规定喷嘴进行打印。脉冲的时长通常约为2s。
如果利用同一组NozzleSelect、BankEnable以及ColorEnable线(从外部布线到打印头),控制所有分段,则下面的情况是正确的:
如果同时打印奇数块和偶数块(两个BankEnable位均被置位),则每个分段的24个喷嘴同时喷射,即,总共192个喷嘴喷射,消耗5.7瓦。
如果单独打印奇数块和偶数块,则每个分段只有12个喷嘴同时喷射,即,总共96个喷嘴喷射,消耗2.85瓦。
打印头接口62
打印头接口62将ACP连接到打印头,将数据和正确信号速度外部打印头。为了在大约2秒的时间内打印照片,打印头接口62与VLIW处理器74以及运行在CPU上的软件算法一起工作。
图154示出打印头接口的输入和输出的概况。CPU利用地址总线和数据总线寻址打印头接口内的各寄存器。一条BitClock输出线连接到打印头上的所有8个分段。8条DataBits线引导到每个分段,并同时存储到打印头的8个分段(利用BitClock脉冲)。例如,同时将点0传送到分段0,将点750传送到分段1,将点1500传送到分段2,等等。
VLIW输出FIFO含有正确顺序的、混色二值C、M和Y 6000×9000分辨率打印图像,以便输出到8 DataBits。ParallelXferClock连接到打印头上的8个分段,因此利用一个脉冲,所有分段同时传送其各位。最后,将NozzleSelect、BankEnable以及ColorEnable线分别连接到8个分段,从而使打印头接口控制C、M和Y墨滴脉冲(drop pusle)的时长以及利用每个脉冲打印多少墨滴。打印头接口上的寄存器允许0至6μs之间的规范脉冲时长,典型时长为2μs。
打印图像
在Artcam用户拿到图像之前,必须执行两个阶段:
1.准备要打印的图像
2.打印准备好的图像
准备图像的过程只需用执行一次。打印图像可以根据要求进行多次。
准备图像
准备要打印的图像的过程包括:
1.将照片图像变换为打印图像
2.转动打印图像(内部彩色空间)以对准打印机的输出取向
3.上内插压缩通道(如果需用)
4.将内部彩色空间彩色变换为适于特定打印机和墨水的CMY彩色空间
在结束准备图像时,准备打印4.5MB的正确取向的1000×1500CMY图像。
将照片图像变换为打印图像
将照片图像变换为打印图像需用执行Vark脚本,以便处理图像。该脚本或者是缺省图像增强脚本,或者是从当前插入的Artcard获取的Vark脚本。利用CPU执行Vark脚本,VLIW矢量处理器执行的函数使该脚本加速。
转动打印图像
内存中的图像起初是顶部向上取向。这样就可以直通Vark处理。在打印该图像之前,必须使它对准打印卷的取向。重新对准只需要进行一次。已经对后续打印的打印图像进行了适当转动。
要进行的变换只是在从CCD捕获图像期间,在用户按下“图像捕获”按钮时,使图像反向。如果原始转动是0,则不需要进行变换。如果原始转动是+90度,则需要在打印前转动-90度(270度也同样)。用于进行转动的方法是Vark仿射变换函数。可以调用仿射变换引擎分别转动每个彩色通道。请注意,不能在原位转动彩色通道。相反,它们可以利用先前被扩展的一个通道使用的空间(1.5MB)。
图155示出转动Lab图像的例子,在该图像中,a和b通道被压缩4∶1。L通道被转动到不再需要的空间(一个通道区),然后,可以将a通道转动到L留下的空闲空间,最后,可以转动b通道。转动3个通道的总时间是0.09秒。这是一个在第一次打印图像之前经历的可接受的时间周期。后续打印不出现这种开销。
上内插和彩色变换
在打印之前,必须将Lab图像变换为CMY。根据Lab图像的a和b通道是否被压缩,而进行不同的处理。如果Lab图像被压缩,则在进行彩色变换之前,必须对a和b通道进行解压缩。如果Lab图像未被压缩,则彩色变换仅是一个必需步骤。必须对Lab图像进行上内插,并将它变换为CMY图像。可以采用组合了比例和彩色变换的一个VLIW进程。
用于进行彩色变换的方法是Vark加速彩色变换函数。为了分别转动每个彩色通道,可以调用仿射变换引擎。不能在原位转动彩色通道。相反,它们可以利用先前被扩展的一个通道使用的空间(1.5MB)。
打印图像
打印图像的过程涉及取出正确取向的1000×1500CMY图像,然后,产生待送到外部打印头的数据和信号。该进程包括与VLIW进程和打印头接口一起工作的CPU。
Artcam上的图像分辨率是1000×1500。所打印的图像的分辨率为6000×9000点,这样形成了非常直通的关系:1像素=6×6=36点。如图156所示,由于每个点是16.6μm,所以6×6点方形是100μm方形。由于每个点是二值的,所以必须将输出混色。
应该在大约2秒的时间内大约图像。对于9000行的点,这意味着,打印每行之间有222μs的时间。此时,打印头接口必须产生6000点,平均每个点37ns。然而,每个点包括3种颜色,因此打印头接口必须在大约12ns的时间内,或者在ACP的1个时钟周期(100MHz的频率,一个周期10ns)内产生每个彩色分量。一个VLIW进程负责计算要打印的6000点的下一行。通过将从6个不同的1000×1500CMY图像行上获得的输入进行混色,产生奇数和偶数C、M和Y点。第二VLIW进程负责取先前计算的6000点的行,并正确产生8个分段的8位数据,打印头接口以一次传送形式将该数据传送到打印头。
CPU进程以每个打印行3次地更新第一VLIW进程中的各寄存器(每个彩色分量一次=在2秒内更新27000次),而以每个打印行一次地更新第二VLIW进程中的各寄存器(2秒内更新9000次)。为此,CPU的工作超前VLIW进程一行。
最后,打印头接口从VLIW输出FIFO内取出8位数据,然后,原封不动将它输出到打印头,从而正确产生BitClock信号。一旦传送了所有数据,就产生ParallelXferClock信号,以装载下一个打印行的数据。在将数据传送到打印头的同时,单独定时器产生用于打印头的不同打印周期的信号,该打印头使用打印头接口内部寄存器规定的NozzleSelect、ColorEnable以及BankEnable线。
在打印过程中,通过并行接口,CPU还控制各种马达和切纸刀。
产生C、M和Y点
该进程的输入是用于打印的正确取向的1000×1500CMY图像。未以任何形式压缩该图像。如图157所示,VLIW微码程序获取CMY图像,然后,产生打印头接口进行混色所需的C、M和Y像素。
该进程运行3次,分别对3个彩色分量运行一次。该进程包括并行运行的2个子进程—一个子进程用于产生偶数点,另一个子进程用于产生奇数点。每个子进程分别从输入图像获取一个像素,然后,产生3个输出点(由于一个像素=6输出点,而且每个子进程既可以涉及偶数点,又可以涉及奇数点)。因此,每个周期产生一个输出点,多少仅每隔3个周期读一次输入像素。
原始色块单元是64×64单元,其中每个项目8位。将该原始单元分割为奇数单元和偶数单元,以便它们分别仍64高,但是仅32项目宽。偶数色块单元含有原始色块单元像素0、2、4等,而奇数色块单元含有原始色块单元像素1、3、5等。由于由于色块单元重复在行上,所以在整个行期间,需要2个色块单元中每个色块单元的一个32字节行,并因此可以完全高速缓存它们。一次处理行中的奇数行与偶数行错列开8个点行,以便将奇数色块单元的行转动8行。因此,可以在奇数单元和偶数单元中采用同样的偏差。因此,偶数色块单元的行对应于原始色块单元中的行L上的偶数项目,而偶数色块单元的行对应于原始色块单元中的行L+8上的奇数项目。
该进程可以运行3次,分别对每个彩色分量运行一次。CPU软件例程必须确保,用于奇数行和偶数行的顺序读迭代器指向对应于打印头的正确图像行。例如,为了产生一组18,000点(3组6000点):
●黄色偶数点行=0,因此输入黄色图像行=0/6=0
●黄色奇数点行=8,因此输入黄色图像行=8/6=1
●深红色偶数行=10,因此输入深红色图像行=10/6=1
●深红色奇数行=18,因此输入深红色图像行=18/6=3
●青色偶数行=20,因此输入青色图像行=20/6=3
●青色奇数行=28,因此输入青色图像行=28/6=4
后续各组输入图像行是:
●Y=[0,1],M=[1,3],C=[3,4]
●Y=[0,1],M=[1,3],C=[3,4]
●Y=[0,1],M=[2,3],C=[3,5]
●Y=[0,1],M=[2,3],C=[3,5]
●Y=[0,2],M=[2,3],C=[4,5]
然而,对于每个彩色分量,不需要更新色块单元数据。3这颜色的色块单元相同,但是每个分量偏差2个数据行。
将混色输出写入顺序写迭代器,其中将奇数混色点和偶数混色点写入2个单独输出。对全部3个彩色分量使用同样的两个写迭代器,因此在分离的奇数点和偶数点分离中,它们是邻接的。
尽管对于打印行可以产生一组点,但是第二VLIW进程将先前产生的一组点合并,正如下面的小节所述。
产生合并的8位点输出
如图158所示,该进程取出一行混色点,然后,产生8位数据流,以通过VLIW输出FIFO输出到打印头接口。该进程要求准备好整个行,因为它要求一次性半随机存取大多数混色行。利用软件设置下面的常数:
顺序读迭代器指向先前产生的各点的行,准备迭代器寄存器以限制存取一个彩色分量。各连续像素之间的距离是375,而使一行与下一行之间的距离为1字节。因此,对每“行”读8个项目。一“行”对应于要装载到打印头的8位。图像中的总“行”数被设置为375。如果至少对顺序读迭代器分配8个高速缓存行,则可以保持完全高速缓存相关性。不是对8位进行计数,8个伪码步骤隐式计数。
该产生进程首先从偶数点读取所有项目,将8个字母组合为一个字节,然后,将该字节输出到VLIW输出FIFO。一旦读取了全部3000个偶数点,就读3000个奇数点,然后进行处理。软件例程必须每个彩色分量一次地更新奇数顺序读迭代器和偶数顺序读迭代器内的各点的地址,这等于每行更新3次。两个VLIW进程需要全部8个ALU和VLIW输出FIFO。正如在这两个进程中描述的那样,只要CPU能够更新寄存器,VLIW处理器就可以以足够高的速度产生混色图像点,以便跟上打印机。
数据卡阅读器
图159示出可以插入Artcard 9的卡阅读器500的形式。图158示出图159所示阅读器的分解透视图。卡阅读器与计算机系统互连,而且包括CCD读机构35。卡阅读器包括用于夹送插入的Artcard 9的夹送轮506、507。Artcard马达37驱动夹送轮之一例如506,以使Artcard 9在这两个夹送轮506和507之间均速前移。Artcard 9从镶在透明塑料制品514内的一系列LED灯512上方通过,该塑料制品514具有半圆形截面。在卡9通过LED 512时,该截面使LED例如512发出的光聚焦到卡9的表面上。该表面将光反射到高分辨率线性CCD 34,所构造的该线性CCD34的分辨率约为480dpi。因此,将Artcard 9的表面编码为大约1600dpi的分辨率,线性CCD 34以接近乘法器的3倍过采样(supersample)Artcard表面。以使线性CCD可以在Artcard移动方向以每英寸读大约4800次的速率进行过采样的速度进一步驱动Artcard 9。将扫描的Artcard CCD数据从Artcard阅读器转发到ACP 31进行处理。可以包括光传感器的传感器49用于检测卡13是否存在。
CCD阅读器包括底部基底516、顶部基底514,顶部基底514包括透明模制塑料。在这两个基底之间插入线性CCD阵列34,线性CCD阵列34包括利用半导体制造过程构造的细长形线性CCD阵列。
参考图160,图160示出构造CCD阅读器单元的例子的部分分解的侧面透视图。在卡9从CCD阅读器34的表面上通过时,使系列LED例如512发光。发出的光通过部分顶部基底523。该基底包括具有弧形外围的部分例如529,以使LED 512发出的光聚焦到卡9表面上的点例如532上。点532将聚焦光反射到CCD阵列34。将以放大图形式示出的一系列微透镜例如534成型在顶部基底523的表面上。微透镜523用于将通过该表面接收的光向下聚焦到与CCD阅读器34的表面上的点对应的点536上,以便检测落在CCD阵列34的光敏部分上的光。
可以对上述配置做许多改进。例如,可以错列线性CCD 34上的光敏器件。还可以对应成型相应微透镜534,以将光聚焦成错列的系列光点,从而与错列的CCD传感器对应。
为了有助于进行读,利用以上参考图38描述的棋盘图形,调制Artcard 9的数据表面积。然而,也可以采用其他形式的高频调制。
显然,为了印出存储Artcard上的数据,提供Artcard打印机。因此,Artcard系统可以用于在Artcam设备之外进行通用信息分销。Artcard打印机可以将Artcard打印在高质量打印面上,而且可以在同一张打印纸上打印多个Artcard,之后将它们分开。在Artcard 9的另一个表面上,可以打印与存储在Artcard 9上的文件等有关的信息用于后续存储。
因此,Artcard系统可以使用适于代替诸如CD ROM、磁盘等的其他形式存储器的简化形式的存储器。还可以批量生产Artcard 9,因此以非常廉价的方式生产它,以便再分销。
打印卷
参考图162,图162示出Artcam的打印卷142和打印头部分。打印纸/胶片611以连续“卷筒形”操作形式送到打印机构15,打印机构15进一步包括夹送辊616至619和打印头44。
夹送辊613连接到驱动机构(未示出),而且在转动夹送辊613时,迫使胶片611形式的“打印纸”通过打印机构615,然后,从图片输出槽6出来。旋转式切纸刀机构(未示出)用于以要求的照片尺寸切割滚动的打印纸611。
因此,显然,打印卷42负责将“打印纸”611送到打印机构615,用于打印用照相方法成像的图片。
在图163中,图163示出打印卷42的分解透视图。打印卷42包括在夹送辊612、613的作用下输出的输出打印纸611。
现在,参考图164,图164示出没有“打印纸”胶卷的、图163所示打印卷42的更全面分解透视图。打印卷42包括3个主要部分,它们是墨水槽部分620、打印纸卷部分622、623以及外壳部分626、627。
首先,参考墨水槽部分620,墨水槽部分620包括墨水槽或墨水源部分633。用于打印的墨水容纳在3个软外壳型容器630-632内。假定打印卷42提供全色输出墨水。因此,第一墨水槽或软外壳型容器630含有青色墨水。第二墨水槽631含有深红色墨水,第三墨水槽632含有黄色墨水。分别设计墨水槽630至632,以使它们具有大致相同的立体尺寸,但是它们也可以具有不同的立体尺寸。
除了外盖624,墨水槽部分621、633也可以由塑料制成,而且可以设计它们,以利用热密封、紫外线辐照等方法使它们拼合在一起。分别将同样大小的墨水槽630至632连接到相应墨水通道639至641,以使墨水从墨水槽630至632流到相应墨水输出口635至637。墨水槽632具有墨水通道641和输出口637,墨水槽631具有墨水通道640和输出口636,墨水槽630具有墨水通道639和输出口637。
在运行过程中,可以将相应墨水注入墨水槽630至632,而部分633与部分621接合在一起。墨水槽部分630至632是可收缩软外壳型容器,它们可以使墨水通过墨水通道639至641,因此,它们与墨水输出口635至637是液体连通的。此外,如果需要,还可以设置进气口,以根据需要保持与墨水槽630至632有关的压力。
外盖624可以与墨水槽部分620接合在一起,以形成气压入口可以接入的加压腔。
设计墨水槽部分621、633以及624,以将它们连接在一起作为整体,然后,将它们插入打印卷部分622、623内。设计打印卷部分622、623,以利用钩扣拼合在一起,该钩扣利用与相应插孔部分(未示出)拼合的插头部分配合。同样,设计插孔部分654-656以与相应插头部分660-662拼合。因此,设计打印纸卷部分622、623以钩扣在一起。在将它们接合在一起时,该打印纸卷内的胶片的一端夹在这两个部分622、623之间。然后,在需要时,可以打印胶片卷到打印卷部分622、625上。
如上所述,所设计的墨水槽部分620、621、633、624可以插入打印纸卷部分622、623的内部。打印纸卷部分622、623可以绕固定的墨水槽部分621、633和624转动,以根据需要配送胶片。
进一步设计外壳部分626和627,以便围绕打印卷部分622、623接合在一起。除了夹送辊例如612、613的两端固定在外壳626、627内的相应凹槽例如670内外,在外部(未示出)驱动夹送辊613以馈送打印胶片并从打印卷出来。
最后,可以在墨水槽部分620、621内设置空腔677,用于插入并固定硅芯片集成电路器件53,该硅芯片集成电路器件53用于存储与打印卷42有关的信息。
如图155和164所示,设计打印卷42以插入Artcam相机设备内,从而与连接单元680相连,连接单元680包括连接垫片681,用于与硅芯片53实现连接。此外,连接器680包括与墨水给水口635-637相连的端连接器。墨水给水口又连接到墨水给水管例如682,墨水给水管例如682又与打印头给水口例如687互连,用于根据要求使墨水流到打印头44。
用于形成卷的“介质”611可以包括许多不同的材料,可以设计这种材料以便在其上打印适当图像。例如,可以采用不透明可卷塑料材料,利用透明塑料板,可以使用透明软片,利用金属薄膜,可以进行金属打印。此外,为了在织物上打印图像,可以在打印卷42内采用织物,但是必须注意,只能使用具有适当刚性或适当垫材的织物。
在打印介质是塑料时,它可以具有用于固定和吸收墨水的涂层。此外,还有几种打印介质可以使用,例如,不透明白无光胶片、不透明白光泽胶片、透明胶片、闷光透明胶片、用于进行立体3D打印的柱镜阵列胶片、镀金属胶片、具有嵌入的光变器件(例如光栅或全息)的胶片、预先打印在反面上的介质以及包括磁记录层的介质。在使用金属薄片时,该金属薄片可以具有聚合物基底,利用铝或其他金属的薄(几微米)蒸发层喷涂该聚合物基底,然后利用适于通过喷墨打印机机构接收墨水的透明保护层喷涂它。
在使用过程中,显然,将所设计的打印卷42插入相机设备内,以便根据要求,通过用于打印图像的墨水和打印纸。墨水输出口635-637与相机设备内的相应口相接,在相机设备的控制线,操作夹送辊672、673以将打印纸送到相机设备。
如图164所示,所安装的硅芯片53插入打印卷42的一端。在图165中,更详细示出验证芯片53,它包括4个通信引线680-683,通信引线680-683用于将详情从芯片53送到它所插入的相应相机。
参考图165,通过将小型集成电路687插入环氧树脂中并布设连接到外部通信引线680-683的接合引线例如688,可以单独建立芯片。集成芯片687是大约400微米的正方形,它具有100微米的划线边界。因此,该芯片可以固定在打印卷42的空腔的表面上。在图166中,示出了与图165示出的分解图所示的连接垫片681、682互连的集成电路687。
在附图中的图164A至164E中,参考编号1100通常表示打印鼓1100。根据本发明,打印鼓1100包括墨水盒(ink轿车tridge)1102。
打印鼓1100包括外壳1104。正如附图中的图2更清楚地示出的那样,上部模制件1106和下部模制件1108确定外壳1104。利用钩扣1110将模制件1106和1108固定在一起。利用标签1112覆盖外壳1104,标签1112对打印鼓1100提供有吸引力的外表。标签1112上还有使用户使用该打印鼓1100的信息。
外壳1104确定在其内容纳墨水盒1102的墨水盒室1114。墨水盒1102固定支持在外壳1104的墨水盒室1114内。
外壳1104的墨水盒室1114内容纳包括绕管架1120缠绕的胶片/介质1118的卷1126的打印介质1116。管架1120可滑动地容纳在墨水盒1102上,而且可以相对于它转动。
如附图中的图164B所示,在将上部模制件1106和下部模制件1108固定在一起时,确定一个用于输出一段打印纸1118的出口槽1122。
打印鼓1100包括辊组件1124,在从卷1126送纸时,辊组件1124用于松开打印纸1118,而且还驱动打印纸1118通过出口槽1122。辊组件1124包括主动辊1128和两个从动辊1130。从动辊1130可旋转地支撑在肋1132上,肋1132直立凸出在外壳1104的下部模制件1108的底板1134上。从动辊1130与主动辊1128一起对打印纸1118提供主动牵引力,以在从外壳1104输出它时,控制其速度和位置。从动辊1130是诸如聚苯乙烯的适当合成塑料材料的注塑模制件。此外,在这方面,上部模制件1106和下部模制件1108也是诸如聚苯乙烯的适当合成塑料材料的注塑模制件。
主动辊1128包括主动轴1136,主动轴1136可旋转地保持在成对凹槽1138与1140之间,在外壳1104的上部模制件1106和下部模制件1108的侧壁上分别确定成对凹槽1138和1140。主动辊1128的对端可旋转地保持在外壳1104的上部模制件1106和下部模制件1108的适当结构(未示出)上。
主动辊1128是两个包括轴1136的注塑模制件,轴1136是高回弹聚苯乙烯,而且在这两个注塑模制件上,以合成橡胶或橡胶辊部分1144的形式模制支承装置。这些部分1144主动接合打印纸1118,而且在从打印鼓1100馈送打印纸1118时,防止打印纸1118滑动。
从外壳1104凸出的主动辊1128的端部具有十字装置1146形式的接合结构(参考图164A),该十字装置与诸如相机的设备的打印头组件的齿轮驱动连接装置(未示出)配合,在没备内安装了打印鼓1100。该十字装置确保将打印纸1118送到打印头的速度与打印头进行打印的速度同步,从而确保墨水精确对准打印纸1118。
墨水盒1102包括容器1148,容器1148取正环状鼓形挤压成形件的形式。利用诸如聚苯乙烯的适当合成塑料材料挤压成形容器1148。
在本发明的优选实施例中,与打印鼓1100一起使用的打印头是多色打印头。因此,容器1148被划分为多个,更具体地说是4个墨水室或墨水槽1150。每个墨水槽1150容纳不同颜色或类型的墨水。在一个实施例中,容纳在墨水槽1150内的墨水是青色、深红色、黄色和黑色墨水。在本发明的另一个实施例中,将3种不同颜色的墨水,即,青色、深红色和黄色墨水容纳在3个墨水槽1150内,而第四个墨水槽容纳仅在红外光频谱下可见的墨水。
正如附图中的图164C和164D更清楚地示出的那样,利用端帽1152封闭容器1148的一端。端帽1152具有多个确定在其上的开口1154。开口1154与每个墨水槽1150相通,以便在具有端帽1152的容器1148的一端,在墨水槽1150内保持大气压力。
密封装置1156容纳在容器1148内具有端帽1152的一端。密封装置1156包括可滑动地容纳在每个墨水槽1150内的、胶质材料的四分之一圆形片1158。四分之一圆形片1158的胶质材料是由热塑橡胶和碳氢化合物形成的化合物。碳氢化合物是白矿物油。热塑橡胶是对矿物油提供足够刚性的共聚物,因此,在正常工作温度下,在使圆形片1158在其相关墨水槽1150内滑动时,圆形片1158保持其形态不变。适当的热塑橡胶是Shell Chemical Company以注册商标“Kraton”销售的热塑橡胶。共聚物以足以使每个圆形片1158产生类凝胶稠度的数量出现在该化合物中。通常,根据使用类型,共聚物以按重量计大约3%至20%的数量出现在该化合物中。
在使用过程中,加热该化合物,以使它变成流体。每个墨水槽1150一注入其特定类型的墨水,就将熔化状态的该化合物注入每个墨水槽1150,在该墨水槽1150内使该化合物形成圆形片1158。存在于圆形片1158后面的,即,存在于对着端帽1152的、圆形片1158的一端大气压力确保,在从墨水槽1150吸出墨水时,使自润滑的圆形片1158向容器1148的对端滑动。在颠倒时,圆形片1158阻止放空容器中的墨水,防止污染墨水槽1150内的墨水,而且还防止墨水槽1150中的墨水被干燥。圆形片1158是疏水性的,以便进一步防止从墨水槽1150泄漏墨水。
利用防墨水环模制件1160封闭容器1148的对端。安装在防墨水环模制件1160上的隔板1162容纳合成橡胶密封模制件1164。疏水性的合成橡胶密封模制件1164具有确定在其内的密封挡板1166。每个密封挡板1166分别具有细长切口1168,以便打印头组件的连接探针(未示出)可插入地通过该细长切口1168,从而与容器1148的墨水槽1150流体连通。空心毂1170从防墨水环模制件1160的对面凸出。所成型的每个毂1170适当插入其相关墨水槽1150,用于将防墨水环模制件定位在容器1148的一端。
再回到附图中的图164C,利用拖板或盘座面(fascia)模制件1172将防墨水环模制件1160保持在适当位置。盘座面模制件1172具有确定在其内的四叶式窗口1174,合成橡胶密封模制件1164通过该四叶式窗口1174进入。盘座面模制件1174在外壳1104的上部模制件1106与下部模制件1108之间保持静止。分别从外壳1104的上部模制件1106和下部模制件1108的内表面伸出的端部模制件1174以及腹板1176和1178确定隔问1180。空气过滤器1182容纳在隔间1180内,并利用端部模制件1174将空气过滤器1182保持在适当位置。空气过滤器1182与打印头组件配合。吹动空气通过打印头组件的喷管以清洁喷管。利用容纳在盘座面模制件1172的入口1184内的探针(未示出),通过使空气吸入空气过滤器1182来过滤空气。
附图中的图164E更详细示出空气过滤器1182。空气过滤器1182包括过滤介质1192。过滤介质1192是基于合成纤维的,而且以沟槽方式排列它们,以提高用于过滤的有效表面积。代替基于纸的过滤介质1192,还可以使用其他纤维棉胎。
过滤介质1192容纳在过滤罐1194内。过滤罐1194包括基底模制件1196和盖板1198。为了容纳在外壳1104的隔间1180内,过滤罐1194是部分圆环形的,或马蹄形的。因此,过滤罐1194有一对相对的端1200。进气口1202被分别确定在两端1200上。
出气口1204被确定在盖板1198上。首先,利用薄膜或者膜片1206封闭出气口1204。在将过滤器1182安装在隔间1180内的适当位置时,出气口1204与盘座面模制件1172上的开口1184对齐。打印头组件的探针刺穿薄膜1206,然后,在通过喷管和打印头组件的打印头吹气之前,通过空气过滤器1182的吸进大气中的空气。
基底模制件1194包括用于将过滤介质1192定位在过滤罐1194内的适当位置的定位结构1208和1210。定位结构1208是多个定位柱1212形式的,但是定位结构1210是与过滤介质1192的端部1214接合的肋形式的。
一旦将过滤介质1192设置在基底模制件1196内的适当位置,就利用超声波焊接装置或类似装置,将盖板1198固定到基底模制件1196上,以使盖板1198密封基底模制件1196。
在组装好打印鼓1100后,将膜片或薄膜1186安装到盘座面模制件1172上,以封闭窗口1174。在使用时,探针刺穿该膜片或薄膜1186。薄膜1186防止碎屑进入墨水槽1150内。
验证芯片1188形式的验证装置容纳在盘座面模制件1172的开口1190内。打印头组件查询验证芯片1188,以确保打印鼓1100与设备的打印头组件兼容和一致。
验证芯片
验证芯片53
优选实施例的验证芯片53负责确保只有正确制造的打印卷可以用于相机系统。验证芯片53采用的技术在与任何消耗品一起使用时通常是有价值的,而且这些技术并不局限于打印系统。需要消耗品的其他系统(例如,需要墨粉盒的激光打印机)的制造商已经在努力解决验证消耗品的问题,以改变成功等级。大多数求助于专用封装。然而,这并不能阻止家庭再充操作或仿制。防止拷贝重要的是要防止所制造的糟糕替换消耗品破坏基础系统。例如,过滤不佳的墨水可能堵塞喷墨打印机的打印喷嘴,从而导致消费者抱怨系统制造商,而且不许可使用未授权的消耗品。为了解决验证问题,验证芯片53含有验证码和对防止拷贝专门设计的电路。利用标准闪速存储器制造方法制造该芯片,而且成本足够低,可以包括在诸如墨水盒或墨粉盒的消耗品上。一旦被编程,在此描述的验证芯片就可以遵守NSA出口指南(NSA export guildeline)。验证领域是一个极大而且还在稳定增长的领域。在此,我们仅涉及消耗品的验证。
符号用语
在本实施例的讨论中,将使用下面的符号用语:
符号用语 |
说明 |
F[X] |
函数F,取一个参数X |
F[X,Y] |
函数F,取两个参数X和Y |
X|Y |
X与Y并置 |
X∧Y |
按位对X和Y进行“与”运算 |
X∨Y |
按位对X和Y进行“或”运算(“或”逻辑) |
X_Y |
按位对X和Y进行“异或”运算(“异或”逻辑) |
~X |
按位对X进行“非”运算(求补) |
X←Y |
对X赋予值Y |
基本术语
消息是明文,利用M表示它。将M变换为密文C的过程被称为加密,密文C隐藏了M的实质内容。将C变换回M的过程称为解密。将加密函数称为E,将解密函数称为D,我们具有下面的恒等式:
E[M]=C
D[C]=M
因此,下面的恒等式正确:
D[E[M]]=M
对称密码术
对称加密算法是一种算法,其中:
加密函数E取决于密钥K1,
解密函数D取决于密钥K2,
可以由K1获得K2,以及
可以由K2获得K1。
在大多数对称算法中,K1通常等于K2。然而,即使K不等于K2,如果可以由一个密钥获得另一个密钥,则对于数学定义,一个密钥K足够了。因此:
Ek[M]=C
Dk[C]=M
从古代历史教科书到现代综合算法,存在大量各种对称算法。它们中的许多是不安全的,因为现代密码分析技术可以成功攻击该算法,已经达到获得K的程度。特定对称算法的安全性通常是两个内容的函数:算法的长度以及密钥的长度。下面的算法包括用于验证芯片的适当方面。
DES
Blowfish
RC5
IDEA
DES
DES(数据加密标准)是美国标准和国际标准,其中同一个密钥用于进行加密和解密。密钥长度是56位。尽管原始设计仅用于硬件,但是可以以硬件和软件的方式实现该标准。第3,962,539号美国专利对用于DES的原始算法进行了描述。被称为三重DES的DES的变换例更安全,但是需要3个密钥:K1、K2和K3。以下面的方式使用各密钥:
EK3[DK2[EK1[M]]]=C
DK3[EK2[DK1[C]]]=M
三重DES的主要优点是,可以使用现有DES实现过程提供比一个密钥DES更高的安全性。具体地说,三重DES对112位的等效密钥长度提供保护。三重DES未能象人们轻易期望的那样,对168位密钥提供等效保护。实现三重DES解码和/或编码的设备不能从美国出口。
Blowfish
Blowfish是首先由Schneier于1994年提出的对称分组密码。它采用从32位到448位的可变长度密钥。此外,它比DES快得多。Blowfish算法包括两部分:密钥扩展部分和数据加密部分。密钥扩展将最多448位的密钥变换为总共4168字节的几个子密钥阵列。利用16循环(round)Feistel网络,进行数据加密。所有运算均是对32位字进行”异或”运算和加运算,其中每个循环需要进行4个索引阵列查用表。应该注意,除了以反向顺序使用子密钥阵列外,解码过程与加密过程相同。因此,与不具有这种对称性的其他算法相比,降低了实现过程的复杂性。
RC5
RC5由Ron Rivest与1995年设计,它具有可变块大小、密钥大小以及循环次数。然而,通常,它使用64位的块大小和128位的密钥。RC5算法包括两个部分:密钥扩展部分和数据加密部分。密钥扩展将密钥变换为2r+2子密钥(其中r=循环次数),每个子密钥分别为w位。对于具有16循环的64位的块大小(w=32,r=16),子密钥阵列总共136字节。数据加密过程使用模2w加法、”异或”运算以及按位回转。
IDEA
IDEA是由Lai和Massey于1990年开发的,第一次实现的IDEA密码被称为PES。在Biham和Shamir于1991年发现差异密码分析后,这种算法被增强了,1992年将这些成果作为IDEA出版。IDEA使用128位密钥对64位明文块进行运算。同样的算法用于进行加密和解密。通常,这被认为是当今可用的最安全的块算法。1993年颁发的第5,214,703号美国专利对它进行了描述。
非对称密码术
作为一种选择,还可以采用非对称密码术。非对称加密算法是一种算法,其中:
加密函数E取决于密钥K1,
解密函数D取决于密钥K2,
不能在合理的时间内由K1获得K2,以及
不能在合理的时间内由K2获得K1。
因此:
Ek1[M]=C
Dk2[C]=M
这些算法还被称为公开密钥,因为可以公开一个密钥K1。因此,任何人均可以对消息进行加密(使用K1),但是只有具有相应解密密钥(K2)的人可以解密,从而读取该消息。在大多数情况下,还保持下面的恒等式:
Ek2[M]=C
Dk1[C]=M
该恒等式非常重要,因为它意味着,具有公开密钥K1的任何人均可以看到M,而且知道它是从K2的拥有者那里获得的。没有别的东西可以产生C,因为这样做意味着知道K2。当然,合理时间的概念使得不能在合理的时间内由K2获得K1,也不能在合理的时间内由K1获得K2的特性模糊了。引入更快的计算机、新算法等后,已经可以实现被认为花费大量时间进行计算的反复证明过程。非对称性算法的安全性基于两个问题之一的难度:分解大数字(更具体地说,大数字是两个大质数的乘积),以及在有限域内计算离散对数的难度。对于当今的数学理解,推测分解大数字是一个非常困难的问题。然而,问题在于,分解比推测更容易、更快。Ron Rivest于1977年说,分解125位数字可能花费40×1015年。在1994年,分解了一个129位的数字。根据Schneier所言,如果要获得1980年由512位获得的安全等级,现在需要1024位的数字。如果这种密钥再过几年,则1024位也不够了。1990年,Rivest将他的密钥长度估计值进行了修改:他建议1628位,在2005年之前具有高安全性,还建议1884位,在2015年之前具有高安全性。对比起来,Schneier建议2048位,以在2015年之前,保护公司和政府。
存在大量的公开密钥密码算法。大多数算法不能实现,而且对于给定的M,许多算法产生非常大的C,或者需要庞大密钥。其他算法尽管安全,但是太慢了以致在几年内不能实现。因此,许多公开密钥系统是混合系统,利用公开密钥机制传送对称对话密钥,然后,将对话密钥用于实际消息。所有算法的问题均在密钥选择方面。随机数只是在安全方面不够。必须仔细选择两个大质数p和q,因为存在某种弱组合,可以非常容易地将它分解(可以对一些弱密钥进行测试)。然而,尽管如此,密钥选择也不是一件例如随机选择1024位的简单事情。因此,密钥选择过程也必须安全。
在基于公开检查使用的实际算法中,适于采用下面的算法:
RSA
DSA
EIGamal
RSA
以Rivest、Shamir以及Adleman的名字命名的RSA密码系统是最广泛采用的公开密钥密码系统,而且事实上,在世界上的许多地方,它是标准。推测RSA的安全性取决于分解大数字的难度,该大数字是两个质数的乘积(p和q)。在生成p和q方面,存在许多限制。它们应该是大数字,它们具有类似的位数,而且互相不接近(但是pq≈√pq)。此外,许多作者建议p和q应该是强质数。1983年颁发了RSA算法专利(第4,405,829号美国专利)。
DSA
DSA(数字签名标准)是作为数字签名标准(DSS)的一部分设计的算法。正如所定义的那样,它不能用于广义加密。此外,与RSA相比,DSA的签名验证过程慢10倍到40倍。DSA显式使用SHA-1散列算法(参考下面关于单向函数的定义)。DSA密钥生成过程取决于找到这样两个质数p和q,即,q可以除尽p-1。根据Schneier所言,对于长期DSA安全性,需要1024位的p值。然而,DSA标准不允许p的值大于1024位(p还必须是64位的倍数)。美国政府拥有DSA算法,而且至少拥有一项相关专利(1993年授予的第5,231,688号美国专利)。
EIGamal
EIGamal方案既用于加密,又用于数字签名。安全性基于在有限域内计算离散对数的难度。密钥选择过程包括以g和x均小于p的方式,选择质数p以及两个随机数g和x的过程。然后,计算y=gx模p。公开密钥是y、g和p。专用密钥是x。
密码询问—响应协议以及零知识证明
询问—响应协议的一般原理是提供适于相机系统的身份验证。最简单形式的询问—响应采用保密口令的形式。A向B询问保密口令,而且如果B以正确的口令响应,则A宣告B被验证。这种过分简单的协议存在3个主要问题。首先,一旦B发出口令,任何观察者C就知道口令是什么。其次,A必须知道该口令以便进行验证。再次,如果C假冒A,则B将对C提供口令(认为C是A),因此B受到损害。使用版权正文(copyright text)(例如haiku)是一种更弱的选择,因为我们认为任何人均可以拷贝口令(例如,在不保护知识产权的国家)。密码询问—响应协议的原理是通过演示与该实体有关的已知保密知识,一个实体(申请者)对另一个实体(验证者)证明其身份,而无需在该协议期间对验证者公开其保密口令。在密码询问—响应协议的广义情况下,利用某些方案,验证者知道保密口令,而在其他方案中,验证者甚至不知道该保密口令。由于该实施例的讨论具体涉及验证,所以将在适当小节详细说明实际用于验证的密码询问—响应协议。然而,在此将说明零知识证明的概念。零知识证明协议首先由Feige、Fiat和Shamir提出,它广泛用于智能卡验证过程。该协议的有效性是基于计算技术不可能利用未知分解方法计算平方根模a大复合整数的假设的。可以证明,这等效于难以分解大整数的假设。应该注意,不需要申请者具有强大计算能力。智能卡仅利用少量模乘法(modular multiplication)实现这种验证。第4,748,668号美国专利对零知识证明协议进行了描述。
单向函数
单向函数对输入X进行运算,然后,以不能由F[X]确定X的方式返回F[X]。在对X的格式没有限制,而且F[X]含有的位比X的位少时,一定存在冲突。冲突被定义为两个不同的X输入值产生同一个F[X]值,即,X1和X2以这样的方式出现,即X1≠X2,但是F[X1]=F[X2]。在X含有的位数比F[X]的位数多时,必须以某种方式对该输入进行压缩,以产生输出。在许多情况下,X被分割为特定大小的块,并且将它压缩多次,其中一次压缩的输出是下一次压缩的输入。散列函数的输出是在处理完X后的最后一个输出。压缩函数CF的伪冲突定义为两个不同的初始值V1和V2,而以CF(V1,X1)=CF(V2,X2)的方式给出X1和X2(可能相同)。请注意,伪冲突的存在并不意味着,对于给定的X1,容易计算X2。
我们仅对快速计算的单向函数感兴趣。此外,我们仅对可以在不同实现过程中重复的确定性单向函数感兴趣。研究一个例子F,其中F[X]是调用到F之间的时间。对于给定的F[X],不能确定X,因为X甚至未被F使用。然而,对于不同的实现过程,F的输出不同。因此,对这种F不感兴趣。
在本实施例的验证芯片的实现过程的讨论范围内,我们对以下形式的单向函数感兴趣:
使用来知密钥进行加密
随机数序列
散列函数
消息验证码
使用未知密钥进行加密
事实上,在利用未知密钥K对消息进行加密时,加密函数E是单向的。如果没有密钥,则计算技术不可能没有K而利用EK[M]获得M。只有在隐藏没有时,加密函数才是单向的。加密算法不产生冲突,因为,以可以利用函数D重构M的方式,E产生EK[M]。因此,如果单向函数F是E,则F[X]至少含有与X同样多的位(未丢失信息)。对称加密算法(如上所述)比根据加密产生单向函数的非对称算法具有优势,原因如下:
对称算法的给定强度加密算法的密钥比非对称算法的给定强度加密算法的密钥短。
对称算法的计算速度快,而且需要的软件/硅少。
根据所选择的加密算法,选择良好密钥。某些密钥可能对特定加密算法不强,因此需要对任何密钥的强度进行测试。需要对密钥选择进行的测试越多,密钥保持隐藏的可能性就越小。
随机数序列
研究随机数序列R0、R1、…Ri、Ri+1。我们确定单向函数F,以便F[X]返回随机序列中的第X个随机数。然而,我们必须确保,在不同实现过程中,对于给定的X,F[X]是可以重复的。因此,随机数序列不可能是真正随机的。相反,在发生器利用特定籽数情况下,它一定是伪随机的。
存在大量与确定良好随机数发生器有关的问题。Knuth对什么可以使发生器“良好”(包括统计测试)以及与构造它们有关的一般问题进行了描述。随机数发生器的主要任务是由第i-1状态产生第i随机数,确定第i随机数的唯一方式是从第0个数到第i个数进行迭代。如果i大,则等待i次迭代,是不现实的。然而,存在一种不容许随机存取的随机数发生器。Blum、Blum以及Shub将理想的发生器定义为:“…我们很想要一种由短籽数快速产生长序列(位)的伪随机序列发生器,该长序列在各方面均象是通过连续投掷精美硬币产生的”。他们确定了X2模n发生器,更常将它称为BBS发生器。他们说明,如果现代密码术基于该假定,则BBS发生器通过极严格的统计测试。
BBS发生器取决于选择作为Blum整数的n(n=pq,其中p和q是大质数,p≠p,p模4=3,而且q模4=3)。利用x0给出发生器的初始状态,其中x0=x2模n,x是与n互质的随机整数。第i伪随机位是xi的最低有效位,其中xi=xi-1 2模n。作为额外特性,p和q的知识使得直接计算序列中的第i个数:xi=x0 y模n,其中y=2i模((p-1)(q-1))。
如果没有p和q的知识,则该发生器必须进行迭代(计算的安全性取决于分解大数字的难度)。在首先确定时,BBS发生器的主要问题是一个输出位所需的工作量。认为该算法对于大多数应用均太慢。然而,Montgomery缩减算法的出现产生了更现实的实现过程。此外,Vazirani和Vazirani表明根据n的大小,可以安全地从xi中取出更多位,而不降低发生器的安全性。假定每个xi仅取出1位,则为了产生N位随机数,需要N位(因此,N次迭代位发生器函数)。对于外部观察者,给定一组特定位,除了以50/50的概率确定下一位,没有别的办法。如果x、p和q被隐藏,则它们用作密钥,而且计算技术不可能取出输出位流并计算x、p和q。此外,计算技术也不可能确定用于产生一组给定的伪随机位的i的值。该最后特征使发生器是单向的。不同的i值可以产生给定长度的相同位序列(例如,32位随机位)。对于给定的F[i],即使已知x、p和q,仍可以不利用特定值,而仅利用一组概率获得i(当然,如果i的域已知,则可以进一步降低这组概率)。然而,在选择良好p和q以及良好籽数x时,存在问题。特别是,Ritter对选择x的问题进行了描述。该问题的性质是,BBS发生器不产生一个已知长度的循环。相反,他产生各种长度的周期,包括退化(0长度)循环。因此,不能利用随机状态初始化BBS发生器,它可能处于短循环。
散列函数
特殊的单向函数被称为散列函数,它将任意长度的消息映像到固定长度散列值。将散列函数表示为H[M]。由于输入是任意长度的,所以散列函数具有压缩分量,以产生固定长度输出。散列函数还具有杂乱分量(obfuscation component),以使它难以发现冲突而且难以根据H[M]确定关于M的信息。因为冲突的确存在,所以大多数应用要求散列算法防止预成像(preimage),因为对于给定的X1,难以求得X2,以致H[X1]=H[X2]。此外,大多数应用还要求散列算法防止冲突(即,应该难以求得两个消息X1和X2,以致H[X1]=H[X2])。公开问题是,在理想情况下,是否可以从根本上存在防冲突散列函数。散列函数的主要应用是,在应用数字签名算法之前,将输入消息缩减为“手印”。从下面的例子中可以看到与数字签名冲突的一个问题。
A具有长消息M1,比如“我欠B 10美元”。A利用其专用密钥在H[M1]上签字。B是贪婪的,然后,他搜索到一条冲突消息M2,其中H[M2]=H[M1],但是对于B其中的M2更好,例如“我欠B1百万美元”。显然,从A的利益出发,要确保难以找到这种M2。
防冲突单向散列函数的例子有全部根据MD4获得的SHA-1、MD5以及RIPEMD-160。
MD4
Ron Rivest于1990年提出MD4。在此提到MD4是因为所有其他单向散列函数均以某种方式根据MD4获得。现在认为MD4是完全分离的,因为可以计算冲突,而非搜索冲突。在上面的例子中,B可以产生与原始消息M1具有相同散列值的、无足轻重的替换消息M2。
MD5
作为更安全的MD4,Ron Rivest于1991年提出MD5。与MD4类似,MD5产生128位散列值。最近发生攻击之后,Dobbertin对MD5的状态进行了描述。他说明了如何在MD5内发现伪冲突,指出压缩函数的弱点,而且最近,已经发现冲突。这意味着,在其中存在冲突可能产生严重后果的数字签名方案中,MD5不应该用于压缩。然而,MD5仍然可以用作单向函数。此外,这些最近的攻击,未影响HMAC-MD5结构。
SHA-1
SHA-1与MD5非常类似,但是它具有160位的散列值(MD5只有128位的散列值)。SHA-1是为了用于数字签名标准(DSS)由NIST和NSA提出并设计的。最初出版的说明被称为SHA,但是稍后,就被修改为SHA-1,据认为它可以校正SHA中的安全性缺陷(但是NSA未透露改变背后的数学原因)。已知还没有针对SHA-1的密码攻击。与MD4或MD5相比,它更可以防止强行攻击,仅因为它具有更长的散列结果。美国政府拥有SHA-1和DSA算法(被定义为DSS的一部分的数字签名验证算法),而且具有至少一个相关专利(1993年授予的第5,231,688号美国专利)。
RIPEMD-160
RIPEMD-160是利用其前身RIPEMD(1992年为欧共体的RIPE项目开发的)获得的散列函数。从其名字可以看出,RIPEMD-160产生160位散列结果。为了协调32位体系结构上的软件实现,RIPEMD-160意在提供10年或更长时间的高度安全性。尽管没有针对RIPEMD-160的成功攻击,但是它比较新,而且还未对它进行广泛密码分析。原始RIPEMD算法是为了防止针对MD4的已知密码攻击而专门设计的。最近针对MD5的攻击显示,RIPEMD 128位散列函数存在类似的弱点。尽管攻击仅说明了理论上的弱点,但是Dobbertin、Preneel以及Bosselaers仍进一步将RIPEMD增强为新算法RIPEMD-160。
消息验证码
下面概括说明消息验证的问题:
A如何确保可能发自B的消息确实发自B?
消息验证不同于实体验证。对于实体验证,一个实体(申请者)向另一个实体(验证者)证明其是否。对于消息验证,我们关心的是,确保给定的消息来自我们认为该消息来自的人,即,从信源到其目的地的路由未被擅自修改。单向散列函数不能充分保护消息。诸如MDS的散列函数取决于产生表示原始输入的散列值,而且根据该散列值不能获得原始输入。位于A与B之间的E进行的简单攻击就是截取来自B的消息,而用他自己的消息代替。即使A还发送散列原始消息,E仍可以仅用他自己的散列新消息代替。单独使用单向散列函数,A没有办法知道B的消息被改动。消息验证的一种解决方案是消息验证码,即,MAC。在B发送消息M时,他还发送MAC[M],以便接收机知道M实际上来自B。这是可能的,仅B必须能够产生M的MAC,此外,A应该能够针对MAC[M]验证M。请注意,这与加密M不同,即,在M不必被保密时,MAC有用。由散列函数建立MAC的最简单方法是,利用对称算法加密散列值:
散列输入消息H[M]
加密散列EK[H[M]]
这样比首先加密消息,然后散列该加密消息更安全。可以使用任何对称的或非对称的密码函数。然而,利用与密钥有关的单向散列函数代替采用加密的技术(如上所述)具有优点:
速度,因为单向散列函数通常比加密过程快得多;
消息大小,因为EK[H[M]]至少与M的大小相同,而H[M]具有固定大小(通常比M小得多);
硬件/软件要求—密钥单向散列函数通常比其基于加密的单向散列函数简单得多;以及
单向散列函数实现过程不被认为是加密器件或解密器件,因此不受美国的出口控制。
应该注意,原始设计的散列函数从来不包括密钥或不支持消息验证。因此,建议了一些使用散列函数进行消息验证的特定方法,该方法包括使消息与保密前缀、后缀或它们二者连在一起的各种函数。大多数这种特定方法均被高级手段成功攻击。还根据”异或”运算解决方案和Toeplitz矩阵建议了其他MAC(包括基于LFSR结构的特殊情况)。
HMAC
作为因特网消息验证安全协议解决方案,HMAC结构尤其获得了认可。HMAC结构用作以黑盒子方式使用基础散列函数的环绕器(wrapper)。如果要求,则替换散列函数是直通的,因为安全性和性能原因。然而,HMAC结构的主要优点在于,如果基础散列函数具有某种合理的密码强度,即,HAMC的强度直接与散列函数的强度有关,则可以保证它是安全的。由于HMAC结构是环绕器,所以在HMAC中可以采用任何迭代散列函数。例子包括HMAC-MD5、HMAC-SHA1、HMAC-RIPEMD 160等。给出下面的定义:
H=散列函数(例如,MD5或SHA-1)
n=H输出的位数(例如,SHA-1为160位,MD5为128位)
M=应用MAC函数的数据
K=双方共享的保密密钥
ipad=重复64次0×36
Opad=重复64次0×5C
下面是HMAC算法:
通过在K的末尾附加0×00字节,将K扩展到64字节
对在(1)产生的64字节串与ipad进行”异或”运算
将数据流M附加到在(2)产生的64字节串
将H附加到在(3)产生的流
将在(1)产生的64字节串与opad进行”异或”运算
将在(4)获得的H附加到在(5)获得的64字节
将H附加到(6)的输出并输出结果
这样:
HMAC[M]=H[(K_opad)|H[(K_ipad)|M]]
推荐的密钥长度至少为n位,但是它不应该超过64字节(散列化块(hashing block)的长度)。不将比n位长的密钥附加到函数的安全性上。HMAC选择使最终输出截断,例如,将160位截断成128位。在首先提出这种算法之后一年,即1997,HMAC设计者提出征求意见(Request forComment)。设计者要求,针对HMAC的最强的已知攻击是基于散列函数的冲突频率的,而且对于最小合理散列函数,它完全不切实际。最近,为了防止在给定时间周期内捕获并回放任何M、HMAC[M]组合,确定了具有防回放分量的HMAC协议。
随机数和时变消息
已经对将随机数发生器用作单向函数进行了详细说明。然而,随机数发生器原理大量涉及密码术、安全性以及验证。存在许多与确定良好随机数发生器有关的问题。Knuth描述了什么使发生器性能良好(包括统计测试),以及与构造它们有关的一般问题。随机数的用途之一就是确保消息随时间变化。对其中A加密命令,然后将它们送到B的系统进行研究。如果对于给定的输入,该加密算法产生同样的输出,则攻击者可以仅记录消息,并对被蒙骗的B播放它们。除了知道对B播放哪个消息(同时假装是A),攻击者不需要破解加密机制。因此,消息通常包括随机数和时间戳,以确保随时改变该消息(因此,改变加密的消息)。随机数发生器还经常用于产生密钥。因此,此时最重要的是要说,对于此用途,所有发生器均不安全。例如,Berlekamp-Massey算法是针对LFSR随机数发生器的典型攻击。如果LFSR的长度为n,则仅2n位的序列足以确定包括密钥发生器的LFSR。然而,如果随机数发生器的作用仅是确保该消息随时间变化,则发生器和籽数的安全性不象它对于对话密钥生成过程那样重要。然而,如果随机数籽数发生器受到损害,而且攻击者能够计算未来的“随机”数,则它可以敞开攻击某些协议。任何新协议均应该针对该情况做检验。实际需要的随机数发生器取决于实现过程和该发生器的用途。发生器包括Blum、Blum和Shub、诸如Ron Rivest提出的RC4的流密码、诸如SHA-A和RIPEMD-160的散列函数以及诸如LFSR(线性反馈移位寄存器)及其相应FCSR(利用进位移位寄存器的反馈)的传统发生器。
攻击
本小节将说明可以破解诸如验证芯片的验证密码系统的各种类型的攻击。攻击分类为:物理攻击和逻辑攻击。物理攻击就是破解密码系统的物理实现的方法(例如,打开芯片来检索密钥),而逻辑攻击包括作为独立实现过程对密码系统进行攻击。逻辑攻击针对协议或算法,并尝试做以下3件事情:
完全旁路验证过程
利用强迫或者利用演绎法获得密钥,因此可以应答任何问题
发现关于验证问题和应答的性质的足够内容,以在没有密钥情况下,对每个问题给出正确答案。
以下将详细说明它们所采取的攻击风格和方式。不考虑安全性芯片使用的算法和协议,该芯片的验证部分的电路系统可能受到物理攻击的影响。物理攻击以4主要方式进行,但是可以改变攻击方式:
完全旁路验证芯片
在操作时,物理检验芯片(破坏或者不破坏)
物理分解芯片
物理改变芯片
下面将详细说明它们采取的攻击风格和方式。本小节未对这些攻击建议解决方案。仅对每种攻击类型进行了描述。仅限制在对安装在某个系统上的验证芯片53的类型进行检验(与诸如因特网验证的某种其他系统不同)。
逻辑攻击
这些攻击是仅取决于密码系统的物理实现的攻击。它们攻击算法和随机数发生器的协议和安全性。
只密文攻击
在这种情况下,攻击者具有一个或者多个全部利用同一种算法加密的加密消息。攻击者的目的是根据加密消息获得明文消息。最理想的是,可以恢复密钥,以便将来可以恢复所有消息。
已知明文攻击
在这种情况下,攻击者具有明文和加密形式的明文。对于验证芯片,已知明文的攻击是一种攻击者可以看到系统与验证芯片之间的数据流的攻击。观察输入和输出(攻击者不选择),而且可以分析输入和输出的弱点(例如,生日攻击,或者通过搜索不同的感兴趣输入/输出对)。已知明文攻击是比选择明文攻击弱的攻击,因为攻击者只能观察到数据流。通过将逻辑分析器连接到系统与验证芯片之间的连线上,就可以进行已知
明文攻击。
选择明文攻击
选择明文攻击就是一种密码分析可以将任意选择的消息发送到密码系统,并观察响应。如果密码分析知道该算法,则通过将特定输出馈送到另一个函数的输入可以采用的输入与输出之间可能存在关系。在使用嵌入式验证芯片的系统上,通常非常难以防止选择明文攻击,因为在逻辑上,密码分析可以慌称他/她是系统,因此,将任何选择的位模式流发送到验证芯片。
自适应选择明文攻击
除了攻击者具有根据先前经验,修改后续选择的明文的附加能力外,这种攻击与选择明文攻击相同。当然,对于在用于诸如照片复制器(photocopier)和墨粉盒的消耗品时描述的任何系统/验证芯片情况的确如此,尤其因为系统和消耗品均是公开可用的。
强力攻击
破解任何基于密钥的密码系统算法的确保方式仅是尝试每个密钥。最后,找到正确的密钥。这被称作强力攻击。然而,存在的可能密钥越多,则必须尝试的密钥就越多,因此,找到正确密钥,花费的时间就长(平均时间)。如果有N个密钥,则最多进行N次尝试。如果密钥的长度为N位,则最多进行2N次尝试,进行一般尝试(2N-1)获得该密钥的几率是50%。N越长,获得密钥花费的时间就越长,因此,密钥就越安全。当然,攻击者可以推测第一次尝试的密钥,但是密钥越长,这就越不可能。对56位长度的密钥进行研究。在最糟糕情况下,为了发现密钥,必须进行全部256次测试(7.2×1016次测试)。在1977年,Diffie和Hellman描述了一种用于破解DES的专用机器,它包括1百万个每个每秒执行1百万次测试的处理器。要破解任何DES码,这种机器必须花费20小时。对128位长度的密钥进行研究。在最糟糕情况下,为了发现密钥,必须进行全部2128次测试(3.4×1016次测试)。对于千吉(1012)个每个每秒分别进行10亿次测试的处理器,这将花费100亿年。如果密钥长度足够长,则强力攻击花费的时间太长,以致攻击者不值得这样做。
推测攻击
这种攻击就是攻击者尝试仅“推测”密钥。作为一种攻击方法,它与强力攻击的相同之处在于,成功的希望取决于密钥的长度。
量子计算机攻击
为了破解n位密钥,必须建立含有嵌入适当算法内的n库位(qubit)的量子计算机(NMR、光学或Caged Atom)。量子计算机有效存在于2n同时相关状态中。技巧是提取正确的相关状态,而不导致任何不相关。迄今为止,已经利用2库位系统实现了这种量子计算机(存在于4个相关状态中)。据认为,可以在几年内将其扩展到6库位(基于64个同时相关位)。
不幸的是,每个附加库位使表示该密钥的信号的相对强度降低一半。对于密钥检索,这样迅速成为影响密钥检索的严重障碍,特别是对于密码安全系统内使用的长密钥。因此,不大可能利用量子计算机对密码安全密钥(例如,160位)进行攻击,而且在验证芯片的商业寿命内,量子计算机极不可能实现大约50库位。即使使用50库位量子计算机,破解160位的密钥需要2110次测试。
蓄意错误攻击
利用某种算法,攻击者可以从错误输入的结果中搜集有价值的信息。这可以在错误消息正文与产生错误花费的时间之间变化。简单例子是用户标识符/口令解决方案。如果错误消息经常是“错误用户标识符”,则在攻击者代之于获得“错误口令”的消息时,它们就知道用户标识符是正确的。如果该消息始终是“错误标识符/口令”,则对攻击者提供的信息非常少。更复杂的例子是最近公开的、由安全网点破解加密码的方法。攻击包括将特定消息发送到服务器,然后,获得错误消息响应。该响应对了解该密钥提供足够信息—即使缺乏响应,仍可以给出某些信息。利用一在输入消息中检测到错误位时就返回错误的算法,可以明白算法时间的例子。根据硬件实现,攻击者对响应进行计时,根据错误响应花费的时间逐位改变每位,然后获得密钥,是一种简单方法。当然,在芯片实现中,可以比通过因特网更准确的方式观测占用的时间。
生日攻击
该攻击是以著名的“生日判定”名称命名的(它根本不是实际判定)。在365天中(不考虑闰年),一个人与另一个人的生日相同的希望是1。因此,如果在一个房间内,其中一人与你的生日相同的希望超过50%,则该房间内必须有183人。然而,只要房间内有23个人,则任何两个人的生日相同的几率将超过50%。这是因为23人产生253个不同的对。生日攻击是针对散列算法的常用攻击,特别是将散列与数字签名组合在一起的算法。如果已经生成了信息而且已经被签名,则攻击者必须搜索对同一个值散列的冲突消息(模拟寻找其生日与你的生日相同的一个人)。然而,如果攻击者可以生成消息,则开始进行生日攻击。攻击者搜索两个具有同样散列值的消息(模拟生日相同的任何两个人),只有一个消息可以接受被签字,而另一个消息对攻击者有益。一旦对该原始消息进行了签字,攻击者就只要求被签字的替换消息—利用数学方法,没有办法告知哪个消息是原始消息,因为它们二者均对同一个值散列。假如强力攻击是确定匹配的唯一方式,则利用生日攻击弱化的n位密钥是2n/2。易受生日攻击的128位密钥长度仅有64位的有效长度。
链式攻击
这是针对散列函数的链接性质进行的攻击。它们集中在散列函数的压缩函数。该理论基于,散列函数通常取任意长度的输入并通过一次性对输入的n位进行处理,产生固定长度输出的事实。将一个块的输出用作下一个块内的链式变量集。不是对整个输入寻找冲突,该理论是给出输入链式变量集,以发现替换块,该替换块将产生同样的输出链式变量作为正确消息。根据块的长度,选择特定块的数量。如果链式变量是c位,则散列函数的作用就象随机映像一样,而且快长度是b位,这种b位块的数量大约2b/2c个。查找替换块的困难是这些块是所有可能块的稀疏子集。对于SHA-1,512位块的数量约为2512/2160,即2352。在2160中,利用强力搜索找到块的机会约为1。
利用完全查用表替换
如果发送到芯片的可能消息的数量少,则仿制制造商不需要破解密钥。相反,仿制制造商可以将ROM插入其芯片,用于记录所有真品芯片对系统发送的代码作出的响应。密钥越大,而且响应越大,则这种查用表所需的空间越大。
利用稀疏查用表替换
如果可以以某种方式预测发送到芯片的消息,而不是实际上的随机消息,则仿制制造商不需要提供完全查用表。例如:
如果消息仅是序列号,则仿制制造商仅需要提供含有过去的序列号和预测的未来序列号的值的查用表。不可能超过这些的109倍。
如果测试代码仅是日期,则仿制制造商可以利用该日期作为地址产生查用表。
如果测试代码仅是将序列号或日期用作籽数的伪随机数,则仿制制造商仅需要破解系统内的伪随机数发生器。这可能是不可能的,因为他们已经选取了系统的对象代码。这样,通过利用这些代码选取所存储的验证码,仿制制造商就可以产生可以寻找内存(或其他稀疏阵列查用表)的内容。
差异密码分析
差异密码分析描述了一种利用已知差别产生成对输入流,然后对编码流中的差别进行分析的攻击。现有差异攻击主要取决于DES和其他类似算法使用的S盒子的结构。尽管诸如HMAC-SHA1的其他算法没有S盒子,但是攻击者仍可以通过进行统计分析来进行差异型攻击:
最小差别输入,及其相应输出
最小差别输出,及其相应输入
一旦描述了该进程,就可以针对差别密码分析增强大多数算法。在关于每种密码算法的特定小节内对该内容进行了说明。然而,保密开发的某些最新算法已经被破解,因为开发者没有考虑到差异攻击的特定风格,而且未使他们的算法经受公众的检查。
消息替换攻击
在某些协议中,左右为难的人(man-in-the-middle)可以替换部分或全部消息。这就是将真实验证芯片插在位于消耗品内的可再用仿制芯片上。仿制芯片截取系统与验证芯片之间的所有消息,而且可以进行独立替换攻击。对含有标题的消息进行研究,标题的后面是内容。攻击者可能不能产生有效标题,但是,特别是,如果有效响应是某些内容以及一行“是的,我收到了你的消息”,则可能可以替换他自己的内容。即使返回消息是“是的,我收到了下面的消息...”,攻击者仍可以在将确认返回原始发送者之前,替换原始消息。开发消息验证码以防止大多数消息替换攻击。
逆向工程密钥发生器
如果伪随机数发生器用于产生密钥,则仿制制造商可能获得该发生器的程序,或者推断所使用的随机籽数。这就是最初破解Netscape安全程序的方式。
完全旁路验证
在允许完全旁路验证进程的验证协议中,可能存在问题。对于这些类型的攻击,与密钥完全无关,而且攻击者不需要恢复它或者推断它。对在加电时进行验证,但是在其他时间不进行验证的系统的例子进行研究。具有仿制验证芯片的可再用消耗品可以使用真实验证芯片。仿制验证芯片53利用真实芯片进行验证调用,此后,模拟真实验证芯片的状态数据。旁路验证的另一个例子是如果系统仅在使用消耗品之后进行验证的情况。通过对在使用消耗品之后,而在完成验证协议(甚或开始验证协议)之前丧失连接的情况进行模拟,仿制验证芯片可以实现简单的验证旁路。一种被称为“Kentucky Fried Chip”黑客的不著名攻击涉及替换卫星电视系统的微控制器芯片。在用户停止支付收视费时,系统可以发出“关闭”消息。然而,新微控制器仅检测该消息,而不将它送到消费者的卫星电视系统。
强迫(garrote)/行贿攻击
如果人们知道密钥,则存在他们告诉其他人的可能性。告诉的原因可能是因为被迫(行贿,强迫等)、报复(例如,心怀不满的雇员)或者仅因为道德原因。与推断密钥的其他攻击相比,这些攻击通常更廉价、容易。作为例子,要求开发Divx标准的许多人最近(1998年5月/6月)抱怨形形色色的DVD新闻组不道德,因为他们要帮助开发Divx专用破解设备。
物理攻击
下面的攻击假定在攻击者物理接触的硅芯片上实现验证机构。首先攻击读ROM就是在密钥存储在ROM内时进行的攻击,其余攻击假定保密密钥存储在闪速存储器内。
读ROM
如果密钥存储在ROM内,则可以直接读它。因此,ROM可以用于安全地保存公开密钥(用于非对称密码术),但是不保存公开密钥。在对称密码术中,ROM完全不安全。将版权正文(例如,haiku)用作密钥是不够的,因为我们认为在知识产权得不到保护的国家存在仿制芯片的现象。
芯片逆向工程
芯片逆向工程是攻击者打开芯片并分析电路系统的情况。一旦对电路系统进行了分析,就可以发现芯片算法的内部工作。Lucent Technologies已经开发了一种被称为TOBIC(两个光子OBIC,其中OBIC代表光束感应电流)、用于描绘电路的有效方法。所做的开发主要用于静态RAM分析,该过程包括卸下背面材料,抛光背面达到镜面光洁度,然后,将光聚焦到该表面上。特别选择激发波长以便不在IC内部感应电流。Kerckhoffs在19世纪提出了一种关于密码分析的基本设想:如果算法的内部工作是唯一保密解决方案,则该解决方案很好被破解。他认为保密必须完全建立在密钥基础上。因此,防止逆向工程芯片的最好方法就是实现内部工作无关。
篡夺验证进程
必须假设任何一个仿制制造商均接触了该系统和消耗品的设计。如果同样的通道用于系统与可信系统验证芯片以及非可信消耗品验证芯片之间的通信,则非可信芯片可能可以询问可信验证芯片,以便获得“正确应答”。如果是这样,则仿制制造商就不必确定密钥。他们只需诱骗系统使用系统验证芯片发出的响应。篡夺验证进程的替换方法仿效与“旁路验证进程”的逻辑攻击相同的方法,包括每当执行验证进程时,就模拟与系统断开连接,模拟掉电等情况。
修改系统
这种攻击就是修改系统本身以接受仿制消耗品。这种攻击可以是改变系统ROM、对消耗品进行重新接线,或者,采取极端情况,完全仿制系统。这种攻击需要对每个单独系统进行修改,而且很可能需要拥有者的同意。这样通常必须对进行这种修改的消费者具有明显的好处,因为它通常没有保证,而且很可能成本高。对消费者具有明显好处的这种修改的例子是软件补丁,它将固定区域DVD播放器变更为区域不固定DVD播放器。
利用传统探测方法直接检查芯片运行过程
如果利用STM或电子束可以直接检查芯片运行过程,则在从内部非易失性存储器读出密钥并将它们装载到工作寄存器内时,可以记录该密钥。这种传统探测方式需要在加电时,直接接触IC的上面和正面。
直接检查非易失性存储器
如果切割该芯片以露出闪速存储器的浮动栅极,而不对它们进行放电,则利用STM或SKM(扫描开尔文显微镜(scanning KelvinMicroscope))可以直接检查密钥。然而,将芯片切割到这种程度,又不使栅极放电几乎是不可能的。采用湿法蚀刻、等离子蚀刻、离子蚀刻(聚焦离子束蚀刻)或化学机械抛光几乎确定要对浮动栅极上存在的少量电荷放电。
检查状态改变产生的光短脉冲串
每当栅极改变状态时,均发出少量红外能量。由于硅对于红外光是透明的,所以通过从芯片的下侧观察电路系统,可以观察到这些改变。尽管发射过程微弱,但是其亮度足以被为天文学开发的高敏设备检测到。IBM开发的这种技术被称为PICA(皮秒成像电路分析器)。如果在时间t已知寄存器的状态,则始终观察寄存器的变化可以发现时间t+n时的准确值,而且如果该数据是密钥的一部分,则该部分受到损害。
监测EMI
每当电子电路系统工作时,总要发出微弱电磁波信号。较廉价设备(几千美元)可以监测这些信号。这样可以给出足以使攻击者推断密钥的信息。
检查Idd波动
即使不能发现密钥,每当寄存器改变状态时,总存在电流波动。如果存在足够高的信噪比,则攻击者可以监测到在通过高位或低位按程序工作时,可能产生的Idd的差别。Idd的变化可能披露关于密钥的信息。这种类型的攻击已经用于破解智能卡了。
差异故障分析
这种攻击假定利用电离作用、微波辐射或环境应变产生误码。在大多数情况下,这种误码更可能反面影响芯片(例如,使程序代码失效),而不是使其产生披露密钥的有益改变。诸如ROM覆盖写、栅极破坏等的目标故障非常可能产生有用结果。
时钟假信号脉冲(glitch)攻击
通常设计的芯片在特定时钟速度范围内正确工作。某些攻击者试图通过以极高的时钟速度运行该芯片,产生故障,或者在特定时长内,在特定时间引入时钟假信号脉冲。这种想法是产生使电路系统不能正常工作的竞争情况。一个例子是始终利用Input1选通(因为竞争情况)的“与”门代替Input1和Input2的“与”。如果攻击者知道芯片的内部结构,则他们可以尝试在算法执行过程中的正确时间引入竞争情况,从而发现关于密钥的信息(或者在最糟糕情况下,发现密钥本身)。
供电攻击
不是以时钟信号的形式产生假信号脉冲,攻击者还可以以其中将功率升高或者降低到工作运行电压范围之外的供电形式产生假信号脉冲。其有效作用与时钟假信号脉冲的有效作用相同,即,使执行特定指令的过程产生错误。该想法是使CPU停止对密钥进行“异或”运算,或者停止使数据移位一位位置等。瞄准特定指令,以便发现关于密钥的信息。
覆盖写ROM
利用激光切割机显微镜,根据逻辑情况,可以将ROM中的一位覆盖写为1或0。利用给定的操作码集/操作数集,攻击者将条件转移变更为非条件转移,或者改变寄存器转移的目的地是一件简单事情。如果仔细选择了目标指令,则可以产生发现的密钥。
修改EEPROM/闪速
除了激光切割机显微镜技术可以用于置位和复位各位外,EEPROM/闪速攻击与ROM攻击相同。这样通过修改算法提供更大的范围。
栅极破坏
Anderson和Kuhn描述了快速软件加密(Fast Software Encryption)上的1997 workshop的尾部(rump)对话,其中Biham和Shamir介绍对DES的攻击。该攻击将使用激光切割机破坏已知块密码的硬件实现的各栅极(DES)。攻击的有效作用是迫使寄存器的特定位被“固定”。Biham和Shamir描述了这样强制影响特定寄存器的作用—将舍入函数的输出的最低有效位置位为0。将左半部分和右半部分的6个最低有效位进行比较,可以发现密钥的几位。这样破坏许多芯片可以发现关于密钥的足够信息,从而便于完全恢复密钥。这样修改的加密芯片具有加密和解密不再相反的特性。
覆盖写攻击
攻击者不试图读闪速存储器,而是仅利用激光切割机显微镜置位一位。尽管攻击者不知道先前值,但是他们知道新值。如果该芯片仍在工作,则位的原始状态一定与新状态相同。如果芯片不再工作,则位的原始状态一定是当前状态的逻辑“非”。攻击者可以对密钥的每位进行攻击,并获得使用最多n个芯片的n位密钥(如果新位匹配旧位,则不需要新芯片确定下一位)。
测试电路系统攻击
大多数芯片含有为了检验制造缺陷而专门设计的测试电路系统。这包括BIST(内建自测试)和扫描通路。扫描通路和测试电路系统经常包括所有嵌入式锁存器的存取机制和读出机制。在某些情况下,测试电路系统可以用于给出关于特定寄存器的内容的信息。通常,一旦芯片通过了所有制造测试,则在某些情况下,通过断开芯片内的特定连接,使测试电路系统关闭。然而,确定的攻击者可以重新连接该测试电路系统,并启动它。
内存剩磁
在断开电源后,各值长时间残留在RAM内,但是他们残留的时间不够长,不能被看作是非易失性的。一旦敏感信息被转移到RAM(例如,工作寄存器)内,攻击者就可以卸下电源,然后,尝试从RAM读取数值。对于具有常规RAM芯片的安全系统,这种攻击最有效。典型例子是,对安全系统设置自动电源关闭功能,它是在计算机外壳被打开时被触发的。攻击者可以仅打开外壳,卸下RAM芯片,然后检索密钥,因为内存剩磁。
芯片盗窃攻击
如果芯片被盗窃,则在验证芯片的寿命期内存在许多时期时,必须根据安全分布检验这些时期中的每个时期。例如,如果在各时期内,将信息编程到芯片内,则在各时期之间盗窃芯片可以使攻击者接触密钥信息,或者介绍进行攻击所做的工作。同样,如果芯片在制造之后,而在编程之前被盗窃,它对攻击者提供任何逻辑或物理优点吗?
要求
验证消耗品问题的现有解决方案通常取决于实际特制封装。然而,这并不能阻止在工业产权保护弱的国家存在家庭再充操作或仿制。因此,需要非常高水平的保护。因此,在验证芯片53内建立验证机构,从而使系统安全、容易地验证消耗品。如果仅探讨系统验证消耗品(我们未对消耗品验证系统进行研究),则可以考虑两级保护:
只存在验证(Presence Only Authentication)
在这种验证中,仅检验验证芯片是否存在。验证芯片可以重新用于另一个消耗品,而无需重新编程。
消耗品寿命验证
在这种验证中,不仅要存在测试的验证芯片,而且验证芯片53还必须仅维持消耗品的寿命。对于将再用的芯片,必须将它完全擦除并重新编程。要求两级不同的保护地址。为了防止仿制大量消耗品,我们主要关心消耗品寿命验证。在这种情况下,每个芯片应该保存关于正在验证的消耗品的安全状态信息。应该注意,消耗品寿命验证芯片可以用于需要只存在验证芯片的任何情况。应该分别研究验证要求、数据存储完整性要求以及制造要求。下面的各小节概括说明每种要求。
验证
对只存在验证和消耗品寿命验证的验证要求仅局限于系统验证消耗品的情况。对于只存在验证,我们必须保证实际上存在验证芯片。对于消耗品寿命验证,我们还需要保证状态数据实际上来自验证芯片,而且保证它们未在途中被改变。不能将这些问题分离,被改变的数据具有新信源,而且如果不能确定信源,则不能解决改变的问题。根据未经安全专家仔细检查的自制(home-brew)安全方法,不足以提供保密的验证方法。因此,主要要求是利用经专家仔细检查的装置进行验证。验证芯片53使用的验证方案应该能够防止被逻辑装置摧毁。逻辑型攻击是多方面的,而且试图做以下3件事情之一:
完全旁路验证进程
利用强迫或者利用演绎法获得密钥,因此可以应答任何问题
发现关于验证问题和应答的性质的足够内容,以在没有密钥情况下,对每个问题给出正确答案。
数据存储完整性
尽管验证协议关心确保通信消息内的数据完整性,但是还是要求数据存储完整性。必须将两种数据存储到验证芯片中:
验证数据,例如,保密密钥
消耗品状态数据,例如,序列号和剩余媒体等。
这两种数据类型的存取要求非常不同。因此,验证芯片53需要满足每种类型的完整性要求的存储/存取控制机制。
验证数据
验证数据必须保持机密。需要在芯片寿命的制造/编程时期,将它存储到芯片中,但是从此开始,一定不能允许它离开该芯片。必须防止从非易失性存储器内读出它。验证方案负责确保不能通过推断获得密钥,而制造过程负责确保不能利用物理方法获得密钥。验证数据存储区的大小必须足够大,以便保存验证协议管理的必要密钥和保密信息。
消耗品状态数据
每个验证芯片53还需要能够存储256位(32字节)的消耗品状态数据。可以将消耗品状态数据划分为下面的类型。根据应用,这些类型的数据项目中的每种类型的数据项目的位数不同。将对最大数是32位的一个数据项目进行研究。
只读
读写
只递减
在芯片寿命的制造/编程时期,需要将只读数据存储到芯片中,但是从此开始,不应该允许改变它。只读数据项目的例子是消耗品批号和序列号。
读写数据是可变状态信息,例如,上次使用的特定消耗品。在消耗品的寿命期间,可以将读写数据项目读和写无限次数。它们可以用于存储关于消耗品的任何状态信息。对该数据的唯一要求是,需要将它保存在非易失性存储器中。由于攻击者可以接触系统(可以写到读写数据),所以任意一个攻击者均可能改变这种类型的数据字段。这种数据类型不应该用于保密信息,而且必须认为它不安全。
只递减数据用于递减计数消耗品资源的可用性。例如,照片复制器的墨粉盒可以将墨粉剩余量作为只递减数据项目存储。彩色打印机的墨水盒可以将每种颜色的墨水的数量作为只递减数据项目存储,需要3个只递减数据项目(分别用于青色、深红色和黄色),甚或需要多至5个或者6个只递减数据项目。对这种数据项目的要求是,一旦在制造/编程时期利用初始值被编程,则可以仅减小其数值。它一到达最小值,就不能再递减了。仅消耗品寿命验证需要只递减数据项目。
制造
最理想的是,验证芯片53的制造成本必须低,以便包括它,将它用作低成本消耗品的验证机构。验证芯片53应该使用标准制造工艺,例如闪速。这需要:
允许大范围选择制造位置
使用意义明确、性能良好的技术
降低成本
不考虑所使用的验证方案,芯片验证部分的电路系统必须防止物理攻击。物理攻击以4种方式进行,但是攻击方式可以改变:
完全旁路验证芯片
在操作时,物理检验芯片(破坏或者不破坏)
物理分解芯片
物理改变芯片
最理想的是,美国应该可以出口该芯片,这样就不能将验证芯片53用作安全加密器件了。这种要求是次要的,因为其他国家的许多公司可以制造这种验证芯片。总之,美国的出口限制可能会改变。
验证
验证消耗品问题的现有解决方案通常取决于实际特制封装。然而,这并不能阻止在工业产权保护弱的国家存在家庭再充操作或仿制。因此,需要非常高水平的保护。因此,根据未经安全专家仔细检查的自制(home-brew)安全方法,不足以提供保密的验证方法。诸如Netscape的原始专用系统和蜂窝电话使用的GSM防骗网络(Fraud PreventionNetwork)的安全系统是其中设计保密导致安全性脆弱的例子。这两个安全系统均被传统装置破解,但是如果该公司利用公开设计方法进行设计,则可以检测到该传统装置。该解决方案是利用经专家仔细检验的装置提供验证。大量协议可以用于消耗品验证。我们仅使用公开描述的、以这种新方式使用已知行为的安全方法。对于所有协议,该解决方案的安全性取决于保密密钥,而不取决于保密算法。所有协议均取决于时变询问(即,每次询问不同),其中响应取决于询问和保密。询问包括随机数,以使任何观察者不能获取关于后续验证的有用信息。对只存在验证和消耗品寿命验证分别提供两个协议。尽管协议的区别在于验证进程所需验证芯片的数量,但是无论如何,该系统要验证消耗品。特定协议将与一个或者两个芯片一起工作,但是其他协议仅与两个芯片一起工作。无论是使用一个验证芯片,还是使用两个验证芯片,该系统仍负责进行验证判定。
一个芯片验证
当只有一个验证芯片53用于验证协议时,一个芯片(称为ChipA)负责向系统(称为System)证明它是真实的。在该协议开始时,System不能肯定ChipA的真实性。系统利用ChipA执行询问—响应协议,从而确定ChipA的真实性。在所有协议中,消耗品的真实性直接取决于芯片的真实性,即,如果认为ChipA是真实的,则认为该消耗品是真实的。在图167中可以看到数据流。在一个芯片验证协议中,System可以是软件、硬件或它们二者的组合。重要的是要注意,认为系统不安全—通过检验ROM,或者通过检验电路系统,攻击者可以容易地对其进行逆向工程。为了本身安全,不专门设计System。
双芯片验证
在其他协议中,如图168所示,需要2个验证芯片。一个芯片(称为ChipA)负责向系统(称为System)证明它是真实的。作为验证进程的一部分,System采用可信验证芯片(称为ChipT)。在双芯片验证协议中,System可以是软件、硬件或者它们二者的组合。然而,ChipT必须是物理验证芯片。在某些协议中,ChipT和ChipA具有同样的内部结构,但是在其他ChipT和ChipA中具有不同的内部结构。
只存在验证(不安全状态数据)
对于这种程度的消耗品验证,我们仅关心证实存在验证芯片53的过程。尽管验证芯片可以含有状态信息,但是传送状态信息并不被认为是安全的。存在两个协议。协议1要求2个芯片,而利用1个或者2个芯片可以实现协议2。
协议1
协议1是双芯片协议(要求2个验证芯片)。每个验证芯片分别含有下面的值:
K FK[X]的密钥。必须保密
R 当前随机数。不必保密,但是必须对每个芯片实例形成具有不同初始值的籽数。每次调用Random函数时改变。
每个验证芯片含有下面的逻辑函数:
Random[] 返回R,以及将R推进到序列中的下一个。
F[] 返回FK[X],根据保密密钥K,对X应用单向函数F的结果。
下面是协议:
System向ChipT请求Random[];
ChipT将R返回System;
System向ChipT和ChipA请求F[R];
ChipT将FKT[R]返回System;
ChipA将FKA[R]返回System;
System将FKT[R]与FKA[R]进行比较。如果它们相等,则认为ChipA有效。如果不相等,则认为ChipA无效。
在图169中可以看到数据流。System不必了解FK[R]消息。它必须仅检验ChipA和ChipT输出的响应是相同的。因此,System不需要密钥。协议1的安全性取决于两个方面:
F[X]的安全性。仅验证芯片含有保密密钥,因此可以根据X产生F[X]的任何内容必须是真实的,X与真实验证芯片53(ChipT)产生的F[X]匹配。
所有验证芯片产生的R的域必须大而且是不确定性的。如果所有验证芯片产生的R的域小,则仿制制造商就不需要破解密钥了。相反,仿制制造商可以将ROM插入他们的芯片中,该ROM记录了真品芯片对系统发送的代码的所有响应。Random函数并不局限于必须在验证芯片内,因为System可以产生同样的随机数序列。然而,它简化了System的设计,并确保随机数发生器的安全性,对于使用验证芯片的所有实现过程,随机数发生器是相同的,从而减少了系统实现中的可能错误。
协议1具有几个优点:
在验证进程期间,未发现K
给定X,如果没有K,或者没有接触真实验证芯片,则仿制芯片不能产生FK[X]。
特别是在诸如喷墨打印机的低成本系统中,容易设计System,因为System本身不需要加密和解密。
存在大量带密钥单向函数(keyed one-way function),包括对称密码术、随机数序列以及消息验证码。
与非对称算法相比,单向函数需要的门少,而且容易验证。
带密钥单向函数的安全密钥大小不必大至非对称(公开密钥)算法的安全密钥那么大。
如果F[X]是对称密码函数,则最小128位可以提供适当安全性。然而,该协议存在以下问题:
容易受到选择正文攻击。攻击者可以将芯片插入其自己的系统,产生选择的RS,然后,观察输出。为了找到密钥,攻击者还可以搜索将产生特殊F[M]的R,因为可以并行测试多个验证芯片。
根据选择的单向函数,可以使密钥生成过程复杂化。选择良好密钥的方法取决于所使用的算法。对于给定算法,特定密钥脆弱。
选择带密钥单向函数本身是不平凡的。因为专利保护,所以有些需要特许。
在将明文消息M传送到ChipA之前,中间芯片(man-in-the-middle)可以对其进行处理—如果在ChipA检测到M之后,中间芯片未检测到M,则这是优先进行的。如果中间芯片根本未检测到M,则这是更优先进行的。
如果F是对称加密,则由于足够安全性所需的密钥大小,不能从美国出口这种芯片,因为它们可以用作强大加密器件。
如果利用F采用非对称加密算法实现协议1,则对对称情况没有优势一需要密钥更长,而且加密算法硅的占用更大。为了保持密钥安全,必须利用验证芯片实现协议1。这意味着,每个System均需要验证芯片,而且每个消耗品也均需要验证芯片。
协议2
在某些情况下,System可以具有大量处理能力。作为一种选择,对于大批量制造的系统的实例,可以要求将ChipT集成到System上。使用非对称加密算法使得System的ChipT部分不安全。因此,协议2采用非对称密码术。对于该协议,每个芯片含有下面的值:
K EK[X]和DK[X]的密钥。在ChipA内必须保密。而不必在ChipT内保密。
R 当前随机数。不必保密,但是必须对每个芯片实例形成具有不同初始值的籽数。每次调用Random函数时改变。
确定下面的函数:
E[X] 仅在ChipT上。返回EK[X],其中E是非对称加密函数E。
D[X] 仅在ChipA上。返回DK[X],其中D是非对称解密函数D。
Random[] 仅在ChipT上。返回R|EK[R],其中R是基于籽数S的随机数。将R推进到序列中的下一个。
公开密钥KT在ChipT内,而保密密钥KA在ChipA内。使KT在ChipT内的优点在于,可以以软件或硬件的方式实现ChipT(条件是,R的籽数对于每个芯片或系统不同)。因此,可以利用单芯片协议或双芯片协议实现协议2。下面是验证协议:
System调用ChipT的Random函数;
ChipT将R|EK[R]返回System;
System调用ChipA的D函数,变成EKT[R];
ChipA返回由DKA[EKT[R]]获得的R;
System将ChipA获得的R与ChipT产生的原始R进行比较。如果它们相等,则认为ChipA有效。如果不相等,则认为ChipA无效。
在图170中可以看到数据流。协议2具有下面的优点:
验证进程期间,未发现KA(保密密钥)
给定EKT[X],如果没有KA,或者没有接触真实ChipA,则仿制芯片就不能产生X。
由于KT≠KA,所以完全可以以软件的形式或硬件的形式或者作为System的一部分实现ChipT。仅要求ChipA(消耗品中的)是安全验证芯片。
如果ChipT是物理芯片,则容易设计System。
有大量有许多文件证明的、密码分析的非对称算法可以选择实现,包括无专利保护和无需特许的解决方案。
然而,协议2本身存在许多问题:
为了满足安全性,每个密钥需要2048位(与协议1中的对称密码术的最小128位相比)。加密算法和解密算法使用的有关中间存储器相应较大。
密钥生成过程是不平凡的。随机数不是良好密钥。
如果利用核心实现ChipT,则可能难以将它连接到给定的SystemASIC。
如果利用软件实现ChipT,则它不仅是公开编程错误和非严格测试的System的实现,而且必须对System的每种实现,严格检验编译程序和数学基元的完整性。与仅使用良好测试的芯片相比,这更复杂,而且成本更高。
尽管为了防止差异密码分析,对许多对称算法专门进行了增强(根据选择正文攻击),但是专用密钥KA仍容易受到选择正文攻击。
如果ChipA和ChipT是同一个验证芯片的实例,则每个芯片必须含有非对称加密功能性和非对称解密功能性。因此,与要求用于协议1的芯片相比,每种芯片更大、更复杂,而且更昂贵。
如果为了节省成本并降低设计/测试的复杂性,将验证芯片分割为2个芯片,则仍需要制造两个芯片,缩小了经济规模。该偏差是系统对于消耗品的相对数量,但是仍必须要考虑在内。
协议2验证芯片不能从美国出口,因为它们被看作强大加密器件。
即使选择协议2的密钥的过程是直通的,协议2当前仍不切实际,因为硅实现的成本高(密钥大小和功能实现)。因此,协议1是选择用于只存在验证的协议。
利用真实验证芯片仿制消耗品
协议1和2仅检验ChipA是真实验证芯片。它们不为了检查消耗品本身是否有效进行检验。验证的基本前提是,如果ChipA有效,则消耗品有效。因此,仿制制造商可以将真实验证芯片插入仿制消耗品。有两种情况需要考虑:
在其中不将状态数据写入验证芯片的情况下,该芯片完全可再用。因此,仿制制造商可以将有效消耗品再造为仿制消耗品。通过将验证芯片埋入消耗品的物理封装内,可以使这变得更难,但是它并不能防止再充操作。
在其中将状态数据写入验证芯片的情况下,该芯片可以是新的、部分用尽的或完全用尽的。然而,这不能防止仿制制造商采用寄生(Piggyback)攻击,在寄生攻击中,仿制制造商建立具有真实验证芯片的芯片作为寄生芯片。因此,攻击者的芯片(ChipE)是中间芯片。在加电时,ChipE将所有内存状态从真实验证芯片53读入它自己的内存。然后,ChipE检验System发出的请求,并根据该请求采取不同的动作。可以直接将验证请求送到真实验证芯片53,模仿真实验证芯片的行为的内存可以模拟读请求/写请求。这样,在加电时,验证芯片53始终表现是新的。这可以由ChipE实现,因为不对数据采取进行验证。
为了诱导System认为其数据存取是成功的,ChieE仍需要真实验证芯片,而在第二种情况下,除了真实验证芯片,还需要仿制芯片。因此,在仿制制造商将真实验证芯片53嵌入消耗品内不合算的情况下,协议1和2有用。如果不能容易地再造或者再充消耗品,则保护充分,可以使用协议1和2。对于成功的仿制操作,每个仿制消耗品必须包括有效验证芯片。一起骗取该芯片,或者从旧消耗品上获取该芯片。这些回收的芯片(以及回收它们所做的工作)的数量不足以支持商业活动,因此安全数据传送的附加保护没有用(请参考协议3和4)。
密钥的存活力
这两个协议的共同问题是,一旦选择了验证密钥,就不能容易地更改它。在某些实例中,损害密钥不成为问题,但是对于其他实例,密钥损害就是灾难性的。例如,在轿车/轿车密钥System/消耗品情况下,消费者只有一组轿车/轿车密钥。每辆轿车具有不同的验证密钥。因此,丢失轿车密钥仅损害各轿车。如果拥有者考虑到该问题,则他们必须通过替换轿车电子电路内的System芯片,对轿车设置新锁。必须重新编程/替换拥有者的密钥,以便与新轿车System验证芯片一起工作。相反,对于大量消耗品市场(例如,打印机内的墨水盒),损害密钥会使仿制墨水盒制造商制造他们自己的验证芯片。现有系统的唯一解决方案是更新System验证芯片,这是一项成本高逻辑上困难的工作。总之,消费者的System已经在工作一没有激励他们重新安排其现有设备。
消耗品寿命验证
在这种程度的消耗品验证中,我们关心证实存在验证芯片的过程以及确保验证芯片仅维持与消耗品同样长的时间的过程。除了证实存在验证芯片外,还必须对读和写验证芯片的内存进行验证。在本小节,我们假定验证芯片的数据存储器完整性是安全的—内存的特定部分是只读的,其他部分是读/写,而其他部分是只递减(关于更多信息,请参考标题为“数据存储完整性”一章)。存在两个协议。协议3要求2个验证芯片,而可以利用一个或者两个验证芯片实现协议4。
协议3
该协议是双芯片协议(要求两个验证芯片)。对于该协议,每个验证芯片含有下面的值:
K1 用于计算FK1[X]的密钥。必须保密。
K2 用于计算FK2[X]的密钥。必须保密。
R 当前随机数。不必保密,但是必须对每个芯片实例形成具有不同初始值的籽数。每次成功验证时改变,正如Test函数确定的那样。
M 验证芯片53的内存矢量(memory vector)。对于每个芯片,该空间的一部分应该不同(不必是随机数)。
每个验证芯片含有下面的逻辑函数:
F[X] 仅是内部函数。返回FK[X],它是根据密钥K1或密钥K2,对X应用单向函数F的结果。
Random[] 返回R|EK[R]。
Test[X,Y] 如果FK2[R|X]=Y,则返回1,而且推进R。否则,返回0。对于所有错误输入,返回0花费的时间必须相同。
Read[X,Y] 如果FK1[R|X]=Y,则返回M|FK2[X|M]。否则,返回0。对于所有错误输入,返回0花费的时间必须相同。
Write[X] 在可以合法覆盖写的、M的这些部分上写X。
为了验证ChipA并读ChipA的内存M:
System调用ChipT的Random函数;
ChipT产生R|FK[R],并将它返回System;
System调用ChipA的Read函数,变成R,EK[R];
ChipA返回M和FK[R|M];
System调用ChipT的Test函数,变成M和FK[R|M];
System检验ChipT输出的响应。如果响应是1,则认为ChipA是真实的。如果是0,则认为ChipA是无效的。
为了对将Mnew写入ChipA的内存M进行验证:
System调用ChipA的Write函数,变成Mnew;
执行对Read的验证过程;
如果ChipA是真实的,而且Mnew=M,则写成功。否则写失败。
图171示出读验证的数据流。关于协议3首先要注意,不能直接调用FK[X]。相反,Random、Test和Read函数可以直接调用FK[X]:
调用者未选择Random[]。它被Random选择。攻击者必须通过多次调用Random、Read以及Test进行强力搜索以获得要求的X、FK1[X]对。
Test[X,Y]调用FK2[R|X] 不直接返回结果,但是将该结果与Y进行比较,然后返回1或0。通过调用Test多次,对给定的X尝试FK2[R|X]的不同值来推断K2所做的任何尝试均被简化为其中攻击者甚至未选择R的强力搜索。
Read[X,Y]调用FK1[X] 调用者必须提供X和FK1[X],因此调用者必须已知X、FK1[X]对。因为该调用返回0,如果:
Y≠FK1[X],调用者可以将Read函数用于对K1进行强力攻击。
Read[X,Y]调用FK2[X|M],调用者提供X,然而,X只能是Random函数已经给出的值(因为利用K1,证实X和Y)。因此,选择正文攻击必须首先从Random中选择各对(实际上是强力攻击)。此外,只有部分M可以用于选择正文攻击,因为某个M是常数(只读),而对于每个消耗品可以仅使用一次M的只递减部分。在下一个消耗品中,M的只读部分不同。
使FK[X]可以被直接调用可以防止对验证芯片进行选择正文攻击。由于在出现要求的R之前,通过多次调用Random、Read和Test,攻击者只能获得选择的R,FK1[X]对,所以为了对K2进行有限选择正文攻击,协议对K1进行强力攻击。在对K2进行选择正文攻击时所做的任何尝试均受到限制,因为不能完全选择该正文:部分M是只读的,而且对于每个验证芯片是不同的。要注意的第二件事情是,使用两个密钥。如果M小,则为了确保F[R]与F[R|X]不相关,使用两个不同的密钥K1和K2。因此,K1用于帮助防止K2受到差异攻击。使用一个较长密钥是不够的,因为M只有256位,而且在消耗品的寿命期内,只有部分M发生变化。否则,攻击者利用某种还未发现的技术可以确定有限改变M对R的特定位组合的作用,并因此而根据FK1[X]计算FK2[X|M]。作为附加预防措施,有关关闭ChipA内的Random和Test函数,以便为了产生R、FK[R]对,攻击者必须使用ChipT的各实例,ChipT的每个实例均比ChipA的每个实例消耗大(由于对于每个ChipT必须获得系统)。同样,应该在调用Random、Read和Test之间存在最小延迟,以使攻击者不能以高速调用这些函数。因此,在特定时间周期内,每个芯片只能发出特定数量的X、FK[R]对。协议3的唯一特定时限要求是,不考虑输入中存在的错误,必须在同样的时间内,产生0返回值(表示错误输入)。因此,攻击者不能得知关于什么值是错误输入值的任何内容。对于RD和TST函数也是正确的。
关于协议3要注意的另一件事情是,从ChipA读数据也需要验证ChipA。System可以确信内存(M)的内容是,如果正确返回FK2[R|M],ChipA要求它是的内容。仿制芯片可以假装M是特定值(例如,可以假装消耗品是慢的),但是它不能对任意R返回FK2[R|M],FK2[R|M]是被System变成的。因此,有效签名FK2[R|M]确保System不仅真实ChipA发送M,而且M在ChipA与System之间不发生变化。最后,所定义的Write函数不验证写。为了验证写,System必须在每次写之后进行读。协议3存在一些基本优点:
验证进程期间,未发现K1和K2
给定X,如果没有密钥,或者没有接触真实验证芯片,则仿制芯片就不能产生FK2[X|M]。
特别是在诸如喷墨打印机的低成本系统中,容易设计System,因为System本身不需要加密和解密。
存在大量基于密钥的单向函数,包括对称密码术、随机数序列以及消息验证码。
与非对称算法相比,带密钥单向函数需要的门少,而且容易验证。
带密钥单向函数的安全密钥大小不必大至非对称(公开密钥)算法的安全密钥那么大。
如果F[X]是对称密码函数,则最小128位可以提供适当安全性。因此,利用协议3,验证ChipA的唯一方式是读ChipA的内存的内容。该协议的安全性取决于所有System的组上的基本FK[X]解决方案和R的域。尽管FK[X]可以是带密钥单向函数,但是对于利用非对称加密实现它没有优势。需要密钥更长,而且加密算法硅的占用更大。这样就产生了用于非对称算法的另一种协议—协议4。为了保持密钥安全,必须利用2个验证芯片实现协议3。这意味着,每个System均需要验证芯片,而且每个消耗品也均需要验证芯片。
协议4
在某些情况下,System可以含有大量处理能力。作为一种选择,对于大批量制造的系统的实例,可以要求将ChipT集成到System上。使用非对称加密算法使得System的ChipT部分不安全。因此,协议4采用非对称密码术。对于该协议,每个芯片含有下面的值:
K EK[X]和DK[X]的密钥。在ChipA内必须保密。而不必在ChipT内保密。
R 当前随机数。不必保密,但是必须对每个芯片实例形成具有不同初始值的籽数。每次成功验证时改变,正如Test函数确定的那样。
M 验证芯片53的内存矢量(memory vector)。对于每个芯片,该空间的一部分应该不同(不必是随机数)。
验证Read函数中的任何内容没有好处,因为任何人都可以利用公开密钥进行加密。因此,定义下面的函数:
E[X] 仅是内部函数。返回EK[X],其中E是非对称加密函数E。
D[X] 仅是内部函数。返回DK[X],其中D是非对称解密函数D。
Random[] 仅在ChipT上。返回EK[R]。
Test[X,Y] 如果FK2[R|X]=Y,则返回1,而且推进R。否则,返回0。对于所有错误输入,返回0花费的时间必须相同。
Read[X,Y] 返回M|EK[R|M],其中R=DK[X](不测试输入)。
Write[X] 在可以合法覆盖写的、M的这些部分上写X。
公开密钥KT在ChipT内,而保密密钥KA在ChipA内。使KT在ChipT内的优点在于,可以以软件或硬件的方式实现ChipT(条件是,对R形成的籽数对于每个芯片或系统不同)。因此,为了验证ChipA并读ChipA的内存M:
System调用ChipT的Random函数;
ChipT产生EKT[R]并将它返回System;
System调用ChipA的Rrad函数,变成EKT[R];
ChipA返回M|EKA[R|M],首先由DKA[EKT[R]]获得R;
System调用ChipT的Test函数,形成M和EKA[R|M];
ChipT计算DKT[EKA[R|M]],并将它与R|M进行比较。
System检验ChipT输出的响应。如果响应是1,则认为ChipA是真实的。如果是0,则认为ChipA无效。
为了对将Mnew写入ChipA的内存M进行验证:
System调用ChipA的Write函数,变成Mnew;
执行对Read的验证过程;
如果ChipA是真实的,而且Mnew=M,则写成功。否则写失败。
图172示出读验证的数据流。只有有效ChipA知道R的值,因为R未成为Authenticate函数的一部分(它变成了加密值)。必须通过解密E[R]获得R,只能利用保密密钥KA进行解密。一旦获得了R,就必须将R附加到M上,然后,对该结果进行再编码。ChipT验证解码形式的EKA[R|M]=R|M有效,并因此验证ChipA有效。由于KT≠KA,所以EKT≠EKA[R]。协议4具有以下优点:
验证进程期间,未发现KA(保密密钥)
给定EKT[X],如果没有KA,或者没有接触真实ChipA,则仿制芯片就不能产生X。
由于KT≠KA,所以完全可以以软件的形式或以不安全硬件的形式或者作为System的一部分实现ChipT。仅要求ChipA是安全验证芯片。
由于ChipT和ChipA含有不同的密钥,所以强烈测试ChipT不能发现关于KA的任何内容。
如果ChipT是物理芯片,则容易设计System。
有大量有许多文件证明的、密码分析的非对称算法可以选择实现,包括无专利保护和无需特许的解决方案。
即使可以重新布线System,以使ChipA请求直接到达ChipT,但是ChipT从来不应答ChipA,因为KT≠KA。为了旁路验证协议,攻击必须对准System ROM本身。
然而,协议4本身存在许多缺点:
所有验证芯片均需要既含有非对称加密功能性,又含有非对称解密功能性。因此,与协议3要求的芯片相比,每个芯片较大、较复杂而且较昂贵。
为了满足安全性,每个密钥需要2048位(与协议1中的对称密码术的最小128位相比)。加密算法和解密算法使用的有关中间存储器相应较大。
密钥生成过程是不平凡的。随机数不是良好密钥。
如果利用核心实现ChipT,则可能难以将它连接到给定的SystemASIC。
如果利用软件实现ChipT,则它不仅是公开编程错误和非严格测试的System的实现,而且必须对System的每种实现,严格检验编译程序和数学基元的完整性。与仅使用良好测试的芯片相比,这更复杂,而且成本更高。
尽管为了防止差异密码分析,对许多对称算法专门进行了增强(根据选择正文攻击),但是专用密钥KA仍容易受到选择正文攻击。
协议4验证芯片不能从美国出口,因为它们被看作强大加密器件。
与协议3相同,协议4的唯一特定时限要求是,不考虑输入中存在的错误,必须在同样的时间内,产生0返回值(表示错误输入)。因此,攻击者不能得知关于什么值是错误输入值的任何内容。对于RD和TST函数也是正确的。
在调用TST时改变
如果使用了两个验证芯片,则从理论上说,仿制制造商可以利用对于每次调用TST返回1(成功)的芯片代替System验证芯片。通过多次调用TST-N次具有错误散列值,System可以对此进行测试,而且可以预期结果是0。在最后一次调用TST时,ChipA的真实返回值合格,而且该返回值可信。然而,产生的问题是,调用多少次TST。调用次数必须是随机的,以使仿制芯片制造商事先不知道该次数。如果System具有时钟,由时钟计时的各位可以用于确定应该假调用TST多少次。此外,还可以使用ChipA输出的返回值。在后者情况下,攻击者仍可以重新布线System,以使仿制ChipT检测到ChipA输出的返回值,从而知道哪个散列值是正确的。当然,最糟糕情况是,利用不需要验证消耗品的仿制System完全替换该System—这是重新布线并改变System的极端情况。因为此原因,根据System、消耗品以及如何进行可能的修改,任选在调用TST时的改变。认为将这种逻辑附加到System(例如,在小型台式打印机情况下)是不值得的,因为这样使得System更复杂。相反,认为将这种逻辑附加到相机是值得的。
利用真实验证芯片仿制消耗品
重要的是,在使用该消耗品部分之前,递减剩余消耗品的数量。如果首先使用消耗品,则在对特殊已知地址进行写期间,仿制消耗品可能假装失去联系,然后,再作为一个新鲜的新消耗品出现。重要的是请注意,这种攻击仍需要每个消耗品内的真实验证芯片。
密钥的存活力
这两个协议的共同问题是,一旦选择了验证密钥,就不能容易地更改它。在某些实例中,损害密钥不成为问题,但是对于其他实例,密钥损害就是灾难性的。
选择协议
即使选择协议2和4的密钥是直通的,这两个协议当前仍不切实际,因为硅实现的成本高(既因为密钥大小,又因为功能实现)。因此,协议1和3是选择的两个协议。然而,协议1和3含有大量相同的部件:
二者均要求读存取和写存取;
二者均要求实现带密钥单向函数;以及
二者均要求随机数生成功能性。
协议3要求附加密钥(K2),而且某个最小状态机改变:
状态机改变以启动FK1[X],以便在Random期间被调用;
调用FK2[X]的Test函数
状态机改变Read函数以调用FK1[X]和FK2[X]
协议3仅要求对协议1做最小改变。它更安全,而且可以用于要求进行只存在验证(协议1)的所有位置。因此,选择该协议。如果协议1和3均采用带密钥单向函数,则在此更仔细检查选择的单向函数。下表概括说明适用选择的属性。采用属性这个措辞是为了使属性被看作优点。
| 三重DES | Blowfish | RC5 | IDEA | 随机序列 | HMAC-MD5 | HMAC-SHA1 |
HMAC-RIPEMD160 |
无专利保护 |
● |
● | | |
● |
● |
● |
● |
随机密钥生成 | | | | | |
● |
● |
● |
可以从美国出口 | | | | |
● |
● |
● |
● |
快速 | |
● | | | |
● |
● |
● |
用于该应用的优选密钥大小(位) | 168 | 128 | 128 | 128 | 512 | 128 | 160 | 160 |
块大小(位) |
64 |
64 |
64 |
64 |
256 |
512 |
512 |
512 |
免受密码分析攻击(脆弱密钥除外) | ● | ● | | | ● | | ● | ● |
给定输入大小N的输出大小 |
≥N |
≥N |
≥N |
≥N |
128 |
128 |
160 |
160 |
低存储器要求 | | | | |
● |
● |
● |
● |
检查该表发现,实际上是在3 HMAC结构与随机序列之间进行选择。密钥大小和密钥生成问题排除了随机序列。如果已经对MD5进行了多次攻击,而且由于散列结果只有128位,所以HMAC-MD5也被排除。因此,在HMAC-SHA1与HMAC-RIPEMD160之间进行选择。RIPEMD-160较新,而且不象SHA1那样被广泛密码分析。然而,SHA-1由NSA设计,因此在某种程度上,可以将这看作负(negative)属性。
如果在这二者之间没有好的选择,则将SHA-1用作HMAC结构。选择随机数发生器
所描述的每个协议(1至4)均需要随机数发生器。从在所有System的寿命期间产生的随机数不能被预测这个意义上说,发生器必须“良好”。如果每个System的随机数相同,则攻击者可以容易地记录真实验证芯片输出的正确响应,并将该响应设置到仿制芯片的ROM查用表内。这种攻击不需要获得K1或K2。因此,为了不可预测,或者具有不确定性,每个System输出的随机数必须充分不同。严格地说,应该采用根据物理随机现象组合在一起的、利用物理方法产生的随机数,对R的初始值(随机籽数)进行编程,该随机数没有关于特定位是1或0的信息。不得利用计算机运行的随机数发生器产生R的籽数。否则,可以损害发生器算法和籽数,使得攻击者可以产生并因此而知道所有System内的一组全部R值。
在每个验证芯片中具有不同的R籽数意味着,第一个R在所有芯片上既是随机的,又是不可预测的。因此,产生的问题是,如何在每个芯片上产生后续R值。
基本情况是根本不改变R。因此,对于每次调用Random[],R和FK1[R]相同。如果它们相同,则FK1[R]可以是常数,而非是计算获得的。这样,攻击者可以使用一个有效验证芯片产生有效查用表,然后,在对该System专门编程的仿制芯片上使用该查用表。常数R不安全。
改变R的最简单理论性方法是将它递增1。由于R是随机开始的,所以不同系统上的值仍可能是随机的。然而,给定初始R,则可以直接确定后续R值(不需要迭代10,000次-R具有R0至R0+10000之间的值)。递增的R可以免受基于常数R的早期攻击。由于R始终不同,所以如果不占用仿制芯片将替换的那么多个真实验证芯片,就没有办法建立用于特定System的查用表。
改变R的另一种方式不是利用加法器进行递增,而是利用LFSR(线性反馈移位寄存器)实现它。这样做的优点是比加法器占用的硅少,而且还具有攻击者不能直接确定特定System的R的范围的优点,因为利用顺序存取确定LFSR值域。为了确定给定的初始R将产生哪个值,攻击者必须对各种可能性进行迭代并将它们列出。LFSR解决方案也证明了改变R的优点。由于R始终不同,所以如果不用尽仿制芯片将替换的那么多个真实验证芯片(而且仅对于该System),就没有办法建立用于特定System的查用表。因此,利用更复杂函数改变R没有优点。如果不考虑函数,则攻击者始终可以在寿命期内迭代模拟的一组值。基本安全取决于R的初始随机性。使用LFSR改变R(除了比加法器使用的硅少)的优点只有,不局限于连续数值范围(即,即使知道R,也不能直接计算RN;攻击者必须通过LFSR迭代N次)。
因此,验证芯片内的随机数发生器是160位的LFSR。抽头选择最长周期LFSR的160位(即,LFSR将循环全部2160次1状态,0不是有效状态)产生159、4、2和1,如图173所示。LFSR是稀疏的,因为不是许多位用于反馈(仅使用160位中的4位)。这就是密码应用的问题,但是采用非序列号生成的这种应用不存在该问题。除了0,R的160位籽数值可以是任意随机数,因为填充了0的LFSR将产生无结尾(never-ending)0流。由于所描述的LFSR是最长周期LFSR,所以可以将全部160位直接用作R。因此,不需要根据b0输出位顺序建立数字。每次成功调用TST后,必须通过“异”运算位1、2、4和159,然后,将结果移位到高序位,推进随机数(R)。在下一次调用Random时,检索新R和相应FK1[R]。抵御逻辑攻击
协议3是验证芯片使用的验证方法。严格地说,它应该可以防止逻辑装置的攻击。尽管在上面的讨论中已经提到对协议3的各种攻击的效果,但是本小节将反过来参考协议3详细说明每种攻击。
强力攻击
强力攻击确保破解协议3。然而,密钥的长度意味着攻击者进行强力攻击花费的时间太长,以致不值得进行这种攻击。攻击者只需破解K2建立仿制验证芯片。K1的存在仅用于增强K2以防止其他形式的攻击。因此,强力攻击K2必须破解160位密钥。强力攻击K2需要最多2160次尝试,只有在2159次尝试之后发现密钥的几率才为50%。假设千吉(1012)个每个每秒分别运行1百万次的处理器的阵列,2159(7.3×1047)次测试将花费2.3×1023年,这比宇宙的寿命还长。世界上只有1亿台个人计算机。即使将所有这些计算机连在一起进行攻击(例如,通过因特网),次数为10,000次,仍小于上述千吉处理器攻击的次数。此外,如果在纳计算机(nanocomputer)时代,有可能制造1千吉处理器,则获得密钥花费的时间也比宇宙的寿命长。
推测密钥攻击
从理论上说,攻击者可以仅“推测密钥”。事实上,如果有足够的时间,而且尝试了每个可能的数字,攻击者将获得密钥。这与上面描述的强力攻击相同,在强力攻击中,在获得50%的成功几率之前,必须进行2159次尝试。仅人们根据第一次尝试推测密钥的机会有2160次。相比之下,在美国抽彩赢得头奖和在同一天被雷电击中而亡的几率也只有261分之一。人们根据第一次尝试推测验证芯片密钥的几率是2160分之一,这可以与两个人从地球上的所有原子的选择中刚好选择同样的原子相比,即,极不可能。
量子计算机攻击
为了破解K2,必须建立含有160库位、嵌入了适当算法的量子计算机。不容易对160位密钥进行攻击。关于量子计算机可能性的最高估计是,可以在50年之内实现50库位。即使使用50库位的量子计算机,破解160位密钥仍需要2110次测试。假设10亿个每个在1微秒内分别尝试250个密钥(远远超出当前的估计)的50库位量子计算机的阵列,发现密钥将平均花费180亿年。
只密文攻击
通过对调用RND和RD进行监测,攻击者可以对K1发起攻击,通过对调用RD和TST进行监测,攻击者可以对K2发起攻击。然而,如果所有这些调用也都发现了明文以及散列形式的明文,则该攻击变换为更强形式的攻击—已知明文攻击。
已知明文攻击
可以容易地将逻辑分析器连接到System与验证芯片之间的连线上,从而监测数据流。该数据流产生已知明文和该明文的散列形式,因此,可以利用已知明文和该明文的散列形式对K1和K2发起已知明文攻击。为了对K1发起攻击,必须多次调用RND和TST(如果成功调用TST,因此需要在有效芯片上调用RD)。这是直通的,要求攻击者既具有System验证芯片,又具有消耗品验证芯片。对于每个K1,发现X,HK1[X]对,对于每个K2,发现Y,HK2[Y]对。攻击者必须采集这些对,做进一步分析。产生的问题是,对于利用该数据进行的有意义攻击,必须采集多少对。需要采集数据进行统计分析的攻击的例子是差异密码分析。然而,没有对SHA-1或HMAC-SHA1的已知攻击,因此此时不需要采集的数据。
选择明文攻击
如果密码分析可以根据先前的试验结果修改后续选择明文,则K2是对部分形式的自适应选择明文攻击公开的,当然,自适应选择明文攻击是比简单选择明文攻击强的攻击形式。选择明文攻击不能攻击K1,因为调用者没有办法修改R,R用作RND函数(利用K1提供散列结果的唯一函数)的输入。清除R同样具有清除密钥的效果,因此没有用,而且在存储新R值之前,SSI命令调用CLR。
自适应选择明文攻击
这种攻击不可能攻击K1,因为K1不容易受到选择明文攻击。然而,特别因为System和消耗品通常对于攻击者都是可用的(在诸如专用轿车的某些实例中,System可能对于攻击者不可用。),所以部分形式的这种攻击可以攻击K2。HMAC结构提供防止所有形式的选择明文攻击的安全性。这主要是因为,HMAC结构具有两个保密输入变量(原始散列结果和保密密钥)。因此,在输入变量保密时,在散列函数本身内发现冲突比在明(plain)散列函数内发现冲突困难。这是因为,前者要求直接接触SHA-1(协议3不允许)以便由SHA-A产生输入/输出对。攻击者可以采集的唯一值是HMAC[R]和HMAC[R|M]。这些不是针对SHA-1散列函数本身的攻击,而是将该攻击简化为差异密码分析攻击,检验采集的数据之间的统计差异。如果不存在针对SHA-1或HMAC的已知差异密码分析攻击,则协议3可以防止自适应选择明文攻击。
蓄意错误攻击
攻击者只能对TST和RD函数发起蓄意错误攻击,因为这两个函数是使输入对密钥有效的仅有函数。利用TST函数和RD函数,如果在输入中发现错误,则产生0值—不给出其他信息。此外,产生0结果花费的时间与输入无关,使得攻击者不能得到关于哪(些)位是错误的信息。因此,蓄意错误攻击无果。
链式攻击
任何一种形式的攻击均假定要散列的消息在几个块上,或者可以以某种方式设置输入变量。协议3采用的HMAC-SHA1算法在任何时候都可以一次仅散列一个512位块。因此,链式攻击不可能攻击协议3。
生日攻击
根据散列函数的冲突频率,已知针对HMAC的最强攻击是生日攻击。然而,对于诸如SHA-1的最小合理性散列函数,这完全不可行。而且,仅在攻击者控制了被签字的消息时,生日攻击才有可能。协议3将散列用作数字签名方式。由于验证芯片必须利用H[R|M]进行响应,但是又不能对输入值R进行控制,所以生日攻击是不可能的。这是因为,实际上已经产生了消息,而且被签名。攻击者必须代替对散列为同一个值的冲突消息进行搜索(模拟寻找其生日与你的生日相同的一个人)。因此,仿制芯片必须尝试发现新值R2,以致R2和选择的M2的散列产生与H[R|M]相同的散列值。然而,System验证芯片不能发现正确的散列值(根据散列值是否正确,TST函数仅返回1或0)。因此,发现正确散列值(为了发现冲突)的唯一方法是询问真实验证芯片。但是发现正确值意味着更新M,而且因为M的只递减部分是单向的,而M的只读部分可以被改变,所以在产生发现冲突之前,仿制消耗品必须更新真实消耗品。另一种方法是强力攻击搜索TST函数以发现成功(要求每个仿制消耗品均接近System消耗品)。如上所述,在这种情况下,对于每个验证,强力搜索花费的时间比宇宙的寿命还长。因为计时累计散列值意味着必须递减真实消耗品,仿制消耗品发起这种攻击也没有什么用。
利用完全查用表替换
每个System内的随机数籽数均是160位。验证芯片的最糟糕情况是,没有状态数据发生变化。因此,没有作为M返回的常数值。然而,仿制芯片必须仍返回FK2[R|M],它是一个160位值。假定160位结果的160位查用表,这需要7.3×1048字节,或6.6×1036太字节(terabyte),当然,将来可能出现更大的空间。当然,这未考虑到从ROM采集数值的方法。因此,完全查用表完全不可能。
利用稀疏查用表替换
仅在可以以某种方式预测发送到验证芯片的消息时,稀疏查用表才是可行的。利用根据自然随机事件组合的未知随机数对随机数R形成籽数。仿制制造商不可能知道对于所有System,R的可能范围是多少,因为每位是1或0的几率均为50%。由于不知道所有System内的R的范围,所以不可能建立可以用于所有System的稀疏查用表。因此,通用稀疏查用表不是可能的攻击。然而,仿制制造商可以知道给定System的R的范围是多少。这是通过装载LFSR,然后迭代某个次数实现的,该LFSR具有通过调用特定System验证芯片的RND函数获得的当前结果。如果这得到实现,则可以建立仅含有特定范围的R的响应的专用ROM,即,专门用于该特定System的消耗品的ROM。但是,攻击者仍需要将正确信息设置到ROM内。因此,攻击者需要找到有效验证芯片,并对R的每个值调用它。
假如仿制验证芯片报告全消耗品,则在模拟断开连接和插入新全消耗品之前,允许使用一次。因此,仿制消耗品需要含有验证全消耗品和验证部分使用的消耗品的响应。在最糟糕情况下,ROM含有System的寿命期内的R的全消耗品和部分使用的消耗品的项目。然而,有效验证芯片必须用于产生信息,而且必须在该过程中,部分使用有效验证芯片。如果给定的系统仅产生约n的R值,则所需的稀疏查用表-ROM是10n字节乘以不同值的M的数量。建立ROM花费的时间取决于调用RD之间发生的时间。
而且,仿制制造商必须依赖消费者返回进行再充,首先,因为建立ROM的成本消耗一个消耗品。因此,在这种情况下,仿制制造商的业务是再充。时间和成本取决于R的大小和必须插入查用表内的不同值的M的数量。此外,必须建立用户仿制消耗品ROM以分别匹配每个System,对于每个System,必须使用不同的有效验证芯片(为了提供全数据和部分使用数据)。因此,必须对System内使用的验证芯片进行检验以确定,对于仿制制造商,这种攻击是否值得。作为例子,在其寿命期间,相机系统可以进行约10,000次打印。假定它具有只递减值(剩余打印次数),而且在调用RD之间存在1秒的延迟。在这种系统中,建立稀松表将花费约3小时的时间,而且占用100K。请记住,建立ROM需要占用有效验证芯片,因此所花费的金钱的价值必须超过一个消耗品和仿制消耗品合在一起的价值。因此,对于一个消耗品实现这种功能是不合算的(除非仿制消耗品以某种形式含有多个等效真实消耗品)。如果仿制制造商要不辞劳苦地对System的每个拥有者建立用户ROM,则较容易的方法是更新System,以便完全忽略验证芯片。因此,该攻击可以作为每个System攻击,而且必须对发生给定System/消耗品组合的几率进行判定。该几率取决于消耗品和验证芯片的成本、消耗品的寿命、消耗品的利润率、建立ROM花费的时间、所获得的ROM的大小以及消费者是否想到仿制制造商利用同一个仿制芯片等进行再充。
差异密码分析
现有差异攻击主要取决于DES和其他类似算法使用的S盒子的结构。尽管诸如用于协议3的HMAC-SHA1的其他算法没有S盒子,但是攻击者仍可以通过进行统计分析来进行差异型攻击:
最小差别输入,及其相应输出
最小差别输出,及其相应输入
为了发起这种性质的攻击,必须采集输入/输出对集。在协议3中进行采集可以通过已知明文,或者由部分自适应选择明文攻击进行。显然,选择后者,后者更实用。散列算法通常用于防止差异分析。特别是,利用80字的扩展专门对SHA-1进行增强,以便输入中的最小差异仍产生大量位位置不同的各输出(与128位散列函数相比)。此外,采集的信息不是直接SHA-1输入/输出集,因为HMAC算法的性质。HMAC算法利用未知值(密钥)散列已知值,然后,利用单独未知值重新散列该散列的结果。由于攻击者不知道保密值,而且不知道第一次散列的结果,所以不知道SHA-1的输入和输出,这样使得任何差异攻击均极端困难。下面将更详细说明验证芯片的最小差异输入和输出。
最小差异输入
在此,攻击者取一组X,FK[X]值,其中X值是最小差异的,攻击者检验输出FK[X]之间的统计差异。攻击取决于只有最少位数不同的X值。产生的问题是,为了将FK[X]值进行比较,如何获得最小差异X值。
K1:对于K1,攻击者需要利用统计方法检验最小差异X,FK1[X]对。然而,攻击者不能选择任何X值,并获得相关FK1[X]值。由于仅通过在System验证芯片上调用RND函数,就可以产生X,FK1[X]对,所以攻击者必须多次调用RND,将观测到的每对记录到表中。然后,在观测值中搜索足够的最小差异X值,以对FK1[X]值进行统计分析。
K2:对于K2,攻击者需要利用统计方法检验最小差异X,FK2[X]对。产生X,FK2[X]对的唯一方法是利用RD函数,对于给定的Y,FK1[Y],RD函数产生FK2[X],其中X=Y|M。这意味着,攻击者可以在有限范围内选择Y和M的可变部分。因此,尽可能多地限制选择的数量。
限制攻击者的选择的第一种方法是限制Y,因为RD需要格式Y,Fk1[Y]的输入。尽管容易从RND函数获得有效对,但是它是一对RND的选择。如果他们由RND获得了适当的对,或者他们知道K1,则攻击者可以仅提供他们自己的Y。由RND获得适当的对需要强力攻击。在逻辑上,通过对由RND函数获得的对进行密码分析,已知K1是可能的—实际上是已知正文攻击。尽管可以每秒只调用RND如此多的次数,但是K1对于所有System芯片是通用的。因此,可以并行产生已知对。限制攻击者的选择的第二种方法是限制M,或者攻击者至少可以选择M。通过只读对于每个验证芯片不同的M的某些部分,来限制M,而只递减M的其他部分。最理想的是,M的只读部分应该对于每个验证芯片不同,因此可以是诸如序列号、批号或随机数的信息。M的只递减部分意味着,对于攻击者尝试不同的M,他们可以只将M的这些部分递减这么多次—在M的只递减部分递减到0后,不能再改变这些部分。获得的新验证芯片53提供新M,但是只读部分不同于先前验证芯片的只读部分,因此降低了攻击者进一步选择M的能力。因此,在选择Y和M的值时,攻击者只能获得有限数量的机会。
最小差异输出
在此,攻击者取一组X,FK[X]值,其中FK[X]值是最小差异的,攻击者检验X值之间的统计差异。攻击取决于只有最少位数不同的FK[X]值。关于K1和K2,对于给定的FK[X],攻击者没有办法产生X值。这样做就违背了F是单向函数这个事实。因此,攻击者发起这种性质的攻击的唯一方式是将观测到的所有X,FK[X]对记录到表上。然后,必须在所有观测值中搜索足够的最小差异FK[X]值,以对X值进行统计分析。如果这需要做的工作比最小差异输入攻击需要做的工作还多(受到极大限制,因为对M和R的选择有限制),则这种攻击无果。
消息替换攻击
为了进行这种类型的攻击,仿制消耗品必须含有真实验证芯片53,而不含有实际上可以再用的验证芯片,因为它始终不递减。仿制验证芯片截取消息,并替换为他自己的消息。然而,这种攻击并不能使攻击者获得成功。仿制验证芯片可以选择不将WR命令送到真实验证芯片。然而,后续RD命令必须返回正确响应(就象WR已经成功)。为了返回正确响应,必须知道特定R和M的散列值。正如在生日攻击小节中描述的那样,通过实际更新真实芯片内的M,攻击者可以只确定散列值,攻击者不希望这样做。甚至改变System发送的R也无助,因为在后续TST期间,System验证芯片必须匹配R。因此,消息替换攻击也未成功。只有在System更新使用前剩余的消耗品的数量时,这才正确。
逆向工程密钥发生器
如果伪随机数发生器用于产生密钥,则仿制制造商有可能获得发生器程序,或者推断所使用的随机籽数。这就是最初破解Netscape安全程序的方式。
完全旁路验证
协议3要求System在使用消耗品之前更新消耗品状态数据,而且每次写之后跟着进行读(验证该写)。因此,每次使用消耗品时均需要进行验证。如果System遵循这两个原则,则仿制制造商必须利用上述方法(例如,稀疏ROM搜索)模拟验证过程。
再用验证芯片
如上所述,协议3要求System在使用消耗品之前更新消耗品状态数据,而且每次写之后跟着进行读(验证该写)。因此,每次使用消耗品时均需要进行验证。如果消耗品被用完,则其验证芯片将具有被递减为0的适当状态数据值。因此,在另一个消耗品中不使用该芯片。请注意,这仅对于保存只递减数据项目的验证芯片是正确的。如果没有随每次使用递减的状态数据,则没有什么东西可以防止再用该芯片了。这是只存在验证与消耗品寿命验证之间的主要差别。协议3对于二者均可。根本问题在于,如果消耗品具有System使用的只递减数据项目,则在知道保密密钥的有效编程站未完全重新编程情况下,该验证芯片就不能被再用。
管理判定以为了省略验证而节省成本
尽管严格地说它不是外部攻击,但是进行判定以为了节省成本而在未来系统中省略验证,对于不同的市场具有非常不同的作用。对于大量消耗品,务必要记住,在打开市场之后,非常难以引入验证,因为要求验证消耗品的系统不能处理仍在流通的旧消耗品。同样,在任何时期断开验证也是不切实际的,因为旧System不能处理新的、未验证的消耗品。在第二种情况下,通过利用具有同样编程接口、但是其TST函数始终连续的简单芯片替换System验证芯片,可以单独改变旧System。当然,可以对System进行编程,以对始终连续的TST函数进行测试,然后,关闭它。对于诸如轿车/轿车密钥或门/门密钥的专用对,或者在某些其他类似情况下,在未来系统中省略验证无足轻重,而且没有影响。这是因为,消费者一次卖出整套System验证芯片和消耗品验证芯片。
强迫(garrote)/行贿攻击
这种形式的攻击仅在以下两种情况中的一种情况下成功:
芯片编程器已经记录了K1、K2和R,或者
攻击者可以强迫记录K1、K2和R的未来值。
如果编程站之外的人或计算机系统不知道该密钥,则可以发现它们的力量或行贿就不存在了。针对这种攻击的安全等级从根本上说是System/消耗品拥有者根据要求的业务等级所做的判定。例如,轿车公司可能希望保存所制造的所有密钥的记录,以便人们可以为他们的轿车请求制造新密钥。然而,这样可能潜在损害整个密钥数据库,使得攻击者可以制造任何一个制造商的现有轿车的密钥。不允许攻击者制造任何一辆新轿车的密钥。当然,还可以利用需要特定数量的人们将他们的密钥部分组合在一起进行存取的密钥,对密钥数据库本身进行加密。如果没有保存哪个密钥用于特定轿车的记录,则在丢失密钥时,就没有办法形成其他密钥了。因此,拥有者就必须更换其轿车的验证芯片及其所有轿车—密钥。这是一个不必要的糟糕情况。相比之下,在诸如打印机墨水盒的消耗品中,一种密钥组合用于所有System和所有消耗品。当然,如果不保存密钥的备份,则没有人知道该没有,因此就不可能存在攻击。然而,没有备份的情况并不是诸如墨水盒的消耗品所希望的,因为如果密钥被丢失,则不再能制造消耗品。因此,制造商应该将密钥信息的备份保存在几个部分,在这几个部分,特定数量的人们必须将其部分组合在一起,以发现全密钥信息。如果需要重新装载芯片编程站,则需要这样做。总之,这些攻击中没有一种是针对协议3本身的,因为验证进程中不涉及任何人。相反,它是针对芯片的编程级的攻击。
HMAC-SHA1
验证机制是根据如下之一运算的HMAC-SHA1算法:
HMAC-SHA1(R,K1),或者
HMAC-SHA1(R|M,K2)
现在将以比迄今对其所做说明更详细的方式研究HMAC-SHA1算法,而且对该算法的优化进行了描述,这种优化算法比原始定义需要更少的内存资源。
HMAC
HMAC算法开始,给出下面的定义:
H=散列函数(例如,MD5或SHA-1)
n=H输出的位数(例如,160位用于SHA-1,128位用于MD5)
M=对其应用MAC函数的数据
K=两个部分共享的保密密钥
ipad=0×36重复64次
opad=0×5C重复64次
下面是HMAC算法:
通过在K的末尾附加0×00字节,将K扩展到64字节
对在(1)产生的64字节串与ipad进行”异或”运算
将数据流M附加到在(2)产生的64字节串
将H附加到在(3)产生的流
将在(1)产生的64字节串与opad进行“异或”运算
将在(4)获得的H附加到在(5)获得的64字节
将H附加到(6)的输出并输出结果
这样:
HMAC[M]=H[(K_opad)|H[(K_ipad)|M]]
HMAC-SHA1算法仅是具有H=SHA-1的HMAC。
SHA-1
以在此概括说明的算法定义SHA1散列算法。
确定9个32位常数。有5个常数用于初始化链式变量,而有4个加性常数。
|
链式初始值 | |
加性常数 |
h1 |
0x67452301 |
y1 |
0x5A827999 |
h2 |
0xEFCDAB89 |
y2 |
0x6ED9EBA1 |
h3 |
0x98BADCFE |
y3 |
0x8F1BBCDC |
h4 |
0x10325476 |
y4 |
0xCA62C1D6 |
h5 |
0xC3D2E1F0 | | |
非优化SHA-1需要总共2912位的数据存储器:
定义5个32位链式变量:H1、H2、H3、H4以及H5。
定义5个32位工作变量:A、B、C、D以及E。
定义1个32位临时变量:t。
定义8个32位临时寄存器:X0-79。
对SHA-1定义下面的函数:
散列算法包括:首先,将输入消息填充成512位的一倍,然后,利用h1-5初始化临时变量H1-5。然后,在512位存储块中处理该填充消息,输出散列值是并置运算链式变量:H1|H2|H3|H4|H5给出的最终160位值。现在,将详细研究SHA-1算法的各步骤。
步骤1.预处理
SHA-1的第一步是将输入消息填充成512位的一倍,然后,初始化链式变量。
预处理输入消息之后的步骤 |
填充输入消息 |
对该消息附加1二进制值 |
|
附加各0二进制值以致填充消息的长度是不到512位的一倍的64位。 |
附加含有原始输入消息的位数长度的64位值。存储该长度作为从最高有效位到最低有效位的长度。 |
初始化链式变量 |
H1←h1,H2←h2,H3←h3,H4←h4,H5←h5 |
步骤2.处理
现在,可以对填充的输入消息进行处理。在512位块中处理该消息。每个512位块均具有16×32位字的形式,该16×32位字称为InputWord0 -15。
步骤3.完成
在处理了填充输入消息的全部512位块后,输出散列值是H1|H2|H3|H4|H5给出的最终160位值。
优化硬件实现
SHA-1步骤2过程不对硬件进行优化。特别是,80个临时32位寄存器用尽硬件实现上的宝贵的硅。本小节将说明优化仅使用16个临时寄存器的SHA-1算法的过程。硅从2560位减少到512位,节省2000位以上。在某些应用中,这可能不重要,但是在验证芯片上,如果可能,必须减小存储空间。根据尽管原始16字消息块被扩展为80字消息块,但是在执行该算法期间并不更新该80字的事实,进行优化。此外,该字仅取决于先前的16字,因此,只要对向后引用保持16字,则在处理期间,可以迅速计算扩展字。要求回转计数器始终监视所使用的寄存器,但是结果却是保存大量存储内容。不是利用一个值j检索X,而是在迭代过程中利用5位计数器进行计数。这可以通过利用16或20初始化5位寄存器,然后递减它直到它达到0实现。为了更新16个临时变量,就好象他们是80,我们需要4个索引,每个索引均是4位寄存器。执行算法期间,所有4个索引递增(利用环绕)。
选择在循环0和循环1A期间递增N1、N2和N3。软件实现不递增它们,因为这费时,而且在16次循环结束时,全部4个计数器恢复它们的原始值。硬件设计师可能希望全部4个寄存器一起保存控制逻辑。如果调用者装载X0-15的512位,则完全省略循环0。
HMAC-SHA1
在验证芯片实现中,只有HMAC-SHA1单元始终可以对两种类型的输入进行散列:采用K1的R和采用K2的R|M。由于该输入是两个固定长度,而作为芯片上的独立实体没有HMAC和SHA-1,所以可以将它们组合在一起并实现硬件优化。为了确保不同的消息在填充之后不被看作是相同的,需要在SHA-1步骤1填充消息(1二进制值、0二进制值串以及消息长度)。由于我们仅处理两种类型的消息,所以我们可以填充常数0。此外,还可以使用优化的SHA-1算法,其中仅16个32位字用于临时存储。利用优化的HMAC-SHA1硬件直接装载这16个寄存器。仍需要9个32位常数h1-5和y1-4,但是它们是常数的事实是硬件实现的优点。硬件优化的HMAC-SHA-1需要总共1024位的数据存储器:
定义5个32位链式变量:H1、H2、H3、H4以及H5。
定义5个32位工作变量:A、B、C、D以及E。
用于临时存储器的5个32位变量以及最终结果:Buff1601-5
定义1个32位临时变量:t。
定义6个32位临时寄存器:X0-79。
下面的两个小节描述两种方式调用HMAC-SHA1的步骤。
H[R,K
1
]
在利用K
1产生R的带密钥散列时,原始输入消息R是160位的固定长度。因此,在处理期间,我们可以利用这个事实。我们不是在执行SHA-1算法的第一部分期间装载X
0-15,而是直接装载X
0-15,从而省略了SHA-1的优化处理块(Process Block)(步骤2)的循环0。伪码执行下面的步骤:
步骤 |
说明 |
动作 |
1 |
处理K_ipad |
X0-4←K1_0x363636… |
2 | |
X5-15←0x363636… |
3 | |
H1-5←h1-5 |
4 | |
处理块 |
| | |
5 |
处理R |
X0-4←R |
6 | |
X5-15←0 |
7 | |
处理块 |
8 | |
Buff1601-5←H1-5 |
| | |
9 |
处理K_opad |
X0-4←K1_0x5C5C5C… |
10 | |
X5-15←0x5C5C5C… |
11 | |
H1-5←h1-5 |
12 | |
处理块 |
| | |
13 |
处理先前H[x] |
X0-4←Result |
14 | |
X5-15←0 |
15 | |
处理块 |
| | |
16 |
获得结果 |
Buff1601-5←H1-5 |
H[R|M,K
2
]
在利用K
2产生R|M的带密钥散列时,原始输入消息是416(256+160)位的固定长度。因此,在处理期间,我们可以利用这个事实。我们不是在执行SHA-1算法的第一部分期间装载X
0-15,而是直接装载X
0- 15,从而省略了SHA-1的优化处理块(Process Block)(步骤2)的循环0。伪码执行下面的步骤:
步骤 |
说明 |
动作 |
1 |
处理K_ipad |
X0-4←K2_0x363636… |
2 | |
X5-15←0x363636… |
3 | |
H1-5←h1-5 |
4 | |
处理块 |
| | |
5 | 处理R|M | X0-4←R |
6 | |
X5-12←M |
7 | |
X13-15←0 |
8 | |
处理块 |
9 | |
Temp←H1-5 |
| | |
10 |
处理K_opad |
X0-4←K2_0x5C5C5C… |
11 | |
X5-15←0x5C5C5C… |
12 | |
H1-5←h1-5 |
13 | |
处理块 |
| | |
14 |
处理先前H[x] |
X0-4←Temp |
15 | |
X5-15←0 |
16 | |
处理块 |
| | |
17 |
获得结果 |
Result←H1-5 |
数据存储完整性
为了保存验证协议3需要的各变量,每个验证芯片均含有一些非易失性存储器。定义下面的非易失性变量:
变量名称 |
大小(位数) |
说明 |
M[0..15] |
256 |
含有诸如序列号、剩余介质等的状态数据的16字(每个16位) |
K1 |
160 |
验证期间用于变换R的密钥 |
K2 |
160 |
验证期间用于变换M的密钥 |
R |
160 |
当前随机数 |
AccessMode[0..15] |
32 |
M[n]的16组2位AccessMode值 |
MinTicks |
32 |
调用基于密钥的函数之间的最少时钟滴答声(clock tick)数 |
SIWritten |
1 |
如果被置位,则保密密钥详细(K1、K2和R)已经被写入芯片。如果被清除,则还未写入保密信息。 |
IsTrusted |
1 |
如果被置位,则可以调用RND函数和TST函数,但是不能调用RD函数和WR函数。如果被清除,则可以调用RND函数和TST函数,但是不能调用RD函数和WR函数。 |
总位数 |
802 | |
请注意,如果这些变量均在闪速存储器中,则写入新值代替旧值不是一件简单事情。必须首先擦除该存储器,然后置位正确的位。这对用于根据各变量改变闪速存储器的算法产生影响。例如,闪速存储器难以用作移位寄存器。为了利用一般操作更新闪速存储器变量,需要执行下面这些步骤:
将全部N位值读入通用寄存器;
对通用寄存器进行操作;
擦除相应变量的闪速存储器;以及
根据设置在通用寄存器内的各位,置位闪速存储器地址的各位。
复位验证芯片对这些非易失性变量没有影响。
M和AccessMode
变量M[0]至M[15]用于保存消耗品状态数据,例如,序列号、批号以及剩余消耗品数量。每个M[n]寄存器均是16位的,从而形成整个M矢量256位(32字节)。客户不能对不能对各M[n]进行读写。相反,在一个逻辑存取过程中,可以读或者写被称为M的整个矢量。利用RD(读)命令,可以读M,而利用WR(写)命令,可以写入M。仅在K
1和K
2均被确定(SIWritten=1)而且验证芯片是消耗品不可信芯片(IsTrusted=0)时,该命令有效。尽管M可以含有大量不同的数据类型,但是它们的不同之处仅在于,它们的写允许。可以始终读每种数据类型。一旦位于客户内存中,则可以以客户选择的任何方式截取该256位。因为安全原因,一次性读取M的全部256位,而不是以小批量方式读取,正如在“验证”一章所说明的那样。下表概括说明了不同的写允许:
数据类型 |
存取注释 |
只读 |
始终不能写入 |
读写 |
始终可以写入 |
只递减 |
仅在新值小于旧值时可以写入。只递减值通常是16位值或32位值,但是也可以是16位的任意倍数。 |
为了实现写要求的保护,对每个M[n]分别定义2位存取方式值。下表说明2位存取方式位模式的解释:
位 |
操作 |
解释 |
写命令期间的采取的动作 |
00 |
RW |
读写 |
始终将新16位值写入M[n]。 |
01 |
MSR |
只递减(最高有效区) |
仅在新16位值小于当前位于M[n]内的值时,将该新16位值写入M[n]。这用于存取只递减数的16个最高有效位。 |
10 |
NMSR |
只递减(非最高有效区) |
仅在也可以写入M[n+1]时,将新16位值写入M[n]。NMSR存取方式可以递减32位或更多位(16位的倍数)的多倍精度值。 |
11 |
RO |
只读 |
忽略新16位值。M[n]保持不变。 |
在一个32位AccessMode寄存器内,将16M[n]寄存器的16组存取方式位组合在一起。32位AccessMode寄存器对应于n的M[n]:
MSB LSB
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
以hi/lo格式存储每个2位值。因此,如果在M[6-15]存取方式RO情况下,M[0-5]是存取方式MSR,则32位AccessMode寄存器是:
11-11-11-11-11-11-11-11-11-11-01-01-01-01-01-01
在执行WR(写)命令期间,对每个M[n]检验AccseeMode[n],并判定是否用新M[n]值代替旧值。利用验证芯片的SAM(设置存取方式)命令,设置AccseeMode寄存器。请注意,只递减比较是无符号的,因此必须将要求负范围的只递减值移位到正范围内。例如,只递减数据项目范围为-50至50的消耗品必须具有被移位到0至100之间的范围。System必须解释范围0至100就是-50至50。请注意,只递减范围的大多数实例是N至0,因此不需要进行范围移位。对于只递减数据项目,以从前向M[n]输出的16位最高有效量到16位最低有效量的顺序排列数据。应该对MSR设置16个最高有效位(存储在M[n]中)的存取方式。剩余的寄存器(M[n+1],M[n+2]等)应该将它们的存取方式设置到NMSR。如果利用无关MSR区域错误地设置了NMSR,则单独研究每个NMSR区域,而不进行多倍精度比较。
K1
K1是执行验证协议期间用于变换R的160位保密密钥。利用SSI(设置保密信息)命令,将K1和K2以及R一起编程。由于K1必须保持保密,所以客户不能直接读K1。使用K1的命令是RND和RD。RND返回一对R,FK1[R],其中R是随机数,而RD要求X,FK1[X]对作为输入。K1用于带密钥单向散列函数HMAC-SHA1。严格地说,应该采用根据物理随机现象组合在一起的、利用物理方法产生的随机数,对它进行编程。不得利用计算机运行的随机数发生器产生K1。验证芯片的安全性取决于以不确定性方式产生的K1、K2和R。例如,为了设置K1,可以将精美硬币投掷160次,将头像面记录为1,而将文面记录为0。在执行了CLR命令后,K1被自动清除为0。利用SSI命令,可以仅将它编程为非零的值。
K2
K2是执行验证协议期间用于变换M|R的160位保密密钥。利用SSI(设置保密信息)命令,将K2和K1以及R一起编程。由于K2必须保持保密,所以客户不能直接读K2。使用K2的命令是RD和TST。RD返回一对M,FK2[M|R],其中X变成RD函数的一个参数。TST要求M,FK1[M|R]对作为输入,其中R是由验证芯片的RND函数获得的。K2用于带密钥单向散列函数HMAC-SHA1。严格地说,应该采用根据物理随机现象组合在一起的、利用物理方法产生的随机数,对它进行编程。不得利用计算机运行的随机数发生器产生K2。验证芯片的安全性取决于以不确定性方式产生的K1、K2和R。例如,为了设置K2,可以将精美硬币投掷160次,将头像面记录为1,而将文面记录为0。在执行了CLR命令后,K2被自动清除为0。利用SSI命令,可以仅将它编程为非零的值。
R和IsTrusted
R是160位随机数籽数,利用SSI(设置保密信息)命令,将它与K1和K2一起编程。R不必保持保密,因为利用RND命令,可以自由地将它提供给调用者。然而,必须仅由验证芯片改变R,而不能由调用者将它设置为任意选择的值。在执行TST命令期间,使用R,以确保使用先前调用RND产生的R,从而在非可信验证芯片(ChipA)内产生FK2[M|R]值。RND和TST仅用于可信验证芯片(ChipT)。IsTrusted是1位标志寄存器,用于确定该验证芯片是否是可信芯片(ChipT):
如果IsTrusted位被置位,则认为该芯片是可信芯片,因此,客户可以调用RND函数和TST函数(但是不能调用RD或WR)。
如果IsTrusted位被清除,则不认为该芯片是可信的,因此,不能调用RND函数和TST函数(但是可以调用RD或WR函数)。System始终不需要调用关于消耗品的RND或TST(由于仿制芯片仅将1返回诸如TST的函数,而对RND返回常数值)。
IsTrusted位的附加优点在于,减少了攻击者可以获得的可用R,FK1[R]对的数量,而仍保持验证协议的完整性。为了获得有效R,FK1[R]对,攻击者需要System验证芯片,它比消耗品更昂贵,而且更不容易获得。利用CLR命令,将R和IsTrusted位清除为0。它们二者均是通过发出SSI命令被写的。仅通过利用SSI命令将非零籽数值存储到R,就可以置位IsTrusted位(R必须是表示有效LFSR状态的非零,因此这是非常合理的)。利用在位1、2、4和159具有抽头的160位最长周期LFSR,改变R,而且仅利用成功调用TST,改变R(其中返回1)。
在编程期间,被确定为System使用的可信芯片(ChipT)的验证芯片应该使其IsTrusted位置位,而用于消耗品的验证芯片(ChipA)应该使其IsTrusted位保持清除(在编程期间,通过利用SSI命令将0存储到R内)。没有直接读或写IsTrusted位的命令。验证芯片的安全性不仅取决于K1和K2的随机性,而且取决于HMAC-SHA1算法的长度。为了防止攻击者建立稀疏查用表,验证芯片的安全性还取决于System寿命期间R的范围。这意味着,攻击者肯定不能推断在未来System内产生的R值。严格地说,应该采用根据物理随机现象组合在一起的、利用物理方法产生的随机数,对它进行编程。不得利用计算机运行的随机数发生器产生R。不得以确定性方式产生R。例如,为了产生用于可信System的R,可以将精美硬币投掷160次,将头像面记录为1,而将文面记录为0。0是可信R的唯一无效常数值(或者不置位IsTrusted位)。
SIWritten
SIWritten(保密信息写)1位寄存器保存存储在验证芯片上的保密信息的状态。保密信息是K1、K2和R。客户不能直接存取SIWritten位。相反,可以利用CLR命令清除它(还清除K1、K2和R)。在利用SSI命令,利用保密密钥和随机数籽数编程验证芯片(不考虑写入的值)时,自动置位SIWritten位。尽管严格地说,R不保密,但是必须将它与K1和K2写在一起,以确保攻击者不能为了获得选择的R,FK1[R]对,而产生他们自己的随机数籽数。存取K1、K2或R的所有函数均使用SIWritten状态位。如果SIWritten位被清除,则将调用RD、WR、RND和TST解释为调用CLR。
MinTicks
有两种机制可以防止攻击者在短时间周期内多次调用TST和RD函数。第一种机制是防止内部时钟以超过特定最高速度(例如,10MHz)的速度工作的时钟限制硬件部件。第二种机制是32位MinTicks寄存器,它用于规定在调用基于密钥的函数之间历时的最少数量时钟滴答声。利用CLR命令,将MinTicks变量清除为0。然后,可以利用SMT(设置MinTicks)命令,置位各位。SMT的输入参数含有表示将置位MinTicks的哪位的位模式。实际效果是攻击者只能增加MinTicks内的值(因为SMT函数仅置位各位)。此外,没有设置使调用者读取该寄存器的当前值的函数。MinTicks的值取决于工作时钟速度和什么构成基于密钥的函数调用之间的合理时间的概念(应用专用)。一个滴答声的时长取决于工作时钟速度。这就是最高输入时钟速度和验证芯片时钟限制硬件。例如,可以将验证芯片的时钟限制硬件设置为10MHz(它是不可改变的),但是输入时钟是1MHz。在这种情况下,1个滴答声的值基于1MHz,而不是基于10MHz。如果输入时钟是20MHz,而不是1MHz,则1个滴答声的值基于10MHz(因为时钟速度被限制到10MHz)。
如果知道滴答声的时长,就可以设置MinTicks的值。MinTicks的值是要求在调用基于密钥的RD函数和TST函数之间经过的最少数量的滴答声。该值是实时数,并利用工作滴答声的长度除该值。假定输入时钟速度匹配10MHz的最高时钟速度。如果我们希望在调用基于密钥的函数之间存在最小1秒的时间,则将MinTicks值设置为10,000,000。对攻击者试图通过多次调用RND、RD和TST采集X,FK1[X]对进行研究。如果以调用TST之间的时间为1秒的方式设置MinTicks值,则产生每对需要1秒。为了产生225对(仅需要1.25GB存储器),攻击者需要用1年以上的时间。如果使用一个芯片,则需要264对的攻击需要5.84×1011年,或者,如果使用10亿个芯片,则需要584年,就时间而言,这种攻击完全不切实(更不要说对存储器的要求了!)。
关于K1,应该注意,MinTicks变量只能降低攻击者的速度,并使攻击成本更高,因为它不能防止攻击者并行使用多System芯片。然而,MinTicks更难以攻击K2,因为每个消耗品分别具有不同的M(部分M是随机只读数据)。为了发起不同的攻击,需要最小差异输入,而且这只能利用一个消耗品(含有M的有效固定部分)实现。最小差异输入要求攻击者使用一个芯片,而MinTicks使得使用一个芯片的速度慢。如果花费1年的时间只能获得开始搜索进行差异攻击的数值的数据,则这样就增加了攻击成本,而且缩短了仿制消耗品的有效市场时间。
验证芯片命令
通过简单的操作命令集,System与验证芯片通信。本小节将详细说明实现协议3所需的实际命令和参数。在此,因为通过串行接口与System通信,所以利用最小实现确定验证芯片。确定通过更宽接口(例如,8位、16位或32位)工作的等效芯片无足轻重。利用3位操作码确定每个命令。可以根据IsTrusted位的当前值和IsWritten的当前值,解释操作码。定义下面的操作:
Op |
T |
W |
Mn |
输入 |
输出 |
说明 |
000 |
- |
- |
CLR |
- |
- |
清除 |
001 |
0 |
0 |
SSI |
[160,160,160] |
- |
设置保密信息 |
010 |
0 |
1 |
RD |
[160,160] |
[256,160] |
安全读取M |
010 |
1 |
1 |
RND |
- |
[160,160] |
随机 |
011 |
0 |
1 |
WR |
[256] |
- |
写入M |
011 |
1 |
1 |
TST |
[256,160] |
[1] |
测试 |
100 |
0 |
1 |
SAM |
[32] |
[32] |
设置存取方式 |
101 |
- |
1 |
GIT |
- |
[1] |
获得IsTrusted |
110 |
- |
1 |
SMT |
[32] |
- |
设置MinTicks |
Op=操作码,T=IsTrusted值,W=IsWritten值
Mn=助记符号,[n]=参数要求的位数
将该表内未定义的任何命令解释为NOP(空操作)。例子包括操作码110和111(不考虑IsTrusted值或IsWritten值),以及在IsWritten=0时,不是SSI的任何操作码。请注意RD和RND的操作码相同,同样,WR和TST的操作码也相同。收到操作码后运行的实际命令取决于IsTrusted位的当前值(只要IsWritten是1)。如果IsTrusted位被清除,则调用RD和WR函数。如果IsTrusted位被置位,则调用RND和TST函数。这两组命令在可信验证芯片与非可信验证芯片之间互相排斥,而且同一个操作码加强了这种关系。后面的小节将详细说明每个这种命令。请注意,该算法是专门设计的,因为假定闪速存储器用于非易失性变量。
CLR(清除)命令用于完全擦除所有验证芯片内存的内容。这包括所有密钥和保密信息、存取方式位以及状态数据。执行CLR命令后,验证芯片将处于可编程状态,就象刚制造的一样。可以利用新密钥重新编程它,而且可以再用它。CLR命令仅含有CLR命令操作码。由于验证芯片是串行的,所以一次必须传送一位。对于每个命令部件,位顺序均是从LSB到MSB。因此,利用位0-2的CLR操作码发送CLR命令。总共传送3位。可以随时直接调用CLR命令。擦除顺序很重要。必须首先清除SIWritten,以停止进一步调用密钥存取函数(例如,RND,TST,RD和WR)。如果在SIWritten之后清除AccessMode位,则攻击者可以在它们被清除后的某个时间卸下电源,然后控制M,从而更有机会利用部分选择正文攻击检索保密信息。利用下面的步骤实现CLR命令:
步骤 |
动作 |
1 |
擦除SIWritten擦除IsTrusted擦除K1擦除K2擦除R擦除M |
2 |
擦除AccessMode擦除MinTicks |
一旦芯片被清除,就可以容易地重新编程和再用它。空白芯片对于攻击者没有用,因为尽管可以产生M的任何值(可以读出和写入M),但是在K1和K2不正确时,基于密钥的函数不提供任何信息。如果对CLR之外的任何操作码调用CLR,则无需占用任何输入参数位。攻击者仅必须RESET芯片。调用CLR的原因是确保破坏所有保密信息,使得攻击者不能使用该芯片。
SSI-设置保密信息
输入:K1,K2,R=[160位,160位,160位]
输出:无
变更:K1,K2,R,SIWritten,IsTrusted
SSI(设置保密信息)命令用于装载K1,K2以及R变量,并用于置位SIWritten和IsTrusted标志,以便之后调用RND、TST、RD和WR命令。SSI命令包括之后是存储在K1,K2以及R寄存器内的保密信息的SSI命令操作码。由于验证芯片是串行的,所以必须一次传送一位。对于每个命令部件,位顺序均是从LSB到MSB。因此,利用位0-2的SSI操作码、后面是位0-159的K1的新值、位0-159的K2的新值以及最后的位0-159的R籽数值,发送CLR命令。总共传送483位。利用CLR命令将K1,K2、R、SIWritten以及IsTrusted寄存器全部清除为0。只能利用SSI命令置位它们。
SSI命令利用标志SIWritten存储数据被装载到K
1,K
2和R的事实。如果SIWritten和IsTrusted标志均被清除(这是CLR指令之后的情况),则利用新值装载K
1,K
2和R。如果两个标志中的任何一个被置位,尝试调用SSI会导致CLR命令被执行,因为只有攻击者或错误客户尝试改变密钥或随机籽数,而不首先调用CLR。根据R的值,SSI命令还置位IsTrusted标志。如果R=0,则认为该芯片不值得信任,因此IsTrusted保持在0。如果R≠0,则认为该芯片值得信任,因此,将IsTrusted置位为1。请注意,仅在SSI命令期间置位IsTrusted位。如果验证芯片将被再用,则必须首先调用CLR命令。然后,利用SSI命令安全地重新编程该密钥,并利用SAM命令和WR命令,将新鲜状态信息装载到M内。利用下面的步骤实现SSI命令:
步骤 |
动作 |
1 |
CLR |
2 |
K1←Read 160bits from client |
3 |
K2←Read 160bits from client |
4 |
R←Read 160bits from client |
5 |
IF(R≠0)lsTrusted←1 |
6 |
SIWritten←1 |
RD-读
输入:X,FK1[X]=[160位,160位]
输出:M,FK2[X|M]=[256位,160位]
变更:R
RD(读)命令用于从非可信验证芯片安全读取状态数据(M)的全部256位。仅有效验证芯片直接响应RD请求。为了进行验证,在可信验证芯片上可以提供RD命令的输出位,作为TST命令的输入位,利用头256位(M)存储以便之后在(正如我们希望的那样)TST返回1时使用它。由于验证芯片是串行的,所以必须一次一位地传送命令和输入参数。对于每个命令部件,位顺序均是从LSB到MSB。因此,RD命令是:位0-2的RD操作码、后面是位0-159的X以及位0-159的FK1[X]。总共传送323位。因此,可以将利用可信芯片的RND命令输出的320位直接送到非可信芯片的RD命令,而不需要System存储这些位。仅在满足下面的条件时,可以使用RD命令:
SIWritten=1 表示已经利用SSI命令建立了K1,K2和R;以及
IsTrusted=0 表示该芯片不可信,因为不允许产生随机数序列;
此外,调用RD必须等待MinTicksRemaining寄存器到达0。一旦这样做了,就可以利用MinTicks重新装载该寄存器,以确保在调用RD之间历时最短时间。一旦利用Minticks重新装载了MinTicksRemaining寄存器,RD命令就验证该输入参数有效。这是通过在内部对X产生F
K1[X],然后将该结果与输入F
K1[X]进行比较实现的。如果不考虑输入参数是否正确,则该产生过程和比较过程花费的时间必须相同。如果花费的时间不同,则攻击者可以获得有关F
K1[X]的哪个位不正确的信息。使输入参数无效的唯一方式是错误System(传送错误位)、错误System上的错误消耗品的情况、错误可信芯片(产生错误对)或对验证芯片的攻击。在输入参数错误时,返回常数值0。对于所有错误输入,返回0花费的时间必须相同,以使攻击者不能得知关于什么内容无效的任何东西。一旦验证了输入参数,就计算输出值。以下面的顺序传送M的256位内容:M[0]的位0-15,M[1]的位0-15直到M[15]的位0-15。计算F
K2[X|M],并利用位0-159,输出它。在X,F
K1[X]对有效期间,R寄存器用于存储X值。这是因为RND和RD互相排斥。利用下面的步骤实现RD命令:
步骤 |
动作 |
1 |
IF(MinTicksRemaining≠0GOTO1 |
2 |
MinTicksRemaining←MinTicks |
3 |
R←从客户读取160位 |
4 |
Hash←Calculate FK1[R] |
5 |
OK←(Hash=next 160bits from client)请注意该操作必须占用固定时间以使攻击者不能确定他们的推测有多少是正确的。 |
6 |
IF(OK)将M的256位输出给客户ELSE将0的256位输出给客户 |
7 |
Hash←计算FK2[R|M] |
8 |
IF(OK)将散列的160位输出给客户 |
RND-随机
输入:无
输出:R,FK1[R]=[160位,160位]
变更:无
客户利用RND(随机)命令获得有效R,FK1[R]对,该有效R,FK1[R]对用于利用RD和TST命令进行后续验证。由于没有输入参数,所以RND命令只有位0-2的RND操作码。在,RND命令仅在满足下面的条件时,可以使用RND命令:
SIWritten=1 表示已经利用SSI命令建立了K1和R;以及
IsTrusted=1 表示允许该芯片产生随机数序列;
RND将R和F
K1[R]返回调用者。可以将RND的128位输出作为输入参数直接送到非可信芯片的RD命令。客户根本不需要存储它们,因为不再需要它们。然而,仅在RND命令首先获得了送到RD命令的随机数时,才执行TST命令。如果调用者仅调用RND命令多次,则每次都返回R,F
K1[R]对。在成功调用TST后,只有R进展到该序列中的下一个随机数。有关更多信息,请参考TST。利用下面的步骤实现RND命令:
步骤 |
动作 |
1 |
输出R的160位给客户 |
2 |
Hash=计算FK1[R] |
3 |
输出散列的160位给客户 |
TST-测试
输入:X,FK2[R|X]=[256位,160位]
输出:1或0=[1位]
变更:M、R以及MinTicksRemaining(或者攻击检测的所有寄存器)
TST(测试)命令用于对从非可信验证芯片读取M进行验证。TST(测试)命令包括TST命令操作码及其后面的输入参数:X和FK2[R|X]。由于验证芯片是串行的,所以必须一次一位地传送该命令。对于每个命令部件,位顺序均是从LSB到MSB。因此,TST命令是:位0-2的TST操作码、后面的位0-159的M、位0-159的FK2[R|X]。总共传送419位。由于所获得的最后416位作为RD命令对非可信验证芯片的输出位,所以甚至不需要客户存储整个数据。相反,可以直接将这些位送到可信芯片的TST命令。仅避免将256位的M送到RD命令。仅在满足下面的条件时,可以使用TST命令:
SIWritten=1 表示已经利用SSI命令建立了K2和R;以及
IsTrusted=1 表示允许该芯片产生随机数序列;
此外,调用TST必须等待MinTicksRemaining寄存器到达0。一旦这样做了,就可以利用MinTicks重新装载该寄存器,以确保在调用TST之间历时最短时间。TST使内部M值被输入的M值替换。然后,计算FK2[M|R],并将它与160位输入散列值进行比较。产生一个输出位:1,如果它们相同;和0,如果它们不相同。使用内部M值是为了节省芯片上的空间,而且这也是RD和TST为什么是互相排斥命令的原因。如果输出位是1,则将R更新为序列内的下一个随机数。这样,在每次调用RD和TST时,迫使调用者使用新随机数。在对整个输入串进行了比较之前,不输出所获得的输出位,以使对TST函数内的比较进行评估的时间始终相同。因此,给出输出之前,攻击者不能将执行时间或处理的位数进行比较。
利用160位最长周期LFSR(位于位159、4、2和1的抽头选择),根据R产生下一个随机数。利用SSI命令建立R的初始160位值,而且该初始160位值可以是0之外的任意随机数(利用0填充的LFSR将产生0的无结尾流)。通过对位1、2、3和159一起进行“异或”运算,然后将“异或”结果用作输入位b159,将全部160位向右移位1位,变换R。在下一次调用RND时,返回新R。请注意,对于所有错误输入,从TST返回0花费的时间必须相同,以使攻击者不能获得关于什么是无效输入的任何内容。
利用下面的步骤实现TST命令:
步骤 |
动作 |
1 |
IF(MinTicksRemaining≠0GOTO 1 |
2 |
MinTicksRemaining←MinTicks |
3 |
M←从客户读取256位 |
4 |
IF(R=0)GOTO CLR |
5 |
Hash←计算FK2[R|M] |
6 |
OK←(Hash=来自客户的下160位) |
|
请注意该操作必须占用固定时间以使攻击者不能确定他们的推测有多少是正确的。 |
7 |
IF(OK)Temp←R擦除R经由LFSR使得TEMP提前R←TEMP |
8 |
输出OK的一位给客户 |
请注意,因为R是闪速存储器,所以我们不能仅使R进入步骤7,而且为了使任何置位位变成0,必须擦除它。如果在步骤7期间,在擦除R的旧值之后,而在写入R的新值之前从验证芯片卸下电源,则擦除R,而且不重新编程。因此,我们获得了IsTrusted=1,而R=0,这是唯一可能的情况,因为存在攻击者。步骤4检测该事件,而且如果检测到攻击,则采取动作。在装载了该新值之后,通过触发用于R和有效位的第二160位闪速寄存器,可以避免出现该问题。因为空间原因,它未包括在该实现中,但是如果空间允许,对于该用途,额外的160位闪速寄存器有用。
WR-写
输入:M=[256位]
输出:无
变更:M
WR(写)命令用于更新含有验证芯片状态数据的M的可写部分。WR命令本身是不安全的。它后面必须对M进行验证读(利用RD命令),以确保根据规定进行变更。通过传送之后是要写入M的新256位数据的WR命令操作码,可以调用WR命令。由于验证芯片是串行的,所以必须一次一位地传送M的新值。对于每个命令部件,位顺序均是从LSB到MSB。因此,WR命令是:位0-2的WR操作码、后面的位0-15的M[0]、位0-15的M[1]直到位0-15的M[15]。总共传送259位。仅在SIWritten=1,表示已经利用SSI命令建立了K1、K2和R时,可以使用WR命令(如果SIWritten=0,则还未建立K1、K2和R,而调用CLR命令代替它)。存储在AccessMode寄存器内的相应AccessMode位控制写入特定M[n]的能力。可以利用SAM命令设置AccessMode位。在将新值写入M[n]时,必须考虑到M[n]是闪速存储器的事实。必须擦除M[n]的所有位,然后置位正确的位。由于在不同周期执行这两个步骤,所以存在公开攻击的可能性。攻击者可以在擦除之后,而在利用新值编程之前卸下电源。然而,这样做对攻击者不具有优势:
读/写利用该方法变成0的M[n]没有优点,因为攻击者已经以任何方式利用WR命令写入了任何值。
只读利用该方法变成0的M[n]允许附加已知正文对(其中M[n]是0,而不是原始值)。为了在将来使用M[n]值,它们已经是0,因此不给出任何信息。
只递减变成0的M[n]仅加速用完消耗品的时间。它不对攻击者提供任何新信息,但是使用消耗品却给出新信息。
利用下面的步骤实现WR命令:
1 |
DecEncountered←0EqEncountered←0n←15 |
2 |
Temp←从客户读取16位 |
3 |
AM=AccessMode[~n] |
比较先前值 | |
5 |
LT←(Temp<M[~n])[比较未符号]EQ←(Temp=M[~n]) |
6 |
WE←(AM=RW)∨((AM=MSR)∧LT)∨((AM=NMSR)∧(DecEncountered∨LT)) |
7 |
DecEncountered←((AM=MSR)∧LT)∨((AM=NMSR)∧DecEncountered)∨((AM=NMSR)∧EqEncountered∧LT)EqEncountered←((AM=MSR)∧EQ)∨((AM=NMSR)∧EqEncountered∧EQ) |
SAM-设置AccessMode
输入:AccessModenew=[32位]
输出:AccessMode=[32位]
变更:AccessMode
SAM(设置存取方式)命令用于设置32位的AccessMode寄存器,而且它只能用于消耗品验证芯片(其中IsTrusted标志=0)。通过传送SAM命令操作码,可以调用SAM命令,该SAM命令操作码位于用于置位AccessMode寄存器内的各位的32位值之后。由于验证芯片是串行的,所以必须一次一位地传送数据。对于每个命令部件,位顺序均是从LSB到MSB。因此,SAW命令是:位0-2的SAM操作码、后面的将在AccessMode内置位的各位中的位0-31。总共传送35位。仅在执行了CLR命令后,清除AccessMode寄存器。由于00的存取方式不是RW(读/写)存取方式,所以在CLR后不置位任何AccessMode位就意味着可以读写所有M。SAM命令仅置位AccessMode寄存器内的各位。因此,通过对32位字中的正确位进行置位,并利用作为输入参数的32位值调用SAM,客户可以将M[n]的存取方式位从RW变更为RO(只读)。这样可以在不同时间,或者在制造过程的不同阶段编程存取方式位。例如,在初始密钥编程阶段,可以写入只读随机数据,而在第二编程阶段写入诸如消耗品序列号的项目。
由于SAM命令仅置位各位,所以其作用是使相应M[n]的存取方式位从RW变更为MSR、NMSR或RO。应该注意,可以将MSR的存取方式变更为RO,但是这对攻击者没有帮助,因为写入伪造验证芯片之后验证M将检测到该写入未成功,因此而异常终止该操作。置位各位相当于闪速存储器的最佳工作方式。清除AccessMode寄存器内的各位,以便例如将只递减M[n]变更为读/写的唯一方式是使用CLR命令。CLR命令不仅擦除(清除)AccessMode寄存器,而且清除密钥和所有M。因此,仅有助于在CLR命令之间一次性改变相当于M[n]的AccessMode[n]位。SAM命令返回AccessMode寄存器的新值(在因为输入参数而置位正确位之后)。通过利用输入参数0调用SAM,将不改变AccessMode,因此将AccessMode的当前值返回调用者。
利用下面的步骤实现SAM命令:
步骤 |
动作 |
1 |
Temp←从客户读取32位 |
2 |
设置位(AccessMode,Temp) |
3 |
输出AccessMode的32位给客户 |
GIT-获得IsTrusted
输入:无
输出:IsTrusted=[1位]
变更:无
GIT(获得IsTrusted)命令用于读验证芯片上的IsTrusted位的当前值。如果返回的位是1,则该验证芯片是可信System验证芯片。如果返回的位是0,则该验证芯片是消耗品验证芯片。GIT命令仅包括GIT命令操作码。由于验证芯片是串行的,所以必须一次一位地传送该命令。对于每个命令部件,位顺序均是从LSB到MSB。因此,利用位0-2的SAM操作码发送GIT命令。总共传送3位。
SMT-设置MinTicks
输入:MinTicksnew=[32位]
输出:无
变更:MinTicks
SMT(设置MinTicks)命令用于置位MinTicks寄存器内的各位,并因此而确定在调用TST与RD之间必须经过的最少滴答声数。通过传送SMT命令操作码,可以调用SMT命令,该SMT命令操作码位于用于置位MinTicks寄存器内各位的32位值之后。由于验证芯片是串行的,所以必须一次一位地传送数据。对于每个命令部件,位顺序均是从LSB到MSB。因此,SMT命令是:位0-2的SMT操作码、后面的将在MinTicks内置位的各位中的位0-31。总共传送35位。仅在执行了CLR命令后,清除MinTicks寄存器。0值表示在调用基于密钥的函数之间不需要经过滴答声。因此,可以以时钟速度限制硬件允许芯片运行的同样频率调用该函数。
由于SMT命令仅置位各位,所以其作用是允许客户设置数值,而且仅在再调用时,增加时间延迟。置位已经被置位的位不起作用,而仅置位被清除的位用于进一步降低芯片的速度。置位各位相当于闪速存储器的最佳工作方式。清除MinTicks寄存器内的各位,以便例如将10个滴答声的值变更为4个滴答声的值的唯一方式是使用CLR命令。然而,CLR命令不仅将MinTicks寄存器清除为0,而且清除所有密钥和M。因此,这对于攻击者没有用。这样,仅有助于在CLR命令之间一次性改变MinTicks寄存器。
利用下面的步骤实现SMT命令:
步骤 |
动作 |
1 |
Temp←从客户读取32位 |
2 |
设置位(MinTicks,Temp) |
编程验证芯片
必须在物理安全环境下,利用逻辑安全信息编程验证芯片。因此,编程过程包括逻辑安全性和物理安全性。逻辑安全性是确保不利用计算机,而利用物理随机过程产生K1、K2、R以及随机M[n]值的过程。它还是确保被编程的芯片的各部分的顺序是逻辑上最安全的过程。物理安全性是确保编程站在物理上是安全的,以便在密钥生成阶段和密钥存储寿命期内,使K1和K2保持保密的过程。此外,编程站必须防止为了获得或破坏密钥而进行的物理攻击。验证芯片具有自己的安全机制,用于确保K1和K2保持保密,但是编程站也必须保持K1和K2安全。
概述
在制造之后,必须在使用之前,对验证芯片进行保持。在所有芯片上,必须确定K1和K2的值。如果确定该芯片是System验证芯片,则必须确定R的初始值。如果确定该芯片是消耗品验证芯片,自然必须将R设置为0,而且必须确定M和AccessMode的初始值。因此,识别下面的各阶段:
确定System与消耗品之间的交互
确定System和消耗品的密钥
确定System和消耗品的MinTicks
编程密钥、随机籽数、MinTicks以及未使用的M
编程状态数据和存取方式
一旦不再需要消耗品或系统,则可以再用安装的验证芯片。这可以通过在阶段4再重新编程该芯片容易地实现。将在后续小节说明每个阶段。
阶段0:制造
制造验证芯片不要求任何特殊安全性。在制造阶段,不将保密信息编程到芯片内。算法和芯片进程不是专用的。采用标准闪速进程。在芯片制造商与编程站之间发生盗窃只能为仿制制造商提供空白芯片。这仅包括销售验证芯片,而不包括验证芯片验证的任何内容。由于编程站仅是具有消耗品和系统产品密钥的机构,所以利用正确密钥,仿制制造商不能对该芯片进行编程。仿制制造商可以针对他们自己的系统或消耗品而编程空白芯片,但是如果不进行检测,难以将这些项目投入市场。此外,一次盗窃难以建立商业基础。
阶段1:确定System与消耗品之间的交互
在任何一个验证芯片可以被编程之前,需要判定什么是System以及什么是消耗品。需要对在哪种System内使用哪种消耗品进行判定,因为所有相连的System和消耗品均必须共享同样的密钥信息。即使还没有确定状态数据的某些解释,但是它们仍需要共享状态数据使用机制。简单例子是轿车和轿车—密钥的例子。轿车本身是System,而轿车—密钥是消耗品。每辆轿车存在几个轿车密钥,每个轿车—密钥含有与特定轿车相同的密钥信息。然而,每辆轿车(System)含有不同的密钥(有其轿车—密钥共享),因为我们不希望一辆轿车的轿车—密钥可以用于另一辆轿车。另一个例子是照片复制器的例子,它要求特定墨粉盒。在简单术语中,照片复制器就是System,而墨粉盒就是消耗品。然而,必须判定在墨粉盒与照片复制器之间存在什么兼容性。根据墨粉盒的物理封装,进行历史判定:根据该复制器的设计判定,特定墨粉盒适于或者不适于新型照片复制器。在使用验证芯片时,必须一起工作的各部件必须共享同样的密钥信息。
此外,每种消耗品均要求以不同方式分割M(状态数据)。尽管使用M的方式各应用不同,但是分配M[n]和AccessMode[n]的方法却相同:
确定特定用途的消耗品状态数据
置位一些M[n]寄存器留着将来使用(如果需要)。将这些寄存器置位为0和只读。可以在System内测试该值并保持兼容。
利用完全随机的每个M[n]的内容,将剩余的M[n]寄存器(至少一个,但是它不必是M[15])置位为只读。这样使得仿制制造商更难以攻击验证密钥。
下面的例子说明了组织状态数据的方式。
例子1
假如我们有一辆具有相关轿车—密钥的轿车。16位密钥数对于唯一识别给定轿车的每个轿车—密钥绰绰有余。可以将M的256位分割为:
M[n] |
存取 |
说明 |
0 |
RO |
密钥数(16位) |
1-4 |
RO |
轿车发动机号(64位) |
5-8 |
RO |
用于未来扩展=0(64位) |
8-15 |
RO |
随机位数据(128位) |
如果轿车制造商保存所有轿车的所有逻辑密钥,则倘若一个逻辑密钥被丢失,对于制造给定轿车的新物理轿车—密钥无足轻重。新轿车—密钥在M[n]内含有新密钥数,但是与轿车的验证密钥具有同样的K1和K2。轿车System可以使特定密钥数无效(例如,如果密钥被丢失)。这种系统可以要求首先插入密钥0(主密钥),然后插入所有有效密钥,再插入密钥0。现在,只有这些有效密钥对该轿车行得通。在最糟糕情况下,例如,如果所有轿车—密钥被丢失,则如果要求,可以对该轿车产生一组新逻辑密钥及其相关物理轿车—密钥。轿车发动机号用于将密钥与特定轿车联系在一起。未来使用数据可以包括诸如出租信息的事件,例如驾驶员/出租人详情。
例子2
假如我们具有照片复制器图像单元,应该每100,000张拷贝更换一次照片复制器图像单元。存储剩余打印纸数量需要32位。可以将M的256位分割为:
M[n] |
存取 |
说明 |
0 |
RO |
序列号(16位) |
1 |
RO |
批号(16位) |
2 |
MSR |
剩余张数(32位,hi/lo) |
3 |
NMSR |
4-7 |
RO |
用于未来扩展=0(64位) |
8-15 |
RO |
随机位数据(128位) |
如果制造仅10,000张拷贝后就必须更换的低质量图像单元,则32位张数仍可以用于与现有照片复制器兼容。这样可以使几种消耗品用于同一种系统。
例子3
对含有25张照片的Polaroid相机消耗品进行研究。16位递减计数就是存储剩余照片数量所需的全部计数。可以将M的256位分割为:
M[n] |
存取 |
说明 |
0 |
RO |
序列号(16位) |
1 |
RO |
批号(16位) |
2 | MSR | 剩余照片(16位) |
3-6 |
RO |
用于未来扩展=0(64位) |
7-15 |
RO |
随机位数据(144位) |
M[2]上的剩余照片值使得多种类型的消耗品可以用于同一个相机系统。例如,具有36张照片的新消耗品对于程序无足轻重。假如在推出该相机后的2年后,推出新型相机。不仅可以使用旧消耗品,而且可以处理新胶片类型。M[3]可以用于确定胶片类型。旧胶片类型可以是0,而新胶片类型可以是某个新值。新系统可以利用这些。原始系统检测M[3]上的非0值,而且与新胶片类型不兼容。新系统可以理解M[3]的值,并因此做出适当反应。为了与旧消耗品保持兼容,新消耗品和System需要与旧消耗品和System具有同样的密钥。为了完全改变新System及其自己的专用消耗品,需要新密钥组。
例子4
对含有3种墨水:青色、深红色以及黄色的打印机消耗品进行研究。分别递减每种墨水的墨水量。
可以将M的256位分割为:
M[n] |
存取 |
说明 |
0 |
RO |
序列号(16位) |
1 |
RO |
批号(16位) |
2 |
MSR |
青色剩余(32位,hi/lo) |
3 |
NMSR |
4 |
MSR |
深红色剩余(32位,hi/lo) |
5 |
NMSR |
6 |
MSR |
黄色剩余(32位,hi/lo) |
7 |
NMSR |
8-11 |
RO |
用于未来扩展=0(64位) |
12-15 |
RO |
随机位数据(64位) |
阶段2:对System和消耗品确定密钥
一旦确定了System和消耗品共享同一个密钥,就必须确定这些密钥。因此,必须确定K1和K2的值。在大多数情况下,总是一次性产生K1和K2。必须一起工作的所有System和消耗品(无论现在还是将来)均需要具有同样的K1和K2值。因此,K1和K2必须保持保密,因为如果该密钥被损害,则System/消耗品组合的整个安全性机制将失效。如果该密钥被损害,则破坏取决于系统和消耗品的数量,以及利用新未损害密钥重新编程它们的情况:对于具有墨粉盒的照片复制器,最糟糕的情况是仿制制造商可以制造他们自己的验证芯片(或者更糟糕情况,购买它们),利用已知密钥编程该芯片,然后,将它们插入他们自己的消耗品中。对于具有轿车—密钥的轿车,每辆轿车具有一组不同的密钥。这样产生了两种可能的一般情况。第一种情况是,在利用密钥K1编程轿车和轿车—密钥后,删除K1和K2,因此不保存他们的值的记录,这意味着,没有办法损害K1和K2。然而,如果未重新编程该轿车的验证芯片,则不能再产生轿车—密钥。第二种情况是,轿车制造商保存K1和K2,而且可以对该轿车产生新密钥。损害K1和K2意味着,某个人可以专门对特定轿车产生轿车—密钥。
因此,必须利用非确定性的方法产生验证芯片使用的密钥和随机数据(不能使用完全由计算机产生的伪随机数,因为它是确定性的—发生器的籽数的知识给出未来的所有伪随机数)。应该利用物理随机过程,而不利用计算机产生K1和K2。然而,根据自然随机性源的随机位发生器受到外部因素的影响,而且还产生故障。对于统计随机性,重要的是周期性地测试这种设备。
一种简单的、仍然有效的随机数源是SGI生产的Lavarand_系统。该发生器利用数码相机每隔几秒就对6个熔岩灯泡(lava lamp)照相。熔岩灯泡含有杂乱湍流系统(chaotic turbulent system)。将获得的数字图像送到SHA-1实现,SHA-1实现产生7向散列,从而根据数字图像中的每个第七字节产生160位的值。这7组160位的值总共140字节。将该140字节的值送到BBS发生器以定位输出位流的开始。BBS输出的160位就是验证芯片53的密钥。
非确定性随机过程的一个极端例子是某人在清洁的房间内对于K1抛掷160次硬币,对于K2抛掷160次。对于每次图像面或文面,通过密钥编程器设备的面板输入1或0。必须在有几个观察者(用于见证)的情况下,安静地(某人可能具有窃听器)进行该过程。形成的观点是安装数据的输入和存储并不想说的那么简单。密钥编程器设备和所附编程站的物理安全性需要其整个文档。一旦确定了密钥K1和K2,则只要验证芯片需要使用该密钥,就保存该密钥。在轿车/轿车—密钥的第一种情况下,在对一个System芯片和几个消耗品芯片编程之后,就销毁K1和K2。在照片复制器/墨粉盒情况下,只要墨粉盒用于照片复制器,就保留K1和K2。必须安全保存该密钥。
阶段3:确定System和消耗品的MinTicks
MinTicks的值取决于验证芯片(System专用)的工作时钟速度和什么构成RD或TST函数调用之间的合理时间的概念(应用专用)。一个滴答声的时长取决于工作时钟速度。这就是最高输入时钟速度和验证芯片时钟限制硬件。例如,可以将验证芯片的时钟限制硬件设置为10MHz(它是不可改变的),但是输入时钟是1MHz。在这种情况下,1个滴答声的值基于1MHz,而不是基于10MHz。如果输入时钟是20MHz,而不是1MHz,则1个滴答声的值基于10MHz(因为时钟速度被限制到10MHz)。如果知道滴答声的时长,就可以设置MinTicks的值。MinTicks的值是要求在调用基于密钥的RD函数或RND函数之间经过的最少数量的滴答声。假定输入时钟速度匹配10MHz的最高时钟速度。如果我们希望在调用TST之间存在最小1秒的时间,则将MinTicks值设置为10,000,000。对于诸如打印机的System,甚至诸如2秒的值就是一个完全合理的值(每页进行一次验证,而且每隔2秒或3秒产生一页)。
阶段4:程序密钥、随机数籽数、MinTicks以及未使用的M
制造之后,验证芯片处于未知状态。作为一种选择,它们已经用于一个消耗品,而且为了用于另一个消耗品,必须重新编程。必须利用新密钥和新状态数据清除每个验证芯片并对它们编程。必须在安全编程站环境下,清除验证芯片并对该验证芯片进行后续编程。
编程可信System验证芯片
如果该芯片是可信System芯片,则必须产生R的籽数值。它必须是根据物理随机过程获得的随机数,而且不得为0。必须在安全编程环境下以下面的顺序执行下面的任务:
RESET芯片
CLR[]
将物理随机数据装载到R(160位寄存器)
SSI[K1,K2,R]
SMT[MinTicksSystem]
现在,验证芯片已经准备好插入System中。它已经被完全编程。如果此时该System验证芯片被盗窃,则仿制制造商可以利用它们产生R,FK1[R]对,以对K1发起已知正文攻击,或者利用它们对K2发起部分选择正文攻击。这与购买大量分别含有可信验证芯片的System没有差别。安全性取决于验证协议的强度以及K1和K2的随机性。
编程非可信System验证芯片
如果该芯片是非可信消耗品验证芯片,则编程过程与可信System验证芯片的编程过程稍许不同。首先,R的籽数值必须为0。必须对M和AccessMode值进行附加编程。必须利用0对未来使用M[n]进行编程,而必须利用随机数据对随机M[n]进行编程。必须在安全编程环境下以下面的顺序执行下面的任务:
RESET芯片
CLR[]
将0装载到R(160位寄存器)
SSI[K1,K2,R]
将0装载到X(256位寄存器)
设置X中的位,对应适当的M[n],其具有物理随机数据
WR[X]
将0装载到Y(32位寄存器)
设置Y中的位,对应适当的M[n],其具有只读存取方式
SAM[Y]
SMT[MinTicksConsumable]
现在,非可信消耗品芯片已经准备好利用通用状态数据被编程。如果此时验证芯片被盗窃,则攻击者可以进行有限的选择正文攻击。在最好情况下,部分M是只读的(0和随机数据),攻击者完全选择M的剩余部分(利用WR命令)。对于有限的M,攻击者大量调用RD以获得FK2[M|R]。在最糟糕情况下,攻击者可以完全选择M(因为全部256位用作状态数据)。然而,在这两种情况下,攻击者不能选择R的任何值,因为通过调用将它从System验证芯片送到RND。获得选择的R的唯一方式是利用强力攻击。应该注意,如果在同一个编程站执行阶段4和5(优选的理想情况),则不能在这两个阶段之间卸下验证芯片。因此,此时,验证芯片不可能被盗窃。判定是一次还是两次编程验证芯片取决于System/消耗品制造商的要求。
阶段5:编程状态数据和AccessMode
要求该阶段仅用于消耗品验证芯片,因为在System验证芯片上不能改变M和AccessMode寄存器。在阶段4,已经对M[n]的未来使用和随机值进行了编程。需要对剩余状态数据值进行编程,而且需要设置有关存取方式值。请记住,利用存储在MinTicks寄存器内的值限制该阶段的速度。考虑到执行阶段4的地点/时间与执行阶段5的地点/时间之间的物理位置或时间的不同,将该阶段与阶段4分开。最理想的是,在同一个编程站同时执行阶段4和阶段5。阶段4产生有效验证芯片,但是不对它们装载初始状态值(0除外)。这样可以使编程芯片与消耗品的生产流水线一致。尽管阶段5可以运行多次,每次分别设置不同的状态数据值和存取方式值,但是更可能运行一次,以设置所有的剩余状态数据值并设置所有剩余存取方式值。例如,可以建立生产线,其中根据正在生产的物理消耗品,产生验证芯片的批号和序列号。如果在实际上不同的工厂装载状态数据,则这非常难以匹配。
阶段5过程包括首先进行检验以确保该芯片是有效消耗品芯片,该有效消耗品芯片包括:RD,以从验证芯片读取数据;WR,在RD的后面,用于写入初始数据值;SAM,用于永久设置新数据值。在此概括说明各步骤:
IsTrusted=GIT[]
If(IsTrusted),退出错误(芯片的错误种类!)
调用有效System芯片上的RND,以得到一个有效的输入对
调用芯片上待编程的RD,经过有效的输入对
将从验证芯片的RD获得的结果装载到X(256位寄存器)
调用有效System芯片上的TST,以保证X和是有效的
If(TST变为0),退出错误(系统的错误消费品芯片)
设置X的位,启动状态值
WR[X]
将0装载到Y(32位寄存器)
设置Y的位,其对应用于新状态值的Access Modes
SAM[Y]
当然,如果在同一个编程站,阶段4和5互相随之进行,则不必进行证实(步骤1至7)。但是在其中阶段5作为与阶段4分开的编程过程的所有其他情况下,有关进行证实。如果这些验证芯片现在被盗窃,它们已经被编程用于特定消耗品。攻击者可以将盗窃的芯片设置在仿制消耗品内。这种盗窃将仿制产品的数量限制在所盗窃的芯片的数量。一次盗窃不能提供稳定供应,不足以对仿制制造商提供成本效益好的业务。使用芯片的另一种方法是防止攻击者为了发起部分选择正文攻击或强力攻击,每次购买与验证芯片同样数量的消耗品。如果发生这种攻击,则不存在专门破坏密钥的安全性的行为。
制造
验证芯片的电路系统必须防止物理攻击。概括说明制造实现指南,然后说明芯片的物理防御(攻击调配)规范。
制造指南
下面说明在制造过程中实现验证芯片的一般指南:
标准工艺
最小尺寸(如果可能)
时钟滤波器
噪声发生器
防止窜改和检测窜改电路系统
具有窜改检测的保护内存
用于装载程序代码的自举电路系统
用于密钥数据通路的FET的专用实现
多晶硅层上可能的数据连接
OverUnderPower检测单元
无测试电路系统
标准工艺
应该利用标准制造工艺(例如,闪速)实现验证芯片。这需要:
允许大范围选择制造位置
使用意义明确、性能良好的技术
降低成本
请注意,该标准工艺还允许具有物理保护机制。
最小尺寸
为了作为低成本消耗品的验证机制而包括验证芯片53,验证芯片53制造成本必须低。因此,最好使该芯片的尺寸保持尽可能相当低的尺寸。每个验证芯片需要802位的非易失性存储器。此外,优化HMAC-SHA1要求的存储器是1024位。该芯片的其余部分(状态机、处理器、CPU或实现协议3选择的任何东西)必须最小,以便将晶体管的数量降低到最少,从而将每个芯片的成本降低到最低。还应该将用于处理保密密钥信息,或者可能暴露关于密钥的信息的电路区减小多最小(请参考下面用于专用数据通路的非闪速CMOS)。
时钟滤波器
验证芯片电路系统是为在特定时钟速度范围内工作设计的。由于用户直接提供时钟信号,所以攻击者可以尝试在处理过程中在特定时间在该电路系统中引入竞争情况。其例子是如果高时钟速度(比所设计的电路系统的高)可以正确防止在工作中进行“异或”运算,而且在这两个输入中,可以始终返回第一个输入。在恢复保密密钥信息时,瞬时故障攻击的这些风格非常有效。由此得到的经验是输入时钟信号不可信。由于输入时钟信号不可信,所以它必须以最高频率工作。这可以利用几种方法实现。滤波时钟信号的一种方法是利用边缘检测单元将边缘传递到延迟,该延迟反过来使输入时钟信号通过。图174示出时钟滤波器内的时钟信号流。应该设置该延迟,以使最高时钟速度是特定频率(例如,约4MHz)。请注意,该延迟不可编程—它是固定的。在需要时,在内部进一步除该滤波的时钟信号。
噪声发生器
每个验证芯片均应该含有噪声发生器,它产生连续电路噪声。该噪声与芯片的正常活动产生的其他电磁辐射互相干扰,并对Idd信号附加噪声。在验证芯片上设置噪声发生器不存在问题,因为辐射波长的长度。噪声发生器用于产生电子噪声,多种状态改变每个时钟周期,而且用作防止窜改和检测窜改电路系统的伪随机位源。噪声发生器的一种简单实现是对其形成的籽数是非零的64位LFSR。为了尽可能多地产生噪声,对于该芯片,用于该噪声发生器的始终应该以最高时钟速率运行。
防止窜改和检测窜改电路系统
需要一组电路测试并防止物理攻击验证芯片。然而,实际检测到的攻击可能不是有意物理攻击。因此,重要的是在验证芯片上区别这两种类型的攻击:
如果你可以确定发生了物理攻击。
如果你不能确定发生了物理攻击。
两种类型检测的不同之处在于,通过检测执行的内容不同。在第一种情况下,如果电路系统可以确定已经发生了真实物理攻击,则擦除闪速存储器密钥信息是明智动作。在第二种情况下,如果电路系统不能确定是否发生了攻击,无疑仍存在某些错误。必须采取动作,但是该动作不应该是擦除保密密钥信息。第二种情况下采取的适当动作是芯片RESET。如果所检测到的是永久破坏该芯片的攻击,则下一次将出现同样的情况,并再RESET该芯片。相反,如果所检测到的是芯片的正常工作环境部分,则RESET不会破坏该密钥。
电路系统没有关于其知识的事件的良好例子是电源假信号脉冲。假信号脉冲可以是试图发现关于密钥的信息的有意攻击。然而,这也可能是故障连接的结果,或者仅是省电过程的开始。因此,最好仅RESET该芯片,而不擦除密钥。如果该芯片正处于省电状态,则什么也不丢失。如果System发生故障,则重复RESET,消费者可以使System得到修复。在这两种情况下,消耗品仍原封不动。电路系统具有关于其知识的事件的良好例子是切断该芯片内的数据线。如果以某种方式检测到该攻击,它可能仅是故障芯片(制造缺陷)或攻击的结果。在两种情况中的任何一种情况中,擦除保密信息均是要采取的明智步骤。
因此,每个验证芯片应该具有2条窜改检测线,如图所示—一条用于确定攻击,一条用于可能攻击。连接到这些窜改检测线的是大量窜改检测测试单元,每个窜改检测测试单元分别对不同形式的窜改进行测试。此外,我们希望确保窜改检测线和电路本身不能被窜改。
窜改检测线的一端是伪随机位源(与通用工作电路系统相比,时钟速度高)。以上描述的噪声发生器电路是充足噪声源。所产生的各位通过两条不同的通路—一条通路承载原始数据,另一条通路承载倒置的该数据。承载这些位的导线位于通用芯片电路系统(例如,存储器、密钥处理电路系统等)之上的层上。这些导线还必须覆盖随机位发生器。利用“异或”门,在许多位置将各位重新组合在一起。如果各位不同(它们应该不同),则输出1,而且特定单元使用1(例如,应该将读取内存获得的每个输出位与该位值进行“与”运算)。各条导线在闪速存储器擦除电路会集到一起,在该闪速存储器擦除电路上,利用“异或”输出的0触发全部擦除。连接到该导线上的是大量触发器,每个触发器检测对芯片进行的物理攻击。每个触发器具有连接到GND的扩界nMOS晶体管。利用物理方法,使窜改检测线超过该nMOS晶体管。如果测试失败,则触发器使窜改检测线变成0。因此,不能在该时钟周期或下一个时钟周期(平均)进行“异或”测试,因此RESET或擦除该芯片。在进行测试和“异或”连接到擦除电路系统或RESET电路系统方面,图175示出窜改检测线的基本原理图。
窜改检测线必须通过输出晶体管的漏极,用于进行每次测试,如图176示出的扩界nMOS晶体管布局所示。不能断开窜改检测线,因为这样停止随机源发出的1和0流。因此,“异或”检测失败。在窜改检测线实际上通过每次测试时,如果不断开窜改检测线,就不能取消任何特定测试。重要的是,“异或”运算从沿窜改检测线的各位置获得数值,以降低攻击几率。图177示出从窜改检测线引出多个“异或”,以便用于芯片的各不同部分。可以认为这些“异或”分别产生ChipOK位,在每个单元或子单元内可以使用ChipOK位。
简单使用是在每个单元内具有在每个周期与给定ChipOK位“与”运算的OK位。在RESET时,利用1装载OK位。如果OK是0,则在进行下一次RESET之前,该单元失败。如果窜改检测线正确工作,该芯片将RESET,或者擦除全部密钥信息。如果RESET或擦除电路系统被破坏时,则该单元不工作,因此阻止攻击者。RESET和擦除线及其有关电路系统的目的地是非常上下文相关的。需要以与单独窜改测试非常相同的方式保护他。如果攻击者只能切断引入到RESET电路系统的导线,则没有办法产生RESET名称。实际实现非常取决于在RESET时清除了什么,以及如何清除这些项目的。最后,图178示出窜改线如何覆盖芯片的噪声发生器电路系统的。该发生器和“非”门在同一级上,而窜改检测线在发生器上面的一级上延伸。
具有窜改检测的保护内存
闪速存储器不够仅存储保密信息或程序代码。必须防止试图修改(或置位)程序代码或密钥信息的特定位的攻击者攻击闪速存储器和RAM。所使用的机制必须符合用于窜改检测电路系统(上述)。该解决方案的第一部分是确保窜改检测线分别直接从闪速存储器或RAM位上通过。这样可以确保攻击者不能探测闪速存储器或RAM的内容。破坏覆盖线就是断开窜改检测线。这种破坏导致擦除信号被置位,从而删除内存上的任何内容。窜改检测线上的高频噪声还使得不易发现波动观察。
闪速存储器解决方案的第二部分是使用多级数据存储器,而不仅仅使用有效位表示的这些多级。通常,在使用多级闪速存储器时,一个浮动门保存1位以上。例如,四电压状态晶体管可以表示2位。假定最低和最高电压分别表示00和11,两个中间电压表示01和10。在验证芯片上,我们可以利用两个中间电压表示一位,而认为两个极端电压是无效状态。如果攻击者试图通过闭合或者切断栅极电路用各种方法强置位状态,则获得无效电压(因此,无效状态)。
RAM解决方案的第二部分是使用奇偶位。可以对照奇偶位校验寄存器的数据部分(攻击之后不匹配)。因此,利用大量与公用窜改检测线相连的测试单元(每位一个测试单元),使闪速存储器和RAM输出的各位有效。窜改检测电路系统可以是数据通过的第一个电路系统(从而防止攻击者切断数据线)。
用于装载程序代码的自举电路系统
应该将程序代码保存在多级闪速存储器内,而不保存在ROM内,因为可以以不可测试方式改变ROM。因此,需要自举机制将程序代码装载到闪速存储器内(在制造之后,闪速存储器处于不确定性状态)。自举电路系统不得在ROM内—小型状态机足以。否则,可以以不可检测方式修改自举代码。自举电路系统必须擦除所有闪速存储器,进行校验以确保进行了擦除,然后,装载程序代码。必须在装载程序代码之前,擦除闪速存储器。否则,攻击者可以使芯片处于自举状态,然后装载用于仅提取现有密钥的程序代码。状态机也必须进行校验,以确保在装载新程序代码之前,所有闪速存储器被清除(以确保攻击者未切断擦除线)。必须在可以装载保密信息(例如密钥)之前,利用安全编程站装载程序代码。
用于密钥数据通路的FET的专用实现
图179示出对于CMOS反相器情况下的FET实现的常规情况(包括与nMOS晶体管组合在一起的pMOS晶体管)。在过渡期间,存在短暂时间周期,其中nMOS晶体管和pMOS晶体管均具有中间电阻。产生的电源—地线短路导致电流暂时升高,而且事实上,导致电流主要被CMOS器件消耗。短路期间,发出少量红外光,而且通过硅衬底可以检测到该红外光(硅对红外光透明)。晶体管栅极电容和传输线电容在充电和放电期间也发出少量光。
对于用于处理保密密钥信息的电路系统,必须使这种信息保持隐藏。因此,应该将替换非闪速CMOS实现用于所有数据通路,该数据通路用于处理密钥或根据该密钥产生的部分数据。使用两个非交叠时钟φ1和φ2可以实现非闪速机制。φ1连接到所有nMOS晶体管的第二栅极,而φ2连接到所有pMOS晶体管的第二栅极。只能结合时钟实现过渡。由于φ1和φ2不交叠,所以pMOS和nMOS晶体管没有同时中间电阻。图180示出建立过程。
最后,可以将常规CMOS反相器定位在临界非闪速CMOS部件附近的位置。这些反相器应该从上面的窜改检测线获取其输入信号。由于窜改检测线的工作速度比常规工作电路系统的速度快许多倍,所以有效作用是在每个非闪速CMOS部件附近存在高速光短脉冲串(light-burst)。由于亮光淹没了观察附近的弱光,所以观察者不能正确检测芯片内发生了什么开关操作。实际上,这些常规CMOS反相器还提高电路噪声,降低SNR,从而不易发现有用的EMI。
因为使用非闪速CMOS,存在许多副作用:
芯片的有效速度被降低每个时钟周期的时钟上升时间的2倍。这对于验证芯片不成为问题。
减少了非闪速CMOS吸收的电流量(因为未发生短路)。然而,这是利用常规CMOS反相器偏置的。
特别是,因为要满足不同级的传播需要多倍φ1和φ2,所以发送时钟增加了芯片的面积。估计芯片面积是常规实现的芯片面积的2倍。
验证芯片的非闪速区域的设计比利用常规CMOS设计做同样的工作稍许复杂。特别是,不使用标准单元部件,这些区域完全是用户定制的。尤其在不必以这种方式保护整个芯片时,对于验证芯片这样小的东西不存在问题。
多晶硅层上可能的连接
应该在多晶硅层上任何可能的地方实现用于传送密钥或保密数据的连接。在需要时,它们可以在金属1上,但是永远不得在顶部金属层上(含有窜改检测线)。
OverUnderPower检测单元
每个验证芯片均需要OverUnderPower检测单元,以防止供电攻击。OverUnderPower检测单元检测电源假信号脉冲并对照电压基准测试电源电平,以确保它在特定容差范围内。该单元含有一个电压基准和两个比较器。OverUnderPower检测单元连接到RESET窜改检测线,从而在触发时实现RESET。OverUnderPower检测单元的副作用是在省电期间出现电压降低时,触发RESET,从而擦除任何工作寄存器。
无测试电路系统
验证芯片上的测试硬件可以非常容易导致脆弱性。因此,验证芯片不应该含有任何BIST或扫描通路。因此,验证芯片必须是利用外部测试矢量可测试的。这应该是可能的,因为验证芯片不复杂。
读ROM
这种攻击取决于存储在可寻址ROM内的密钥。由于每个验证芯片分别将其验证密钥存储到内部闪速存储器内,而不存储到可寻址ROM内,所以不考虑这种攻击。
逆向工程该芯片
仅在验证的安全性仅取决于算法时,才逆向工程芯片。然而,我们的验证芯片取决于保密密钥,而不取决于算法的保密性。相反,我们的验证算法是公开的,而且在任何情况下,均假定大量消耗品的攻击者能够获得芯片内部的详细平面图。考虑到这些因素,与存储的数据相反,逆向工程该芯片本身不构成威胁。
篡夺验证进程
可以进行这种攻击的方式有几种,每种方式具有不同的成功率。在所有情况下,假定仿制制造商将接触System和消耗品设计。攻击者可以尝试建立欺骗System返回有效代码,而不产生验证码。这种攻击是不可能的,因为2个原因。第一个原因是,System验证芯片和消耗品验证芯片尽管在物理上相同,但是编程不同。特别是,RD操作码和RND操作码相同,WR操作码和TST操作码也相同。System验证芯片不能执行RD命令,因为每次调用均被解释为调用RND。这种攻击将失败的第二个原因是,从System到System验证芯片和消耗品验证芯片,设置单独的串行数据线。因此,没有芯片可以观察到对另一个芯片发送和接收的内容。如果攻击者建立了可以忽略WR命令(递减剩余消耗品)的仿制芯片,则协议3确保后面的RD将检测到未出现WR命令。因此,System就不继续使用消耗品,从而阻止攻击者。如果攻击者模拟在验证之前失去联系也同样正确—因为未进行验证,就不能使用消耗品。因此,防止攻击者为了使仿制消耗品被接受而修改每个System。
修改System
修改System的最简单方法是,利用仅报告每次调用TST成功的验证芯片代替System的验证芯片。对于每次验证,System通过调用TST几次,头几次提供虚假值,然后期望TST输出失败,就可以阻止这种修改。预期最后调用TST成功。根据RD返回的部分结果或根据系统时钟,可以确定虚假调用TST的次数。不幸的是,攻击者可以仅重新布线System,以便新System仿制验证芯片53可以监测消耗品芯片返回的结果或时钟。在对其TST函数提供监测值时,仿制System验证芯片可以仅返回成功。在仿制System芯片宣告该值无效时,仿制消耗品可以返回任何值作为RD的散列结果。因此,System没有办法多次调用System验证芯片,因为重新布线攻击仅对被重新布线的System有效,而不对所有System有效。对System的一种类似攻击是,替换System ROM。可以改变ROM程序代码,以便永远不进行验证。对此束手无策,因为System仍在消费者手中。当然,这可以使任何保证无效,但是如果仿制消耗品极便宜,而且比原装消耗品更容易得到,则消费者可能认为这种变更是值得的。
因此,System/消耗品制造商必须确定这种性质的攻击有多大可能性。这种研究必须包括给出System和消耗品定价结构、System业务的频率、对进行了物理修改的消费者的优点以及消费者到什么地方进行修改。修改系统的限制情况是仿制制造商提供采用仿制消耗品的完全仿制System。这可能是简单的竞争或侵犯专利权。这两种方式均超出了验证芯片的范围,而且它们取决于被仿制的技术或业务。
利用传统探测方法直接检查芯片的运行
为了检查芯片运行,该芯片必须工作。然而,防止窜改和检测窜改电路系统包括了芯片上用于处理密钥或保存密钥的这些部分。利用防止窜改线,不能检查这些部分。攻击者不能仅通过窜改防止层切割芯片,因为这样将切断窜改检测线,从而导致在加电时擦除所有密钥。仅破坏擦除电路系统还不够,因为送到验证芯片上的多个单元的多个ChipOK位(现在,全部为0)将导致芯片的常规工作电路系统停止工作。为了建立用于攻击的芯片,需要攻击者删除窜改检测线、停止擦除闪速存储器,以及以某种方式重新布线依赖于ChipOK线的各部件。即使所有这些可以实现,但是将芯片切割到这种程度的动作仍最可能破坏用于存储密钥的非易失性存储器的电荷图形,从而使得该过程无果。
直接检查非易失性存储器
如果验证芯片被切割,以便不对它们进行放电,而暴露闪速存储器的浮动栅极,则利用STM或SKM,很有可能直接检查密钥。然而,将芯片切割到这种程度,又不使栅极放电几乎是不可能的。采用湿法蚀刻、等离子蚀刻、离子蚀刻(聚焦离子束蚀刻)或化学机械抛光几乎确定要对浮动栅极上存在的少量电荷放电。这对于常规闪速存储器也是正确的,而对于多级闪速存储器更是如此。
检查状态改变产生的光脉冲
在上述非闪速CMOS内实现用于处理保密密钥信息的电路系统的所有部分。这样可以防止发射大多数光短脉冲串。非常靠近非闪速CMOS设置的常规CMOS反相器将隐藏电容器充电和放电产生的任何微弱辐射。反相器连接到窜改检测电路系统,因此在非闪速CMOS状态每次发生变化时,反相器要多次改变状态(以高时钟速率)。
监测EMI
上述噪声发生器将产生电路噪声。该噪声将干扰芯片的常规活动产生的其他电磁辐射,从而难以理解任何有意读取的内部数据传送。
检查Idd波动
针对这种攻击的解决方案是降低Idd信号的SNR。这可以通过增加电路中的噪声量,而降低信号量实现。噪声发生器电路(还用于抵御EMI攻击)将在每个周期产生足够多的状态改变,从而难以理解Idd信号内的任何有意义信息。此外,在状态发生变化时,芯片的承载密钥数据通路的专用非闪速CMOS实现防止电流流动。这样做的好处是减少信号量。
差异故障分析
差异故障误码是由电离作用、微波辐射或环境应变以无目标方式产生的。攻击这种性质的最可能效果是,改变闪速存储器(产生无效状态)或RAM(错误奇偶校验)。该无效状态和错误奇偶校验被窜改检测电路系统检测到,并导致擦除密钥。由于窜改检测线覆盖密钥处理电路系统,所以可以利用窜改检测线上的错误反映密钥处理电路系统内产生的任何错误。如果窜改检测线被改变,则该芯片将或者继续RESET,或者仅在加电时擦除密钥,使攻击无果。如果攻击者不依赖无目标攻击,而希望“仅以正确的方式仅改变芯片上的正确部分”,则攻击者最好尝试产生触发故障(例如,覆盖写攻击、栅极破坏攻击等)。关于这些目标故障攻击的信息,请参考下面的有关小节。
时钟假信号脉冲(glitch)攻击
时钟滤波器(如上所述)消除了时钟假信号脉冲攻击的可能性。
供电攻击
OverUnderPower检测单元(如上所述)消除了供电攻击的可能性。
覆盖写ROM
验证芯片将程序代码、密钥以及保密信息存储到闪速存储器,而不存储到ROM内。因此,该攻击是不可能的。
修改EEPROM/闪速存储器
验证芯片将程序代码、密钥以及保密信息存储到闪速存储器内。然而,闪速存储器被两条防止窜改线和窜改检测线覆盖。如果这两条线中的任何一条被切断(在破坏栅极的过程中),则在加电时可以检测到攻击,而且该芯片或者RESET(连续),或者存储闪速存储器内的密钥。然而,即使攻击者可以以某种方式存取闪速存储器内的各位,并破坏或使保存特定位的栅极短路,这样仍将迫使该位没有电荷或者充满电荷。对于使用多级闪速存储器的验证芯片,这是两个无效状态(只有两个中间状态有效)。在从闪速存储器传送该数据值时,检测电路系统将触发擦除窜改检测线—从而擦除闪速存储器的剩余部分并RESET该芯片。因此,修改EEPROM/闪速存储器攻击无果。
栅极破坏攻击
栅极破坏攻击取决于攻击者修改一个栅极以使该芯片在运行过程中暴露信息的能力。然而,用于处理保密信息的任何电路系统均被两条防止窜改线和窜改检测线之一覆盖。如果这两条线中的任何一条被切断(在破坏栅极的过程中),则在加电时可以检测到攻击,而且该芯片或者RESET(连续),或者存储闪速存储器内的密钥。为了发起这种攻击,攻击者必须实现逆向工程该芯片以确定哪个(些)栅极是目标。一旦确定了目标栅极的位置,则攻击者必须断开覆盖的窜改检测线,停止擦除闪速存储器以及以某种方式重新布线依赖于ChipOK线的各部件。如果不切割芯片,则不能重新布线电路系统,而且即使可以这样做,将芯片切割到这种程度的动作仍最可能破坏用于存储密钥的非易失性存储器的电荷图形,从而使得该过程无果。
覆盖写攻击
覆盖写攻击取决于不知道先前值而能够置位密钥的各位。它取决于象在传统探测攻击中那样探测该芯片,以及象在栅极破坏攻击中那样破坏栅极。这两种攻击均不成功(正如相应小节说明的那样),因为使用了防止窜改和检测窜改电路系统以及ChipOK线。然而,即使攻击者可以以某种方式存取闪速存储器内的各位,并破坏或使保存特定位的栅极短路,这样仍将迫使该位没有电荷或者充满电荷。对于使用多级闪速存储器的验证芯片,这是两个无效状态(只有两个中间状态有效)。在从闪速存储器传送该数据值时,检测电路系统使擦除窜改检测线被触发—从而擦除闪速存储器的剩余部分并RESET该芯片。同样,对从RAM读取的窜改值进行奇偶校验也可以使擦除窜改检测线被触发。因此,覆盖写攻击无果。
内存剩磁攻击
在卸下电源时,验证芯片内的任何工作寄存器或RAM均可以保存部分验证密钥。在卸下电源后,工作寄存器和RAM仍保存该信息某个时间。如果切割该芯片暴露寄存器/RAM的栅极,而不使它们放电,则利用STM可以直接检查数据。如上所述,在防御电源假信号脉冲攻击的描述中,可以发现第一级防御。在卸下电源时,所以寄存器和RAM均被清除,就象RESET条件导致清除寄存器一样。这样,该攻击成功的几率小于读取闪速存储器的成功几率。RAM的电荷(自然)比闪速存储器的电荷容易丢失。切割芯片以卸下RAM将肯定导致电荷丢失(如果它们未被丢失,那只是因为该存储器未被刷新而且进行切割需要时间)。因此,该攻击无果。
芯片盗窃攻击
在验证芯片的寿命期内存在不同阶段。在这些阶段中的任何一个阶段,芯片均可能被盗窃:
制造之后,但是在编程密钥之前
编程密钥之后,但是在编程状态数据之前
编程状态数据之后,但是在插入消耗品或系统内之前
插入系统或消耗品内之后
在芯片制造与编程站之间盗窃只能对仿制制造商提供空白芯片。这仅包括销售验证芯片,而不包括被验证芯片验证的任何内容。由于编程站是具有消耗品和系统产品密钥的唯一机构,所以仿制制造商不能利用正确密钥编程该芯片。仿制制造商可以对它们自己的System和消耗品编程空白芯片,但是不经过检测,难以将这些项目推向市场。第二种形式的盗窃发生在验证芯片通过两个或者更多个编程阶段的情况下发生的。那是可能的,但是大概不会实现。总之,最糟糕情况是状态数据未被编程,因此读/写M的所有内容。如果是这种情况,攻击者可以尝试对芯片发起自适应选择明文攻击。HMAC-SHA1算法防止这种攻击。第三种形式的盗窃发生在编程站与安装工厂之间。验证芯片已经被编程,可以用于特定系统或者用于特定消耗品。对于盗窃者使用该芯片就是将它们设置到仿制System内或仿制消耗品内。与仿制System无关—仿制System甚至不需要验证芯片53。对于仿制消耗品,这种盗窃将仿制产品的数量限制在所盗窃的芯片的数量。一次盗窃不能提供稳定供应,不足以对仿制制造商提供成本效益好的业务。盗窃的最后一种形式是盗窃System或消耗品本身。当在制造工厂发生盗窃时,必须增强物理保密协议。如果盗窃发生在任何其他地方,则这是只有项目的拥有者和警察以及保险公司关心的问题。验证芯片使用的安全机制假定消耗品和系统掌握在公众手中。因此,它们被盗窃对密钥的安全性没有影响。
验证芯片的设计
验证芯片具有物理和逻辑外部接口。物理接口确定验证芯片如何连接到实际System,而逻辑接口确定System如何与验证芯片进行通信。
物理接口
验证芯片是小型4引脚CMOS封装(实际内部尺寸大约是采用0.25μm Flash工艺的0.30mm2)。这4个引脚是GND、CLK、电源以及数据。电源是额定电压。如果电压偏离该额定电压超过固定值,则芯片将RESET。推荐的时钟速度是4-10MHz。内部电路系统对时钟信号进行滤波,以确保不超过最高安全时钟速度。沿串行数据线,一次一位地发送和接收数据。在加电和省电时,芯片均要RESET。此外,芯片上的窜改检测和防止窜改电路系统将使芯片在检测到攻击时,或者RESET,或者擦除闪速存储器(根据检测到的根据)。通过将CLK电压保持在特定电平,可以启动特定编程方式。下个小节将对此做进一步说明。
逻辑接口
验证芯片有两种工作方式—正常方式和编程方式。这两种方式均需要,因为将工作程序代码存储到闪速存储器内,而不存储到ROM内(因为安全原因)。编程方式用于在制造之后进行测试,并支持工作程序代码,而正常方式用于该芯片的所有后续用途。
编程方式
通过使CLK线上的特定电压保持给定时间,可以启动编程方式。在芯片进入编程方式时,所有闪速存储器被擦除(包括所有保密密钥信息和任何程序代码)。然后,验证芯片使擦除生效。如果擦除成功,则验证芯片接收相当于新程序代码的384字节的数据。以byte0至byte383的顺序传送这些字节。以bit0至bit7的顺序传送这些位。一旦程序代码的全部384位被装载,验证芯片就挂起。如果擦除不成功,则验证芯片将挂起,而不将任何数据装载到闪速存储器中。在芯片被编程后,可以重新起动它。在利用CLK线上的正常电压RESET芯片时,进入正常方式。
正常方式
每当验证芯片不处于编程方式时,它就处于正常方式。当在正常方式下起动验证芯片时(例如,加电RESET),它执行当前存储在闪速存储器的程序代码区内的程序。根据来自System的命令和数据以及产生的输出值,该程序代码在System与验证芯片之间实现通信机制。由于验证芯片串行通信,所以一次一位地传送各位。利用简单操作命令集,System与验证芯片通信。利用3位操作码确定每个命令。操作码的解释取决于IsTrusted位和IsWritten位的当前值。
定义下面的操作:
Op |
T |
W |
Mn |
输入 |
输出 |
解释 |
000 |
- |
- |
CLR |
- |
- |
清除 |
001 |
0 |
0 |
SSI |
[160,160,160] |
- |
设置保密信息 |
010 |
0 |
1 |
RD |
[160,160] |
[256,160] |
安全读M |
010 |
1 |
1 |
RND |
- |
[160,160] |
随机 |
011 |
0 |
1 |
WR |
[256] |
- |
写入M |
011 |
1 |
1 |
TST |
[256,160] |
[1] |
测试 |
100 |
0 |
1 |
SAM |
[32] |
[32] |
设置存取方式 |
101 |
- |
1 |
GIT |
- |
[1] |
获得IsTrusted |
110 |
- |
1 |
SMT |
[32] |
- |
设置MinTicks |
Op=操作码,T=IsTrusted值,W=IsWritten值,
Mn=助记符号,[n]=参数要求的位数
将该表内未定义的任何命令解释为NOP(空操作)。例子包括操作码110和111(不考虑IsTrusted值或IsWritten值),以及在IsWritten=0时,不是SSI的任何操作码。请注意RD和RND的操作码相同,同样,WR和TST的操作码也相同。收到操作码后运行的实际命令取决于IsTrusted位的当前值(只要IsWritten是1)。如果IsTrusted位被清除,则调用RD和WR函数。如果IsTrusted位被置位,则调用RND和TST函数。这两组命令在可信验证芯片与非可信验证芯片之间互相排斥。为了在验证芯片上执行命令,客户(例如,System)发送后面跟着该操作码要求的输入参数的操作码。从最低有效位到最高有效位发送操作码。例如,为了发送SSI命令,以此顺序发送位1、0和0。以首先发送最低有效位直到发送最高有效位的同样方式发送每个输入参数。以首先读取最低有效位直到读取最高有效位的同样方式读取返回值。客户必须知道要检索多少位。
在某些情况下,可以将一个芯片命令的输出位作为输入位直接送到另一个芯片命令。这种命令的例子是RND命令和RD命令。在可信验证芯片上调用RND的输出位不必被System保存。相反,System可以将输出位直接传送到非可信验证芯片的RD命令的输入。对每个命令进行描述指出何处是这样的。后面的小节将详细说明每条命令。请注意,有些算法是专门设计的,因为永久寄存器位于闪速存储器中。
寄存器
验证芯片上的内存包括一些非易失性存储器,以存储验证协议所需的变量。定义下面的非易失性(闪速)变量:
变量名称 |
大小(位数) |
说明 |
M[0..15] |
256 |
含有诸如序列号、剩余介质等的状态数据的16字(每个16位) |
K1 |
160 |
验证期间用于变换R的密钥 |
K2 |
160 |
验证期间用于变换M的密钥 |
R | 160 | 当前随机数 |
AccessMode[0..15] |
32 |
M[n]的16组2位AccessMode值 |
MinTicks |
32 |
调用基于密钥的函数之间的最少时钟滴答声(clocktick)数 |
SIWritten |
1 |
如果被置位,则保密密钥详细(K1、K2和R)已经被写入芯片。如果被清除,则还未写入保密信息。 |
IsTrusted |
1 |
如果被置位,则可以调用RND函数和TST函数,但是不能调用RD函数和WR函数。如果被清除,则可以调用RND函数和TST函数,但是不能调用RD函数和WR函数。 |
总位数 |
802 | |
体系结构概述
本章给出可以实现验证芯片要求的功能性的特制CPU的高级定义。请注意,该CPU不是通用CPU。它是为了实现验证芯片定制的。利用以CPU指令集形式编写的小程序全部实现验证芯片的用户明白的验证命令,例如,WRITE、TST、RND等。CPU含有32位累加器(在大多数操作中需要它)以及大量寄存器。CPU以8位指令工作,8位指令特别适于实现验证逻辑。每个8位指令通常含有4位操作码和4位操作数。
工作速度
内部时钟频率限制器单元防止芯片以比预定频率高的任何速度工作。在制造期间,在芯片内建立该频率,而且该频率不能被改变。推荐该频率约为4-10MHz。
合成图和方框图
验证芯片含有下面的部件:
单元名称 |
CMOS类型 |
说明 |
时钟频率限制器 |
正常 |
确保验证芯片的工作频率不超过特定最高频率 |
OverUnderPower检测单元 |
正常 |
确保在有效工作范围内保持供电 |
编程方式检测单元 |
正常 |
允许用户进入编程方式 |
噪声发生器 |
正常 |
用于产生Idd噪声而且用于防止窜改和检测窜改电路系统。 |
状态机 |
正常 |
用于控制芯片的两种工作方式(编程方式和正常方式)。这包括产生CPU的两个工作周期、长命令操作期间失速(stalling)以及存储工作周期内的操作码和操作数。 |
I/O单元 |
正常 |
响应与外界的串行通信 |
ALU |
非易失性 |
含有32位累加器以及通用数学运算器和逻辑运算器。 |
MinTicks单元 |
正常(99%)非易失性(1%) |
响应基于特定密钥的操作之间的可编程最小延迟(利用递减)。 |
地址发生器单元 |
正常(99%)非易失性(1%) |
根据特定操作数的要求产生直接、间接以及索引地址。 |
程序计数器单元 |
正常 |
包括9位PC(程序计数器)以及用于 |
| |
分支处理和子例程控制的逻辑 |
存储单元 |
非易失性 |
利用9位地址进行寻址。它含有8位宽程序闪速存储器、32位宽闪速存储器、RAM以及查用表。还含有编程方式电路系统,从而装载程序代码。 |
图181示出验证芯片的原理框图。未示出防止窜改和检测窜改电路系统:噪声发生器、OverUnderPower检测单元以及编程方式检测单元连接到该防止窜改和检测窜改电路系统,而比连接到其余单元。
内存映像
图182示出典型内存映像。尽管验证芯片没有外部存储器,但是它却具有内部存储器。利用9位寻址内部存储器,而且内部存储器是32位宽,或8位宽(取决于地址)。32位内存用于保存非易失性数据、用于HMAC-SHA1的变量以及常数。8位宽内存用于保存程序以及该程序使用的各跳转地址表。地址断点(address breakup)(包括保留的内存范围)用于优化地址生成和解码。
常数
图183示出典型常数内存映像。常数区包括32位常数。这些是简单常数(例如,32位全0和32位全1)、HMAC算法使用的常数以及用于SHA-1算法所需的常数y0-3和y0-4。这些值均不受RESET的影响。使用常数的唯一操作码是LDK。在这种情况下,为了将地址生成和解码降低到最少,操作数与内存布局紧密相连。
RAM
图184示出RAM内存映像的例子。RAM区包括验证芯片的通用功能所需的32个奇偶校验32位寄存器,但是只有在芯片运行期间才需要它们。RAM是易失性存储器,这意味着,关闭电源,数值将丢失。请注意,实际上,在处于省电状态后,内存将其值保存某个时间周期(因为内存剩磁),但是不能认为加电后可以使用。这就有了在该专利文件的其他小节解决了的安全问题。RAM含有:HMAC-SHA1算法使用的变量,即:A-E、临时变量T;用于160位工作散列值H的空间;用于散列结果(HMAC要求的)B160的临时存储器的空间;以及用于扩展的散列存储器X的512位空间。在RESET时,全部RAM值被清除为0,但是这不应该对任何程序代码产生影响。采用RAM地址的操作码是LD、ST、ADD、LOG、XOR以及RPL。总之,为了将地址生成和解码降低到最少,操作数与内存布局紧密相连(以首先是最高有效字的方式存储多字变量)。
闪速存储器—变量
图185示出闪速存储器变量内存映像的例子。闪速存储器区含有验证芯片的非易失性信息。在电源被关闭后,闪速存储器仍保存其值,而且预期在下一次接通电源时,其值不被改变。保存在多态闪速存储器内的非易失性信息包括:2个16位密钥(K1和K2)、当前随机数值(R)、状态数据(M)、MinTicks值(MT)、AccessMode值(AM)以及IsWritten(ISW)和IsTrusted(IST)标志。利用闪速地址的操作有:LD、ST、ADD、RPL、ROR、CLR以及SET。总之,为了将地址生成和解码降低到最少,操作数与内存布局紧密相连。以首先是最高有效字的方式存储多字变量,因为寻址要求。所采用的寻址方法是偏移从N开始而在0结束的索引的基址。因此,MN是存取的第一字,M0是循环处理中存取的最后一个32位字。为了便于利用同样的索引方法实现LFSR生成,以首先是最低有效字的方式,存储多字变量R。
闪速存储器—程序
图186示出闪速存储器程序内存映像的例子。第二多态闪速存储器区是384×8位。该区含有JSR、JSI和TBR指令的地址表、DBR命令的偏移、常数以及程序本身。RESET不对闪速存储器产生影响,但是在进入编程方式时,它却被清除(为0)。一旦进入编程方式,就可以利用新一组384字节装载该8位闪速存储器。一旦该过程完成,就可以RESET芯片,而且进入正常芯片运行过程。
寄存器
在验证芯片内定义了大量寄存器。在函数执行过程中,它们用作临时存储器。一些用作算法函数,其他的用于计数和索引,而且其他的用于串行I/O。这些寄存器不需要位于非易失性(闪速)存储器内。不需要擦除周期,就可以读或者写它们(不同于闪速存储器)。仍需要利用防止窜改和检测窜改电路系统和奇偶校验防止含有保密信息的临时存储器寄存器被物理攻击。在RESET时,将所有寄存器清除为0。然而,程序代码应该不假定处于任何特定状态,而适当建立寄存器值。请注意,这些寄存器不包括对防止窜改和检测窜改电路系统确定的各OK位。OK位分散在各单元内,而且在RESET时被置位为1。
周期
1位周期值确定CPU是处于取指令周期(0)还是处于执行指令周期(1)。利用保存先前周期值的1位寄存器实际获得周期。不能利用指令集直接存取周期。它只是一个内部寄存器。
程序计数器
定义6级深(6-level deep)9位程序计数器阵列(PCA)。利用3位堆栈指针(SP)检索它。含有当前执行指令的当前程序计数器(PC)实际上是PCA[SP]。此外,定义含有当前内存引用的分解地址的9位地址寄存器(用于索引或间接内存存取)。利用指令集不能直接存取PCA、SP和地址寄存器。它们仅是内部寄存器。
CMD
8位CMD寄存器用于保存当前执行的命令。不能利用指令集直接存取CMD,它仅是内部寄存器。
累加器和Z标志
累加器是32位通用寄存器。它用作所有算术运算的输入之一,而且是用于在存储器寄存器之间传送信息的寄存器。Z寄存器是1位标志,而且每次在对累加器进行写入时,更新Z寄存器。Z寄存器含有累加器的0性(zero-ness)。如果写入累加器的最后一个值是0,则Z=1,而如果写入的最后一个值是非零,则Z=0。累加器和Z寄存器均可以被指令集直接存取。
计数器
定义大量专用计数器/索引寄存器:
名称 |
寄存器大小 |
位数 |
说明 |
C1 |
1×3 |
3 |
用于索引阵列的计数器:AE、B160、M、H、y和h。 |
C2 |
1×5 |
5 |
通用计数器 |
N1-4 |
4×4 |
16 |
用于索引阵列X |
所有这些计数器寄存器均可以被指令集直接存取。存在利用特定数值装载它们的专用指令,而且存在用于递减它们或者递增它们,或者根据专用计数器是否为0进行分支处理的其他指令。还存在2个与C
1和C
2有关的专用标志,这两个标志保存0性的C
1和C
2。该标志用于循环控制,在此列出这两个标志,但是尽管它们不是寄存器,但是可以象寄存器一样测试它们。
名称 |
说明 |
C1Z |
1=C1是当前0,0=C1当前是非零。 |
C2Z |
1=C2是当前0,0=C2当前是非零。 |
标志
定义大量对应于CPU工作方式的1位标志:
名称 |
位数 |
说明 |
WE |
1 |
X寄存器阵列的WriteEnable:0=写入X寄存器变成无操作(no-ops)1=实施写入X寄存器 |
K2MX |
1 |
在K引用期间存取0=K1。将从M读取解释为读0在K引用期间存取1=K2。读M成功 |
所有这些1位标志均可以被指令集直接存取。存在用于置位或者清除这些标志的专用指令。用于写完整性的寄存器。
名称 |
位数 |
说明 |
EE |
1 |
对应于WR命令伪码内的EqEncountered变量。在写入多倍精度数据值期间使用它以确定更高有效分量是否等于其先前值。 |
DE |
1 |
对应于WR命令伪码内的DeEncountered变量。在写入多倍精度数据值期间使用它以确定更高有效分量是否已经被递减。 |
用于I/O的寄存器
定义4个1位寄存器以在客户(System)与验证芯片之间进行通信。这些寄存器是:InBit、InBitValid、OutBit和OutBitValid。InBit和InBitValid为客户提供将命令和数据传送到验证芯片的装置。OutBit和OutBitValid为客户提供从验证芯片获取信息的装置。客户一次一位地将命令和参数位送到验证芯片。由于验证芯片是从器件,所以从验证芯片的观点出发:
在清除InBitValid时,将挂起读InBit。InBitValid保持清除,直到客户将下一个输入位写入InBit。读InBit清除InBitValid位,以便从客户读取下一个InBit。除非InBitValid位被清除,否则客户不能将位写入验证芯片。
在置位OutBitValid时,挂起写OutBit。OutBitValid保持被置位,直到客户从OutBit读取了该位。写OutBit将置位OutBitValid位,以使客户读下一个OutBit。除非OutBitValid位被置位,否则客户不能从验证芯片读取位。
用于时限存取(Timing Access)的寄存器
定义用作计时器的一个32位寄存器。每次在执行指令时,MTR(MinTicksRemaining)寄存器递减。一旦MTR寄存器到达0,则它就停在0。与MTR有关的是1位标志MTRZ,它含有MTR寄存器的0性。如果MTRZ是1,则MTR寄存器是0。如果MTRZ是0,则MTR寄存器也不是0。MTR始终以MinTicks值开始(在RESET或特定密钥存取函数之后),而且最终递减到0。尽管可以利用专用指令置位MTR并测试MTRZ,但是任何指令均不能直接读取MTR的值。
寄存器概述
下表概括说明所有临时寄存器(利用寄存器名字排序)。该表列出寄存器名字、大小(位数)以及规定的寄存器可以位于何处。
寄存器名称 |
位数 |
奇偶校验 |
位于何处 |
Acc |
32 |
1 |
算术逻辑运算单元 |
Adr |
9 |
1 |
地址发生器单元 |
AMT |
32 | |
算术逻辑运算单元 |
C1 |
3 |
1 |
地址发生器单元 |
C2 |
5 |
1 |
地址发生器单元 |
CMD |
8 |
1 |
状态机 |
Cycle(Old=prevCycle) |
1 | |
状态机 |
DE |
1 | |
算术逻辑运算单元 |
EE |
1 | |
算术逻辑运算单元 |
InBit |
1 | |
输入输出单元 |
InBitValid |
1 | |
输入输出单元 |
K2MX |
1 | |
地址发生器单元 |
MTR |
32 |
1 |
MinTicks单元 |
MTRZ |
1 | |
MinTicks单元 |
N[1-4] |
16 |
4 |
地址发生器单元 |
OutBit |
1 | |
输入输出单元 |
OutBitValid |
1 | |
输入输出单元 |
PCA |
54 |
6 |
程序计数器单元 |
RTMP |
1 | |
算术逻辑运算单元 |
SP |
3 |
1 |
程序计数器单元 |
WE |
1 | |
存储单元 |
Z |
1 | |
算术逻辑运算单元 |
合计位数 |
206 |
17 | |
指令集
CPU以8位指令工作,该8位指令特别适于实现验证逻辑。大多数8位指令包括4位操作码和4位操作数。高序4位含有操作码,而低序4位含有操作数。
操作码和操作数(概述)
下表概括说明操作码:
操作码 |
助记符号 |
简单说明 |
0000 |
TBR |
测试和分支处理 |
0001 |
DBR |
递减和分支处理 |
001 |
JSR |
利用表跳转子例程 |
01000 |
RTS |
从子例程返回 |
01001 |
JSI |
间接跳转子例程 |
0101 |
SC |
置位计时器 |
0110 |
CLR |
清除专用闪速寄存器 |
0111 |
SET |
置位专用闪速寄存器内的各位 |
1000 |
ADD |
将32位值加到累加器 |
1001 |
LOG |
逻辑运算(“与”和“或”) |
1010 |
XOR |
与某个值进行“异或”的累加器 |
1011 |
LD |
从规定的位置装入累加器 |
1100 |
ROR |
向右回转累加器 |
1101 |
RPL |
替换位 |
1110 |
LDK |
将常数装入累加器 |
1111 |
ST |
将累加器存储到规定的位置 |
下表概括说明哪个操作数可以与哪个操作码一起使用。该表以操作码助记符号的字母顺序排序。在后面的表中可以发现每个操作数的二进制值。
操作码 |
有效操作数 |
ADD |
{A,B,C,D,E,T,MT,AM,AE[C1],B160[C1],H[C1],M[C1],K[C1],R[C1],X[N4]} |
CLR |
{WE,K2MX,M[C1],Group1,Group2} |
DBR |
{C1,C2},至DBR表的偏差 |
JSI |
{} |
JSR |
至表1的偏差 |
LD |
{A,B,C,D,E,T,MT,AM,AE[C1],B160[C1],H[C1],M[C1],K[C1],R[C1],X[N4]} |
LDK |
{0x0000…,0x3636…,0x5C5C…,0xFFFF,h[C1],y[C1]} |
LOG |
{AND,OR},{A,B,C,D,E,T,MT,AM} |
ROR |
{InBit,OutBit,LFSR,RLFSR,IST,ISW,MTRZ,1,2,27,31} |
RPL |
{Init,MHI,MLO} |
RTS |
{} |
SC |
{C1,C2},至计数器列表的偏差 |
SET |
{WE,K2MX,Nx,MTR,IST,ISW} |
ST |
{A,B,C,D,E,T,MT,AM,AE[C1],B160[C1],H[C1],M[C1],K[C1],R[C1],X[N4]} |
TBR |
{0,1},至表1的偏差 |
XOR |
{A,B,C,D,E,T,MT,AM,X[N1],X[N2],X[N3],X[N4]} |
下面的操作数表示出4位操作数的解释,其中全部4位用于直接解释。
操作数 |
ADD,LD,ST | XOR | ROR | LDK | RPL | SET | CLR |
0000 |
E |
E |
InBit |
0x00… |
Init |
WE |
WE |
0001 |
D |
D |
OutBit |
0x36… |
- |
K2MX |
K2MX |
0010 |
C |
C |
RB |
0x5C… |
- |
Nx |
- |
0011 |
B |
B |
XRB |
0xFF… |
- |
- |
- |
0100 |
A |
A |
IST |
y[C1] |
- |
IST |
- |
0101 |
T |
T |
ISW |
- |
- |
ISW |
- |
0110 |
MT |
MT |
MTRZ |
- |
- |
MTR |
- |
0111 |
AM |
AM |
1 |
- |
- |
- |
- |
1000 |
AE[C1] |
- |
- |
h[C1] |
- |
- |
- |
1001 |
B160[C1] |
- |
2 |
- |
- |
- |
- |
1010 |
H[C1] |
- |
27 |
- |
- |
- |
- |
1011 |
- |
- |
- |
- |
- |
- |
- |
1100 |
R[C1] |
X[N1] |
31 |
- |
- |
- |
R |
1101 |
K[C1] |
X[N2] |
- |
- |
- |
- |
Group1 |
1110 |
M[C1] |
X[N3] |
- |
- |
MLO |
- |
M[C1] |
1111 |
X[N4] |
X[N4] |
- |
- |
MHI |
- |
Group2 |
下面的指令根据操作数的最高位进行选择:
操作数3 |
哪个计数器?(DBR,SC) |
哪种运算?(LOG) |
哪个值?(TBR) |
0 |
C1 |
“与” |
0 |
1 |
C2 |
“或” |
非0 |
操作数的最低3位是距离专用表(SC)的偏差(DBR、TBR)值,或者象对于LOG那样,它们选择逻辑运算的第二输入。该解释匹配ADD、LD和ST操作码的解释:
操作数2-0 |
LOG输入2 |
SC值 |
000 |
E |
2 |
001 |
D |
3 |
010 |
C |
4 |
011 |
B |
7 |
100 |
A |
10 |
101 |
T |
15 |
110 |
MT |
19 |
111 |
AM |
31 |
ADD-加到累加器
助记符号:ADD
操作码:1000
用途:ADD值
利用模232加法,ADD指令将规定的操作数加到累加器。该操作数是A、B、C、D、E、T、AM、MT、AE[C1]、H[C1]、B160[C1]、R[C1]、K[C1]、M[C1]或X[N4]之一。该运算期间,还根据装入的值是否为0,置位Z标志。
CLR-清除各位
助记符号:CLR
操作码:0110
用途:CLR标志/寄存器
CLR指令可以使规定的内部标志或闪速存储器寄存器被清除。对于闪速存储器,尽管CLR指令花费一些时间,但是在完成擦除闪速存储器之前,使下一条指令失速。可以被清除的寄存器是WE和K2MX。可以被清除的闪速存储器是:R、M[C1]、Group1和Group2。Group1是IST和ISW标志。如果这些均被清除,则唯一的有效高级命令是SSI指令。Group2是MT、AM、K1和K2寄存器。单独擦除R,因为在每次调用TST后必须更新它。还利用索引机制擦除M,以使M的各部分被更新。还存在相应的SET指令。
DBR-递减和分支处理
助记符号:DBR
操作码:0001
用途:DBR计数器,偏差
该指令提供用于建立简单循环的机制。操作数的高位在测试C1或C2(两个计数器)之间进行选择。如果规定的计数器是非0,则递减该计数器,并将给定偏差的值与PC相加。如果规定的计数器是0,则递减它,并在PC+1继续处理。将8项目偏差表存储在地址0 1100 0000(程序存储器的第64个项目)。可以将8位偏差看作带符号数。因此,将0xFF看作-1,而将0x01看作+1。通常,循环中使用的值是负的。
JSI-间接跳转子例程
助记符号:JSI
操作码:01001
用途:JSI(Acc)
JSI指令使得根据当前位于累加器内的值跳转到子例程。该指令将当前PC上推到堆栈,并将新值装入该PC。利用跳转表2装入新PC的高位8位(累加器的低位5位过程偏差),将PC的最低位清除为0。因此,所有子例程均从偶数地址开始。堆栈提供6级执行(5个子例程深)。编程器的响应度确保不超过该深度,或者不覆盖写返回值(由于堆栈环绕)。
JSR-跳转子例程
助记符号:JSR
操作码:001
用途:JSR偏差
JSR指令最常使用的子例程结构。该指令将当前PC上推到堆栈,并将新值装入该PC。新PC值的高位8位来自地址表1,其中利用5位操作数提供该表内的偏差(32个可能地址)。将PC的最低位清除为0。因此,所有子例程均从偶数地址开始。堆栈提供6级执行(5个子例程深)。编程器的响应度确保不超过该深度,或者不覆盖写返回值(由于堆栈环绕)。
LD-装入累加器
助记符号:LD
操作码:1011
用途:LD值
LD指令从规定的操作数装入累加器。该操作数是A、B、C、D、E、T、AM、MT、AE[C1]、H[C1]、B160[C1]、R[C1]、K[C1]、M[C1]或X[N4]之一。该运算期间,还根据装入的值是否为0,置位Z标志。
LDK-装入常数
助记符号:LDK
操作码:1110
用途:LDK常数
LDK指令利用规定的常数装入累加器。该常数是对HMAC-SHA1要求的32位值,而全部0和全部1最适于通用处理。因此,它们是选择:
0x00000000
0x36363636
0x5C5C5C5C
0xFFFFFFFF
或者从h和y常数表中选择,利用C1检索它们。h和y常数表保存对HMAC-SHA1要求的32位列表常数。在该运算期间,还根据装入的常数是否为0,置位Z标志。
LOG-逻辑运算
助记符号:LOG
操作码:1001
用途:LOG操作值
LOG指令对累加器与规定的值进行32位按位逻辑运算。LOG指令支持的两种运算是“与”运算和“或”运算。“异或”指令支持按位“非”和“异或”运算。要与累加器进行“与”或“或”运算的32位值是如下之一:A、B、C、D、E、T、MT和AM。在该运算期间,还根据获得的32位值(装入累加器的)是否为0,置位Z标志。
ROR-向右回转
助记符号:ROR
操作码:1100
用途:ROR值
ROR指令提供了一种将累加器向右回转一组位的方式。进入累加器的顶部的位(变成位31)可以来自累加器的先前位0,或者来自外部1位标志(例如,标志,或者串行输入连接)。回转出的位也可以被串行连接输出,或者与外部标志组合在一起。许用操作数是:InBit、OutBit、LFSR、RLFSR、IST、ISW、MTRZ、1、2、27和31。在该运算期间,还根据获得的32位值(装入累加器的)是否为0,置位Z标志。在其最简单的形式中,ROR指令的操作数是1、2、27和31之一,它指出应该使累加器回转多少位位置。对于这些操作数,没有外部输入或输出—仅向右回转累加器的各位。利用操作数IST、ISW和MTRZ,将正确标志传送到累加器的最高位。将累加器的剩余部分向右移位一个位位置(位31变成位30等),其中累加器的最低位被移出。然后,清除InBitValid位。如果还未从客户得到可用输入位,则暂停执行,直到有了可用输入位。将累加器的剩余部分向右移位一个位位置(位31变成位30等),其中累加器的最低位被移出。利用操作数OutBitValid,向右移位累加器1个位位置。将从位0移出的位存储到OutBit标志,然后置位OutBitValid标志。因此,准备好客户进行读。如果OutBitValid标志以及被置位,则该指令的执行过程失速,直到客户读取了OutBit位(并清除OutBitValid标志)。应该将移位到位31的新位看作无用信息(当前实际位于InBit寄存器内的值)。最后,RB和XRB操作数可以实现LFSR和多倍精度移位寄存器。利用RB,将移出的位(形式上的位0)写入RTMP寄存器。当前位于RTMP寄存器内的寄存器变成累加器的新位31。对几个32位值执行多重ROR RB命令可以实现多倍精度向右回转/向右移位。与RB同样的方式进行XRB运算,因为RTMP寄存器内的当前值变成累加器的新位31。然而,利用XRB指令,形式上被称为位0的位不必仅仅替换RTMP(象RB指令那样)。相反,它与RTMP进行“异或”运算,然后,将结果存储到RTMP。这样可以实现长LFSR,正如验证协议所要求的那样。
RPL-替换位
助记符号:RPL
操作码:1101
用途:ROR值
RPL指令用于在验证芯片上实现高级WRITE命令。该指令用于利用最终将写入M阵列的值代替累加器的前16位(取决于存取方式值)。该指令取3个操作数:Init、MHI和MLO。Init操作数置位所有内部标志,并使ALU内的RPL单元准备好后续处理。将累加器转移到内部AccessMode寄存器。在实现WRITE命令的情况下,在调用RPL之前,将AM闪速存储器位置的Init装入累加器,或者在实现TST命令的情况下,在调用RPL之前,将0装入累加器。累加器保持不变。MHI和MLO操作数指出是M[C1]的高位16位还是低位16位用于与累加器的(始终)高位16位进行比较。所执行的MHI指令和MLO指令分别使用初始化AccessMode值中的后续2位。第一次执行MHI或MLO使用最低2位,接着使用第二个2位等。
RTS-从子例程返回
助记符号:RTS
操作码:01000
用途:RTS
RTS指令使得执行以在最新执行了JSR或JSI指令后从该指令重新开始。因此,术语:从子例程返回。实际上,该指令从堆栈拉出存储的PC,加1,在获得的地址重新开始执行。尽管提供6级执行(5个子例程),但是编程器的响应度使JSR和JSI指令分别与RTS平衡。没有先前JSR执行的RTS将使得执行,以在每次从堆栈拉出地址时开始。
SC-置位计数器
助记符号:SC
操作码:0101
用途:SC计数器值
SC指令用于将特定值装入计数器。操作数确定装入计数器C1和C2中的哪个。要装入的值是2、3、4、7、10、15、19和31之一。计数器值用于进行循环和检索。C1和C2均用于循环结构(在与DBR指令组合时),而只有C1可以用于检索多倍精度变量的32位部分。
SET-置位各位
助记符号:SET
操作码:0111
用途:SET标志/寄存器
SET指令可以置位特定标志或闪速存储器。还存在相应CLR指令。WE和K2MX操作数分别置位规定的标志,以便之后进行处理。IST和ISW操作数分别置位闪速存储器内的适当位,而MTR操作数将累加器内的当前值传送到MTR寄存器。SET Nx命令将下面的常数装入N1-N4:
索引 |
装入的常数 |
引用的初始X[N] |
N1 |
2 |
X[13] |
N2 |
7 |
X[8] |
N3 |
13 |
X[2] |
N4 |
15 |
X[0] |
请注意,引用的每个初始X[Nn]匹配索引N1-N4的优化SHA-1算法初始状态。在每个索引值Nn递减时,有效X[N]递增。这是因为,以首先是最高有效字的方式,将X字存储到内存。
ST-存储累加器
助记符号:ST
操作码:1111
用途:ST位置
ST指令将累加器的当前值存储到规定的位置。该位置是:A、B、C、D、E、T、AM、MT、AE[C1]、H[C1]、B160[C1]、R[C1]、K[C1]、M[C1]或X[N4]之一。X[N4]操作数对进展到N4索引存在副作用。在存储之后,N4将指向X阵列的下一个单元。N4递减1,但是由于X阵列从高到低排序,所以递减索引可以进展到阵列内的下一个单元。如果目的地在闪速存储器内,ST指令的作用是置位闪速存储器内对应于累加器内的各位的位。为了确保存储累加器内的准确值,必须使用CLK指令首先擦除正确内存位置。
TBR-测试和分支处理
助记符号:TBR
操作码:0000
用途:TBR值索引
测试和分支处理指令测试累加器是0还是非0,然后,如果累加器的当前状态匹配正在测试的累加器的状态,则分支到给定地址。如果Z标志匹配TRB测试,则利用9位值替换PC,而高位8位来自MU。否则,将当前PC递增1。值操作数是0或1。0表示对是0的累加器进行测试。1表示对是非0的累加器进行测试。索引操作数表示,如果测试成功,则执行跳转到何处。操作数的其余8位索引到跳转表1的最低8个项目。从该表中取出高位8位,而将最低位(位0)清除为0。在RESET时,将CMD清除为0。0被翻译为TBR 0,这意味着,如果累加器=0,则分支到存储在地址偏移0的地址。由于在RESET时,累加器和Z标志也被清除,所以测试是正确的,因此有效作用是跳转到存储在跳转表的第0项目的地址。
XOR-“异或”
助记符号:XOR
操作码:1010
用途:XOR值
XOR指令对累加器进行32位按位“异或”运算,然后,将结果存储到累加器中。操作数是:A、B、C、D、E、T、AM、MT、X[N1]、X[N2]、X[N3]或X[N4]之一。在该运算期间,还根据结果(即,装入累加器内的是什么值),置位Z标志。通过将累加器与0xFFFFFFFF进行“异或”运算(利用LDK指令),按位进行“非”运算。X[N]操作数对使正确索引进展到下一个值存在副作用(运算之后)。在进行了“异或”运算之后,索引指向X阵列中的下一个单元。ST X[N4]还使N4升高。索引递减1,但是由于X阵列从高到低排序,所以递减索引可以进展到阵列内的下一个单元。
ProgrammingMode检测单元
ProgrammingMode检测单元监测输入时钟电压。如果时钟电压是特定值,则触发擦除窜改检测线以擦除所有密钥、程序代码、保密信息等,然后,进入编程方式。利用常规CMOS可以实现ProgrammingMode检测单元,因为密钥不通过该单元。不必利用非闪速CMOS实现它。不特别需要利用窜改检测线覆盖ProgrammingMode检测单元,因为利用CLK输入,攻击者始终可以使芯片处于ProgrammingMode。为了进入编程方式,将擦除窜改检测线用作信号意味着,如果攻击者希望将编程方式作为要攻击的一部分,则擦除窜改检测线必须是活动的和工作的。这使得对验证芯片的攻击非常困难。
噪声发生器
利用常规CMOS可以实现噪声发生器,因为密钥不通过该单元。不必利用非闪速CMOS实现它。然而,必须利用两条窜改检测线和防止窜改线保护该噪声发生器,因此,如果攻击者尝试窜改该单元,则该芯片将RESET或擦除所有保密信息。此外,必须使LFSR内的各位有效,以确保它们不被窜改(即,奇偶校验)。如果奇偶校验失败,则触发擦除窜改检测线。最后,将噪声发生器内的全部64位“或”运算为一位。如果该位是0,则擦除窜改检测线被触发。这是因为0是LFSR的无效状态。使用建立的OK位毫无意义,因为只有检测窜改和防止窜改电路系统使用噪声发生器位。
状态机
状态机负责产生CPU的两个工作周期、长命令操作期间失速以及存储工作周期内的操作码和操作数。利用常规CMOS可以实现状态机,因为密钥不通过该单元。不必利用非闪速CMOS实现它。然而,需要对操作码/操作数进行奇偶校验。必须利用两条窜改检测线覆盖状态机内的逻辑和寄存器。这样可以确保要执行的指令不被攻击者改变。
验证芯片不需要高速、大吞吐量的通用CPU。它必须以足以执行验证协议的送到运行,而无需再快。状态机没有在取指令下一条指令时用于优化分支控制或执行操作码的专用电路系统(而且不存在与其有关的复杂性),它采用对整个芯片进行简单检查的方法。这有助于将设计时间缩短到最短,而且降低了实现过程出错的可能性。
状态机的通用运行过程是产生各组周期:
周期0:取指令周期。在此,从程序存储器提取操作码,并根据提取的操作码产生有效地址。
周期1:执行周期。在此,利用产生的有效地址搜索操作数(可能),然后,执行该运算本身。
在正常情况下,状态机产生周期:0、1、0、1、0、1、0、1、…。然而,在某些情况下,状态机失速,每个时钟滴答声均产生周期0,直到失速条件结束。失速条件包括等待闪速存储器的擦除周期、等待客户读或写串行信息,或者无效操作码(因为窜改)。如果闪速存储器当前正在被擦除,则在完成擦除闪速存储器之前,不能执行下一条指令。这是由来自存储单元的Wait命令确定的。如果Wait=1,则状态机必须仅产生周期0。因为串行I/O操作,还存在两种失速情况:
操作码是ROR OutBit,而OutBitValid已经等于1。这意味着,当前操作需要对客户输出位,但是客户还未读取最后一位。
操作是ROR InBit,而InBitValid=0。这意味着,当前操作需要从客户读取位,但是客户还未提供该位。
在这两种情况下,状态机必须失速,直到失速条件结束。因此,下一个“周期”取决于旧的或先前周期以及CMD、Wait、OutBitValid和InBitValid的当前值。Wait来自MU,而OutBitValid和InBitValid来自I/O单元。在周期是0时,从存储单元提取8位操作码,并将它设置到8位CMD寄存器中。因此,启动CMD寄存器的写是~周期。该单元有两个输出:周期和CMD。将这两个值送到验证芯片内的所有其他处理单元。1位周期值使每个单元都知道正在执行取指令周期还是执行周期。而8位CMD值可以使每个单元对与特定单元有关的命令采取适当动作。
图187示出状态机各部件之间的数据流和关系,其中:
Logic1: |
Wait OR~(Old OR((CMD=ROR)&((CMD=InBit AND~InBitValid)OR(CMD=OutBit AND OutBitValid)))) |
在RESET时,将Old和CMD均清除为0。这样导致第一周期为1,从而使得执行0CMD。将0翻译为TBR 0,这意味着,如果累加器=0,则分支到存储在地址偏移0的地址。由于在RESET时,累加器也被清除,所以测试是正确的,因此有效作用是跳转到存储在跳转表的第0项目的地址。两个VAL单元用于使通过它们的数据生效。每个VAL含有连接到两条防止窜改线和窜改检测线的OK位。在RESET时,OK位被置位,然后,与每个周期从两条窜改检测线输出的ChipOK位进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。对于VAL1,如果芯片被窜改,则有效周期始终是0。因此,由于永远没有周期1,所以不执行程序代码。如果Old被窜改,则不需要对攻击者是否冻结Old状态进行校验,该芯片不执行任何其他指令。对于VAL2,如果该芯片被窜改,则有效8位CMD值将始终为0,这就是TBR 0指令。这样将停止执行任何程序代码。VAL2还对CMD的各位进行奇偶校验,以确保CMD不被窜改。如果奇偶校验失败,则触发擦除窜改检测线。
I/O单元
I/O单元负责与外界进行通信。验证芯片用作从串行器件,从客户接收串行数据、处理命令以及将获得的数据串行发送到客户。可以利用常规CMOS实现I/O单元,因为密钥不通过该单元。不必利用非闪速CMOS实现它。此外,无需对各锁存器进行奇偶校验,因为攻击者破坏或者修改它们没有好处。如果两条窜改检测线之一被断开,则I/O单元输出0,并输入0。仅在攻击者已经关闭RESET和/或擦除电路系统时,这才起作用,因为断开两条窜改检测线之一应该导致RESET或擦除全部闪速存储器。
InBit、InBitValid、OutBit和OutBitValid 1位寄存器均用于在客户(System)与验证芯片之间进行通信。InBit和InBitValid为客户提供将命令和数据送到验证芯片的装置。OutBit和OutBitValid为客户提供从验证芯片获取信息的装置。在芯片被RESET时,InBitValid和OutBitValid均被清除。客户一次一位地将命令和参数位送到验证芯片。从验证芯片的观点出发:
在清除InBitValid时,将挂起读InBit。InBitValid保持清除,直到客户将下一个输入位写入InBit。读InBit清除InBitValid位,以便从客户读取下一个InBit。除非InBitValid位被清除,否则客户不能将位写入验证芯片。
在置位OutBitValid时,挂起写OutBit。OutBitValid保持被置位,直到客户从OutBit读取了该位。写OutBit将置位OutBitValid位,以使客户读下一个OutBit。除非OutBitValid位被置位,否则客户不能从验证芯片读取位。
状态机关心实际失速的命令,但是在I/O单元内建立各种通信寄存器和通信电路系统。
图188示出I/O单元各部件之间的数据流和关系,其中:
Logic1 |
Cycle AND(CMD=ROR OutBit) |
串行I/O单元含有通过数据引脚与外部进行通信的电路系统。在给定的时钟周期(可以是任何状态的周期)内,占用InBit的任何单元均必须置位InBitUsed控制信号。这两个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。
对于VAL1,如果芯片被窜改,则芯片输出的有效位始终是0。因此,攻击者不能产生有用输出。对于VAL2,如果该芯片被窜改,则输入到该芯片的有效位将始终为0。因此,攻击者不能选择有用输入。不需要对I/O单元内的各寄存器进行验证,因为通过破坏或者修改它们,攻击者不能得到任何信息。
ALU
图189输出算术逻辑运算单元的原理框图。算术逻辑运算单元(ALU)含有32位Acc(累加器)寄存器以及用于进行简单算术运算和逻辑运算的电路系统。必须利用非闪速CMOS实现ALU和所有子单元,因为没有通过它。此外,必须对累加器进行奇偶校验。必须利用两条窜改检测线覆盖状态机内的逻辑和寄存器。这样可以确保密钥和中间计算值不可能被攻击者改变。1位Z寄存器含有累加器的0性(zero-ness)状态。在RESET时,Z寄存器和累加器寄存器均被清除为0。每次更新累加器时,就更新Z寄存器,而且对于任何命令:LD、LDK、LOG、XOR、ROR、RPL和ADD,均更新累加器。每个算术与逻辑模块分别对两个32位输入:累加器的当前值与MU的当前32位输出进行运算。其中:
Logic1: |
Cycle AND CMD7 AND(CMD6-4≠ST) |
用于Acc和Z的WriteEnable考虑到了CMD
7和周期(因为Logic
1),所以为了选择输出,复用器MX
1不需要这两位。MX
1的输出选择仅需要CMD的位6-3,因此结果更简单。
|
输出 |
CMD6-3 |
MX1 |
ADD |
ADD |
AND |
LOG AND |
OR |
LOG OR |
XOR |
XOR |
RPL |
RPL |
ROR |
ROR |
来自MU |
LD或LDK |
这两个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。对于VAL
1,如果芯片被窜改,则累加器输出的有效位始终是0。这样防止攻击者对累加器内的任何内容进行修改。VAL
1还对累加器进行奇偶校验,如果校验失败,置位擦除窜改检测线。对于VAL
2,如果该芯片被窜改,则累加器的有效Z状态始终为真。因此,攻击者不能建立循环结构。下面说明ALU内的其余函数模块。它们均以非闪速CMOS的形式实现。
模块 |
说明 |
OR |
从复用器MX1获取32位输出,将所有32位一起“或”运算获得1位 |
ADD |
将其两个输入的模232加法的结果输出 |
AND |
输出并行按位“与”运算其两个32位输入的32位结果。 |
OR |
输出并行按位“或”运算其两个32位输入的32位结果。 |
XOR |
输出并行按位“异或”运算其两个32位输入的32位结果。 |
RPL |
在下面的进一步详细说明中研究 |
ROR |
在下面的进一步详细说明中研究 |
RPL
图159示出RPL单元的原理框图。RPL单元是ALU内的部件。它用于实现验证芯片的RPL CMP功能性。专门设计RPL CMP命令用于确保根据AccessMode的值对闪速存储器M进行写。RPL单元含有:32位移位寄存器,被称为AMT(AccessModeTemp),对于每个移位脉冲,它向右移位2位;以及1位寄存器,被称为EE和DE,它们直接根据WR伪码的EqEncountered和DecEncountered标志。在RESET时,将所有寄存器清除为0。利用RPL INIT命令,将32位AM值装入AMT,而根据通用写算法,通过调用RPL MHI和RPL MLO,置位EE和DE。EQ和LT模块的功能性与在WR命令伪码描述的功能性完全相同。如果2个16位输入是位相同的(bit-identical),则EQ模块输出1,而如果不是位相同的,则输出0。如果从累加器输入的高位16位小于利用MU
2从MU选择的16位值,则LT模块输出1。对比较不加符号。特殊选择各操作数的位模式,以使组合逻辑更简单。因为,我们要使用位模式,所以在此再列出该操作数的位模式:
操作数 |
CMD3-0 |
Init |
0000 |
MLO |
1110 |
MHI |
1111 |
MHI和MLO使高位被置位,以便容易将它们与Init位模式区别开,而最低位可以用于区别MHI和MLO。在每次发出RPL命令时,均必须更新EE和DE标志。对于Init阶段,我们需要建立两个具有0的值,而对于MHI和MLO,我们需要正确更新EE和DE的值。因此,EE和DE的WriteEnable是:
Logic1: |
Cycle AND(CMD7-4=RPL) |
利用32位AMT寄存器,我们希望根据RPL Init指令,将AM的内容(从MU读取的)装入寄存器,而且对于RPL MLO以及RPL MHI命令,向右移位2个位位置。仅利用RPL操作数(CMD
3)的最高位,就可以对此进行测试。因此,AMT寄存器的WriteEnable和ShiftEnable是:
Logic2 |
Logic1 AND CMD3 |
Logic3 |
Logic1 AND~CMD3 |
Logic
3的输出还用作复用器MX
1的输入,因为它可以用于使当前2个存取方式位或00通过(这样导致复位DE和EE寄存器,因为它代表存取方式RW)。因此,MX
1是:
|
输出 |
Logic3 |
MX1 |
AMT输出 |
0 |
00 |
1 |
RPL逻辑仅替换累加器的高位16位。低位16位非接触地通过。然而,在MU输出的32位中(对应于M[0-15]之一),仅使用高位16位或低位16位。因此,MX
2测试CMD
0,以将MHI与MLO区别开。
|
输出 |
CMD0 |
MX2 |
低16位 |
0 |
高16位 |
1 |
用于更新DE和EE的逻辑匹配WR命令的伪码。请注意,AccessMode值是00(在RPL INIT期间出现=RW,)的输入使得将0装入DE和EE(正确初始化值)。将Logic
4的结果装入EE,而将Logic
3的结果装入DE。
Logic4 |
(((AccessMode=MSR)AND EQ)OR((AccessMode=NMSR)AND EE AND EQ)) |
Logic5 |
(((AccessMode=MSR)AND LT)OR((AccessMode=NMSR)AND DE)OR((AccessMode=NMSR)AND EQ AND LT)) |
必须利用写入M的值替换累加器的高位16位。因此,Logic
6匹配WR命令伪码中的WE标志。
Logic6 |
((AccessMode=RW)OR((AccessMode=MSR)AND LT)OR((AccessMode=NMSR)AND(DE OR LT))) |
Logic
6的输出直接用于利用复用器MX
3在累加器输出的原始16位与M[0-15]输出的值之间进行选择。如果选择累加器输出的16位(使累加器保持不变),则这意味着可以将累加器值写入M[n]。如果选择M输出的16位值(改变累加器的高位16位),则这意味着,M内的16位值不发生变化。因此,MX
3取下面的形式:
|
输出 |
Logic6 |
MX3 |
MU输出的16位 |
0 |
Acc输出的16位 |
1 |
进行奇偶校验毫无意义,因为攻击者会明智地使MX3的输入为0(从而使攻击者将任意值写入M)。然而,如果攻击者不辞劳苦激光切割该芯片(包括所有检测窜改测试与电路系统),则存在比通过固定MX3的输入进行受限选择正文攻击的可能性更好的目标。
ROR
图191示出ALU的ROR模块的原理框图。ROR单元是ALU内的部件。它用于实现验证芯片的ROR功能性。被称为RTMP的1位寄存器包括在ROR单元内。在RESET时,RTMP被清除为0,而在ROR RB和ROR XRB期间,它被置位。RTMP寄存器可以实现具有任何抽头结构的线性反馈移位寄存器。XOR模块是2个1位输入、1位输出的XOR。为了简洁起见,示出RORn模块,但是实际上,它们可以被硬布线到复用器MX
3内,因为每个模块仅重新布线32位,向右回转N位。全部3个复用器(MX
1、MX
2和MX
3)取决于8位CMD值。然而,为了逻辑优化目的,排列ROR操作码的位模式。因为我们要使用该模式,所以在此再次列出操作数的位模式:
操作数 |
CMD3-0 |
InBit |
0000 |
OutBit |
0001 |
RB |
0010 |
XRB |
0011 |
IST |
0100 |
ISW |
0101 |
MTRZ |
0110 |
1 |
0111 |
2 |
1001 |
Logic
1用于将WriteEnable信号送到RTMP。应该仅在ROR RB以及ROR XRB命令期间,对RTMP寄存器进行写。Logic
2用于在每次占用InBit时提供控制信号。这两个组合逻辑模块是:
Logic1: |
Cycle AND(CMD7-4=ROR)AND(CMD3-1=001) |
Logic2: |
Cycle AND(CMD7-0=ROR InBit) |
利用复用器MX
1,我们选择要存储到RTMP内的位。Logic
1已经将CMD输入限制到RB和XRB之一。因此,我们仅测试CMD
0,以将它们两个区别开。下表示出CMD
0与MX
1输出的值之间的关系。
|
输出 |
CMD0 |
MX1 |
Acc0 |
0 |
XOR输出 |
1 |
利用复用器MX2,选择使哪个输入位代替累加器输入中的位0。在此,可以仅进行少量优化,因为不同的输入位通常分别与特定操作数有关。
下表示出CMD
3-0与MX
2输出的值之间的关系。
|
输出 |
CMD3-0 |
解释 |
MX2 |
Acc0 |
1xxx OR 111 |
1,2,27,31 |
RTMP |
001x |
RB,XRB |
InBit |
000x |
InBit,OutBit |
|
MU0 |
010x |
IST,ISW |
MTRZ |
110 |
MTRZ |
最后一个复用器MX
3对32位值做最后回转。此外,利用CMD操作数的位模式:
|
输出 |
CMD3-0 |
解释 |
MX3 |
ROR 1 |
0xxx |
2、27和31之外的全部 |
ROR 2 |
1xx1 |
2 |
ROR 27 |
1x1x |
27 |
ROR 31 |
11xx |
31 |
MinTicks单元
图192示出MinTicks单元内的各部件之间的数据流和关系。MinTicks单元负责验证芯片内的基于密钥的操作之间的可编程最小延迟(通过递减)。必须利用两条窜改检测线覆盖包括在MinTicks单元内的逻辑和寄存器。这样确保攻击者不能改变调用基于密钥的函数之间的时间。利用常规CMOS几乎可以实现所有MinTicks单元,因为密钥不通过该单元的大部分。然而,累加器用于SET MTR指令。因此,必须以非闪速CMOS实现电路系统的该微小部分。不必利用非闪速CMOS实现MinTicks单元的其余部分。然而,需要奇偶校验MTRZ锁存器(参考以下内容)。
MinTicks单元含有被称为MTR(MinTicksRemaining)的32位寄存器。MTR寄存器含有在调用下一个基于密钥的函数之前剩余的时钟滴答声数。对于每个周期,将MTR内的值递减1,直到该值为0。一旦MTR到达0,它就不再递减。附加的、被称为MTRZ(MinTicksRegisterZero)的1位寄存器反映MTR寄存器的当前0性。如果MTRZ寄存器是0,则MTRZ是1,而如果MTRZ寄存器不是0,则MTRZ是0。利用REST清除MTR寄存器,而利用SET MTR命令,将它设置为新数,SET MTR命令将累加器内的当前值传送到MTR寄存器。其中:
而且:
|
输出 |
Logic1 |
MTRZ |
MX1 |
Acc |
1 |
- |
MTR-1 |
0 |
0 |
0 |
0 |
1 |
由于周期与MTR和MTRZ的WriteEnable相连,所以仅在执行周期,即在周期=1时,更新这些寄存器。这两个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。对于VAL1,MTR的有效输出是0,这意味着,递减器单元的输出是全1,从而使MTRZ保持0,因此防止攻击者使用基于密钥的函数。VAL1还使MTR寄存器的奇偶校验有效。如果奇偶校验失败,则触发擦除窜改检测线。对于VAL2,如果该芯片被窜改,则MTRZ的有效输出为0,表示MinTicksRemaining寄存器还未到达0,从而防止攻击者使用基于密钥的函数。
程序计数器单元
图192是程序计数器单元的方框图。程序计数器单元(PCU)包括9位PC(程序计数器)以及用于进行分支处理和子例程控制的逻辑。可以利用常规CMOS实现程序计数器单元,因为密钥不通过该单元。不必利用非闪速CMOS实现它。然而,需要对锁存器进行奇偶校验。此外,必须利用两条窜改检测线覆盖包括在存储单元内的逻辑和寄存器,以确保攻击者不能改变PC。实际上,利用6级9位PCA(PC阵列)实现PC,利用3位SP(堆栈指针)寄存器检索PC。在RESET时,PC和SP寄存器均被清除,而在程序控制流期间,根据操作码更新它们。在周期0(取指令周期)期间,将PC的当前值输出到MU。在周期1(执行周期)期间,根据执行的命令,更新PC。在大多数情况下,PC仅递增1。然而,在进行分支处理(因为子例程或某些其他形式的跳转)时,利用新值代替PC。计算新PC值的机制取决于正在处理的操作码。ADD模块是简单的模2
9加法器。输入是PC值以及1(用于使PC递增1)或9位偏移(具有被置位的高位和MU输出的低位8位)。“+1”模块获取3位输入,并使它递增1(利用环绕)。“-1”模块获取3位输入并使它递减1(利用环绕)。下面是不同形式的PC控制。
命令 |
动作 |
JSR,JSI(ACC) |
将PC的旧值保存到堆栈供之后使用。新PC是9位值,其中位0=0(因此,子例程必须从偶数地址开始),而且地址的高位8位来自MU(MU8位值是JSR的跳转表1以及JSI的跳转表2) |
JSI RTS |
使PC的旧值从堆栈退栈,并递增1以获得新PC |
TBR |
如果Z标志匹配TBR测试,则利用9位值代替PC,其中位0=0,而高位8位来自MU。否则,将当前PC递减1。 |
DBR C1DBR C2 |
仅在置位C1Z或C2Z时,将9位偏移(MU输出的8位值,而高位=1)与当前PC相加(C1Z用于DBR C1、C2Z用于DBR C2)。否则,将当前PC递增1。 |
所有其他命令 |
将当前PC递增1。 |
由于对JSR和JSI采取同样的动作,所以特别检测Logic
1。利用同样的原理,可以特别测试Logic
2内的JSI RTS情况。
Logic1 |
(CMD7-5=001)OR(CMD7-3=01001) |
Logic2 |
CMD7-3=01000 |
在更新PC时,必须判定是利用完新项目替换PC,还是利用加法器的结果代替PC。只要测试位匹配累加器的状态,则JSR和JSI(ACC)以及TBR的情况正如所述。利用Logic
1对TBR之外的所有命令进行测试,因此Logic
3还包括作为其输入的Logic
1的输出。然后,复用器MX
2利用Logic
3的输出获得新PC值。
Logic3 |
Logic1 OR((CMD7-4=TBR)AND(CMD3 XOR Z)) |
|
输出 |
Logic3 |
MX2 |
加法器的输出 |
0 |
替换值 |
1 |
9位加法器的输入取决于,在从MU读时,是递增1,还是加偏移(DBR命令)。Logic
4导致进行测试。因此,MX
3直接使用Logic
4的输出。
Logic4 |
((CMD7-3=DBR C1)AND C1Z)OR(CMD7-3=DBR C2)AND C2Z)) |
|
输出 |
Logic4 |
MX3 |
加法器的输出 |
0 |
替换值 |
1 |
最后,选择使用哪个PC项目取决于SP的当前值。在进入子例程时,SP索引值必须递增,而且在从子例程返回时,SP索引值必须递减。在所有其他情况中,而且在希望取命令(周期0)时,必须使用SP的当前值。Logic
1告知何时进入子例程,而Logic
2告知何时从子例程返回。因此,以下确定复用器选择过程:
|
输出 |
周期/Logic1/Logic2 |
MX1 |
SP-1 |
1x1 |
SP+1 |
11x |
SP |
0xx OR 00 |
这两个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。两个VAL单元还对数据位进行奇偶校验,以确保它们有效。如果奇偶校验失败,则触发擦除窜改检测线。对于VAL1,SP寄存器的有效输出将始终为0。如果芯片被窜改。这样可以防止攻击者执行任何子例程。对于VAL2,如果该芯片被窜改,则有效PC输出将始终为0。这样可以防止攻击者执行任何程序代码。
存储单元
存储单元(MU)含有验证芯片的内部存储器。利用9位地址寻址内部存储器,该9位地址是由地址发生器单元提供的。根据该地址,存储单元输出正确的32位值和8位值。存储单元还负责专用编程方式,编程方式可以接收程序闪速存储器的输入。必须防止窜改整个存储单元的内容。因此,必须利用两条窜改检测线覆盖包含在存储单元内的逻辑和寄存器。这样确保攻击者不能改变程序代码、密钥以及中间数据。所有闪速存储器需要是多态的,而且必须检验它是否正在被无效电压读。还需要对32位RAM进行奇偶校验。必须利用非闪速CMOS实现存储单元上的32位数据通路,因为密钥沿该通路传送。可以利用常规CMOS实现8位数据通路,因为密钥不通过该通路传送。
常数
常数存储区的地址范围为:000000000-000001111。因此,它的范围是00000xxxx。然而,如果保留接着的48个地址,则在解码过程中,可以采用常数存储区。因此,利用地址的高位3位(Adr
8-6=000)选择常数存储区,而低位4位进入组合逻辑,该4位映像到32位输出值,如下所述:
Adr3- 0 |
输出值 |
0000 |
0x00000000 |
0001 |
0x36363636 |
0010 |
0x5C5C5C5C |
0011 |
0xFFFFFFFF |
0100 |
0x5A827999 |
0101 |
0x6ED9EBA1 |
0110 |
0x8F1BBCDC |
0111 |
0xCA62C1D6 |
1000 |
0x67452301 |
1001 |
0xEFCDAB89 |
1010 |
0x98BADCFE |
1011 |
0x10325476 |
11xx |
0xC3D2E1F0 |
RAM
32项目32位RAM的地址空间是:001000000-001011111。因此,它的范围是0010xxxxx。因此,利用地址的高位4位(Adr8-5=0010)选择RAM存储区。假定是连续32项目地址空间,则可以利用简单的32×32位RAM实现该RAM。尽管CPU以特殊方式对范围00000-11111内的每个地址进行处理,但是RAM地址解码器本身不对地址进行特殊处理。在RESET时,将所有RAM值清除为0,但是不应该将任何程序代码清除为0。
闪速存储器—变量
32位宽闪速存储器的地址空间是:001100000-001111111。因此,它的范围是0011xxxxx。因此,利用地址的高位4位(Adr
8-5=0111)选择闪速存储区,而低位5位选择要寻址的值。特别需要擦除闪速存储器。完成擦除闪速存储器占用相当长的时间。因此,根据收到的CLR命令,在闪速控制器内置位等待信号,而且仅在擦除了请求的内存后,清除该信号。在内部,将各特定存储区的存储区连接在一起,因此,仅需要2位,如下表所示:
Adr4-3 |
擦除范围 |
00 |
R0-4 |
01 |
MT,AM,K10-4,K20-4 |
10 |
单独M地址(Adr) |
11 |
IST,ISW |
RESET不改变闪速值,但是程序代码除了取无用信息之外,而不应该取闪速存储器的初始值(制造之后)。使用闪速地址的操作是:LD、ST、ADD、RPL、ROR、CLK以及SET。总之,为了将地址生成和解码降低到最少,将操作数与内存布局紧密联系在一起。在进入编程方式后,而且在检测到确定物理攻击后,还要擦除闪速存储器的全部变量部分。
闪速存储器—程序
384项目8位宽程序闪速存储器的地址范围是:010000000-111111111。因此,它的范围是01xxxxxxx-11xxxxxxx。已知ROM的开始地址和地址范围,则解码是直通的。尽管CPU以特殊方式处理地址范围的各部分,但是地址解码器本身却不对地址做特殊处理。RESET不改变闪速值,而且只能通过进入编程方式,清除闪速值。在制造之后,必须将闪速内容看作无用信息。在处于编程方式时,状态机只能装入384字节。
MU的方框图
图193是存储单元的方框图。所示的逻辑利用单独命令需要32位数据和8位数据的事实,因此,需要较少的位进行编码。如图所示,始终产生32位输出和8位输出。根据正在执行的命令,验证芯片的剩余部分内的适当部件仅使用32位值或8位值。复用器MX
1从可供选择的真值表常数、RAM以及闪速存储器中选择32位输出。为了在这3个输出之间进行选择,仅需要2位,即Adr
6和Adr
5。因此,MX
2取下面的形式:
|
输出 |
Adr6-5 |
MX2 |
32位真值表的输出 |
00 |
32位闪速存储器的输出 |
10 |
32位RAM的输出 |
11 |
Logic
1满足用于擦除32位闪速存储器的特定部分的逻辑。在周期=1时,应该仅在将CLR命令送到内存的正确部分期间,置位擦除部分控制信号。请注意,一条CLR可以清除闪速存储器的存储范围。Adr
6足以用作CLR的地址范围,因为该范围将始终位于有效操作数的闪速内,而0用于无效操作数。在触发擦除检测线(被攻击者,或者因为有意进入编程方式)时,擦除32位宽闪速存储器的整个范围。
Logic1 |
Cycle AND(CMD7-4=CLR)AND Adr6 |
Logic
2满足用于对闪速存储器的特定部分进行写的逻辑。在周期=1时,应该仅在将正确ST命令送到闪速存储范围期间,置位WriteEnable控制信号。仅测试Adr
6-5是可以接受的,因为ST命令仅有效写入闪速存储器或RAM(如果Adr
6-5是00,则K2MX必须是0)。
Logic2 |
Cycle AND(CMD7-4=ST)AND(Adr6-5=10) |
在执行SET WE和CLR WE命令期间,置位WE(WriteEnable)标志。Logic
3对这两种情况进行测试。实际写入WE的位是CMD
4。
Logic3 |
Cycle AND(CMD7-5=011)AND(CMD3-0=0000) |
Logic
4满足用于对内存的RAM区进行写的逻辑。在周期=1时,应该仅在将正确ST命令送到RAM存储范围期间,置位WriteEnable控制信号。然而,WE标志调节它,WE标志控制是否容许写入X[N]。X[N]范围是RAM的上半部分,因此利用Adr
4,可以对此进行测试。仅将Adr
6-5作为RAM的全地址范围进行测试是可以接受的,因为ST命令仅写入闪速存储器或RAM。
Logic4 |
Cycle AND(CMD7-4=ST)AND(Adr6-5=11)AND((Adr4 AND WE)OR(~Adr4)) |
这三个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。VAL单元还检验各数据位,以确保它们有效。通过检验每个数据位的状态,使VAL1和VAL2生效,而VAL3进行奇偶校验。如果任何有效测量均失败,则触发擦除窜改检测线。对于VAL1,如果芯片被窜改,则程序闪速存储器的有效输出将始终是0(被解释为TBR 0)。这样防止攻击者执行任何有用指令。对于VAL2,如果该芯片被窜改,则32位有效输出将始终为0。因此,攻击者不能使用密钥和中间存储值。8位闪速存储器用于保存程序代码、跳转表以及其他程序信息。利用全部9位地址(使用地址范围01xxxxxxx-11xxxxxxx)选择程序闪速存储器的384字节。仅在触发擦除检测线(或者被攻击者,或者因为编程方式检测单元而进入编程方式)时,存储程序闪速存储器。在触发擦除检测线时,程序闪速存储器内的小型状态机擦除8位闪速存储器、使擦除生效以及装入串行输入中的新内容(384字节)。下面的伪码示出在触发擦除检测线时执行的状态机逻辑:
Set WAIT output bit to prevent the remainder of the chip from
functioning
Fix 8-bit output to be 0
Erase all 8-bit Flash memory
Temp←0
For Adr=0 to 383
Temp←Temp OR FlashAdr
IF(Temp≠0)
Hang
For Adr=0 to 383
Do 8 times
Wait for InBitValid to be set
ShiftRight[Temp,InBit]
Set InBitUsed control signal
FlashAdr←Temp
Hang
在编程方式状态机执行过程中,必须将0设置到8位输出中。0命令使验证芯片的剩余部分将该命令解释为TBR 0。在该芯片将全部384字节写入程序闪速存储器时,它挂起(无限循环)。然后,可以复位该验证芯片,并正常使用该程序。请注意,用于装载8位程序闪速存储器的新内容的同一个8位寄存器使该擦除生效。这有助于减少成功攻击的机会,因为如果用于使擦除生效的寄存器被攻击者破坏,则不能正确装入程序代码。此外,利用两条窜改检测线保护整个状态机。
地址发生器单元
地址发生器单元产生用于对存储单元(MU)进行存取的有效地址。在周期0,为了取下一个操作码,PC通过MU。地址发生器解释返回的操作码,以产生周期1的有效地址。在周期1,产生的地址通过MU。必须利用两条窜改检测线覆盖包含在地址发生器单元内的逻辑和寄存器。这样确保攻击者不能改变任何产生的地址。利用常规CMOS,几乎可以实现所有地址发生器单元,因为密钥不通过该单元的大部分地方。然而,在JSI地址发生器内使用5位累加器。因此,必须以非闪速CMOS方式实现电路系统的该微小部分不必利用非闪速CMOS实现地址发生器的其余部分。然而,应该对用于计数器和计算地址的锁存器进行奇偶校验。如果两条窜改检测线中任何一条被断开,则地址发生器单元均将在每个周期产生地址0,并将所有计数器固定为0。这仅在攻击者关闭RESET和/或擦除电路系统时起作用,因为在正常环境下,断开窜改检测线将导致RESET或擦除所有闪速存储器。
地址生成背景
逻辑和地址生成要求检验各种操作码和操作数组合。在本小节将研究操作码/操作数与地址之间的关系,而且该关系用作地址发生器单元的基础。
常数
后4个项目是通用用途以及HMAC算法的简单常数。对于这4个值,即,0000、0001、0010以及0011,LDK操作数的低位4位分别直接对应内存内地址的低位3位。还利用LDK命令寻址y常数和h常数。然而,通过将操作数的低位3位与倒置的C1计数器值进行“或”运算,并原封不动保留该操作数的第四位,产生地址。因此,对于LDK y,y操作数是0100,而对于LDK h,h操作数是1000。由于倒置的C1值体现000-011范围的y和000-100范围的h,所以“或”运算的结果给出准确地址。对于所有常数,最终地址的高位5位始终是00000。
RAM
变量A-T检验与其操作数值的低位3位直接相关的地址。即,对于LD、ST、ADD、LOG和XOR命令的操作数值0000-0101以及LOG命令的操作数值1000-1101,可以将低位3操作数地址位与001000的固定高8位地址一起使用,以产生最终地址。仅利用索引机制存取其余寄存器值。仅在利用C1计数器值进行检索时,可以存取变量A-E、B160以及H,而利用N1、N2、N3和N4检索X。利用LD、ST和ADD命令,通过取操作数的低位3位(000)并将它们与C1计数器值进行“或”运算,可以产生利用C1检索的AE的地址。然而,不能以这种方式产生H和B160地址(否则,RAM地址空间将是不连续的)。因此,简单的组合逻辑必须将AE变换为0000,将H变换为0110,以及将B160变换为1011。通过将C1与4位值相加(产生4位结果),然后,预附(prepending)固定高5位地址00100,可以获得最终地址。最后,仅在利用N1、N2、N3和N4检索时,可以存取寄存器的X范围。对于XOR命令,N1-4之任一可以用于检索,而对于LD、ST和ADD,只能使用N4。由于LD、ST和ADD内的X的操作数与XN4操作数相同,所以操作数的低位2位选择使用哪个N。因此,利用选择的N计数器产生的低位4位,可以将地址表示为固定高5位值00101。
闪速存储器—变量
根据有关命令的操作数,可以产生变量MT和AM的地址。可以直接使用4位操作数(0110和0111),并预附固定高5位地址00110。仅在利用倒置的C1计数器值(此外,对于R,利用实际C1值)检索时,可以存取变量R1-5、K11-5和K21-5。根据是寻址K1或者寻址K2,简单的组合逻辑必须将R和RF变换为00000,将K变换为010000或11000,而将M(包括MH1和MLO)变换为10000。通过将C1(或者,对于RF,直接使用C1)与5位值进行“或”运算(或相加),然后,预附(prepending)固定高4位地址00111,可以获得最终地址。变量IST和ISW分别仅是1位的值,但是可以利用任意位数实现它们。作为0x00000000或0xFFFFFFFF,写和读数据。仅利用ROR、CLR和SET命令寻址它们。对于ROR,将操作数的低位位与固定前8位值00111111组合在一起,从而对IST和ISW分别产生001111110和001111111。这是因为,其他ROR操作数均不使用内存,因此对于IST和ISW之外的情况,可以忽略返回值。利用SET和CLR,通过将固定前4位0011与从IST(0100)到11110以及从ISW(0101)到11111的映像组合在一起寻址IST和ISW。由于IST和ISW与RAM内的E和T共享同一个操作数值,所以同样的解码逻辑可以用于低位5位。最终地址要求置位位4、3和1(这可以通过对测试操作数值010x的结果进行“或”运算实现)。
闪速存储器—程序
在程序闪速存储器内进行搜索的地址直接由9位PC(在周期0)或9位Adr寄存器(在周期1)获得。根据存储在程序存储器内的特定地址的表内的数据,诸如TBR、DBR、JSR和JSI的命令修改PC。因此,地址生成利用一些常数地址部分,而命令操作数(或累加器)形成有效地址的低位:
命令 | 地址范围 | 地址的常数(高位)部分 |
地址的变量(低位)部分 |
TBR |
010000xxx |
010000 |
CMD2-0 |
JSR |
0100xxxxx |
0100 |
CMD4-0 |
JSI ACC |
0101xxxxx |
0101 |
Acc4-0 |
DBR |
011000xxx |
011000 |
CMD2-0 |
地址发生器单元的方框图
图194示出地址发生器单元的方框图。MX
1选择地址发生器单元的总输出,如下表所示:
重要的是将CMD数据与MU中的8位数据区别开:
在周期0,8位数据线保存要在下面的周期1执行的下一条指令。利用该8位命令值解码有效地址。相比之下,CMD 8位数据保存先前指令,应该忽略该CMD 8位数据。
在周期1,CMD线保存当前执行的指令(周期0期间,位于8位数据线上的指令),而根据该指令,8位数据线保存位于有效地址的数据。必须在周期1期间执行CMD数据。
因此,复用器MX3从MU或CMD值中选择9位数据,如下表所示:
|
输出 |
周期 |
MX3 |
MU中的8位数据 |
0 |
CMD |
1 |
由于在每个周期均更新9位Adr寄存器,所以将Adr的WriteEnable连接到~周期。计数器单元常数计数C1、C2(内部使用)和选择的N索引。此外,计数器单元输出标志C1Z和C2Z,供程序计数器单元使用。在周期0期间,各*GEN单元产生特定命令类型的地址,而根据利用PC(即,8位数据线)从程序存储器读取的命令,复用器MX
2在它们之间进行选择。下面是产生的值:
模块 |
产生哪个地址的命令 |
JSIGEN |
JSI ACC |
JSRGEN |
JSR,TBR |
DBRGEN |
DBR |
LDKGEN |
LDK |
RPLGEN |
RPL |
VARGEN |
LD,ST,ADD,LOG,XOR |
BITGEN |
ROR,SET |
复用器MX
2具有下面的选择判据:
|
输出 |
MU中的8位数据值 |
MX1 |
JSIGEN输出的9位值 |
01001xxx |
JSRGEN输出的9位值 |
001xxxxx OR 0000xxxx |
DBRGEN输出的9位值 |
0001xxxx |
LDKGEN输出的9位值 |
1110xxxx |
RPLGEN输出的9位值 |
1101xxxx |
VARGEN输出的9位值 |
10xxxxxx OR 1x11xxxx |
BITGEN输出的9位值 |
0111xxxx OR 1100xxxx |
CLRGEN输出的9位值 |
0110xxxx |
VAL1单元是连接到防止窜改和检测窜改电路系统的有效单元。它含有OK位,在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与9位有效地址进行“与”运算,然后就可以使用它们了。如果芯片被窜改,则该地址输出将始终是0,从而防止攻击者存取内存的其他部分。VAL1单元还对有效地址位进行奇偶校验,以确保它还未被窜改。如果奇偶校验失败,则触发擦除窜改检测线。
JSIGEN
图195示出JSIGEN单元的原理框图。JSIGEN单元产生用于JSI ACC指令的地址。有效地址仅是:
JSI表地址的高位4位部分(0101)和
累加器值的低位5位的连接。
由于累加器可以在其他时间保存密钥(在不产生跳转地址时),所以必须无法看到该值。因此,必须利用非闪速CMOS实现该单元。根据该命令是否是JSIGEN,复用器MX
1仅在累加器中的5位或0之间进行选择。复用器MX
1具有下面的选择判据:
|
输出 |
CMD7-0 |
MX1 |
累加器4-0 |
JSI ACC |
00000 |
~(JSI ACC) |
JSRGEN
图196示出JSRGEN单元的原理框图。JSRGEN单元产生用于JSR和TBR指令的地址。有效地址仅由:
JSR表地址的高位4位部分(0100)和
该表中与操作数的偏移(对于JSR命令是5位,而对于TBR是3位加常数0位)
的连接获得。
其中Logic
1产生有效地址的位3。对于JSR,该位应该是位3,而对于TBR,该位应该是0:
由于JSR指令具有位于位5的1(而TBR在该位是0),所以对于JSR,将它与位3进行“与”运算将产生位3,而对于TBR,将产生0。
DBRGEN
图197示出DBRGEN单元的原理框图。DBRGEN单元产生用于DBR指令的地址。有效地址仅由:
DBR表地址的高位6位部分(011000)和
操作数的低位3位
的连接获得。
LDKGEN
图198示出LDKGEN单元的原理框图。LDKGEN单元产生用于LDK指令的地址。有效地址仅由:
LDK表地址的高位5位部分(00000),
操作数的高位,和
操作数的低位3位(对于低位常数),或与C1进行“或”运算的操作数的低位3位(对于索引常数)
的连接获得。
OR
2模块仅将3位C1与MU输出的8位数据中的最低3位进行“或”运算。根据操作数的高位位是否被置位,复用器MX
1仅在实际数据位与和C1“或”运算的数据之间进行选择。对复用器进行输入的选择器仅是“或”门,用于将bit
2与bit
3进行“或”运算。复用器MX
1具有下面的选择判据:
|
输出 |
bit3与bit2“或”运算 |
MX1 |
MU中的8位数据 |
0 |
CMD |
1 |
RPLGEN
图199示出RPLGEN单元的原理框图。RPLGEN单元产生用于RPL指令的地址。在K2MX是0时,有效地址是常数000000000。在KSMX是1(表示从M读取返回有效值)时,有效地址仅由:
M的高位6位部分(001110)和
C1的3位当前值
的连接获得。
根据K2MX的当前值,复用器MX
1在两个地址之间进行选择。因此,复用器MX
1具有下面的选择判据:
|
输出 |
K2MX |
MX1 |
000000000 |
0 |
001110|C1 |
1 |
VARGEN
图200示出VARGEN单元的原理框图。VARGEN单元产生用于LD、ST、ADD、LOG以及XOR指令的地址。K2MX 1位标志用于确定从M读取的内容是否映像到常数0地址(返回0,而且不能被写入),以及在规定K时,存取K1和K2中的哪个。4位加法器模块取2组4位输入,并通过进行模24加法,产生4位输出。曾经在执行CLR K2MX或SET K2MX指令期间,仅写入一位寄存器K2MX。根据这些条件,Logic
1置位K2MX WriteEnable:
Logic1 |
Cycle AND bit7-0=011x0001 |
在执行SET指令期间,写入K2MX变量的位是1,而在执行CLR指令期间,写入K2MX变量位是0。便于将操作码的低序位(bit
4)用作输入位源。在地址生成期间,利用组合逻辑实现的真值表确定下面的基址部分:
bit7-4 |
bit3-0 |
说明 |
输出值 |
LOG |
x |
A,B,C,D,E,T,MT,AM |
00000 |
≠LOG |
0xxx OR 1x00 |
A,B,C,D,E,T,MT, |
00000 |
| |
AM,AE[C1],R[C1] | |
≠LOG |
1001 |
B160 |
01011 |
≠LOG |
1010 |
H |
00110 |
≠LOG |
111x |
X,M |
10000 |
≠LOG |
1101 |
K |
K2MX|1000 |
尽管真值表产生5位输出,但是将低位4位送到4位加法器,该4位加法器将它们与索引值相加(C1、N或操作数本身的低位3位)。最高位通过该加法器,并将该最高位预附到该加法器产生的4位结果,以产生5位结果。加法器的第二输入来自复用器MX
1,该复用器MX
1从C1、N或操作数本身的低位3位中选择索引值。尽管C1只有3位,但是第四位是常数0。复用器MX
1具有下面的选择判据:
|
输出 |
bit7-0 |
MX1 |
数据2-0 |
(bit3=0)OR(bit7-4=LOG) |
C1 |
(bit3=1)AND(bit2-0≠111)AND((bit7-4=1x11)OR(bit7-4=ADD)) |
N |
((bit3=1)AND(bit7-4=XOR))OR(((bit7-4=1x11)OR(bit7-4=ADD))AND(bit3-0=1111)) |
对于RAM地址,有效地址的第六位(bit
5)是0,而对于闪速存储器地址,有效地址的第六位(bit
5)是1。闪速存储器地址是MT、AM、R、K和M。Logic
2计算bit
5:
Logic2 |
((bit3-0=110)OR(bit3-0=011x)OR(bit3-0=110x))AND((bi7-4=1x11)OR(bi7-4=ADD)) |
预附常数1,从而形成总共7位的有效地址。这些位将形成有效地址,除非K2MX是0,而指令是LD、ADD或ST M[C1]。在后者情况下,有效地址是常数地址0000000。在这两种情况下,预附两个0位,以形成最终9位地址。在此示出Logic
3和复用器MX
1实现的计算。
Logic3 |
~K2MX AND(bit3-0=1110)AND((bit7-4=1x11)OR(bit7-4=ADD)) |
|
输出 |
Logic3 |
MX2 |
计算的位 |
0 |
0000000 |
1 |
CLRGEN
图201示出CLRGEN单元的原理框图。CLRGEN单元产生用于CLR指令的地址。对于有效内存存取操作数,有效地址始终位于闪速存储器内,而对于无效操作数,该有效地址为0。CLR M[C1]指令始终擦除M[C1],而不考虑K2MX标志的状态(保存在VARGEN单元内)。真值表是实现如下关系的简单组合逻辑:
输入值(bit3-0) |
输出值 |
1100 |
00 1100 000 |
1101 |
00 1101 000 |
1110 |
00 1110|C1 |
1111 |
00 1111 110 |
~(11xx) |
000000000 |
简化该真值表所需的逻辑是件简单事情,因为全部4种主要情况中,有效地址的头6位是00和后面的操作数(bit3-0)。
BITGEN
图202示出BITGEN单元的原理框图。BITGEN单元产生用于ROR和SET指令的地址。对于有效内存存取操作数,有效地址始终位于闪速存储器内,而对于无效操作数,该有效地址为0。由于ROR和SET指令仅对IST和ISW闪速存储器地址进行存取(其余操作数存取寄存器),简单组合逻辑真值表足以实现地址生成过程:
输入值(bit3-0) |
输出值 |
010x |
00111111|bit0 |
~(010x) |
000000000 |
计数器单元
图Y37示出计数器单元的原理框图。计数器单元产生计数C1、C2(内部使用)和选择的N索引。此外,计数器单元输出标志C1Z和C2Z,以便在外部使用它们。在寄存器C1和C2是DBR或SC指令的目标时,更新寄存器C1和C2。操作数的高位位(有效命令的bit
3)在C1与C2之间进行选择。Logic
1和Logic
2分别确定C1和C2的WriteEnable。
Logic1 |
Cycle AND(bit7-3=0x010) |
Logic2 |
Cycle AND(bit7-3=0x011) |
利用它们的多位C1和C2寄存器,产生一位标志C1Z和C2Z。因此,如果C1=0,则CIZ是1,而如果C2=0,则C2Z是1。在执行DBR指令期间,使C1或C2的值递减1(利用环绕)。复用器MX
2选择递减器单元的输入,如下所述:
写入C1或C2的实际值取决于是在执行DBR指令还是在执行SC指令。复用器MX
1在递减器的输出(对于DBR指令)与真值表的输出(对于SC指令)之间进行选择。请注意,5位输出的最低3位被写入C1。因此,复用器MX
1具有下面的选择判据:
|
输出 |
Bit6 |
MX2 |
真值表的输出 |
0 |
递减器的输出 |
1 |
利用SC指令,该真值表保存要装入C1和C2的值。该真值表是实现下面的关系的简单组合逻辑:
输入值(bit2-0) |
输出值 |
000 |
00010 |
001 |
00011 |
010 |
00100 |
011 |
00111 |
100 |
01010 |
101 |
01111 |
110 |
10011 |
111 |
11111 |
在XOR指令引用它们时,利用其下一个值-1(利用环绕)更新寄存器N1、N2、N3和N4。在执行ST X[N4]指令时,还更新寄存器N4。LD和ADD指令不更新N4。此外,还在执行SET N
X命令期间,更新全部4个寄存器。Logic
4-7对寄存器N1至N4产生WriteEnable。全部使用Logic
3,如果命令是SET N
X,则Logic
3产生1,否则产生0。
Logic3 |
bit7-0=01110010 |
Logic4 |
Cycle AND((bit7-0=10101000)OR Logic3) |
Logic5 |
Cycle AND((bit7-0=10101001)OR Logic3) |
Logic6 |
Cycle AND((bit7-0=10101010)OR Logic3) |
Logic7 |
Cycle AND((bit7-0=11111011)OR(bit7-0=10101011)OR Logic3) |
复用器MX
4仅选择送到递减器,或者用作递减器的输入的实际N索引值,从而使用操作数的低位2位:
|
输出 |
bit1-0 |
MX4 |
N1 |
00 |
N2 |
01 |
递增器取输入值的4位(复用器MX
4选择的),然后,加1,从而产生4位结果(因为进行模2
4加法)。最后,复用器MX
3的4个实例在常数值(对于每个N不同,而且在执行SET N
X命令期间装入它们)与递减器的结果(在执行XOR或ST指令期间)之间选择。仅在置位正确WriteEnable标志(请参考Logic
4-Logic
7)时,写入该值,因此复用器可以安全地使用Logic
3。
|
输出 |
Logic3 |
MX3 |
递减器的输出 |
0 |
常数值 |
1 |
SET N
X命令将下面的常数装入N1-N4:
索引 |
装入的常数 |
引用的初始X[N] |
N1 |
2 |
X[13] |
N2 |
7 |
X[8] |
N3 |
13 |
X[2] |
N4 |
15 |
X[0] |
请注意,引用的每个初始X[Nn]匹配索引N1-N4的优化SHA-1算法初始状态。在每个索引值Nn递减时,有效X[N]递增。这是因为,以首先是最高有效字的方式将X字存储到内存中。这三个VAL单元是连接到防止窜改和检测窜改电路系统的有效单元,它们分别具有OK位。在RESET时,将OK位置位为1,然后,在每个周期,将它与两条窜改检测线输出的ChipOK值进行“或”运算。将该OK位与通过该单元的每个数据位进行“与”运算。所有VAL单元还对各数据进行奇偶校验,以确保各计数器不被窜改。如果奇偶校验失败,则触发擦除窜改检测线。对于VAL1,如果芯片被窜改,则计数器C1的有效输出将始终是0。这样防止攻击者执行任何利用密钥检索的循环结构。对于VAL2,如果该芯片被窜改,则C2计数器的有效输出将始终为0。这样防止攻击者执行任何循环结构。对于VAL3,如果芯片被窜改,则任何N计数器(N1-N4)的有效输出将始终是0。这样防止攻击者执行任何利用X检索的循环结构。
现在参考图203,图203示出存储在闪速存储存储器701内的信息705。该数据包括以下内容:
工厂代码
工厂代码是指出制造打印卷的工厂的16位代码。这样可以识别是属于打印卷技术的拥有者的工厂,或者是许可制造打印卷的工厂。该数的用途是在发生质量问题的情况下,可以跟踪制造打印卷的工厂。
批号
批号是指出打印卷的制造批次的32位数。该数的用途是在发生质量问题的情况下,跟踪所制造的打印卷的批次。
序列号
设置48位序列号,以便唯一识别最多280千吉个打印卷以内的每个打印卷。
制造日期
为了在适用期有限的情况下,跟踪打印卷的使用时间,所以包括16位制造日期。
介质长度
利用该数表示打印卷上剩余的打印介质的长度。利用诸如厘米的小单位,或采用打印卷的打印机设备的最小点间距表示该长度,并计算众所周知的C、H和P格式中每种格式以及可以打印的其他格式的剩余照片数量。使用小单位还可以确保利用高分辨率与预打印介质保持同步。
介质类型
介质类型数据列举包含在打印卷内的介质。
(1)透明
(2)不透明白色
(3)不透明着色
(4)3D柱镜
(5)预打印:长度规定的
(6)预打印:无长度规定
(7)金属薄片
(8)全息/光变器件薄片
预打印介质长度
在此存储例如包含在打印卷的背面的任何预打印介质的重复图形的长度。
墨水粘度
利用8位数表示每种彩色墨水的粘度。可以利用墨水粘度数调节打印头致动器特性,以对粘度进行补偿(通常,为了实现同样的滴量,较高的粘度需要较长的致动器脉冲)。
推荐的1200dpi的滴量
利用8位数表示每种彩色墨水的推荐滴量。最适当的滴量取决于墨水和打印介质的特性。例如,随着着色浓度和吸收率的提高,所需的滴量将降低。此外,透明介质需要的滴量约为不透明白色介质所需滴量的两倍,因为对于透明介质,光仅通过着色层一次。
由于打印卷中既有墨水,又有介质,所以可以实现客户匹配。该滴量仅是推荐滴量,因为打印机可以不是1200dpi的,或者可以将打印机调节到更亮或更暗打印。
墨水颜色
包括着色颜色中每种着色颜色的颜色,而且利用该颜色“微调”在打印之前对任何图像应用的数字半色调。
剩余介质长度指数符
利用该数不是打印卷上剩余的打印介质的长度,而且相机设备可以更新该长度。利用小单位(例如,1200dpi像素)表示该长度,以计算C、H和P格式中每种格式以及可以打印的其他格式的剩余照片数量。可以利用高分辨率与预打印介质保持同步。
版权或位模式
该512位模式表示足以使闪速存储存储器的内容享有版权的ASCII字符序列。
现在,参考图204,图204示出Artcam验证芯片的存储表730。该表包括:制造代码、批号以及序列号和日期,它们的格式与以上描述的格式相同。表730还包括关于Artcam设备内的打印引擎的信息731。存储的信息可以包括打印引擎类型、打印机的DPI分辨率以及打印机设备产生的打印数量的打印机计数。
此外,设置验证测试密钥710,各芯片的验证测试密钥710可以随机地各不相同,而且在上述算法中,可以将该验证测试密钥710用作Artcam随机识别码。还设置128位打印卷验证密钥713,它与存储在打印卷内的密钥等效。接着,在适于Artcam使用的120位备用区之后,存储512位模式。
如上所述,Artcam优先包括液晶显示器15,该液晶显示器15示出容纳在Artcam内的打印卷上剩余的打印数。此外,Artcam还包括三态开关17,三态开关17允许用户在3种标准格式C、H和P(传统、HDTV以及全景)之间进行选择。在三态之间进行了选择之后,如果使用选择的特定格式,则更新液晶显示器15,以反映打印卷上剩余的图像数。
为了正确操作液晶显示器,在插入打印卷并通过验证测试后,Artcam处理器对打印卷芯片53的闪速存储存储器进行读,并确定剩余的打印纸数量。接着,Artcam处理器确定输出格式选择开关17的值。通过将打印长度除以选择的输出格式的相应长度,Artcam处理器确定可能的打印数,然后,利用剩余打印数更新液晶显示器15。在用户改变了输出格式选择开关17后,Artcam处理器31根据该格式重新计算输出图片的数量,并再一次更新LCD显示器15。
存储在打印卷表705(图165)内的进程信息还使Artcam设备利用打印卷的进程特性和打印特性的变化。
特别是,为了考虑到进程特性的变化,可以改变对打印头内的每个喷嘴施加的脉冲特性。现在,参考图205,Artcam处理器适于运行存储在辅助存储ROM芯片内的软件程序。该软件程序,即脉冲轮廓表征器771可以从打印卷读取大量变量。这些变量包括打印卷772上剩余的介质、打印介质类型773、墨水颜色粘度774、墨水颜色滴量以及墨水颜色776。脉冲轮廓表征器分别读取这些变量,然后,根据以前的试验和经验,确定相应的、最适当脉冲轮廓。参数改变每个打印机喷嘴接受的打印脉冲,以改进输出墨水的稳定性。
显然,验证芯片的显著进步在于,重要的和有价值的信息存储在打印卷的打印芯片上。除了关于打印卷类型的信息以及打印卷上剩余的打印纸数量,该信息还可以包括上述打印卷的进程特性。此外,打印卷接口芯片可以提供有价值的验证信息,而且可以以防止窜改的方式构造打印卷接口芯片。此外,提供了一种利用该芯片的防止窜改的方法。利用该打印卷芯片还可以对Artcam设备的中间输出设置分别有效的用户界面,从而可以输出多种照片格式,而且可以同时提供打印设备内剩余的照片数量的指数符。
打印头单元
现在,参考图206,图206示出图162所示打印头单元615的部分剖视分解透视图。
打印头单元615基于打印头44,打印头44根据要求将墨滴喷射在打印介质611上,以形成图像。打印介质611夹在包括第一组618、616和第二组617、619的两组夹送辊之间。
在电源线、地线和信号线810的控制下,打印头44工作,电源线、地线和信号线810对打印头44提供电源和控制,而且通过带式自动焊接(TAB)焊接到打印头44的表面上。
重要的是,可以利用适当分离的硅圆片器件构造的打印头44取决于通过该圆片、具有接近垂直侧壁的一系列各向异性蚀刻812。直通圆片蚀刻812可以将墨水从圆片的背面直接送到打印头表面,以便进行后续喷射。
利用墨水头供应单元814,将墨水送到喷墨打印头44的背面。喷墨打印头44具有3个沿其表面、用于提供各种颜色的墨水的单独行。墨水头供应单元814还包括用于密封墨水通道的盖子。
在图207至图210中,示出墨水头供应单元814的各种透视图。图207和图210仅分别示出可以构造为有限长度的墨水头供应单元的一部分,为了提供典型详细说明示出该部分。在图207中示出底部透视图,图148示出顶部透视图,图209示出近视底部透视图,图210示出详细示出墨水通道的顶部侧面透视图,图211示出顶部侧面透视图,图212也示出顶部侧面透视图。
利用注塑成型塑料代替比如微型机制硅,制造墨水头供应单元814具有明显的成本优势。在数量上,塑料墨水通道的制造成本非常地,而且制造过程非常简单。附图所示的设计假定预定长度的1600dpi三色整体打印头。所提供的流速率计算过程是针对100mm照片打印机的。
墨水头供应单元814含有所有要求的微细细节。盖子815(参考图206)永久接合到墨水头供应单元814,或者利用超声波焊接到墨水头供应单元814上,并用于密封墨水通道。
参考图209,青色、深红色以及黄色墨水流入直通墨水入口820-822,深红色墨水流过通孔824、825,而且沿着深红色主通道826、827流动(参考图141)。青色墨水沿青色主通道830流动,黄色墨水沿黄色主通道831流动。从图209中可以最清楚地看到,青色主通道内的青色墨水然后流入青色子通道833。黄色子通道834以类似方式从黄色主通道831接收黄色墨水。
在图210中可以最清楚地看到,深红色墨水也从深红色主通道826、827流过深红色通孔836、837。再回去参考图209深红色墨水从通孔836、837流出。深红色墨水沿第一深红色子通道例如838流动,然后,沿第二深红色子通道例如839流动,之后,流入深红色槽840。然后,深红色墨水流过与相应喷墨头通孔(例如图166所示的812)对准的深红色通路例如842,其中它们随后将墨水送到喷墨喷嘴印出。
同样,青色子通道833内的青色墨水流入青色凹槽区849,青色凹槽区域849将墨水送到流过青色通路843、844。同样,黄色子通道834将墨水送到黄色凹槽区46,黄色凹槽区46又将墨水送到黄色通路847、848。
在图210中可以看到,所设计的打印头容纳在打印头槽850内,打印头槽850具有与打印头圆片上的相应通孔例如851对准的各种通路例如851。
回去参考图206,必须注意,要对整个打印头芯片44提供足够墨水流,同时满足注塑成型工艺的制约。位于打印头芯片的背面的墨水直通圆片孔812的尺寸约为100μm×50μm,而承载不同颜色的墨水的各通孔之间的间隔约为170μm。尽管可以容易地利用塑料注塑成型该尺寸特征图形(feature)(压缩光盘具有微米尺寸的特征图形),但是,最理想的是,壁高度不得超过壁厚度的几倍,从而保持总共的刚性。利用逐步减小墨水通道的分级结构,优选实施例克服了这些问题。
在图211中示出了打印头44表面的一小部分870。该表面被分割为3个系列的喷嘴,这3个系列包括青色系列871、深红色系列872和黄色系列873。每个系列的喷嘴被进一步分割为具有打印头44的两行例如875、876,打印头44具有一系列用于连接电源和控制信号的连接垫878。
优先根据为包括Artcam设备的用途而发明的大量不同形式的墨水喷口,构造打印头。下面将进一步详细说明这些墨水喷口器件。
打印头喷嘴包括墨水供应通道880,它与图206所示的各向异性蚀刻孔812等效。墨水从圆片直通供应通道881流出,又通过过滤器格栅到达墨水喷嘴室例如883。如上所述,在上述专利说明书中对喷嘴室883和打印头44(参考图1)的操作进行了描述。
墨水通道液流分析
现在分析墨水流,主墨水通道826、827、830、831(参考图207、图141)约为1mm×1mm,并将一种颜色送到所有喷嘴。子通道833、834、838、839(参考图209)约为200μm×100μm,并分别设置约25个墨水喷嘴。打印头通孔843、844、847、848以及圆片通孔例如881(参考图211)为100μm×50μm,并在打印头通孔的两侧分别设置3个喷嘴。每个喷嘴过滤器882分别具有8个细长切口,每次细长切口的面积为20μm×2μm,并分别设置一个喷嘴。
已经对以上构造的喷墨打印机的压力要求进行了分析。该分析是针对用于进行照片打印的1600dpi三色工艺打印头的。打印宽度是100mm,这样使得每种颜色具有6,250个喷嘴,所以总共具有18,750个喷嘴。
用于全黑色打印的各种通道要求的最高墨水流速非常重要。它确定墨水通道的压降,并因此确定打印头是否仅利用表面张力保持充满,否则,如果未充满,则需要墨水压力使打印头保持充满。
为了计算压降,采用对于1600dpi操作的2.5pl的滴量。尽管喷嘴可以以更高速率工作,但是选择的墨滴重复率为5kHz,该墨滴重复率适于在稍许不到2秒的时间内打印150mm长的照片。因此,在极端情况下,打印头具有18,750个喷嘴,它们每秒均最多打印5,000墨滴。该墨水流分布在墨水通道的分级结构中。在所有喷嘴打印时,每条墨水通道实际上提供固定数量的喷嘴。
根据Darcy-Weisbach公式,计算压降Δρ:
其中ρ是墨水浓度,U是平均流速,L是长度,D是液力直径,f是以下计算的无量纲磨擦因数:
其中Re是雷诺数,k是以下计算的、取决于通道的截面的无量纲摩擦系数:
其中v是墨水的动粘滞率。
对于矩形剖面,可以将k近似为:
其中a是矩形剖面的最长边,而b是最短边。下式给出矩形截面的液力直径D:
在沿着墨水通道长度方向的250个点从主墨水通道汲取墨水。墨水流速从通道起始处的速度线性降低到通道结束处的0,因此,平均流速U是最高流速的一半。因此,沿主墨水通道的压降是利用最高流速计算的压降的一半。
利用这些公式,可以根据下表计算压降:
墨水通道维数和压降
|
项目号 |
长度 |
宽度 |
深度 |
设置的喷嘴数 |
5KHz时的最高墨水流速(U) |
压降Δρ |
中心模制 |
1 |
106mm |
6.4mm |
1.4mm |
18,750 |
0,23ml/s |
NA |
青色主通道(830) |
1 |
100mm |
1mm |
1mm |
6,250 |
0.16μl/μs |
111Pa |
深红色主通道(826) |
2 |
100mm |
700μm |
700μm |
3,125 |
0.16μl/μs |
231Pa |
黄色主通道(831) |
1 |
100mm |
1mm |
1mm |
6,250 |
0.16μl/μs |
111Pa |
青色子通道(833) |
250 |
1.5mm |
200μm |
100μm |
25 |
0.16μl/μs |
41.7Pa |
深红色子通道(834)(a) |
500 |
200μm |
50μm |
100μm |
12.5 |
0,031μl/μs |
44.5Pa |
深红色子通道(838)(b) |
500 |
400μm |
100μm |
200μm |
12.5 |
0.031μl/μs |
5.6Pa |
黄色子通道 |
250 |
1.5mm |
200μm |
100μm |
25 |
0.016μl/ |
41.7Pa |
(834) |
|
|
|
|
|
μs |
|
青色凹槽(842) |
250 |
200μm |
100μm |
300μm |
25 |
0.010μl/μs |
3.2Pa |
深红色直通(840) |
500 |
200μm |
50μm |
200μm |
12.5 |
0.016μl/μs |
18.0Pa |
黄色凹槽(846) |
250 |
200μm |
100μm |
300μm |
25 |
0.010μl/μs |
3.2Pa |
青色通路(843) |
500 |
100μm |
50μm |
100μm |
12.5 |
0.031μl/μs |
22.3Pa |
深红色通路(842) |
500 |
100μm |
50μm |
100μm |
12.5 |
0.031μl/μs |
22.3Pa |
黄色通路 |
500 |
100μm |
50μm |
100μm |
12.5 |
0.031μl/μs |
22.3Pa |
深红色通孔(837) |
500 |
200μm |
500μm |
100μm |
12.5 |
0.003μl/μs |
0.87Pa |
芯片槽 |
1 |
100mm |
730μm |
625 |
18,750 |
NA |
NA |
打印头通孔 |
1500 |
600μ |
100μm |
50μm |
12.5 |
0.052μl/ |
133Pa |
(881)(位于芯片衬底上) |
|
|
|
|
|
μs |
|
打印头通道分段(位于芯片正面) |
1,000/颜色 |
50μm |
60μm |
20μm |
3.125 |
0.049μl/μs |
62.8Pa |
过滤器格栅(位于喷嘴室的入口)(882) |
每个喷嘴8个 |
2μm |
2μm |
20μm |
0.125 |
0.039μl/μs |
251Pa |
喷嘴室(位于芯片正面)(883) |
每个喷嘴1个 |
70μm |
30μm |
20μm |
1 |
0.021μl/μs |
75.4Pa |
因此,从墨水入口到喷嘴的总压降,对于青色和黄色约为701Pa,而对于深红色约为845Pa。这小于大气压力的1%。当然,在打印的图像不是全黑色时,墨水流比这些值小(并因此压降也小)。
对墨水头供应单元制模
墨水头供应单元14(参考图1)具有小至50μ和106mm长度的特征图形。以传统方式机械加工注塑成型工具是不切实际的。然而,即使总体形状复杂,但是不要求复杂的曲线。通过利用传统方法铣削主墨水通道和其他毫米级特征图形,采用光刻方法制造微细特征图形的水道(inset),可以制造注塑成型工具。对于水道可以采用LIGA工艺。
可以容易地使一个注塑成型工具具有50个或者更多个空腔。大多数工具复杂性在水道。
参考图206,如上所述,通过一起模制墨水供应单元814和盖子815,并将它们密封在一起,构造打印系统。然后,将打印头44安置到其相应槽850内。粘接密封带852、853设置在深红色主通道上,以确保适当密封它们。然后,利用在空腔855内延伸的接头焊接线,将带式自动焊接(TAB)带810连接到喷墨打印头44。从图206、图207以及图212中可以最清楚地看到,设置孔径槽855-862,以便在插入夹送辊后闭合。在游动(play)程度小仅使夹送辊转动的情况下,设置该孔径槽以“夹紧”夹送辊。
在图213至217中,在适当编号的各器件的情况下,示出了最终组装的Artcam设备的内部部分的各透视图。
●图213示出Artcam相机的内部部分的顶部侧面透视图,它示出了展平的各部分;
●图214示出Artcam相机的内部部分的底部侧面透视图,它示出了展平的各部分;
●图215示出Artcam相机的内部部分的第一顶部侧面透视图,它示出了装在Artcam内的各部分;
●图216示出Artcam相机的内部部分的第二顶部侧面透视图,它示出了装在Artcam内的各部分;
●图217示出Artcam相机的内部部分的第二顶部侧面透视图,它示出了装在Artcam内的各部分;
明信片打印卷
现在,参考图218,在一种形式的优选实施例中,输出打印纸11可以在不接受打印图像的一侧包括大量预打印“明信片”格式的背面部分885。明信片格式部分885可以包括邮资已付“邮票”886,邮资已付“邮票”886可以包括相关邮资管理机构提供的打印授权,在该管理机构的管辖范围内,销售或者使用打印卷。通过与相关管辖邮政管理机构达成协议,可以使用具有不同邮资的打印卷。这对于位于该辖区内而且希望将大量明信片寄回他们的祖国的海外游客特别方便。此外,设置地址格式部分887,以便以通常的明信片方式书写详细发信地址。最后,设置消息区887,以便书写个性化信息。
现在,参考图218和图219,以这样的方式操作相机设备,以致当在打印卷的第一面上打印了一系列图像890-892时,相应的背面是图218所示的背面。因此,在利用相机打印每幅图像例如891时,图像的背面具有准备好的明信片885,这样就可以在管辖区内的最近邮政信箱发信。这样,可以产生个性化明信片。
显然,在使用图219和图220所示的明信片系统时,只有预定图像尺寸是可能的,因为必须使背面明信片部分885与正面图像891之间保持同步。这可以通过利用容纳在打印卷内的验证芯片的内存部分存储每种明信片背面格式打印纸885的长度详情实现。这可以通过使每种明信片具有同样的尺寸,或者通过将打印卷内的每种尺寸存储到板上打印芯片存储器上实现。
Artcam相机控制系统可以确保,在使用具有预格式化的明信片的打印卷时,仅以使每幅图像位于明信片边线上的方式,使用打印卷打印图像。当然,通过在每张照片的边缘设置边界区,可以提供某种程度的“游动”,这样可以考虑到稍许不对准。
现在,参考图220,显然,在相机用户在可以使用明信片卷的特定辖区内旅行时,他可以预先购买明信片卷。还可以在明信片卷的外表面上设置包括购买国家、每张明信片的邮资额、每张明信片的格式(例如,C、H或P,或者这些图像模式的组合)、适用国家以及其后不再保证邮资够用的邮资有效日期的打印信息。
因此,通过利用其手持相机对准相关景物,并获得一面具有图像而另一面具有邮资已付明信片详情的图片,相机设备的用户可以制造通过邮政系统发信的明信片。随后,可以在明信片上注明地址,并在明信片上书写短信,然后,立即通过邮政系统发信。
关于Artcam设备的软件运行过程,尽管在一种设计中可以具有许多不同的软件设计,但是每种Artcam设备均可以包括一组松耦合功能模块,一个嵌入式应用程序以联动方式利用这组松耦合功能模块服务该设备的核心用途。尽管在各种类型的Artcam设备中可以以不同的组合方式再用该功能模块,但是应用程序是该类型的Artcam设备专用的。
大多数功能模块含有软件部件和硬件部件。利用硬件抽象层保护软件不受硬件细节的影响,而利用抽象软件接口保护模块的用户不受其软件实现的影响。用户启动的事件和硬件启动的事件可以将系统作为一个整体驱动,大多数模块可以运行一个或者多个异步事件驱动的进程。
图221示出最重要的模块,它包括类属Artcam设备。在该图和后面的附图中,示出了位于左侧、利用垂直虚线901与右侧的硬件部件分开的软件部件。下面说明这些模块的软件方面:
软件模块-Artcam应用程序902
Artcam应用程序实现Artcam设备的高级功能性。这通常包括捕获图像、对该图像施加艺术效果以及打印该图像。在面向相机的Artcam设备中,利用相机管理器903捕获图像。在面向打印机的Artcam设备中,或许因为图像由另一个设备“喷出”,所以利用网络管理器904捕获图像。
在文件管理器905管理的统一文件系统中建立艺术效果。艺术效果包括脚本文件和一组资源。利用图像处理管理器906解释该脚本并将它应用到图像。通常,将脚本装载到被称为Artcard的ArtCard上。利用缺省,应用程序使用包括在当前安装的Artcard上的脚本。
利用打印机管理器908打印图像。
在Artcam设备启动时,在启动该应用程序之前,自举进程启动各管理器进程。在启动时,这样可以使应用程序立即向各管理器请求业务。
在初始化时,应用程序902将自身作为下列事件的处理程序保存。在它接收事件时,它执行下表描述的动作:
用户界面事件 |
动作 |
锁定聚焦 |
执行相机管理器建立的任何自动预捕像。这包括自动聚焦、自动调节曝光以及对闪光灯充电。这通常是通过用户将拍摄按钮按下一半启动的。 |
拍摄 |
利用相机管理器捕获图像 |
自拍装置(self-timer) |
利用相机管理器以自定时方式捕获图像。 |
闪光方式 |
更新相机管理器以使用下一个闪光方式。更新状态显示器以显示新闪光方式。 |
打印 |
利用打印机管理器打印当前图像。 |
|
如果操作当前脚本,则利用图像处理管理器,对图像施加艺术效果。更新状态显示器上的剩余打印计数(请参考下面的“插入的打印卷”) |
保持 |
如果存在当前脚本,则利用图像处理管理器对当前图像施加艺术效果,但是不打印图像。 |
退出ArtCards |
利用文件管理器退出当前插入的ArtCards。 |
插入的打印卷 |
根据打印管理器的剩余介质长度和相机管理器的宽高比,计算剩余的打印数量。更新状态显示器上的剩余打印计数。 |
卸下打印卷 |
更新状态显示器以指出当前不存在打印卷。 |
如果相机包括显示器,则利用允许用户编辑当前日期和时间以及其他可编辑相机参数的用户界面管理器910,该应用程序还可以构造图形用户界面。该应用程序将所有持久性参数保存到闪速存储器内。
实时微内核911
实时微内核根据中断和进程优先权抢先调度各进程。它提供集成进程间通信业务和定时器业务,因为与进程调度紧密相关。在微内核外部实现所有其他操作系统功能。
相机管理器903
相机管理器提供图像捕获业务。它对嵌入Artcam内的相机硬件进行控制。它提供可以查询和设置相机参数而且可以捕获图像的抽象相机控制接口。该抽象接口将该应用程序与相机实现的细节去耦。相机管理器使用下面的输入/输出参数和命令:
输出参数 |
域 |
聚焦范围 |
实数,实数 |
变焦范围 |
实数,实数 |
光圈范围 |
实数,实数 |
快门速度范围 |
实数,实数 |
输入参数 |
域 |
聚焦 |
实数 |
变焦 |
实数 |
光圈 |
实数 |
快门速度 |
实数 |
宽高比 |
传统、HDTV、全景 |
聚焦控制方式 |
多点自动、单点自动、手动 |
曝光控制方式 |
自动、光圈优先、手动 |
闪光方式 |
自动、自动关闭红灯(red-eye),填充、断开 |
取景方式 |
接通、断开 |
相机管理器在异步事件启动进程运行。它含有一组联动状态机,每个异步操作使用一个状态机。这些异步操作包括自动聚焦、对闪光灯充电、递减计数自拍装置以及捕获图像。在初始化时,相机管理器将相机硬件设置为已知状态。这包括设置正常焦距和缩进变焦距。图222示出相机管理器的软件结构。将在下面的各子小节说明各软件部件:
锁定聚焦913
锁定聚焦自动调节当前景物的焦距和曝光,而且根据聚焦控制方式、曝光控制方式以及闪光方式,在需要时闪光。通常,响应用户将拍摄按钮按下一半,启动锁定聚焦。它是正常图像捕获序列,但是,如果用户使拍摄按钮保持按下一半,可以及时将它与实际捕获图像分离。这样可以使用户进行定点聚焦和定点测量。
捕获图像914
捕获图像捕获当前景物的图像。如果闪光方式包括关闭红灯、控制快门、如果启动则触发闪光灯以及利用图像传感器检测图像,则照亮红灯。它确定相机的取向,并因此确定捕获的图像,以便在之后的图像处理过程中正确取向该图像。它还确定在图像捕获过程中是否存在相机运动,从而在之后的图像处理过程中触发去模糊过程。
自定时捕获915
在递减计数20s计时器后,自定时捕获当前景物的图像。在利用自拍装置LED递减计数期间,向用户提供反馈。在头15s期间,它可以照亮LED。在后5s期间,它可以使LED闪光。
取景917
利用图像传感器,取景周期性地检测当前景物,并将它显示在彩色LCD上,从而为用户提供基于LCD的取景器。
自动聚焦918
自动聚焦改变焦距,直到选择的图像区域足够清晰,从而表示它们位于焦点上。如果由图像传感器的规定区域获得的图像清晰度量度高于固定阈值,它认为该区域在焦点上。通过梯度下降清晰度对焦距的导数,根据需要改变方向和步长,可以发现最佳焦距。如果聚焦控制方式是多点自动,则可以使用3个区域,这3个区域水平排列在视区上。如果聚焦控制方式是单点自动,则使用位于视区的中心的一个区域。自动聚焦在聚焦控制器指出的有效焦距范围内工作。在固定焦距设备中,实际上它被关闭。
自动闪光919
自动闪光确定景物照明是否足够暗,需要闪光。如果景物照明低于固定阈值,它认为照明黯淡。利用照明传感器获得景物照明,照明传感器从图像传感器的中心区域获得照明量度。如果需要闪光,则它对闪光灯充电。
自动曝光920
景物照明、光圈以及快门速度一起确定捕获图像的曝光。要求的曝光是固定值。如果曝光控制方式是自动,则自动曝光确定对给定的景物照明产生要求的曝光的组合光圈和快门速度,这样。如果曝光控制方式是光圈优先,则自动曝光确定对给定的景物照明和当前光圈产生要求的曝光的快门速度。如果曝光控制方式是快门优先,则自动曝光确定对给定的景物照明和当前快门速度产生要求的曝光的光圈。利用照明传感器获得景物照明,该照明传感器从图像传感器的中心区域获得照明量度。
自动曝光在光圈控制器和快门速度控制器指出的有效光圈范围内和快门速度范围内工作。快门速度控制器和快门控制器掩盖了在大多数Artcam内没有机械快门。
如果手动或者利用自动闪光启动闪光灯,则有效快门速度在闪光时长内,闪光时长通常在1/1000s至1/10000s范围内。
图像处理管理器906(参考图221)
图像处理管理器提供图像处理和艺术效果业务。它利用嵌入Artcam的VLIW矢量处理器进行高速图像处理。图像处理管理器包括以Vark图像处理语言方式编写的脚本的解释器。因此,艺术效果包括Vark脚本文件和诸如字体、剪辑图像等的有关资源。图223更详细示出图像处理管理器的软件结构,它包括下面的模块:
变换与增强图像921
图像处理管理器在设备无关的CIE LAB彩色空间内,以适合Artcam打印机硬件的再现能力的分辨率进行图像处理。首先,通过滤除噪声,增强捕获的图像。选择进行处理以去除运动产生的模糊。然后,将该图像从其设备有关的RGB彩色空间变换为CIE LAB彩色空间。在捕获图像时,还转动该图像以撤销任何相机转动产生的效果,并将该图像缩放到工作图像分辨率。通过将其动态范围缩放到有效动态范围,可以进一步增强该图像。
检测面部923
根据色调和局部特征分析,在捕获的图像中检测面部。Vark脚本使用检测的面部区域列表,施加面部特效效果,例如翘曲和定位讲话引线(speech ballon)。
Vark图像处理语言解释器924
Vark包括具有一组丰富图像处理扩展的通用编程语言。它提供各种基元数据类型(整数、实数、布尔符号、字符)、各种用于构成更复杂类型(阵列、串、记录)的聚合数据类型、一组丰富算术算子和关系算子、条件与迭代控制流(如果—则—否则,当执行)以及递归函数和过程。它还提供了各种图像处理数据类型(图像、剪辑图像、褪光、查色表、调色板、色块矩阵、卷积内核等)、图形数据类型(字体、文本、通路)、一组图像处理函数(彩色变换、复合、过滤、空间变换以及翘曲、照明、文本设置以及润色)以及一组高级艺术函数(铺砌、着色以及笔画)。
从两个意义上说,Vark程序是可移植的。因为可以解释它,所以与CPU及其主机的图像处理引擎无关。因为它使用设备无关的模型空间和设备无关的彩色空间,所以它与输入的颜色特性和主输入设备的分辨率以及输出颜色特性和主输出设备的分辨率无关。
Vark解释器924对用于建立Vark脚本的源语句进行剖析,并产生可以表示脚本的语义的剖析树。剖析树上的节点对应于程序中的语句、表达式、子表达式、变量和常数。根节点对应于主过程语句列表。通过执行剖析树上的根语句,解释器执行该程序。剖析树上的每个节点均要求其子代正确评估或执行它们自己。例如,if语句节点具有3个子代—条件表达式节点、then语句节点以及else语句节点。if语句要求条件表达式节点对自己进行评估,而且根据返回的布尔值,要求then语句或else语句执行它们自己。它对于实际条件表达式或实际语句什么也不知道。
当在执行剖析树期间对大多数数据类型进行运算时,推迟对图像数据类型进行运算,直到执行了剖析树之后。这样可以优化成像过程,以便仅计算对最终图像起作用的那些中间像素。这样还可以通过进行空间细分,在多个通路内计算最终图像,从而减少所需的存储量。
在执行剖析树期间,每种成像函数仅返回成像图形—即,其节点是成像操作,而其leave是图像的图形,该成像图形是利用其相应成像操作作为根,而其图像参数作为根的子代构造的。当然,图像参数本身是图像图形。因此,每个连续成像函数返回更深的成像图形。
执行了剖析树之后,获得了与最终图像对应的成像图形。然后,利用下面的两种优化过程,以深度优先方式(与任何表达式树类似)执行该成像图形:(1)仅在给定节点计算对最终图像起作用的那些像素,以及(2)以可以使所需存储量降低到最少的顺序,执行节点的子代。以常数最终图像的优化顺序,执行成像图形中的成像操作。利用嵌入Artcam设备内的VLIM处理器加速计算机强化成像操作。如果执行成像图形所需存储量超过可用内存,则细分最终图像区域,直到所需内存不超过可用内存为止。
对于良好构造的Vark程序,第一优化过程本身不可能提供非常多的好处。但是,如果对最终图像区域进行细分,则该优化过程很可能提供显著好处。准确地说,该优化过程可以将细分用作减少内存要求的有效技术。推迟执行成像操作的结果之一是程序控制流不能取决于图像内容,因为在剖析树执行过程中,不知道图像内容。实际上,这不是严格限制,但是尽管如此,在进行语言设计期间,必须考虑到。
Guibas和Stolfi对推迟执行(或迟缓计算)成像操作的概念进行了描述(Guibas,L.J.,和J.Stolfi,“A Language for BitmapManipulation”,ACM Transactions on Graphics,Vol.1,No.3,July1982,pp.191-214)。他们同样在执行程序的过程中构造成像图形,而在后续图形评估期间,向后传送结果区域,以避免计算对最终图像不起作用的像素。Shantzis是在成像图形评估期间先前传送可用像素区(Shantzis,M.A.,“A Model for Efficient and Flexible ImageComputing”,Computer Graphics Proceedings,Annual ConferenceSeries,1994,pp.147-154)。Vark解释器使用Cameron描述的更复杂的多通路双向区域传播解决方案(Cameron,S.,“Efficient Bounds inConstructive Solid Geometry”,IEEE computer Graphics &Applications,Vol.11,No.3,May 1991,pp.68-74)。由于Shantzis的努力优化了将内存用量降低到最少的执行顺序,但是它基于标准编译理论(Aho,A.V.,R.Sethi,和J.D.Ullman,“Generating Code fromDAGs”,in Compiler:Principles,Techniques,and Tools,Addison-Wesley,1986,pp.557-567)。Vark解释器使用比Shantzis更复杂的解决方案,然而,可以支持可变大小的图像缓冲器。为了减少内存用量而结合区域传送细分结果区域也是Shantzis努力的结果。
打印机管理器908(参考图221)
打印机管理器提供图像打印业务。它控制嵌入Artcam内的喷墨打印机的硬件。它提供可以查询和设置打印机参数的抽象打印机控制接口和打印的图像。该抽象接口将该应用程序与打印机实现的细节去耦。该抽象接口包括下面的变量:
输出参数 |
域 |
存在介质 |
布尔数 |
介质具有固定页面大小 |
布尔数 |
介质宽度 |
实数 |
剩余介质长度 |
实数 |
固定页面大小 |
实数,实数 |
输出事件 |
无效介质 |
消耗的介质 |
插入的介质 |
卸下的介质 |
打印机管理器作为异步事件启动进程运行。它含有一组联动状态机,每个异步操作使用一个状态机。这些异步操作包括打印图像和自动安装打印卷。图224示出打印机管理器的软件结构。将在下面的各子小节说明各软件部件:
打印图像930
打印图像打印提供的图像。它使用VLIW处理器准备要打印的图像。这包括将图像彩色空间变换为设备专用CMY并以打印头希望的格式产生半色调二值数据。
在打印期间,打印纸缩回打印卷的凸出部分,从而允许卸下打印卷,并覆盖喷嘴以防止墨水泄漏和干燥。因此,在实际开始打印之前,不覆盖和清洗喷嘴,而打印纸前进到打印头。打印过程本身包括从VLIW处理器传送行式数据,打印行式数据以及进纸,直到完全打印了该图像。完成打印之后,利用切纸刀切割打印纸,然后缩回打印卷,之后,覆盖喷嘴。然后,更新打印卷上剩余的介质长度。
自动安装打印卷131
自动安装打印卷对插入和卸下打印卷产生响应。它产生打印卷插入和卸下事件,应用程序处理该事件,而且该事件用于更新状态显示器。根据嵌入打印卷的验证芯片与嵌入Artcam的验证芯片之间的协议,验证打印卷。如果该打印卷未通过验证,则将它退出。从打印卷提取各种信息。在打印过程中,使用打印纸和墨水特性。如果有,打印管理器就公开剩余介质长度和固定页面大小,然后,应用程序使用剩余介质长度和固定页面大小。
用户界面管理器910(参考图221)
图225更详细示出用户界面管理器,用户界面管理器提供用户界面管理业务。它包括:物理用户界面管理器911,用于控制状态显示器和输入硬件;以及图形用户界面管理器912,用于管理彩色显示器上的虚拟图形用户界面。用户界面管理器将虚拟输入和物理输入翻译为事件。将每个事件分别插入对该事件记录的进程的事件队列中。
文件管理器905(参考图222)
文件管理器提供文件管理业务。它提供统一分级文件系统,在该统一分级文件系统中,存在所有安装容量的文件系统。Artcam内使用的主要可拆卸存储介质是ArtCards。利用直接表示冗余RS编码二进制数据的二值点块,以高分辨率打印ArtCards。块结构支持在适当读—写ArtCards设备(Artcam未首先使用)中附加和附加—重写。高级ArtCards可以含有扩展的附加—可重写ISO9660 CD-ROM文件系统。图226示出文件管理器的软件结构,并特别示出ArtCards设备控制器。
网络管理器904(参考图222)
通过包括红外(IrDA)和通用串行总线(USB)的各种接口,网络管理器提供“电器”联网业务。这样可以使Artcam共享捕获的图像,而且可以接收图像进行打印。
时钟管理器907(参考图222)
时钟管理器提供日期和当天时间(time-of-day)时钟业务。它嵌入Artcam的后备电池实时时钟,并根据用户设置时间时执行的子校准,可以在自动调节时钟偏移的程度上控制它。
电源管理
在系统空闲时,它就进入静态电源状态,在该状态期间,仅周期性地扫描输入事件。输入事件包括按下按钮或插入ArtCards。一检测到输入事件,Artcam就重新进入活动电源状态。然后,该系统以通常的方式处理输入事件。
即使系统处于活动电源状态,与各模块有关的硬件通常仍处于静态电源状态。这样可以降低总功耗,而且尤其可以排除诸如打印机切纸刀的硬件部件,从而在它们工作时垄断使用电源。作为缺省,相机取向Artcam设备处于图像捕获模式。这意味着,相机是活动的,而诸如打印机的其他模块是静态的。这意味着,在不启动相机功能时,应用程序必须显式挂起相机模块。在其他模块变成空闲时,自然挂起其他模块。
监视时钟
系统产生周期性高优先权监视时钟中断。如果推断自从上次中断后该系统还未被改进,即,已经被破坏,则该中断处理程序复位该系统。
替换打印卷
在变换实施例中,提供了一种修改的打印卷,主要可以利用适于搭锁配合在一起的注塑成型塑料件构造该修改的打印卷。除了以某种方式简化了结构外,修改的打印卷的墨水存储容量大。为了简化结构,将要在其上打印图像的打印介质缠绕在塑料套管上。墨水介质储槽具有一系列通气口,构造该通气口以将从该通气口泄漏墨水的机会降低到最少。此外,对墨水出口设置橡胶密封圈,在将打印卷插入相机系统时,穿过该橡胶密封圈。此外,打印卷包括打印介质出口,而且该出口包括围绕安装的表面,围绕安装的表面有助于支持相对于打印系统或相机系统内的打印头,精确定位打印介质出口。
参考图227至图231,在图227中,示出了一个组装形式的打印卷单元1001,部分切掉示出该打印卷的内部。图228和图229分别示出左侧和右侧分解透视图。图230和图231是图227和图229所示内部核心部分1007的分解透视图。
围绕内部核心部分1007构造打印卷1001,该内部核心部分1007包括内部墨水源。在核心部分1007的外部设置套管1008,围绕套管1008缠绕打印纸源或胶片源1009。围绕打印纸源构造两个盖板1010、1011,这两个盖板围绕打印卷扣在一起,以形成覆盖单元,如图227所示。底部盖板1011包括槽1012,通过槽1012,输出打印介质1004,从而与相机系统互连。
设置两个夹送辊1038、1039以对夹送辊1040夹送打印纸,以便它们一起对围绕打印卷1040的打印纸去卷。去卷用于消除以打印卷形式长期保存的打印纸产生的强烈卷曲。设置夹送辊1038、1039以便与盖板基底部分1077形成搭锁配合,而包括用于驱动的齿形端1043的夹送辊1040与上部盖板1010搭锁配合,以使打印纸1004牢固地夹在它们之间。
盖板1011包括端部凸起或凸出部分1042。为了使打印纸的出口精确对准相机系统内的相应打印加热板结构,设置端部凸出部分1042。这样,为了将打印纸完全引导到打印头,相对于相邻打印头,准确对准或者定位输出的打印纸。
现在,参考图230和图231,图230和231示出可以利用注塑成型部分构造的、基于具有内部海绵体部分1034-1036的3芯墨水柱的内部核心部分的分解透视图。
在该核心部分的一端设置一系列通气通道例如1014-1016。每个通气通道1014-1016分别与具有外部触点1019的第一孔例如1018互连,外部触点与大气互连。通气通道例如1014经过的通路优先是自然弯曲的、向后弯曲和先前弯曲。利用设置在核心部分的该端之上的部分密封带1020密封通气通道。最好对密封带1020的表面进行疏水处理,以使它非常疏水,并因此而防止任何液体流入通气通道。
在核心部分1007的第二端设置橡胶密封帽1023,该橡胶密封帽1023包括3个加厚部分1024、1025和1026,其中每个加厚部分具有一系列细孔。例如,部分1024具有细孔1029、1030和1031。以每个单独加厚部分上的一个孔排列在一条线上的方式排列细孔。例如,细孔1031、1032和1033(参考图230)全部与不同细小部分的每个孔排列在一条线上。每个加厚部分对应于相应墨水源储槽,因此在穿过这3个孔时,与相应储槽实现液体连通。
设置端帽单元1044以便安装到核心部分1007上。除了包括3个齿的齿形衔接器(未示出)之外,端帽1044包括用于插入验证芯片的孔径1046,这3个齿通过相应孔(例如1048)插入、穿过密封帽1023的细小部分(例如1033)以及与相应墨水室(例如1035)互连。
此外,插入端部部分1044的是验证芯片1033,设置该验证芯片用于对相机系统使用该打印卷进行验证。因此,该核心部分被分割为3个不同的室,其中每个室内含有单独颜色的墨水和内部海绵体。每个室包括位于第一端的墨水出口和位于第二端通气孔。设置覆盖密封带1020用于覆盖通气通道,而设置橡胶密封帽1023用于密封墨水室的第二端。
内部墨水室海绵体和疏水通道可以使打印卷用于移动环境,而且可以具有许多不同的取向。此外,可以对海绵体本身进行疏水处理,以使墨水以有序方式从核心部分流出。
可以在核心部分的表面上设置一系列肋(例如1027),以便在核心部分1007与打印卷套管1008之间具有最小摩擦接触。
可以利用注塑成型塑料构造打印卷的大部分,而打印卷包括大内部墨水储量。除了用于实现最小泄漏的墨水室通气口,该简化结构还包括打印卷去卷机构。橡胶密封有助于与墨水源室实现有效连通,从而提供大操作容量。
当然,Artcards可以用于许多其他环境。例如,ArtCards可以用于对大量数据和配置信息提供用户友好界面的嵌入式应用和个人计算机(PC)应用。
这样可以产生大量可能应用。例如,可以将Artcards阅读器安装到PC。PC应用有许多,而且可以改变。最简单的应用是低成本只读分配介质。由于ArtCards是打印的,所以如果用于在公司内部进行数据分配,则它们提供审计追踪。此外,多次将PC用作闭路系统的基础,然而存在许多配置选择。不依赖于用户的复杂操作系统界面,简单将Artcards插入Artcards阅读器就可以提供所有配置要求。
尽管Artcards的背面具有与应用无关的同样可视外观,但是Artcards的正面与应用有关。它必须使用户明白该应用的范围。
因此,可以明白,图Z35所示的排列便于以书籍、报纸、杂志、技术手册等的形式有效分配信息。
在其他应用中,如图Z36所示,ArtCards 80的正面可以示出包括要对采样图像施加的艺术效果的图像。可以设置包括卡阅读器82的相机系统81,卡阅读器82用于读取卡80的背面上的编程数据,然后,对采样图像83施加算法数据,以产生输出图像84。相机单元81包括机载喷墨打印机和用于处理采样图像数据的足够处理装置。ArtCards原理的另一种应用是将公司信息存储到名片上,以下将该应用称为“BizCard”。BizCard是公司信息方面的新概念。如图Z37所示,bizCard的正面看上去象当今的常规名片,而且完全起当今的常规名片的作用。它包括照片和联系信息,有多少种名片,就有多少种不同的卡风格。然而,每个bizCard的背面含有打印的黑点和白点阵列,该阵列保存1-2兆字节关于该公司的数据。效果与使3.5”磁盘安装到每个名片上类似。
只要bizCard持有者愿意,信息可以是公司信息、特定产品清单、网点指针、电子邮件地址、简短简历。诸如安装在PC上的卡阅读器的ArtCards阅读器可以读取bizCard,该卡阅读器可以通过USB端口连接到标准PC。还可以在特定嵌入式设备上将bizCard显示为文档。对于PC,用户仅将bizCard插入其阅读器。这样,就象使用常规万维网浏览器的网点那样,优先导航bizCard。
仅通过包含拥有者的照片和数字签名以及公司的公开密钥的指针,每个bizCard就可以用于利用电子方法验证该人实际上就是他们要求的,而且他实际上的确在为给定的公司工作。此外,通过指出公司的公开密钥,bizCard还可以简单启动安全通信。
另一个应用是含有到一个城市的游客或访问者的信息的ArtCards的应用,以下将该应用称为“TourCard”。在将TourCard插入TourCard书形阅读器时,信息形式可以是:
●地图
●公共交通时刻表
●有趣的地点
●当地历史
●赛事和展览
●餐馆地址
●购物中心
TourCard是旅行小册子、游行指南以及街名录的低成本替代品。仅利用每张卡1%的制造成本,可以以最低成本,或者如果有广告资助可以免费,在旅游信息中心、饭店和旅游胜地分发TourCard。书形阅读器的便携性使得它成为旅游解说。还在信息亭使用TourCard,在信息亭,通过任何万维网浏览器,装备了ArtCards阅读器的计算机可以解码被编码为TourCard的信息。
正是书形阅读器的交互性使TourCard如此通用。例如,可以选择地图上的超文本链路显示特征建筑的历史记述。这样,利用随时可用的相关交通线路和时刻表,游客就可以开始有指南的城市旅游。TourCard使得不需要单独地图、指南、时刻表和饭店指南,而且可以对独立旅行者产生简单的解说。当然,数据卡可以具有许多其他用途。例如,报纸、研究指南、流行音乐卡、棒球卡、时刻表、音乐数据文件、产品部分、广告、TV导视、电影导视、交易显示信息、杂志内的可撕下卡片、处方、分类广告、医学信息、程序和软件、赛马指南、电子表格、年报、餐馆、饭店和度假指南、转播节目、高尔夫球场信息、新闻广播、连环漫画、天气详情等。
例如,ArtCards可以包括书籍的内容或报纸的内容。图Z35示出这种系统的一个例子,其中ArtCards包括位于一个表面上的书籍标题,而在第二表面上交易打印在其上的书籍的编码内容。将卡70插入阅读器72,阅读器72可以包括柔性显示器73,这样可以折叠卡阅读器72。卡阅读器72可以包括显示器控件74,显示器控件74可以先前和向后翻页,而且对卡阅读器72实现其他控制。