名称:基于FPGA的5位(有符号位)定点整数的原码乘法器Verilog代码Quartus仿真(文末获取)
软件:Quartus
语言:Verilog
代码功能:
组成原理第二次实验内容:
设计实现5位(包括符号位)定点整数的原码乘法器,分别由移位加和全加器阵列结构实现,比较两种结构的运算速度(输入乘数到输出积的时间)和硬件资源(逻辑门和触发器的个数)。
可以画原理图或者写verilog程序,quartus或者modelsim仿真,可编程逻辑器件实现。
1.原码阵列乘法器结构参考教材上的结构,电路结构如下:
其中的阵列乘法器结构如下:
2.移位加实现的乘法器结构参考我补充的内容,数据通路图如下:
控制器状态流程图如下:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 状态图
6. 管脚分配
7. 仿真图
可以看到
-10*15=-150
12*-10=-120
7*12=84
11*-13=-143
-4*-12=48
乘法器功能验证正确
部分代码展示:
//5bit无符号移位相加乘法器 module Mult_5bit_unsigned(A,B,clk,start,mult_product); input clk,start;//start高电平时输入乘数 input [4:0] A;//A是乘数5bit input [4:0] B;//B是被乘数5bit output [9:0] mult_product;//乘积 reg [9:0] mult_product=10'd0; reg [9:0] mult_product_buf=10'd0; parameter INIT=2'd0; parameter ADD=2'd1; parameter SHIFT=2'd2; parameter s_END=2'd3; reg[1:0] state=INIT;//初始状态为INIT reg[9:0] B_buf=10'd0;//临时变量 integer Count=0; 循环移位相加状态机控制 always@(posedge clk) begin case(state) INIT://初始状态 if(start)begin state=ADD; //start有效跳转到下一个状态ADD B_buf[4:0]=B; //取被乘数 B_buf[9:5]=5'd0; //临时变量的高5位置0 end else begin mult_product_buf=0; Count=0; state=INIT; //初始状态 end ADD://相加状态 begin if(A[Count]) //判断乘数的第Count位是否为1 mult_product_buf=mult_product_buf+B_buf; //若为1则把乘数左移一位相加 state=SHIFT; //完成相加后跳到SHIFT状态继续左移 end SHIFT://移位状态 begin B_buf={B_buf[8:0],1'b0}; //左移一位,最低位补0 Count=Count+1; //计数器加一 if(Count==5) //循环5次 begin state=s_END; mult_product<=mult_product_buf; end else state=ADD; end s_END:begin//结束状态 mult_product_buf=0; Count=0; state=INIT; //初始状态 end endcase end endmodule
源代码
扫描文章末尾的公众号二维码