Verilog除法器(32位无符号+带符号)

32位无符号除法器设计

恢复余数法:

恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0.
寄存器使用:

reg_r 存放被除数a
reg_b 存放除数b
reg_r 存放余数(初始清零)

具体做法:

做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正负,减法器的位数要比除数的位数多出一位。若相减为正,则减法器输出的最高位为0;若相减为负,则减法器输出的最高位为1。

若相减结果为正,把相减结果写入reg_r(部分余数),reg_q的内容左移一位,最低位放入商1。
若相减结果为负,把被减数写入reg_r(恢复之前的余数),reg_q的内容左移一位,最低位放入商0。

循环上述减法,知道被除数全部移除reg_q为止。计算结束后reg_q中内容是商,reg_r中的内容是余数

Tips:

之所以能够一位一位减,是因为若一个数a可以除b,则a左移一位之后(相当于乘2),仍然可除b。

不恢复余数除法

在恢复余数除法算法中,如果部分余数为负,则要恢复原来的余数并左移。设部分余数为R,除数为B。恢复余数相当于R+B,左移相当于(R+B)*2。以上操作完成后进行下一轮的迭代,即从部分余数中减去B。我们有以下的等式:

(R+B)2-B=R2+B

所以不管相减结果是正是负,都把它写入reg_r,若为负,下次迭代不是从中减去除数而是加上除数。

代码如下:

`timescale 1ns / 1ps
module DIVU(
    input [31:00] dividend,
    input [31:00] divisor,
    input start,
    input clock,
    input reset,
    output [31:00] q,
    output [31:00] r,
    output reg busy
    );
    wire ready;
    reg [5:0] count;
    reg [31:00] reg_q;
    reg [31:00] reg_r;
    reg [31:00] reg_b;
    reg busy2,r_sign;
    assign ready=~busy&busy2;
    wire [32:0] sub_add=r_sign?({reg_r,q[31]}+{1'b0,reg_b}):
                                ({reg_r,q[31]}-{1'b0,reg_b});
    assign r=r_sign?reg_r+reg_b:reg_r;
    assign q=reg_q;
    
    always @(posedge clock or posedge reset)begin
    if(reset)begin
        count<=0;
        busy<=0;
        busy2<=0;
    end
    else begin
        busy2<=busy;
        if(start)begin
            reg_r<=32'b0;
            r_sign<=0;
            reg_q<=dividend;
            reg_b<=divisor;
            count<=0;
            busy<=1;
        end
        else if(busy)begin
            reg_r<=sub_add[31:0];
            r_sign<=sub_add[32];
            reg_q<={reg_q[30:0],~sub_add[32]};
            count<=count+1;
            if(count==31)busy<=0;
        end
    end
    end                            
endmodule

32位带符号除法器

带符号数不恢复余数除法

和不带符号不恢复余数思想一致。如果部分余数(第一次为被除数)和除数的符号相同,则减去除数,否者加上除数。这样做的结果导致求出的商为正数,最后还要根据符号对商进行调整。

代码如下:

`timescale 1ns / 1ps
module DIV(
    input [31:0] dividend,
    input [31:0] divisor,
    input start,
    input clock,
    input reset,
    output [31:0] q,
    output [31:0] r,
    output reg busy
    );
    wire ready;
    reg [5:0] count;
    reg [31:00] reg_q;
    reg [31:00] reg_r;
    reg [31:00] reg_b;
    wire [31:00] reg_r2;
    reg busy2,r_sign,sign;
    assign ready=~busy&busy2;
    wire [32:0] sub_add=r_sign?({reg_r,reg_q[31]}+{1'b0,reg_b}):
                                ({reg_r,reg_q[31]}-{1'b0,reg_b});
    assign reg_r2=r_sign?reg_r+reg_b:reg_r;
    assign r=dividend[31]?(~reg_r2+1):reg_r2;
    assign q=(divisor[31]^dividend[31])?(~reg_q+1):reg_q;
    
    always @(posedge clock or posedge reset)begin
    if(reset)begin
        count<=0;
        busy<=0;
        busy2<=0;
    end
    else begin
        busy2<=busy;
        if(start)begin
            reg_r<=32'b0;
            r_sign<=0;
            if(dividend[31]==1) begin
                reg_q<=~dividend+1;
            end
            else reg_q<=dividend;
            if(divisor[31]==1)begin
                reg_b<=~divisor+1;
            end
            else reg_b<=divisor;
            count<=0;
            busy<=1;
        end
        else if(busy)begin
            reg_r<=sub_add[31:0];
            r_sign<=sub_add[32];
            reg_q<={reg_q[30:0],~sub_add[32]};
            count<=count+1;
            if(count==31)busy<=0;
        end
    end
    end    
endmodule

  • 18
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 32位无符号除法器是一种用于计算器、数字信号处理器等电子工程中的数字芯片。它可以执行32位数的无符号除法运算,无符号表示运算中不考虑正负号。在Verilog中实现32位无符号除法器需要以下步骤: 第一步是输入寄存器,并设置初始值。在该寄存器中输入需要进行除法运算的两个32位无符号整数B和A,其中被除数A为32位,除数B为32位。 第二步是进行除法操作,可以使用“非规范化除法法”或“高精度除法法”等算法。这里我们以“非规范化除法法”为例进行说明。首先将余数寄存器初始化为被除数A的值,然后除以除数B,如果余数寄存器的值小于除数B,则继续左移一位,将除数B左移一位,然后再次减去除数B。一直重复这个过程,直到余数寄存器的值大于等于除数B为止,此时将商寄存器的值左移一位,最后将商寄存器加上1。 第三步是输出商寄存器的结果。商寄存器存储的即为除法运算的结果,是32位无符号整数。 综上所述,我们可以在Verilog中实现32位无符号除法器,它能够进行32位无符号整数A/B的除法操作,并输出商寄存器的结果。这种除法器可以用于数字计算器、数字信号处理器等电子工程中的数字芯片中。 ### 回答2: 32位无符号除法器是一种数字电路设计,可以将32位无符号整数除以任意不为零的32位无符号数。在Verilog语言中,可以使用模块化方法实现32位无符号除法器。 首先,需要定义输入输出端口,包括32位除数dividend、32位除数divisor和32位商quotient。接着,使用Verilog代码实现除法运算的算法,例如时间复杂度为O(n)的16位位移除法算法。在该算法中,先将除数左移直至其最高位小于等于被除数的最高位,然后将被除数减去左移后的除数,直到被除数小于除数,商的每一位由减法的次数确定。 最后,需要注意除数不能为零的情况,可以使用if语句判断并将商赋值为全零。此外,在实现中需要注意数据类型的选择,整数需要用无符号类型表示,如"reg [31:0] dividend"。 ### 回答3: 32位无符号除法器是一种能够将两个32位无符号整数相除的硬件电路。相对于软件实现,在硬件中实现除法运算可以获得更高的速度和性能,适用于需要快速且高效处理除法运算的场合。 在verilog语言中实现32位无符号除法器,需要写出divisor、dividend、quotient和remainder四个信号的代码,并通过实例化模块实现调用和传输数据。在计算机底层结构中,实现方式主要是通过作差减法和移位右移的方式将除数和被除数逐渐逼近相等,并通过商和余数的累计得出最终结果。 具体实现过程中,可以使用类似于Booth算法或者类似于龙皮递归算法的递归结构来进行除法计算。此外,在代码实现中还需要注意一些细节问题,如除数为0的特殊情况、被除数小于除数的情况等,需要考虑如何解决或者报错提示。 总的来说,32位无符号除法器是一种实现除法运算的高效且可靠的方法。在硬件实现中可以使用verilog语言进行代码编写,并通过递归算法实现高效的除法运算。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值