16位串行乘法器 Verilog FPGA

名称:16位串行乘法器 Verilog FPGA

语言:Verilog

功能介绍

Multiplier_16bit 是一个16位乘法器,输入为 mult_A 和 mult_B,输出为32位乘积 mult_product,并通过 Done 信号指示本次计算完成。start 用于启动运算;启动后,设计逐位处理乘数,并把对应的被乘数移位值累加到部分积中。 该设计以移位相加算法和三状态控制流程实现乘法运算,适合用于学习串行乘法器、有限状态机控制及部分积累加的 Verilog 实现。设计文档列出了多组乘法仿真数据,可用于了解不同输入下的计算结果。

运行环境

设计语言:Verilog。

设计思路

设计采用移位相加算法完成两个16位操作数的乘法运算,按照乘数 mult_A 的位序逐位处理。每轮根据当前乘数位决定是否将被乘数的移位值累加到部分积中,再将被乘数左移一位,以对应乘数位权重的递增。经过16轮处理后,结果写入32位乘积输出。 控制逻辑由 INIT、ADD、SHIFT 三个状态组成。INIT 等待 start 启动并装载 mult_B;ADD 检查 mult_A 当前位并按需累加;SHIFT 更新移位数据及计数器。计数达到16时,状态机回到 INIT,置位 Done,并输出计算结果。该结构为串行、非流水线计算方式,文档给出的计算过程为每次乘法处理16个时钟周期。

模块结构

工程包含乘法器模块 Multiplier_16bit 和仿真测试模块 testbench。Multiplier_16bit 接收两个16位操作数及 clk、start 控制信号,内部使用状态机、移位寄存器、计数器和部分积寄存器完成运算,并输出 mult_product 与 Done。

演示视频

下方提供演示视频,可直接播放查看运行效果。

仿真图/仿真说明/设计文档图片

设计文档包含仿真说明及仿真图,列出5组乘法结果:0×0=0、255×38=9690、65530×4287=280927110、31136×3548=110470528、257×268=68876。文档还介绍了计算周期、吞吐量及非流水线特性。

16位串行乘法器 Verilog FPGA 设计文档图片 image1.png

16位串行乘法器 Verilog FPGA 设计文档图片 image2.png

16位串行乘法器 Verilog FPGA 设计文档图片 image3.png

16位串行乘法器 Verilog FPGA 设计文档图片 image4.png

16位串行乘法器 Verilog FPGA 设计文档图片 image5.png

16位串行乘法器 Verilog FPGA 设计文档图片 image6.png

部分代码

以下展示顶层模块 Multiplier_16bit 的部分代码,完整源码请下载压缩包查看。

module Multiplier_16bit(mult_A,mult_B,clk,start,Done,mult_product);
input [15:0] mult_A,mult_B;   //mult_A是乘数,mult_B是被乘数
input clk,start;//start高电平时输入乘数
output Done;//乘积计算完成
output [31:0] mult_product;//乘积

reg Done;
reg [31:0] mult_product=32'd0;
reg [31:0] mult_product_buf=32'd0;
parameter INIT=2'd0;
parameter ADD=2'd1;
parameter SHIFT=2'd2;
reg[1:0] state=INIT;//初始状态为INIT
reg[31:0] mult_B_buf=32'd0;       //临时变量

integer Count=0;

always@(posedge clk)
  begin
 	case(state)
	INIT://初始状态
	 if(start)begin
		state=ADD;   //start有效跳转到下一个状态ADD
		mult_B_buf[15:0]=mult_B;   //取被乘数
		mult_B_buf[31:16]=16'd0;   //临时变量的高16位置0
		end
	 else                  
		begin
			mult_product_buf=0;
			Count=0;			
			Done=0;             //运算未完成
			state=INIT;      //初始状态
		end
	
	ADD://相加状态
	 begin
		if(mult_A[Count])      //判断乘数的第Count位是否为1
		  mult_product_buf=mult_product_buf+mult_B_buf;  //若为1则把乘数左移一位相加
		  state=SHIFT;    //完成相加后跳到SHIFT状态继续左移
	 end

	SHIFT://移位状态
	  begin
		mult_B_buf={mult_B_buf[30:0],1'b0};        //左移一位,最低位补0
		Count=Count+1;            //计数器加一
		if(Count==16)     //循环16次 	
		  begin
			state=INIT;
			Done=1;
			mult_product<=mult_product_buf;
		  end
	     else
		  state=ADD;
	  end

	endcase
   end
endmodule

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 16位串行乘法器 Verilog FPGA

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员