前邊寫了很多關于板上外圍器件的評測文章,這篇是FPGA純邏輯設計,是FPGA的另一部分——算法實現,上篇文章做了HDC1000傳感器的使用,當時說FPGA是不支持小數的,本篇記述的是FPGA如何去做除法運算。很多人覺得不就是除法嘛,直接打上/即可,但是,FPGA是不能正確綜合這個除法器的,綜合的結果只是一個固定數值,而不像其他微處理器。可以這么說,用FPGA實現除法運算是比較麻煩的。
用軟件編程的時候,用到除法器的時候,一個/就能求商,一個%就能求余,很簡單。但是,如果使用硬件來實現除法運算,就需要了解計算機存儲結構,二進制的除法和平常使用的十進制除法是一樣的,都是通過輾轉相除的原理,
原理如上所述,現在需要把這個原理轉換成可實現的設計方案,從圖可以看出,首先是將除數與被除數的最高3位做比較,如果除數(110)大于被除數(101),則將商賦值為0(最高位是0可以省略),被除數向右增加1位再進行比較;當被除數增加1位,除數(110)小于被除數(1010),則將商賦值為1,接著進行二進制減法運算,被除數(1010)減去除數(110),變成100;然后被除數向右再增加1位,變成1001,再與除數(110)比較,以此類推,最后輸出結果。
設計好代碼,用Modelsim仿真驗證,
用$random產生隨機數,實現效果如下:
i_dividend為被除數,i_divisor為除數,o_quotient為商,o_remainder為余數(下同)。
$random是不能綜合的,所以,只能用其他的進行代替,被除數用一個計數器,除數用數字3,再進行Modelsim仿真驗證:
由2個圖可知,除法器設計滿足需求。
進行板上調試,
綜合后的RTL圖,
用Quartus ii軟件查看結果,一切與預期一致,設計成功。
總結:用FPGA實現除法器真麻煩!