基於FPGA的除法器原理介紹及設計實現
引言應用
在FPGA的設計應用領域裏,許多電路需要用到除法器,而在硬件描述語言裏卻沒有直接的除法器“%”,“/”可以直接引用運算。許多文獻都是單獨介紹小數除以大數或者大數除以小數等單一的設計描述,爲此本文在參考了許多技術文獻之後,提出自己的一種設計方法,不管除數與被除數的大小關係,都可以直接通過算法“減法進位”來推導運算出整數商與餘數(小數商)。具有多功效,全方位,可優化,易綜合等參考價值。
算法原理介紹
算法設計實現
整體設計介紹
設計端口介紹
dividend爲被除數,divisor爲除數,quotient爲整數商,decimals爲小數商
dividend ÷ divisor = quotient.decimals
設計的端口介紹具體如下所示:
狀態機設計
爲節省電路面積,使寄存器共用,流程設計更清晰無誤,本除法器的設計採用狀態機的設計。
狀態1:讀入除數與被除數;
狀態2:進行求整數商的運算;
狀態3:進行求小數商的運算;
狀態1讀入除數與被除數
當div_en讀入使能信號打開爲1,數據讀入,state爲1,開始讀入數據驗證。
狀態2求整數商的設計
在上面所描述到的,如果被除數一開始是大於除數的話,那麼在求整數商時,就應該進行減法操作。
狀態2求整數商的設計:
狀態3求小數商的設計
在上面的描述到了,如果補位進位後的被除數大於除數,就需要再一次進行減法操作。
狀態3小數商的設計:
算法設計驗證
算法的設計仿真驗證,以被除數165,除數28爲驗證數據,我們可以自己先計算一下。
165/28=5.8929,也就是說相對於的我們仿真的數據應該是整數商quotient=5,decimals = 0.89286。
具體的仿真是否符合預期結果,建立仿真環境驗證開始:
從下面的仿真波形圖1可以看得出,在div_en被拉高之後,被除數165,除數28開始讀入,進入求整數商操作。
一直在判斷被除數dividend_reg是否大於除數divisor_reg,是則整數商quotient-reg一直在加1直到5。—符合我們的設計預期
從下面的仿真波形圖2可以看到,如上面設計描述所述,在求完整數商後拉高dec_en信號,開始進入狀態3求小數商的設計。
得到的小數商decimals=229,在上面的算法原理描述時已經說過,因爲被左乘了256倍,所以換算成小數,需再除以256。
因此:229/256=0.8945,與上面預期的165/28=5.8929來說是相當接近的,誤差在可控範圍內。—符合我們的設計預期
整體的功能仿真波形圖如下:
設計總結
到這裏除法器的算法設計就已經介紹完畢了,正如前文引言裏所描述的,本文的除法器設計具有多功效,全方位,可優化,易綜合等參考價
值。其全方位體現在可以提高被除數除數的位寬,擴大其除法範圍,另外可以擴展小數商的位寬,這樣子求導得到的小數商其誤差就會更
小,可適應不同場合誤差要求。
本文的設計描述如果有什麼地方描述的不清晰的,有不明白的地方都可以加博客發信息詢問。後續將介紹平均濾波器的FPGA設計實現,還
有數字後端設計DC,PR,PT,FM等流程,如果有想投稿或者想要我寫什麼題材的,歡迎提出建議。