不使用加減號,使用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就可以完成功能。

  • 希望能幫到小夥伴,還請各位老鐵及時交流,共同進步,感謝你的閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章