咋看之下这道题颇为蛋疼,因为估计现在没有谁会傻逼兮兮的去这样做。现在动辄就是HDL语言一写就完了,以后估计就是C语言一写或者OpenCL语言一写就完了。但是为什么要考这道题?我认为出题者主要是想考察应聘者的逻辑能力以及数字逻辑电路的基础知识。
其实解决一个问题,最关键的在于抓住核心。这个题目的核心在哪里?我们首先应该从不同点去找。32bit要拆封成两个16bit加法器,困难在哪里?我们就要回忆一下,加法器的核心是什么?是1位全加器。把一位全加器串联起来,就是多位的加法器。32bit改两个16bit加法的最大问题在哪里?就是低16bit的加法器有可能进位上去影响高16bit加法器的结果,可能会造成高16bit加法运算出错。
那解决这个核心又在哪里呢?群里面七嘴八舌的议论了半天,其实都没有议论到点子上面,什么加1取反之类的都来了。
既然出问题的是进位,那解决问题的核心就是干掉进位!如何能干掉进位?那就看如何会产生进位。从全加器的真值表来看,输入端位a,b,cin,输出端位s,cout,其中如果a,b,cin中有任意两位为1,那么都会进位。要干掉进位怎么办?就是强制输入为0.
再具体到这个问题,在哪里打断进位呢,就是在第15个bit。对于32bit的加法器,输入为a[31:0],b[31:0],输出为s[31:0],cout。解决这个问题就是把加法器的a[15],b[15]旁路,强制给这两位输入0,那么此时的s[15]就等于a[14:0]+b[14:0]的进位。而不会再向上产生进位了。高16bit的结果就独立了。
剩下低16bit的最高位怎么办?好办啊!a[15],b[15]s[15]作为全加器的输入,用门电路再做一个全加器不就把最高位的值求出来了嘛。
于是,这题就这么顺理成章的解开了。
这道题其实考察的就是两点:1、对于全加器这种基本的数字逻辑器件,掌握了没有,理解了没有,2、基本的分析问题能力和逻辑推理能力。要做一个好的IC设计者很难的,很多时候我们虽然不用再纠结于这种很蛋疼的问题,但是通过基本的逻辑推理和电路变换从而达到从架构上优化设计的能力,这个题目却真的能考查出来一点点。之前帮朋友的公司面试,经常有很多不知天高地厚的本科微电子应届小p孩,因为自己写了几十行HDL代码就能做数字IC前端设计了。以后要是有机会,我会让他们试试这道题,让他们知道:会写代码和会写字一样,只是非常基础的东西。如果会写字就能当作家,那诺贝尔文学奖估计每分钟都要颁次奖才行。