BP算法的FPGA需要浮點數運算,所以學習了一下桶形移位器
桶形移位器的使用
桶形移位器的常見用法是浮點運算的硬件實現。對於浮點加或減法操作時,有效數的兩個數的必須對准,這需要移動所述較小數到右邊,增加其指數,直到它的較大數目的指數相匹配。這是通過減去指數並使用桶形移位器在一個周期內將較小的數字向右移動差值來完成的。如果使用簡單的移位器,則移位n位位置將需要n個時鍾周期。
桶形移位器是一個數字電路,可以移位一個數據字由指定數量的位,而無需使用任何的時序邏輯,只有純組合邏輯,即,它固有地提供一個二進制運算。但是,從理論上講,它也可以用於執行一元運算,例如在固定數量(例如地址生成單元)受固定數量限制的情況下進行邏輯左移。實現桶形移位器的一種方法是作為多路復用器序列其中一個多路復用器的輸出以取決於移位距離的方式連接到下一個多路復用器的輸入。桶形移位器通常用於在現代微處理器中移位和旋轉n位,通常在單個時鍾周期內進行
使用一個四位的桶形移位器,其輸入為A、B、C和D。移位器可以將ABCD位的順序循環為DABC、CDAB或BCDA。在這種情況下,不會丟失任何位。也就是說,它可以將所有輸出右移三個位置(因此可以進行A、B、C和D的任何循環組合)。桶形移位器具有多種應用,包括作為微處理器中的有用組件
例如設計一個8位桶形移位器:8位桶形移位器是有8個數據輸入位,8個數據輸出位和3個控制輸入位的組合邏輯電路,其輸出字等於輸入字的循環移位,循環移位的次數由控制輸入位指定。
代碼如下
module barrel_shifter(data,num,out);
input [7:0] data;
input [2:0] num;
output [7:0] out;
reg [7:0] out
always @(*) begin
case(num)
3'b000:out=data;
3'b001:out={data[6:0],data[7]};
3'b010:out={data[5:0],data[7:6]};
3'b011:out={data[4:0],data[7:5]};
3'b100:out={data[3:0],data[7:4]};
3'b101:out={data[2:0],data[7:3]};
3'b110:out={data[1:0],data[7:2]};
3'b111:out={data[0],data[7:1]};
endcase
end
endmodule
以上都是邏輯運算的桶形移位器,如果是算數的請注意補充符號
知識點補充:
算術移位和邏輯移位運算
- 邏輯移位
對於邏輯移位,就是不考慮符號位,移位的結果只是數據所有的位數進行移位。根據移位操作的目的,左移時,低位補0,右移時,高位補0;
例:
01010101>>3=00001010
01101011<<3=01011000
Q1:此時是不是就有一個問題,不考慮符號位,如果一個負數,邏輯右移,結果就會變成正數,例如
10000101=-5>>1=01000010=66
的確是的,因為這是邏輯運算的特點,算術移位運算才會考慮符號位!
Q2:如果一個有符號數,邏輯左移,導致符號位變化,此時也算邏輯運算的特點嗎?
例如:10000001=-1<<1=00000010=2;
這里只是溢出,並不算特點,類型溢出在算術移位中也存在!
- 算術移位
算術是帶有符號的數據,所以我們不能直接移動所有的位數,這可能會使得符號不正確。
其它參考原碼 反碼 補碼的其它知識,FPGA中有符號位,就是它的最高位,擴展的時候需要填充的是符號位