孙丽在画串行通信控制器的波特率发生器,用计数器和比较器搭了一个可编程分频器,分频比可以从1到,覆盖从300到的所有常用波特率。
吕辰回到自己的绘图桌前,坐下来,翻开GY-cU-01主控核心的顶层电路图。
这是26颗芯片里最复杂的一颗。
指令译码器、程序计数器、堆栈指针、ALU、寄存器堆、中断控制器、总线接口,七个模块,每个模块少则几十个门,多则几百个门,全部要用手工画出来。
他已经画了三天,完成了指令译码器和程序计数器,正在画ALU算术逻辑单元。
ALU要做加减法、与或非异或、移位、比较,一共十几条指令。
他选择了标准单元库里的全加器单元,8位全加器需要8个全加器级联,每级的进位传递延迟加起来,最坏情况下要将近100纳秒。
4兆赫的时钟周期是250纳秒,时序上没问题。
但问题出在移位器上。
吕辰设计的移位器是桶形的,8位数据可以左移或右移1到7位。如果用标准单元库里的多路选择器搭,需要8x8=64个8选1多路选择器,每个多路选择器由十几个门构成,64个就是将近800个门,面积太大。
他在草稿纸上画了好几种方案,都不满意。
“吕辰。”
曾祺不知道什么时候站到了他身后,手里端着一个搪瓷缸子,眼镜片上反射着台灯的光。
“曾师兄,你来得正好。”吕辰把草稿纸转过来给他看,“移位器,我卡住了。桶形移位器面积太大,用循环移位寄存器面积小但速度慢,每条移位指令要移位N次,N个时钟周期,实时性不够。”
曾祺放下搪瓷缸子,弯下腰看了一会儿,然后拿起铅笔在草稿纸上画了一个图。
“用交叉开关矩阵。”他的笔在纸上飞快地画着,“8位输入,8位输出,中间用传输门阵列。左移一位,就是把输入的第0位接到输出的第1位,第1位接到第2位,依此类推。左移两位,就是第0位接到第2位,第1位接到第3位。用传输门实现,几十个管子就够了,比桶形移位器小一个数量级。”
吕辰盯着那个图看了几秒,脑子里飞快地模拟着。
传输门是cmoS工艺里的基本元件,一个NmoS加一个pmoS并联,用互补的控制信号打开或关断。用传输门搭交叉开关矩阵,确实比用多路选择器小得多。而且传输门的延迟很小,几个纳秒就能完成信号传递,一个时钟周期内可以完成任意位数的移位。
“这个好。”吕辰拿起铅笔,在草稿纸上重新画起来,“8位输入,8位输出,左移右移分开控制。左移时,输入的第i位接到输出的第(i+shift)位;右移时,输入的第i位接到输出的第(i-shift)位。shift值由指令的操作数决定,用译码器产生控制信号。”
曾祺在旁边补充:“传输门的控制信号要小心,不要出现竞争。两个传输门同时导通会把两根信号线短接。用译码器保证任何时候只有一个传输门导通。”
两个人又讨论了半个多小时,把移位器的方案定了下来。
吕辰在图纸上画了一个大大的方框,里面写上“桶形移位器(传输门阵列)”,然后在旁边标注:“待细化,预计门数约150。”
画完这一笔,他靠在椅背上,长长地吐了一口气。
窗外,天已经黑透了。路灯的光从窗户照进来,在图纸上投下一片昏黄。
设计区里的人少了一些,有人去食堂吃饭了,有人趴在桌上睡着了。
吕辰站起来,活动了一下僵硬的脖子,走到黑板前,看了一眼进度表。
26颗芯片,逻辑设计全部完成。
电路设计,完成了大约60%。
最复杂的几颗,主控核心、向量运算单元、存储控制器,还在攻坚。
按照这个进度,春节前能完成全部电路设计,开年之后送版图。
他在主控核心那一行后面画了一个半勾,表示进度过半。
然后他走回桌前,坐下来,继续画ALU。
日子一天一天地过。
设计区里的台灯从早亮到晚,从晚亮到早。
图纸越堆越高,铅笔越磨越短,搪瓷缸子里的茶越泡越淡。
有人在讨论中吵了起来,吵完了又坐在一起改图纸。
有人在半夜里忽然想通了一个问题,兴奋得拍桌子,把旁边睡着的人吓一跳。
有人画着画着趴在桌上睡着了,醒来发现图纸上压着一个油条,不知道是谁放的。
吕辰每天早上七点到所里,晚上十一二点回家,中间除了吃饭上厕所,全泡在设计区里。
他画完了ALU,画完了寄存器堆,画完了中断控制器,画完了总线接口。
每一张图纸都要反复