筆記,傳統乘法器

      今天的筆記是關於傳統的乘法器,乘法器還是蠻有用的吧,也比較簡單。

      首先是說一下計算機中數值的存儲問題。在計算機中正數是以二進制來表示的,而負數則是以補碼的形式來表示的,補碼就是對正數二進制取反然後再加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 			


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章