fpga中乘法器是很稀缺的資源,但也是我們做演算法必不可少的資源。7系列及之前的fpga都是25x18的dsp,ultrascale中是27x18,我們可以通過調ip core的方式或者原語的方式來進行乘法操作。在裡面可以設定有符號還是無符號數乘法。
當然,我們也可以直接使用*
符合來進行乘法,對於無符號的乘法
reg [7:0] ubyte_a;
reg [7:0] ubyte_b;
(* use_dsp48="yes" *)
output reg[15:0] u_res;
always @ ( posedge clk ) begin
if(rst)
u_res <= 'b0;
else
u_res <= ubyte_a * ubyte_b;
end
有符號乘法可以在verilog中使用signed
來標註。
reg signed [7:0] byte_a;
reg signed [7:0] byte_b;
(* use_dsp48="yes" *)
reg signed [15:0] res;
always @ ( posedge clk ) begin
if(rst)
res <= 'b0;
else
res <= byte_a * byte_b;
end
當然我們也要理解有符號數乘法的原理,其實就是擴位乘法,把高位都補充為符號位。
有符號數乘法:
reg [7:0] ubyte_a;
reg [7:0] ubyte_b;
(* use_dsp48="yes" *)
reg [15:0] res_manul;
always @ ( posedge clk ) begin
if(rst)
res_manul <= 'b0;
else
res_manul <= },ubyte_a} * },ubyte_b};
end
關於乘法輸出的位寬,我們知道,兩個8bits的無符號數乘法,結果的位寬是16bits,但對於兩個8bits有符號數的乘法,只要兩個數不同時為-128,即二進位制0b1000_0000,那麼輸出結果的高兩位都是符號位,我們只需要取低15bits即可。因此,如果我們可以保證兩個輸入的乘數不會同時為有符號數所能表示的負數最小值,那麼乘法結果的高兩位都是符號位,只取其中一位即可。
往期文章:
fpga時序約束教程:
fpga時序約束理論篇之建立保持時間
fpga時序約束理論篇之時序路徑與時序模型
3. fpga時序約束理論篇之io約束
4. fpga時序約束理論篇之時鐘週期約束
5. fpga時序約束理論篇之兩種時序例外
6. fpga時序約束理論篇之xdc約束優先順序
7. fpga時序約束實戰篇之梳理時鐘樹
8. fpga時序約束實戰篇之主時鐘約束
9. fpga時序約束實戰篇之衍生時鐘約束
10. fpga時序約束實戰篇之延遲約束
11. fpga時序約束實戰篇之偽路徑約束
12. fpga時序約束實戰篇之多週期路徑約束
13. vivado時序約束輔助工具
14. fpga時序約束之tcl命令的物件及屬性
無符號右移負數 關於負數的右移與無符號右移運算小結
對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變 對於負數的右移 因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼 符號位不變,其餘位按照原...
有符號右移》,無符號右移》
計算機表示數字正負不是用 加減號來表示,而是用最高位數字來表示,0表示正,1表示負 1.有符號右移 若正數,高位補0,負數,高位補1 正數 例如4 2 首先寫出4的二進位制數,因為是正數所以最高位為0,也就是第乙個 0000 0000 0000 0000 0000 0000 0000 0100 右移...
有符號右移》,無符號右移》,左移
計算機表示數字正負不是用 加減號來表示,而是用最高位數字來表示,0表示正,1表示負 1.有符號右移 若正數,高位補0,負數,高位補1 正數 例如4 2 首先寫出4的二進位制數,因為是正數所以最高位為0,也就是第乙個 0000 0000 0000 0000 0000 0000 0000 0100 右移...