1967年10月24日,京城已入深秋。
所里的老槐树,叶子黄了大半,风一吹,哗啦啦往下落,在地上铺了薄薄一层。
主楼顶上的高音喇叭照例在中午播报着最新指示,声音从高处传下来,穿过那些飘落的黄叶,传到右附楼走廊里时已经模糊成一片嗡嗡声,像远处河滩上磨石的声音。
没有人关掉它,也没有人认真在听。
吕辰站在办公室窗前,点了一根烟,慢慢抽着。
键合机的动员会已经过去一个多月。各协作单位的人陆续到位,运动平台、光学系统、材料工艺都在按计划推进。
包康建带着哈工大的人已经在6305厂设备中心搭起了实验台,秦世襄那边显微镜和摄像头的选型也基本定了。
方教授的微波辅助对准方案还在论证,但陈光远说“可以先放一放,主通道走通再说”。
但最核心的问题,对准算法,一直没有定论。
用微程序做图像处理,一张256乘256的图,十几万次操作,把午马机搬出来都扛不住。
用硬件做,怎么设计?架构是什么?数据怎么流动?这些问题,理论组论证了快一个月,方案出了四五版,每一版都被推翻重来。
他把烟掐灭,正准备去自动化控制中心,门被推开了。
诸葛彪站在门口:“陈教授到了,第三会议室。”
“到了?什么时候到的?”
“刚到,钱兰已经过去了。”
吕辰拿起笔记本就往外走,二人来到第三会议室,陈教授已经坐在了主位。
他穿着一件藏蓝色的中山装,领口的扣子系得整整齐齐,头发梳得一丝不苟,花白的鬓角在日光灯下泛着银光。
但吕辰注意到,他眼睑下方有一圈青黑,手指关节处还沾着一点墨渍,大概是熬夜写方案时留下的。
面前摊着厚厚一沓图纸,最上面一张画满了框框和数据流,旁边还放着一个搪瓷缸子,里面泡着茶,茉莉花的香味在会议室里弥漫开来。
钱兰坐在他对面,笔记本已经翻开,手里握着笔,随时准备记。
“陈教授。”吕辰走进去,在钱兰旁边坐下。
陈教授抬起头,看了他一眼,嘴角微微动了一下,算是笑了。
“小吕来了,坐。”他低头看了看表,“设计院的筹备工作、午马机的微程序设计,事情堆在一起,键合机的算法拖了几天。今天咱们把它定下来。”
吕辰心里一喜,设计院在筹备了,这是好事。
陈教授翻开第一张图,那是一张巨大的系统架构图,画满了方框和箭头,用不同颜色的笔标注,每一根线条都画得工工整整。
图纸的边角有几处被橡皮擦过的痕迹,擦得不干净,还留着淡淡的铅笔印,说明改过不止一版。
“键合机对准算法,理论组经过充分论证,总算是敲定了初步方案。”他顿了顿,声音里有一丝疲惫,但更多的是笃定,“我们的方案是,把二维问题变成一维流水线。”
吕辰心里一动,往前倾了倾身子。
陈教授拿起一支铅笔,在图上的空白处画了一个简图。
“如果是用微程序做图像处理,一般的思路是先把整帧图像存到内存里,然后逐像素遍历,做各种计算。这需要大量的存储空间和随机访问。”
他在图旁边写了一行字:整帧存储 → 逐像素遍历 → 大量RAM + 随机访问。然后划掉了。
“硬件做图像处理的思路完全不同。”
他在
“摄像头输出一行像素,硬件就在这一行上实时处理。不存储整帧图像,只存‘必要的最小状态’。”
钱兰在笔记本上飞快地记着,笔尖沙沙作响。诸葛彪把嘴里那根烟拿下来,放在桌上,身体往前倾,眼睛一眨不眨地盯着图纸。
窗外,一片黄叶被风吹起来,贴在玻璃上,停了两秒,又被吹走了。
陈教授翻开第二张图。那是一张图像预处理的数据流图,左边是一个摄像头图标,右边是一系列方框,箭头从左往右流动。
“第一步,图像预处理。”
他用铅笔指着最左边的图标:“摄像头输出的模拟视频信号,通过ADC转换为数字像素流。假设分辨率256乘256,8位灰度,逐行扫描。每行256个像素,每个像素的灰度值0到255。”
他的手指移到第二个方框。
“用滤波降噪,消除单个像素的随机噪声。硬件实现可以用一个3乘3的滑动窗口寄存器。”
他在图上画了一个3乘3的网格。
“像素流 → 行缓存 → 3乘3窗口寄存器 → 排序网络 → 输出。行缓存需要存储上一行和上两行的像素,每行256个像素,每个8位,共256乘8乘2等于4096位寄存器。”
吕辰听到这里,举起手。
“陈教授,我插一句。”
陈教授停下笔,看着他。
“您用的是均值滤波?”
“对,均值滤波。”
吕辰摇了摇头:“均值滤波需要乘法器。像素值乘系数,再累加,再除法。乘法器在五微米工艺
他在自己笔记本上画了一个简图,推到桌子中间。
“我建议用中值滤波。中值滤波只需要比较器,不需要乘法器。九个像素的值,找中间那个。比较器比乘法器简单得多,面积小、速度快。”
陈教授盯着那张图看了几秒。
他没有立刻回答。
会议室里安静了两秒,只有日光灯的嗡嗡声。
然后他忽然笑了一下,很轻,像是在对自己说。
“你说得对。我想复杂了。”
他用笔在图纸上改了一笔,把“均值滤波”划掉,写上“中值滤波”。
“排序网络,九个数找中值,用九个比较器搭成排序网络。纯组合逻辑,一个时钟周期就能输出结果。”
钱兰在旁边插了一句:“九个比较器,面积大概多大?”
陈教授想了想:“按你们标准单元库里的比较器来算,八位的,大概几十个门。九个,加上连线,几百个门。可以接受。”
他在笔记本上记了一笔,然后继续往下讲。
“接下来是对比度增强。”
他在图上画了一个新的方框。
“焊盘是金属的,反光强,灰度值高。背景是陶瓷或者塑料的,反光弱,灰度值低。对比度增强就是让这种差异更明显。硬件实现用查找表。输入8位灰度,输出8位灰度。映射关系预先算好,固化在ROM里。”
钱兰立刻接话:“256乘8位的ROM,约2048个存储单元。面积很小,没问题。”
陈教授点了点头,手指移到下一个方框。
“最关键的一步,自适应二值化。”
他在方框旁边写了一行字:把灰度图像变成黑白二值图像(0=背景,1=焊盘)。
“为什么不能用固定阈值?因为光照不均匀。芯片中间和边缘的亮度可能不一样,固定阈值会导致中间焊盘能识别、边缘焊盘被漏掉。”
他抬起头,看着三个人。
“所以要用局部自适应阈值。取当前像素周围N乘N区域的灰度均值,以此为阈值。”
他在图上画了一个示意图,一个像素周围围着八个邻居,组成3乘3的区域。
“局部均值的计算不需要乘法器。九个像素的和可以用加法树实现,除以九可以用移位加法近似。”
诸葛彪开口了:“加法树的速度呢?”
“一个时钟周期。”陈教授说,“九个8位数相加,用三级加法树,每级延迟几十纳秒。一兆赫的时钟周期是一微秒,绰绰有余。”
他在纸上算了一下,然后抬起头。
“预处理部分,到此结束。输入模拟视频,输出二值化像素流。全部硬件实现,每一行像素进来,实时处理,实时输出,没有帧延迟。”
他在图纸上画了一条横线,表示第一部分结束。
然后翻开第三张图。
“第二步,特征提取。”
他的声音提高了一些,铅笔在纸上点了几下。
“这是整个算法中最核心、最巧妙的部分。”
吕辰盯着那张图,心跳微微加速。他知道,这才是真正的难点。
陈教授拿起粉笔,在黑板上画了一行二值化的像素:0 0 0 1 1 1 1 1 0 0 0 0。
“这一行像素,连续的白像素从第4列到第8列,长度5。我们可以把它压缩成一个线段:start=4, end=8, length=5。”
他在
“硬件实现非常简单,只需要一个状态机加两个计数器。扫描一行像素,遇到从0变1就记录start,遇到从1变0就记录end,输出一个游程。”
钱兰在笔记本上飞快地记着,嘴里小声重复:“状态机加两个计数器。”
陈教授继续往下讲。
“有了游程,下一步是连通域标记。找出哪些游程属于同一个焊盘。”
他在黑板上画了三行像素的示意图,用红笔把重叠的部分圈出来。
“关键观察:当前行的游程和上一行的游程,如果列范围重叠,就属于同一个连通域。硬件实现只需要存储上一行的游程标记结果,每列一个标记。”
诸葛彪皱起了眉头:“每列一个标记?256列,就是256个标记。每个标记需要多少位?”
陈教授想了想:“最多同时有多少个焊盘在一行里?假设焊盘直径10个像素,一行最多二十几个焊盘。用5位标记就够了。256乘5等于1280位寄存器,可以接受。”
他顿了顿,铅笔在纸上点了一下。
“标记的时候有个麻烦,当前行的游程可能同时和上一行的两个游程重叠,那两个游程属于不同的连通域,但被当前行连在一起了。这叫‘等价标记’。”
他在黑板上画了一个“工”字形的例子,然后停顿了一下。
“这个问题,我想了整整一周。”
他的声音很轻,像是在自言自语。会议室里安静了一瞬,三个人都没有说话。
然后他拿起粉笔,在黑板上写了几个字:优先级编码器。
“用优先级编码器做硬件实现。256个prev_bel并行比较,找出第一个非零的。不需要循环,一个时钟周期搞定。”
钱兰道:“这个巧妙。用空间换时间。”
陈教授点了点头,继续往下讲。
“有了连通域标记,下一步是质心计算。”
他在黑板上写了两行公式:
X_troid = (Σ x) / N
Y_troid = (Σ y) / N
“累加每个连通域内所有像素的X坐标和Y坐标,最后用除法求平均。硬件实现需要每个连通域有一套累加器。假设最多同时有32个焊盘在视野里,每个累加器需要X累加器、Y累加器、像素计数器。”
他在纸上估算了一
“X坐标范围0到255,8位就够了。但累加时,一个焊盘可能有几十个像素,8位会溢出。用16位累加器,每个域三个16位寄存器,32个域,共32乘3乘16等于1536位寄存器。可以接受。”
“扫描结束后,对每个焊盘,用除法器计算质心。除法器的硬件实现用移位减法,32位除以16位,约16个时钟周期完成。对键合机来说,扫描结束后花几百微秒算除法,完全可以接受。”
吕辰听到这里,心里已经有了底。
这个方案,可行。
陈教授翻开第四张图。
“第三步,位置偏差计算。”
他指着图上一个极简的方框。
“这一步最简单。理想坐标存在ROM里,实测坐标来自第二步的质心计算结果,做减法。”
他在图上画了一个小框图。
“但有一个问题,需要知道‘当前对准的是第几个焊盘’。一颗芯片可能有几十个焊盘,必须按顺序一个一个对准。”
他顿了顿,在图上加了一个地址计数器。
“焊盘序号 → ROM(存储理想坐标)→ 减法器 → 输出ΔX, ΔY。按照预设顺序,从左到右、从上到下。芯片设计时就已经定好了焊盘的顺序,键合时按这个顺序执行。”
诸葛彪插了一句:“这个ROM里的理想坐标,从哪儿来?”
陈教授看了他一眼:“从芯片的版图设计数据里来。芯片设计完成后,每个焊盘的位置是确定的。把这些坐标提取出来,固化到ROM里。不同型号的芯片,换不同的ROM。”
他估算了一下:“约1000个门,面积很小。甚至可以和特征提取芯片集成,但为了模块化和并行处理,单独做一块也有道理。”
陈教授翻开第五张图。
“第四步是运动控制。”
他在图上画了一个PID控制器的框图。
“输入目标位置,来自偏差计算芯片,加当前位置,来自光栅尺反馈,输出压电陶瓷驱动电压。内部架构是一个PID控制器的硬件实现。”
他在黑板上写了PID的标准公式:u(t) = Kp·e(t) + Ki·∫e(t)dt + Kd·de(t)/dt。
“比例项、积分项、微分项,每一项都需要乘法器。硬件实现用8乘12乘法器,可以串行实现以节省面积,也可以并行实现以追求速度。”
他在纸上估算了一
“约到个门,是这几块芯片中最复杂的。面积可能到60到80平方毫米。”
80平方毫米,将近1厘米乘0.8厘米。在五微米工艺下,这已经是非常大的芯片了。吕辰在心里盘算了一下,没有立刻表态。
陈教授继续往下讲。
“另外还需要插补器。X轴和Y轴需要协同运动,不能一个动一个不动。需要一个小型CORDIC或者简单的逐点比较法插补器。”
他在图上又加了一个方框。
“再加上一个超声焊接控制芯片,控制键合头的超声振动、压力、时间。”
他翻开第六张图。
“输入焊接指令,来自总控状态机,加压力传感器反馈,输出超声发生器使能信号、压力调节信号、时间计数器。内部架构相对简单,主要是一个精密定时器加状态机。压力控制可以用一个简单的比较器,压力传感器反馈与设定值比较,高了减压,低了加压。”
他估算了一下:“约5000个门。”
最后,他翻开第七张图。
“总控状态机,系统的‘大脑’。”
他在图上画了一个圆形的状态转移图。
“用标准单元搭一个有限状态机,控制整个键合流程。”
他在状态转移图上标出了每一个状态:空闲 → 移动到焊盘1 → 对准 → 键合 → 移动到焊盘2 → 对准 → 键合 → …… → 完成。
“状态不多,十几个。用标准单元库里的触发器搭就可以,不需要单独的芯片。”
讲完算法设计,陈教授把七张图摊在桌上,排成一排。
从左到右,图像采集、预处理、特征提取、位置计算、运动控制、超声焊接——六个方框,箭头从左往右,整整齐齐。
“整体架构是一个四级的流水线专用处理器。每一级由一块专用芯片实现,数据在芯片之间直接传递,没有中间存储,没有数据搬移,没有微程序解释执行的开销。”
会议室里安静了几秒。
吕辰盯着那些图纸,脑子里飞快地转着。
图像预处理芯片,约5000个门。焊盘特征提取芯片,约8000到个门。位置偏差计算芯片,约1000个门。运动控制芯片,约到个门。超声焊接控制芯片,约5000个门。加起来,三万到四万个门。
在五微米工艺下,每平方毫米大约能集成200到300个门。
四万个门,挑战不小!
吕辰端起搪瓷缸子想喝水,发现水已经凉了。
他把缸子放下,开口说:“陈教授,这个架构,可行。”
陈教授看着他,没有说话,等着他往下说。
“功能划分清晰,每块芯片只做一件事,专芯专用。最复杂的运动控制芯片约两万门,在五微米工艺用芯片,可以挑战一下。”
他顿了顿,又说:“但我有几个问题。”
“你说。”
“第一,行缓存的面积。您刚才说每行256个像素,每个8位,两行就是4096位。这是寄存器,不是存储芯片。4096位寄存器,面积不小。能不能用存储芯片来做行缓存?”
陈教授想了想:“可以。但存储芯片的读写时序和寄存器不一样,需要加控制逻辑。不过面积能省不少。这是一个好建议,回头细化的时候可以优化。”
吕辰点了点头,继续问。
“第二,连通域标记的优先级编码器。256个并行比较,一个时钟周期出结果,这个逻辑的扇入扇出会不会太大?时序能收住吗?”
陈教授拿起铅笔,在纸上画了一个树状结构图。
“用二叉树结构。第一级128个比较器,第二级64个,第三级32个,依此类推。七级就能出结果。每一级的扇入扇出控制在4以内,时序没问题。”
吕辰看着那个树状图,心里踏实了。
“第三,运动控制芯片的PID算法。Kp、Ki、Kd三个系数,是固定的还是可调的?”
“可调的。”陈教授说,“不同型号的压电陶瓷微动台,响应特性不一样。系数存在寄存器里,出厂时校准。甚至可以在键合过程中动态调整,适应不同工况。”
吕辰点了点头,表示没有问题了。
钱兰这时候开口了。
“陈教授,我还有一个问题。您这个方案,需要多少存储?不是寄存器,是真正的存储。”
陈教授想了想:“行缓存可以用存储芯片做,256乘8乘2等于4096位,约0.5KB。特征提取芯片的累加器,32个域,每个域三个16位累加器,共1536位,约0.2KB。其他零散的,加起来不到1KB。”
他看着钱兰:“1KB的存储,在五微米工艺下,面积大概多大?”
钱兰在笔记本上算了一下:“存储芯片的密度比寄存器高得多。1KB,约8000位,面积大概10到15平方毫米。可以接受。”
陈教授点了点头,把桌上的图纸收拢,摞成一摞。
“好。方案我讲完了。你们觉得,能不能干?”
吕辰没有立刻回答,而是看向钱兰和诸葛彪。
钱兰合上笔记本,点了点头:“把二维问题变成一维流水线,这个思路,简直太好了。每块芯片的规模都在可接受范围内。能干。”
诸葛彪也点了点头,但他又举起手:“陈教授,我还有一个问题。”
“说。”
“逻辑设计、版图绘制、仿真验证,这些工程上的事,我们来。但是图像处理芯片里的滤波算法、连通域标记的等价合并、PID参数整定,这些数学上的东西,得请你们帮忙。”
陈教授点点头:“没问题,这本就是理论组的事。”
吕辰感叹道:“五块芯片,每块都要从零开始设计,逻辑图、版图、仿真、流片、测试。工作量不小。”
陈教授端起搪瓷缸子喝了一口水,水已经凉了,他也没在意。
“工作量是大,但这个项目是总装给的军令状,拖不得。”
他放下缸子,目光从三个人脸上扫过。
“咱们要在两个月之内拿出逻辑设计,春节之前版图画完,开年就送中试线。”
吕辰在笔记本上写下这几个时间节点,然后在旁边画了一个倒计时。
“陈教授,数学模型什么时候能给我们?”
“一个月。”陈教授说。
他顿了顿,又补了一句:“西军电那边,秦教授可以帮忙验证信号处理部分的算法。他们对图像处理有经验,可以帮我们看看中值滤波窗口大小、二值化阈值的选取这些参数。”
钱兰在旁边记了一笔:“西军电,信号处理算法验证。”
诸葛彪把烟点上,吸了一口,慢慢吐出来。
“陈教授,还有一个问题。”
“说。”
“您这个方案,是五块专用芯片。但如果以后算法要升级,或者要适配不同型号的芯片,比如有的芯片焊盘是圆的,有的是方的,有的是矩形,那是不是要重新设计芯片?”
陈教授笑了。
“这也是理论组一直争论的点之一。我们最后认为,专用芯片的灵活性确实不如微程序。但键合机的对准算法,本质上是稳定的。焊盘形状可能有变化,但特征提取的逻辑是通用的,不管焊盘是圆是方,都能用。”
他想了想,又说:“至于参数调整,比如中值滤波窗口大小、二值化阈值、PID系数,这些可以做成可配置的。在芯片里加一些寄存器,参数从外部加载,不用改芯片设计。”
诸葛彪点了点头,没有再问。
吕辰把笔记本合上,站起来,伸出手。
“陈教授,这个方案,我代表红星所集成电路实验室,正式接受。”
陈教授握住他的手。
“好。那咱们就这么定了。”
钱兰和诸葛彪也站起来,四个人围在桌前,看着那七张摊开的图纸。
夕阳从窗户照进来,照在那些密密麻麻的方框和箭头上,照在陈教授花白的鬓角上。