連載《fpga線下培訓-第8天》【4位乘法器、4位除法器設計】 【原理及verilog實現、仿真】


本篇文章,介紹4位乘法器、4位除法器的設計原理 與 verilog 代碼實現

一、乘法器原理

  1、我們先看十進制的乘法過程

    

    可以看出來,我們是分別用乘數的各位、十位、百位與被乘數相乘分別得到 ;

    最后的結果 等於 A + B*10 + C*100 = 401050

  2、二進制的乘法過程

    

       可以看出來,二進制乘法和十進制是一致的

    最后的結果 等於 A + B*2 + C*4 + D*8 = 1991

 二、verilog代碼實現

  mult4bit.v

module mult4bit(
	input 	[3:0]		a,
	input 	[3:0]		b,
	
	output	[7:0]		y
);

	wire  	[7:0] 	temp1;
	wire		[7:0]		temp2;
	wire 		[7:0]		temp3;
	wire 		[7:0]		temp4;

	assign temp1 = {4'b0000,a&{4{b[0]}}};
	assign temp2 = {3'b000,a&{4{b[1]}},1'b0};
	assign temp3 = {2'b00,a&{4{b[2]}},2'b0};
	assign temp4 = {1'b0,a&{4{b[3]}},3'b0};
	
	assign y = temp1 + temp2 + temp3 + temp4;

endmodule

 三、編寫仿真腳本

  mult4bit.v

`timescale 1ns/1ps

module mult4bit_tb();

	reg 	[3:0]		a;
	reg 	[3:0]		b;
	
	wire	[7:0]		y;

	mult4bit mult4bit_inst(
		.a		(a),
		.b		(b),
		
		.y		(y)
	);

	initial begin
		repeat (100)begin
			a = {$random}%16;
			b = {$random}%16;	
			#20;
		end
	end

endmodule

四、仿真結果

  

  仿真結果顯示我們的乘法器設計正確

五、除法器原理

   1、我們先看十進制的除法過程

    

      從十進制的除法運算,我們可以看見有幾個步驟;

     1.1、首先除法是從高位至低位依次進行;

     1.2、每一位要加上前一位留下來的余數,組成一個新數和除數比較;

     1.3、當新數大於/等於除數時,寫商求余;

      1.4、按照上述方式依次進行,直到被除數最末尾,除法運算結束。

  2、二進制的除法過程

    

     從圖中可以看出二進制的除法,和十進制一致

 六、代碼實現

  div4bit.v

module div4bit(
	input 	[3:0]		a,
	input		[3:0]		b,
	
	output	[3:0]		s,
	output	[3:0]		y

);

	wire	[3:0]	part1;
	wire	[3:0]	part2;
	wire	[3:0]	part3;
	wire	[3:0]	part4;
	
	assign s[3] 	= (a[3] >= b)?1'b1:1'b0;
	assign part1	= (a[3] >= b)?(a[3]-b):a[3];
	
	assign s[2] = ({part1[0],a[2]} >= b)?1'b1:1'b0;
	assign part2 = ({part1[0],a[2]} >= b)?({part1[0],a[2]}-b):{part1[0],a[2]};
	
	assign s[1] = ({part2[1:0],a[1]} >= b)?1'b1:1'b0;
	assign part3 = ({part2[1:0],a[1]} >= b)?({part2[1:0],a[1]}-b):{part2[1:0],a[1]};

	assign s[0] = ({part3[2:0],a[0]} >= b)?1'b1:1'b0;
	assign part4 = ({part3[2:0],a[0]} >= b)?({part3[2:0],a[0]}-b):{part3[2:0],a[0]};	

	assign y = part4;

//這段代碼執行也是對的,但是編譯器會報警告,因為我們把5bit的數據賦值給4bit

//  assign s[3] = a[3] >= b;
//  assign part1 = (s[3]) ? a[3] - b : a[3];
//  
//  assign s[2] = {part1,a[2]} >= b;
//  assign part2 = (s[2]) ? {part1,a[2]} - b : {part1,a[2]};
//  
//  assign s[1] = {part2,a[1]} >= b;
//  assign part3 = (s[1]) ? {part2,a[1]} - b : {part2,a[1]};
//  
//  assign s[0] = {part3,a[0]} >= b;
//  assign part4 = (s[0]) ? {part3,a[0]} - b : {part3,a[0]};
//  
//  assign y = part4;
	
endmodule

七、編寫仿真文件

  div4bit_tb.v

`timescale 1ns/1ps


module div4bit_tb();
		reg 	[3:0]		a;
		reg	[3:0]		b;
		
		wire	[3:0]		s;
		wire	[3:0]		y;

		div4bit div4bit_isnt(
			.a		(a),
			.b		(b),
			
			.s		(s),
			.y		(y)
		);

		initial begin
			repeat(100)begin
				a ={$random}%16;
				b ={$random}%16;
				#20;
			end
		
		end

endmodule

八、仿真結果

  

   從仿真結果可以看出,我們設計的4bit除法器正確


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM