目录
32位简易乘法器,乘数和部分积右移
//
//
//创建日期:2022/10/04 08:00:00
//设计名称:32位简易乘法器,乘数和部分积右移
//课程名称:multiplication
//说明:输入时钟clk,乘法开始信号mult_begin,
// 输入32位operand1,32位operand2
// 输出64位result,乘法结束信号mult_end
//依赖项:
//
//版次:
//版本0.01-文件已创建
//其他注释:
//
//
module multiplication(clk,mult_begin,operand1,operand2,result,mult_end);
input clk; // 时钟
input mult_begin; // 乘法开始信号
input [31:0] operand1; // 操作数1
input [31:0] operand2; // 操作数2
output[63:0] result; // 输出
output mult_end; // 乘法结束信号
reg [63:0] result; // 储存结果
reg mult_valid = 0; // 乘法进行信号
reg mult_end = 0; // 乘法结束信号
reg [31:0] M; // 被乘数
reg [31:0] Q; // 乘数
reg [31:0] A; // 部分积
reg C = 0; // 储存加法器进位
reg [4:0] i=8'b0; // 计数,控制循环步骤
// 控制乘法开始和初始化
always @(posedge clk) // 当时钟遇到上升沿
begin
// 如果乘法未开始,乘法进行信号置0
if (!mult_begin)
begin
mult_valid <= 1'b0;
end
else
// 否则乘法进行信号置1
begin
// 如果之前没在进行(这是开始后第一个上升沿)
if(mult_valid ==1'b0)
begin
// 初始化
M<=operand1; // 被乘数
Q<=operand2; // 乘数
A<=32'b0; // 部分积
i<=1'b0; // 计数
mult_end<=0; // 乘法停止
end
// 开始乘法
mult_valid <= 1'b1;
end
end
// 控制 乘法
always @(posedge clk) // 当时钟遇到上升沿
begin
//乘法正在运行
if(mult_valid&&~mult_end)
begin
if(Q[0])
begin
{C,A}=M+A; // 阻塞赋值加法
end
// 移位
{A,Q}={A,Q}>>1;
end
end
// 控制 i
always @(posedge clk) // 当时钟遇到上升沿
begin
//乘法正在运行
if(mult_valid&&~mult_end)
begin
i<=i+1;
// 结束
if(i==5'b11111)
begin
result <= {A,Q};
mult_end <= 1'b1;
end
end
end
endmodule
32位简易乘法器,被乘数左移
//
//
//创建日期:2022/10/04 11:49:21
//设计名称:32位简易乘法器,被乘数左移
//课程名称:multiplication
//说明:输入时钟clk,乘法开始信号mult_begin,
// 输入32位operand1,32位operand2
// 输出64位result,乘法结束信号mult_end
//依赖项:
//
//版次:
//版本0.01-文件已创建
//其他注释:
//
//
module multiplication1(clk,mult_begin,operand1,operand2,result,mult_end);
input clk; // 时钟
input mult_begin; // 乘法开始信号
input [31:0] operand1; // 操作数1
input [31:0] operand2; // 操作数2
output[63:0] result; // 输出
output mult_end; // 乘法结束信号
reg [63:0] result; // 储存结果
reg mult_valid = 0; // 乘法进行信号
reg mult_end = 0; // 乘法结束信号
reg [63:0] M; // 被乘数
reg [31:0] Q; // 乘数
reg [4:0] i=8'b0; // 计数,控制循环步骤
// 控制乘法开始和初始化
always @(posedge clk) // 当时钟遇到上升沿
begin
// 如果乘法未开始,乘法进行信号置0
if (!mult_begin)
begin
mult_valid <= 1'b0;
end
else
// 否则乘法进行信号置1
begin
// 如果之前没在进行(这是开始后第一个上升沿)
if(mult_valid ==1'b0)
begin
// 初始化
M<=operand1; // 被乘数
Q<=operand2; // 乘数
result<=64'b0; // 积
i<=1'b0; // 计数
mult_end<=0; // 乘法停止
end
// 开始乘法
mult_valid <= 1'b1;
end
end
// 控制 乘法
always @(posedge clk) // 当时钟遇到上升沿
begin
//乘法正在运行
if(mult_valid&&~mult_end)
begin
if(Q[0])
begin
result=result+M; // 阻塞赋值加法
end
// 移位
Q<=Q>>1;
M<=M<<1;
end
end
// 控制 i
always @(posedge clk) // 当时钟遇到上升沿
begin
//乘法正在运行
if(mult_valid&&~mult_end)
begin
i<=i+1;
// 结束
if(i==5'b11111)
begin
mult_end <= 1'b1;
end
end
end
endmodule