当前位置:   article > 正文

FPGA:设计一个原码一位乘法器_8位原码一位乘法器设计与实现

8位原码一位乘法器设计与实现

一、运算规则
X*Y=P
引入部分积的概念,每次Y的一位和X相乘的结果叫做部分积 ,每次相乘后需要右移一位,再处理Y下一位的数值
1.符号位单独计算(异或运算)
符号组合就4种(00.01.11.10);异或运算即相同为0,不同为1

2.被乘数X 和乘数Y 都取绝对值计算
在这里插入图片描述
3.一般把被乘数X取双符号位,并且让部分积初始值为0,长度与被乘数X相同
4.从乘数Y的最后一位开始到第一位分别于被乘数X相乘。
当Y当前位数值为1时,部分积加上 |X| (X的绝对值)
当Y当前位数值为0时,部分积加上 0
5.每次右移一位时,在最前面补0.
二、两个例子
在这里插入图片描述
在这里插入图片描述
三、设计源码(Verilog)
module array_multiplier(clk,rst_n,mul_x,mul_y,res );
input clk ;//系统时钟
input rst_n ;//复位信号
input [3:0] mul_x ;//被乘数
input [3:0] mul_y ;//乘数
output reg [7:0] res ;//结果
reg [3:0] mul_p ;//部分积
reg c ;//进位信号
reg [3:0] mul_y0 ;//储存乘数
reg en ;//使能信号
//使能信号模块
always@(posedge clk or negedge rst_n)begin
if(rst_n1’b0)begin
en<=1’b0;
end
else if(mul_x
1’b0||mul_y1’b0)begin
en<=1’b0;
end
else if(cnt
8’d3)begin
en<=1’b1;
end
else begin
en<=en;
end
end
//逻辑控制模块(计数)
reg [7:0] cnt;
always@(posedge clk or negedge rst_n)begin
if(rst_n1’b0)begin
cnt<=1’b0;
end
else if(en
1’b1)begin
cnt<=8’d0;
end
else if(cnt8’d3)begin
cnt<=8’d0;
end
else begin
cnt<=cnt+1’b1;
end
end
//逻辑控制模块(加)
reg con_add_en;
always@(*)begin
if(en
1’b1)begin
con_add_en=1’b1;
end
else if(mul_y0[0]1’b1)begin
con_add_en=1’b0;
end
else begin
con_add_en=1’b1;
end
end
always@(posedge clk or negedge rst_n)begin
if(rst_n
1’b0)begin
mul_p=1’b0;
c=1’b0;
mul_y0=mul_y;
end
else if(en1’b1)begin
mul_p=mul_p;
mul_y0=mul_y0;
end
else if(con_add_en
1’b0)begin
{c,mul_p[3:0]}=mul_x[3:0]+{c,mul_p[3:0]};
{c,mul_p[3:0],mul_y0[3:0]}={c,mul_p[3:0],mul_y0[3:0]}>>1;
end
else begin
{c,mul_p[3:0],mul_y0[3:0]}={c,mul_p[3:0],mul_y0[3:0]}>>1;
end
end
always@(posedge clk or negedge rst_n)begin
if(rst_n1’b0)begin
res<=1’b0;
end
else if(mul_x
1’b0||mul_y1’b0)begin
res<=1’b0;
end
else if(en
1’b1)begin
res<={mul_p,mul_y0[3:0]};
end
else begin
res<=res;
end
end
endmodule

四、test文件(根据自己需求写的仿真文件)
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2020/06/11 20:07:06
// Design Name:
// Module Name: test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//

module test();
reg clk;
reg rst_n;
reg [3:0] mul_x;
reg [3:0] mul_y;
wire [7:0] res;

initial begin
clk = 0;
rst_n = 0;
#100;
rst_n =1;
end

always #20 clk = ~clk;

initial begin
mul_x = 4’b0000;
mul_y = 4’b0000;
#50 mul_x = 4’b1101;
mul_y = 4’b1011;
end

array_multiplier u_multiply(
.clk(clk),
.rst_n(rst_n),
.mul_x(mul_x),
.mul_y(mul_y),
.res(res)
);
endmodule

五、仿真结果
在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/811756
推荐阅读
相关标签
  

闽ICP备14008679号