FPGA中的除法運算及初識AXI匯流排

2021-08-19 20:47:41 字數 1607 閱讀 5993

pga中的硬體邏輯與軟體程式的區別,相信大家在做除法運算時會有深入體會。若其中乙個運算元為常數,可通過簡單的移位與求和操作代替,但用硬體邏輯完成兩變數間除法運算會占用較多的資源,電路結構複雜,且通常無法在乙個時鐘週期內完成。因此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將所有有符號數視為二進位制補碼形式,運算的結果同樣為補碼。

總是就兩頁,非常簡單。需要重點關注的有三個地方:1演算法實現結構(演算法型別)2被除數與除數的位寬3第二頁流控制模式。現在一一說明:

就演算法結構來說官方文件pg151 logicore ip產品指南中說得很詳細:lutmult結構運算元最好不要高於12bit,且充分利用dsp slice和bram以降低fpga邏輯資源的消耗.radix-2運算元不要超過16bit,且利用資源與lutmulti相反,大量使用暫存器和lut從而將dsp片和bram資源節省出來用在別的地方。最後乙個高階基數結構支援超過16bit的大位寬運算元,利用dspslice等專用硬體資源。根據自己的需求選擇即可。

位置問題沒什麼好說的,需要特別注意保留位寬滿足計算範圍,也就是運算之前的「補碼符號位擴充套件」。至於流量控制模式與介面和axi匯流排有關。

每個axi匯流排通道總是包括tdata tuser tlast和握手訊號tvalid tready,其中tuser為附加資訊,tlast表示流程式下最後乙個資料,相當於資料報中的包尾處。資料傳輸僅在tvalid和tready同時拉高時有效並更新。

而非阻塞模式在除法運算時較常用,一句話概括:ip核介面不帶有fifo快取,輸出通道資料必須被下游模組實時處理。上圖就明白了:

這一模式實際上是對axi匯流排的簡化,很多場合下並不完全需要axi匯流排強大的流控功能,特別是在axi匯流排模組的上下游均為可進行實時處理的fpga邏輯電路的情況下。 axi匯流排的另乙個特點就是資料打包,需要將不是8bit倍數字寬的資料高位填充從而確保資料最小單位是1byte,具體填充方式有所不同。很容易想到,這樣的資料打包功能對soc中pl與ps部分的互動是十分友好的。

FPGA中的小數運算

最近在影象演算法的中間遇到一下小數的運算問題,雖然之前也遇到很多次,但是這次記錄下來。r 1.164 y 16 1.596 cr 128 g 1.164 y 16 0.391 cb 128 0.813 cr 128 b 1.164 y 16 2.018 cb 128 遇到的一些問題是,色彩空間的轉換...

關係代數中的除法運算

這個概念的描述的非常抽象,剛開始學習的同學完全不知所云。這裡通過乙個例項來說明除法運算的求解過程 設有關係r s 如圖所示,求r s 的結果 求解步驟過程 第一步 找出關係r和關係s中相同的屬性,即y屬性。在關係s中對y做投影 即將y列取出 所得結果如下 第二步 被除關係r中與s中不相同的屬性列是x...

C 中的除法和四捨五入運算

c 中的除法和四捨五入運算 1.除法運算 當你使用以下 double d 3 6 console.writeline d 時,得到的結果會是0,而不是你期望的0.5 此時c 將3當作整數來處理了,結果它也會返乙個整數。所以,你應該將這一句改為 double d 3.0 6 或者double d co...