在硬體設計中,乘法器是非常重要的一個器件,乘法器的種類繁多,常見的有並行乘法器、移位相加乘法器和查詢表乘法器,並行乘法器的實現非常簡單,在Verilog中只需要透過 * 實現,若要進行有符號的乘法,需使用 系統函式$signed。查詢表乘法器實際上是先將乘法的計算結果提前算好,這樣就可以在計算時透過查表的方式直接得到結果,一般用於位寬較小的情況。移位相加乘法器是一種耗費較少資源的演算法,其思想是將乘法轉化為加法和移位運算,缺點是比較耗時,一般用於對效能要求不高的場合。
一、無符號移位相加乘法器
以a=1011和b=1001相乘為例(均為無符號數)
1.b的第0位為1,所以
result = result + b[0] * a<<0;
2.b的第1位為0,result保持不變
result = result + b[1] * a<<1;
3.b的第2位也為0,result保持不變
result = result + b[2] * a<<2;
4.b的第3位為1,則得到最終的計算結果
result = result + b[3] * a<<3;
可以看到, W 位寬的無符號乘法器,需要 W 個週期才能計算完成。
二、有符號移位相加乘法器
以(-3)x(-6)為例,Verilog中有符號數用補碼錶示,正數的補碼是他本身,負數的補碼是符號位不變,其他位的反碼加1。(-3)的補碼是 1101,(-6)的補碼是 1010,為了保證結果的正確,首先要將兩個數進行符號位擴充套件,擴充套件為8bits。有符號位擴充套件,高位補1,所以(-3)就變為 11111101 ,(-6)就變為 11111010 。然後其計算步驟與無符號移位相加乘法器計算步驟一致。
注意:
1.無論是有符號數相乘還是無符號數相乘,其乘積的位寬必定位a+b;
2.如果被乘數和乘數均為有符號數,那麼相乘之前首先要進行符號位擴充套件,將被乘數和乘數均擴充套件位a+b位。
3、有符號數乘法的最終結果也是補碼形式。