FPGA中的除法運算及初識AXI總線

  FPGA中的硬件邏輯與軟件程序的區別,相信你們在作除法運算時會有深刻體會。若其中一個操做數爲常數,可經過簡單的移位與求和操做代替,但用硬件邏輯完成兩變量間除法運算會佔用較多的資源,電路結構複雜,且一般沒法在一個時鐘週期內完成。所以FPGA實現除法運算並非一個「/」號能夠解決的。算法

  好在此類基本運算均有免費的IP核使用,本人使用的VIVADO 2016.4開發環境提供的divider gen IP核均採用AXI總線接口,已經再也不支持native接口。故作除法運算的重點從設計算法電路轉變成了調用AXI總線IP核以及HDL中有符號數的表示問題,極大下降了開發難度。如下就上述兩個方面進行探討。緩存

  VerilogHDL中默認數據類型爲無符號數,所以須要數學運算的場合必需要用「signed」聲明,如:reg signed [8-1:0] signal_a;  wire signed [32-1:0] signal_b;須要注意一點,FPGA將全部有符號數視爲二進制補碼形式,運算的結果一樣爲補碼。再來看看除法器IP核配置界面。ide

   總共就兩頁,很是簡單。須要重點關注的有三個地方:1 算法實現結構(algorithm type)2 被除數與除數的位寬 3 第二頁flow control模式。現來一一說明:ui

  就算法結構來講官方文檔pg151 LogiCORE IP Product Guide中說得很詳細:LUTMult結構操做數最好不要高於12bit,且充分利用DSP slice和BRAM以下降對FPGA 邏輯資源的消耗。Radix-2操做數不要超過16bit,且利用資源與LUTMulti相反,大量使用register和LUT從而將DSP slice和BRAM資源節省出來用在別的地方。最後一個High Radix結構支持超過16bit的大位寬操做數,利用DSPslice等專用硬件資源。根據本身的需求選擇便可。spa

  位寬問題沒什麼好說的,須要特別注意保留位寬知足計算範圍,也就是運算以前的「補碼符號位擴展」。至於flow control 模式與接口和AXI總線有關。設計

  接口劃分得十分清晰,被除數 除數和商通道以及必要的時鐘和復位邏輯接口。每一個AXI總線通道老是包括tdata tuser tlast 和握手信號tvalid tready,其中tuser爲附加信息,tlast表示流模式下最後一個數據,至關於數據包中的包尾處。數據傳輸僅在tvalid和tready同時拉高時有效並更新。blog

  而Non Blocking Mode在除法運算時較經常使用,一句話歸納:IP核接口不帶有FIFO緩存,輸出通道數據必須被下游模塊實時處理。上圖就明白了:接口

  這一模式其實是對AXI總線的簡化,不少場合下並不徹底須要AXI總線強大的流控功能,特別是在AXI總線模塊的上下游均爲可進行實時處理的FPGA邏輯電路的狀況下。AXI總線的另外一個特色就是data packing,須要將不是8bit倍數位寬的數據高位填充從而確保數據最小單位是1byte,具體填充方式有所不一樣。很容易想到,這樣的data packing 功能對SOC中PL與PS部分的交互是十分友好的。資源

   整體來講,在FPGA中作基本的數學運算沒什麼難度,即便是指數 對數 開根號之類的複雜運算也有浮點IP Core的支持。本人後續用到複雜算法時,會採用HLS方式開發,僅用於算法驗證,歡迎關注。
開發

相關文章
相關標籤/搜索