昨天碰巧看了一下求职相关的题目,最开始是看到NVIDIA ASIC design的笔试和面试题目,后来有找了一些公司AMD,华为的ASIC和FPGA的相关题目,发现都有涉及一些小的逻辑算法(虽然本人对这种考察方式并不认同,跟考试没啥区别)。但是想起来自己很久以前在项目中还真遇到过一个小的逻辑算法问题,虽然对整个系统并非关键路径,但是当时仍然精益求精,找到了一个最优的方法去解决。这些东西虽然没什么大用处,但是多积累一些也没有坏处。
First one:
这个是几年前项目中遇到的一个问题,判断一个数是否为2的整数幂,对于二进制数来讲就是判断其只有一个bit位是1.
今天工作中遇到一个问题就是判断一个数是否为2的整数幂,当然是对于二进制数,这个问题可以转化为此std_logic_vector中是否仅有一个1的问题,开始我想通过计数判断的方式,但是这样做逻辑比较复杂,延时也较长,于是google了一下,没想到真的有更好的方式,在微软面试题中找到了这样一个问题就是求int型1的个数的问题,其中有一种比较高效的解决方法就是01 000 000 &(01 000 000 - 00 000 001),如果该数仅有一个1,那么结果为0,如果不为1个1,那么结果为1,这样仅需要一个减法和求与逻辑即可解决这个问题,2拍足够完成。
Second one:
复数乘法的问题,这个问题当前宽带DBF中有用到(复滤波器,复数加权),很多笔试面试题目中也有,最少只需要3个乘法器就可以实现一次复数乘法:
具体的实现方式是,复数乘法可以用如下表达式(I1+Q1i)*(I2+Q2i)=(I1*I2-Q1*Q2)+(I1*Q2+I2*Q1)i
这里设X=I1*I2-Q1*Q2,Y=I1*Q2+I2*Q1,首先计算Y需要两个乘法器和一个加法器,其次再算X的时候可以采用如下方法,首先计算(I1-Q1)*(I2+O2)=I1*I2-Q1*Q2+I1*Q2-I2*Q1,而I1*Q2和I2*Q1在计算Y的时候已经得到了,因此整个复数乘法只需要3个乘法器即可实现,比传统方式资源减少25%。总结下来,这种方式实现一次复数乘法需要3个乘法器,2个加法器