除法器 FPGA verilog

计算时先将计算的被除数向前扩展7位,随后由高位向低位逐8位递减,滚动记录差值。
首先被减数16位在前边拼接7位0,拼接后不会改变被除数的大小,而且方便向下操作。拼接后将此23位数称为mid。之后取mid的高8位与除数作比较,若大于除数,则减去除数,结果低位拼接一。若小于除数,则验证最高位是不是0,若是则左移一位,结果拼接0.若不是则用高九位减去除数,结果拼接两个0.然后将差和后15位以及末尾一个0拼接,实现结果循环向前。在计算的同时用计数器计数来确定运行到的位数。在进行以上操作,最终得到结果。
实际算法和平常做除法竖式原理相同,只是为了速度将一些操作合并在同一时刻进行,加快了运算速度。

`timescale 1ns / 1ps
 


module devided(
                clk,
                rst_n,
                a,
                b,
                result,
                remainder
    );
    
    input                 clk;
    input                 rst_n;
    
    input   [15:0]        a;   // 被除数
    input   [7:0]         b;   //除数
    
    output  reg  [15:0]        result; // 商
    output    [7:0]         remainder;//余数
    
    reg    [22:0]        mid_a ;
    reg    [2:0]         state;
    reg    [6:0]         diff;
    reg    [4:0]         cnt;
    
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)begin
            mid_a <= {7'd0,a};
            state <= 3'd0;
            result <= 16'd0;
            diff  <= 7'd0;
            cnt   <= 5'd0;
            end
        else if( cnt == 5'd16) begin
            mid_a   <=  mid_a;  
            state   <=  state ; 
            result   <= result ;
            diff    <=  diff ;  
            cnt     <=  cnt;    
        end
        else
            case(state)
            3'd0:begin
                   if(mid_a[22:15] < b)begin
                        state  <= 3'd2;
                   end
                   else begin          
                         state  <= 3'd1;
                   end
            end
            3'd1:begin 
                        result <= { result[14:0], 1'd1};
                        diff   <= mid_a[22:15] - b;
                        state  <= 3'd3;
            end
            3'd2:begin
                          result <= { result[14:0], 1'd0};
                         state  <= 3'd4;
            end
            3'd3:begin
                        mid_a <= { diff,mid_a[14:0],1'd0};
                        cnt   <= cnt + 5'd1;
                        state <= 3'd0;
            end
            3'd4:begin
                        if(mid_a[22]) begin
                            result <= { result[14:0], 1'd1};
                            diff   <= mid_a[22:14] - b;
                            cnt    <= cnt +5'd1;
                            state  <= 3'd3;
                        end
                        else begin
                            diff   <= mid_a[21:15];
                            state  <= 3'd3;
                        end    
            end

            default: state <= 3'd0;
            endcase
    end 
    
    assign  remainder = diff;
endmodule

在这里插入图片描述

dividend为被除数,divisor为除数,quotient为整数商,decimals为小数商
dividend ÷ divisor = quotient.decimals
设计的端口介绍具体如下所示:

在这里插入图片描述

状态机设计
为节省电路面积,使寄存器共用,流程设计更清晰无误,本除法器的设计采用状态机的设计。
状态1:读入除数与被除数;
状态2:进行求整数商的运算;
状态3:进行求小数商的运算;
在这里插入图片描述

状态1读入除数与被除数
当div_en读入使能信号打开为1,数据读入,state为1,开始读入数据验证。

在这里插入图片描述

状态2求整数商的设计
在上面所描述到的,如果被除数一开始是大于除数的话,那么在求整数商时,就应该进行减法操作。
在这里插入图片描述

状态2求整数商的设计:在这里插入图片描述

状态3求小数商的设计
在上面的描述到了,如果补位进位后的被除数大于除数,就需要再一次进行减法操作。
在这里插入图片描述
状态3小数商的设计:
在这里插入图片描述
算法设计验证
算法的设计仿真验证,以被除数165,除数28为验证数据,我们可以自己先计算一下。
165/28=5.8929,也就是说相对于的我们仿真的数据应该是整数商quotient=5,decimals = 0.89286。
具体的仿真是否符合预期结果,建立仿真环境验证开始:
在这里插入图片描述

https://blog.csdn.net/weixin_39015789/article/details/101195249?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值