连载《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