“1位、2位、4位,还有循环移位和算术移位。”钱兰说,“CORDIC算法里需要的是2^(-i)乘,也就是右移i位。i最大20,所以移位器要能实现1到20位的右移,但不可能每种移位都做一条指令,那样微程序就太长了。我们的方案是:移位指令里只指定移几位,具体的移位次数由微程序循环控制。”
吕辰点点头,这个思路是对的。
他又看向HX-2B,那个24位移位器的图标
旁边是24位加法器,再旁边是三个寄存器X、Y、Z。
“数据宽度24位,相当于7位十进制精度,科学计算够用了。”吴国华在旁边解释,“核心部件就这么几个,简单可靠。”
吕辰问:“CORDIC算法的迭代次数设了多少?”
“20次。”诸葛彪插话,“理论上迭代次数越多精度越高,但20次之后提升就不明显了。我们算过,20次迭代,误差小于10的负六次方,足够用了。”
吕辰点点头,又看向HX-2C,那个键盘扫描和显示驱动的图标
“键盘多少键?”他问。
“数字键0-9,小数点,正负号,一共12个。”吴国华掰着手指头数,“函数键s、s、tan、log、ln、e^x、x^y、√、1/x,这9个。模式键DEG/RAD、FIX/SCI,这2个。加起来23个,8×8矩阵够用。”
吕辰想了想,问:“编码方式呢?”
“行扫描,列检测。”吴国华说,“HX-2C定时扫描,检测到按键后向HX-2A发中断,HX-2A读键值,然后执行对应的微程序。”
吕辰点点头,这个方案成熟可靠。
“现在最大的分歧在这儿。”钱兰指着图纸上的显示部分,“显示方案,我们几个意见不统一。”
她把本子翻到另一页,上面画着几种显示方案的对比表格。
“吴国华和诸葛彪倾向继续用辉光管。”钱兰说,“理由是技术成熟,我们有积累,而且外观好看,显示数字清晰明亮。”
吴国华点点头:“辉光管的效果确实好,红星一号上用的就是辉光管,美观,能增加市场竞争力。”
吕辰点头:“辉光管的数字是橙红色的,特别醒目。用户一看,就觉得这玩意儿高级。”
“但辉光管的问题也很明显。”钱兰说,“第一,耗电大,阳极电压要170伏,得专门做一个高压电源。第二,寿命短,用个几千小时就老化。第三,国产的辉光管质量不稳定,经常出现数字显示不全的问题。”
她从桌上拿起一份资料,递给吕辰:“这是我查的荧光数码管的资料。上海电子管厂生产的YS-13系列,阳极电压20伏,功耗只有辉光管的十分之一,寿命长,而且已经实现了国产化,成本低。”
吕辰接过资料,仔细看着那些参数。
荧光数码管显示的是一种绿色的荧光,亮度均匀,数字清晰。
虽然不如辉光管那么“高级”,但胜在实用、可靠。
“第三个方案是边光显示。”钱兰说,“就是白炽灯泡加数字模板,但那个可靠性太差,灯泡容易烧,模板容易卡住,我们直接排除了。”
吕辰看完资料,抬起头:“我支持钱兰的方案。”
吴国华愣了一下:“你也支持荧光管?”
“对。”吕辰说,“辉光管确实好看,但咱们做的是科学计算器,不是摆设。第一要考虑实用,第二要考虑成本。荧光管省电、寿命长、便宜,这三条,辉光管都比不了。”
吴国华皱起眉头:“可荧光管的显示效果,跟辉光管差着一截呢。”
“差在哪儿?”吕辰问。
吴国华想了想,说:“辉光管的数字是立体的,浮在玻璃管里,看着就有层次。荧光管是平面的,贴在玻璃上,看着就……就普通。”
吕辰笑了:“普通就对了。咱们的产品,是要大量生产、大量销售的。普通,意味着成本低,意味着可靠,意味着用户买得起、用得住。那些花里胡哨的东西,等以后技术成熟了再说。”
他补充道:“荧光管不是不能做得好看。12位显示,科学计数法,尾数8位,指数2位,符号1位,正负号1位,排列整齐,显示清晰,往那儿一摆,一样有科技感。”
钱兰在旁边补充:“驱动方式我和谢凯讨论过,HX-2C输出BCD码,经译码器或者分立元件驱动显示。显示格式采用科学计数法,尾数8位加指数2位加符号,比如‘-1. -03’,这样用户一看就懂。”
吴国华沉默了一会儿,然后叹了口气:“行,你们说得对。我就是有点舍不得辉光管那个效果。”
钱兰道:“讲美术功底,我们都不如谢凯,他也觉得实用第一,好看第二。”
吕辰拍了拍吴国华的肩膀:“放心,等以后工艺进步了,集成度高了,咱们再做高端型号,用更好的显示方案。”
钱兰在图纸上写了几笔,把显示方案正式定为荧光数码管。
她抬头看着吕辰:“微程序控制这一块,我们还有一些细节要确定。夏先生那边给了很多指导,但具体实现还得自己摸索。”
吕辰点点头:“你说。”
钱兰指着图纸上的HX-2A:“微程序ROM,256条微指令,每条24位。这个规模,用‘掐丝珐琅’工艺做固定布线,可行。但问题是,微指令怎么设计?CORDIC算法的一个迭代步,需要几个微指令?”
这个问题问到点子上了。
吕辰想了想,说:“CORDIC的一次迭代,大概需要这几步:判断Z的符号,决定旋转方向;X、Y、Z分别执行移位和加减;判断迭代次数是否达到上限。这些操作,如果能在一个微指令周期内完成,那一个迭代步就只需要一条微指令。”
吴国华皱起眉头:“一个周期内完成这么多操作?移位、加减、判断方向、判断次数……这控制逻辑太复杂了。”
他顿了顿:“我和谢凯师兄倾向于分成两个微指令。第一条,判断Z符号,决定旋转方向,然后执行移位和加减。第二条,判断迭代次数,更新计数器,然后跳转。”
钱兰摇头:“两个微指令,一个迭代步就要两个周期。20次迭代,就是40个周期。再加上初始化和收尾,算一个角度可能要50个周期。这个速度,能接受吗?”
吕辰在心里算了算:“能接受,微指令周期大概几微秒,50个周期就是几百微秒,算一个角度半毫秒。按下一个键,等半毫秒出结果,感觉不到延迟。”
钱兰点点头,在本子上记了一笔:“那就按两个微指令一个迭代步来设计。第一条微指令,操作码是‘CORDIC_STEP1’,完成移位和加减,同时把Z的符号存到状态寄存器。第二条微指令,操作码是‘CORDIC_STEP2’,根据状态寄存器的值判断方向,同时更新迭代计数器,检查是否完成,如果没完成就跳转回第一条。”
吕辰问道:“微程序的跳转你们想如何实现?”
钱兰介绍道:“我们的思路是用条件跳转。微指令里有4位条件跳转字段,可以指定跳转条件。比如‘如果迭代计数器小于20,跳转到微地址XX’。这样就能实现循环。”
吕辰点头:“这个思路对。”
几个人围着图纸,一条一条地往下讨论。
从微指令的格式,到CORDIC迭代器的具体实现;从输入键盘的编码方式,到显示驱动的时序要求;从对数函数的计算流程,到指数函数的精度控制……
每一个细节都反复推敲,每一种可能都考虑周全。
钱兰在本子上记得密密麻麻,吴国华和吕辰不时插话,提出自己的见解。
不知不觉,太阳已经升得老高。
院子里传来笑声和饭菜的香味。
李鹃的声音远远飘来:“吃饭了!都别忙了!”
三人抬起头,对视一眼,都笑了。
“走吧,先吃饭。”吴国华站起来,“下午接着聊。”
院子里,阳光正好。
一张大桌子摆在槐树下,上面摆满了碗筷和饭菜。
“来来来,坐坐坐!”王卫国招呼着大家,“今天人多,热闹!”
吕辰在娄晓娥旁边坐下。
他伸手摸了摸小吕晓的脸,小家伙转过头看他,眼睛亮晶晶的。
“聊完了?”娄晓娥问。
“差不多了。”吕辰说,“下午再确认几个细节,就定稿了。”
娄晓娥点点头,没再问。
饭菜陆续上桌,有红烧肉、炒鸡蛋、凉拌黄瓜,还有一大盆西红柿蛋汤。
不是什么山珍海味,但胜在实在,每一道都透着家常的香气。
王卫国举起酒杯:“来,今天高兴,都喝一点。第一杯,敬小吕晓,咱们红钢小院最小的客人!”
大家都笑了,举起杯。
吕辰也举起杯,喝了一口。
酒是普通的二锅头,辣辣的,烧喉咙。
但喝下去,心里暖洋洋的。
阳光从槐树叶子的缝隙里洒下来,在地上落下斑驳的光影。
蝉鸣声从远处传来,是这个夏天特有的背景音乐。
槐花飘落,带着淡淡的香气。
日子就这样,一天一天,慢慢往前走。