(原創(chuàng)聲明:該文是作者的原創(chuàng),面向對象是FPGA入門者,后續(xù)會有進階的高級教程。宗旨是讓每個想做FPGA的人輕松入門,作者不光讓大家知其然,還要讓大家知其所以然!每個工程作者都搭建了全自動化的仿真環(huán)境,只需要雙擊top_tb.bat文件就可以完成整個的仿真(前提是安裝了modelsim),降低了初學者的門檻。如需整個工程請留言(WX:Blue23Light),不收任何費用,但是僅供參考,不建議大家獲得資料后從事一些商業(yè)活動!)
前面的定點數的乘法和除法運行,至少我們還是能列豎式進行計算,所以用FPGA實現還算簡單。但是對于本節(jié)要講的開方運算,我們好像在數學書本上沒有學習過如何進行計算。我們對于一些比較小的數的開方,我們可以根據乘法口訣大體推算出來,比如64=8*8,那64的平方根就是8,但是對于比較大的數,比如12345678這樣的數,我們很難張口就算出了。
定點數的平方根,還是由一些算法能夠實現的,我們以《基于FPGA的數字信號處理》[高亞軍 編著] 這本書上Restoring 算法為例進行設計。下面是書上手工計算一個定點數平方根的過程。
第一步:將被開方數由低位至高位每兩位分為一組;
第二步: 由高兩位06開始,對應的平方根為2,即Q(2)=2。將Q(2)左移1位并與6相減獲得部分余數 r2=2;
第三步:r2與D(3)D(2)合并構成 214,講Q(2)左移1位為4,根據[4Q(1)]xQ(1)≤214,確定Q(1)=4,并獲得部分余數r1=38;
第四步:r1與D(1)D(0)合并構成 3858 , [Q(2)Q(1)]左移 1 位為 48 , 根據[48Q(0)]xQ(0)≤3858確定Q(0)=7, 并獲得部分余數r0,此即為最終余數R。
可見,該算法是一種迭代的過程,每次迭代獲得平方根的某一位。這其實就是恢復余數(Restoring) 算法。
上面是書上的原話,大家可以理解一下,這種方法用在10進制數的開方計算上還是挺麻煩的,主要是中間有乘法運算,比如4Q(1)和48Q(0)。書上由10進制推導出2進制數據的開方運行,使用了Restoring算法和Non-Restoring 算法來求數據的平方根,中間還有一些公式的推導,看的比較眼花繚亂,有興趣的讀者可以好好的看一下。下面是Restoring算法的計算過程圖。
書中還給出了被開方數為8bit 的開方運算電路結構,如下所示。
其實二進制的開方運算非常簡單,根本不需要涉及乘法除法和加法,只需要減法就可以完成。將被開方數從低位到高位2位一組進行處理。二進制的2位只能是11,10,01,和00,其中11,10,01的平方根是01,00的平方根是00,從高位到低位進行判斷,假如當前是第k步,用前面所有步計算的平方根結果Q[n:k+1]連接01和當前的余數進行比較,來確定當前這一步的Q(k)是0還是1,如果Q(k)是1,減去當前結果的平方值;如果Q(k)是0,保持余數不變即可。
下面我們通過FPGA來實現8位無符號整數的開方運算。由于2位數進行1次計算,所以8位無符號整數的開發(fā)運算其實只需要4次計算就可以得出結果,如下定義的開方運算次數SQUARE_CNT=4。
余數的運算如下所示,從高到底依次取余數的兩位和前面計算結果與01的連接進行比較,來確定余數是減去當前的的平方值還是保持不變。
同余數的處理,來當前確定平方根的值到底是1還是0。
最后完成計算后,將結果鎖存輸出即可。
在仿真文件中產生隨機數,雙擊sim文件夾下面的top_tb.bat文件,完成功能仿真。
仿真結果如下所示,我們測試幾個數據42=6*6+7;232=15*15+7;92=9*9+11;結果都是正確的,FPGA設計實現的功能正常。文章來源:http://www.zghlxwxcb.cn/news/detail-768626.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-768626.html
到了這里,關于孩子都能學會的FPGA:第二十課——用FPGA實現定點數的開方運算的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!