不使用加减号,使用verilog实现多位加法器功能

如何在不使用加减号的情况下,用verilog实现多位加法器的功能呢?

  • 其实这一道FPGA面试的的题目,原理很简单,希望能对即将毕业想从事FPGA的小伙伴能起到一定的帮助(大马猴表示想和很多小伙伴交流共同成长)。

  • 拿到这道题的时候首先想到不用加减号,那沾边的可能是“异或”,或者是“移位”,因为在编写verilog时候若出现乘法(除法)的时候,是通过移位实现的。举个例子:a x10(表示的是a与10进行相乘),若不使用乘号,则可以这样表示:ax10=ax(8+2)=ax8+ax2=a<<3+a<<1,8表示2的三次方,左移三位,2表示2的一次方,左移一位,然后进行相加,但是记住:在verilog中移位的优先级比较低,通常要在移位的位置打上小括号进行优先计算(除法同理)。

  • 回归正题,思路走到这个位置,已经完成了一大半。先贴答案,其实就是两句话,很容易,先上答案:
    1.a = a ^ b
    2.b = (a & b) << 1
    3.重复1、2步骤直到进位值为0

  • 完事,相信很多小伙伴已经明白了(没错,一开始我就是那很少的不明白的小伙伴。)没事,咱来一步一步分析举例子呗,反正今天不加班 :)

  • 首先相异或,无非就是四种结果,0^0 = 0, 0^1=1, 1^0=1,这三种是不产生进位的, 1^1=0 是产生进位的,这个时候在没有进位(也可以说不考虑进位的时候),a+b就可以用a^b来进行计算,结果为d。如 d=0010^0011=0001。

  • 接着就要考虑进位了,这时候也是四种结果,0&0=0,0&1=0,1&0=0,这三种是没有进位的情况,1&1=1,所以只有在a和b其中的某位同时为1有进位的时候,结果才会为1,这个时候产生了进位,0010 & 0011=0010,这个进位是要往高位进的,但是仅用&的话,进位就留在了原位上,这个时候用<<1,即左移一位,将进位移到高一位上变成e=0100

  • 重复1、2步骤直到进位值为0就可以完成功能。

  • 希望能帮到小伙伴,还请各位老铁及时交流,共同进步,感谢你的阅读。

你可能感兴趣的:(verilog,fpga,加法器)