今天的筆記是關於傳統的乘法器,乘法器還是蠻有用的吧,也比較簡單。
首先是說一下計算機中數值的存儲問題。在計算機中正數是以二進制來表示的,而負數則是以補碼的形式來表示的,補碼就是對正數二進制取反然後再加1,則形成負數的表達。
比如說4和-4,4:0000_0100 表示正4;
1111_1011 進行取反;
1111_1100 加1,表示負4;
數制轉換中,正數取反加1表示負數,同樣的負數取反加1也表示正數。
然後是乘法器,設計的思路是首先判斷最高位的符號位,因爲在乘法計算中,我們知道最後算出的數值和符號無關,所以把符號單獨判斷,最後加上,乘法的計算就是把乘數加上被乘數個。代碼不是自己寫的,只是做下筆記整理的哦,代碼如下:
//模塊名:整數乘法器
//作者:昌磊
//單位:電子科技大學
//時間:2017.9.30
module multiplier_module (
input clk,
input rst_n,
input Start_Sig,
input [7:0]Multiplicand,
input [7:0]Multiplier,
output Done_Sig,
output [15:0]Product
);
/********************************/
reg [1:0]i;
reg [7:0]Mcand;
reg [7:0]Mer;
reg [15:0]Temp;
reg isNeg;
reg isDone;
always@(posedge clk or negedge rst_n)
if(rst_n==1'b0)
begin
i<=2'd0;
Mcand<=8'd0; //給乘數的寄存器
Mer<=8'd0; //給被乘數的寄存器
Temp<=16'd0; //給相乘的結果的寄存器
isNeg<=1'b0; //符號標誌寄存器
isDone<=1'b0; //相乘結束標誌信號
end
else if(Start_Sig)
case(i)
0:
begin
isNeg<=Multiplicand[7]^Multiplier[7];
Mcand<=Multiplicand[7]?(~Multiplicand+1'b1):Multiplicand;
//判斷是否爲正數,若是正數則直接計算,若不是,則要轉換成正數
Mer<=Multiplier[7]?(~Multiplier+1'b1):Multiplier;
Temp<=16'd0;
i<=i+1'b1;
end
1:
if(Mer==0) i<=i+1'b1;
else begin Temp<=Temp+Mcand;Mer<=Mer-1'b1;end
//乘法就是把乘數相加被乘數次數的累加和
2:
begin
isDone<=1'b1; i<=i+1'b1;
end
3:
begin
isDone<=1'b0;i<=2'd0;
end
endcase
/********************************************************/
assign Done_Sig=isDone;
assign Product=isNeg?(~Temp+1'b1):Temp;
/*******************************************************/
endmodule