Verilog 无符号乘法器

目录

32位简易乘法器,乘数和部分积右移

32位简易乘法器,被乘数左移


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

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值