FPGA中乘法器是很稀缺的資源,但也是我們做算法必不可少的資源。7系列及之前的FPGA都是25x18的DSP,UltraScale中是27x18,我們可以通過調(diào)IP Core的方式或者原語的方式來進(jìn)行乘法操作。在里面可以設(shè)置有符號還是無符號數(shù)乘法。
當(dāng)然,我們也可以直接使用*符合來進(jìn)行乘法,對于無符號的乘法
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來標(biāo)注。
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
當(dāng)然我們也要理解有符號數(shù)乘法的原理,其實就是擴(kuò)位乘法,把高位都補充為符號位。
有符號數(shù)乘法:
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 <= {{8{byte_a[7]}},ubyte_a} * {{8{ubyte_b[7]}},ubyte_b}; end
關(guān)于乘法輸出的位寬,我們知道,兩個8bits的無符號數(shù)乘法,結(jié)果的位寬是16bits,但對于兩個8bits有符號數(shù)的乘法,只要兩個數(shù)不同時為-128,即二進(jìn)制0b1000_0000,那么輸出結(jié)果的高兩位都是符號位,我們只需要取低15bits即可。因此,如果我們可以保證兩個輸入的乘數(shù)不會同時為有符號數(shù)所能表示的負(fù)數(shù)最小值,那么乘法結(jié)果的高兩位都是符號位,只取其中一位即可。
-
dsp
+關(guān)注
關(guān)注
555文章
8123瀏覽量
354416 -
FPGA
+關(guān)注
關(guān)注
1643文章
21923瀏覽量
612399
發(fā)布評論請先 登錄
【國產(chǎn)FPGA入學(xué)必備】國產(chǎn)FPGA權(quán)威設(shè)計指南+配套FPGA圖像視頻教程
Verilog中signed和$signed()的用法

請問AFE5801 AD轉(zhuǎn)換后數(shù)字信號是用有符號數(shù)還是無符號數(shù)表示的?
TMS320DM642 EVM OSD FPGA用戶指南

ADS8688分別設(shè)置0 to 1.25 × VREF和±1.25 × VREF采樣范圍時,得到的16位數(shù)據(jù)是按照有符號數(shù)還是無符號數(shù)進(jìn)行轉(zhuǎn)換?
采用Xilinx FPGA的AFE79xx SPI啟動指南

KiCad中不同GND符號的含義及應(yīng)用

DLP? DLPC910 Apps FPGA指南

請問如何用VCA810實現(xiàn)模擬乘法器?
FPGA Verilog HDL有什么奇技巧?
EasyGo 實時仿真 NetBox 操作指南
LM70 SPI/MICROWIRE 10位帶符號數(shù)字溫度傳感器數(shù)據(jù)表

LM12454/LM12458/LM12H458 12位符號數(shù)據(jù)采集系統(tǒng)數(shù)據(jù)表

評論