算法原理:

参考《基于FPGA的数字信号处理 [高亚军]》,文中给出的是10进制的计算过程,在verilog中使用2进制更方便,也避免引入缺乏控制的D×10乘法

约定:

  1. 先确定商和除数都为 n bit,则由乘法规律可知被除数为 2n bit: 除法位宽比较复杂,如果先确定被除数和除数分别为2n、n bit,则商有可能超过n bit
  2. 设求第 i 位商 q i q_i qi​迭代时的余数为 r i r_i ri​,除数为D: 则有:
    r i = r i + 1 − q i D 2 i r_i = r_{i+1} - q_iD2^i ri​=ri+1​−qi​D2i
    其中 i 在迭代时由n - 1递减至0,可求出商的所有位

结构:

外部模块div_restoring计算每一轮迭代的 q i D 2 i q_iD2^i qi​D2i值,并传递给下级模块div_iter,2进制算法中 q i q_i qi​只取0或1,故每轮迭代只需在div_iter中比较1次即可获得正确的商和当前余数

module div_restoring #(parameter N = 7
)(input     [N+N-1:0]  dividend,input      [N-1:0]     divisor,output reg  [N-1:0]     quotient,output reg  [N-1:0]    remainder,input clk,input rstn,input I_valid,output O_valid);reg        [N+N-1:0]  r_i, div_coe;
reg     [N-1:0]     i_cnt;  // 迭代位数cnt,从N到1
wire    [N+N-1:0]  r_o;
wire                q_o;wire o_valid_t;
reg i_valid_t, O_validReg;assign O_valid = O_validReg;always @(posedge clk or negedge rstn) beginif (!rstn) beginr_i <= 'b0;div_coe <= 'b0;i_cnt <= N;i_valid_t <= 1'b0;O_validReg <= 'b0;endelse if (I_valid && i_cnt == N) begin  // 迭代初始化r_i <= dividend;div_coe <= divisor << N-1;  // 计算迭代式中的系数,2为基数,相乘等于左移i_cnt <= i_cnt - 1;i_valid_t <= 1'b1;endelse if (i_cnt < N && i_cnt > 0 && o_valid_t) begin  // 迭代quotient[i_cnt] <= q_o;r_i <= r_o;  div_coe <= divisor << i_cnt - 1;i_cnt <= i_cnt - 1;i_valid_t <= 1'b1;endelse if (i_cnt == 0 && o_valid_t) beginquotient[i_cnt] <= q_o;remainder <= r_o;i_valid_t <= 1'b0;O_validReg <= 'b1;endelse begini_valid_t <= 1'b0;O_validReg <= 'b0;end
enddiv_iter #(.N(N))
div_iter_u(.clk(clk),.rstn(rstn),.I_valid(i_valid_t),.r_i(r_i),.div_coe(div_coe),.r_o(r_o),.q_o(q_o),.O_valid(o_valid_t)
);endmodule// 复用模块,计算迭代式的正负,据此给出第i位商和当前余数
module div_iter #(parameter N = 7
) (input        [N+N-1:0]  r_i,input       [N+N-1:0]  div_coe,output  reg [N+N-1:0]  r_o,output  reg             q_o,input clk,input rstn,input I_valid,output   reg O_valid
);reg [N+N-1:0] r_Reg1, r_Reg2;
reg calc_valid;always @(posedge clk or negedge rstn) beginif (!rstn) beginr_Reg1 <= 'b0;r_Reg2 <= 'b0;O_valid <= 1'b0;calc_valid <= 1'b0;r_o <= 'b0;q_o <= 'b0;endelse if (I_valid && calc_valid == 0) beginr_Reg1 <= r_i;r_Reg2 <= r_i - div_coe;  // 迭代式中的相减calc_valid <= 1'b1;O_valid <= 1'b0;endelse if (calc_valid) beginq_o <= ~r_Reg2[N+N-1];r_o <= r_Reg2[N+N-1]? r_Reg1 : r_Reg2;  // 根据符号位判断本轮余数取值O_valid <= 1'b1;calc_valid <= 1'b0;endelse beginr_Reg1 <= 'b0;r_Reg2 <= 'b0;O_valid <= 'b0;calc_valid <= 1'b0;r_o <= 'b0;q_o <= 'b0;end
endendmodule

testbench: 参考菜鸟教程

module div_restoring_tb();parameter N = 9;reg       clk, rstn;//clockalways beginclk = 0 ; #5 ;clk = 1 ; #5 ;end//resetinitial beginrstn      = 1'b0 ;#8 ;      rstn      = 1'b1 ;endreg  [N+N-1:0]  dividend;reg    [N-1:0]     divisor;wire [N-1:0]    quotient, remainder;reg I_valid;wire O_valid;// 用task完成多次赋值被除数、除数task div_data_in;input [N+N-1:0]  dividend_task;input [N-1:0]     divisor_task;beginwait (!div_restoring_tb.div_restoring_u.O_valid);  // 非输出状态rstn = 1'b0 ;@(negedge clk);  I_valid = 1'b1;dividend = dividend_task;divisor = divisor_task;rstn = 1'b1 ;@(negedge clk);  I_valid = 1'b0;  wait (div_restoring_tb.div_restoring_u.O_valid);endendtaskinitial begin#55 ;div_data_in(25, 5 ) ;div_data_in(3927, 15 ) ;div_data_in(5454, 300 ) ;div_data_in(215, 9) ;enddiv_restoring #(.N(N)) div_restoring_u(.clk(clk),.rstn(rstn),.I_valid(I_valid),.dividend(dividend),.divisor(divisor),.quotient(quotient),.remainder(remainder),.O_valid(O_valid));//simulation finishinitial beginforever begin#100;if ($time >= 10000)  $finish ;endendendmodule

【Verilog】基于恢复余数法(restoring)的除法器实现相关推荐

  1. <Verilog实现除法器> Verilog实现恢复余数(restoring)除法器

    一,内容介绍 除法器是数字电路中的基础电路之一,也是CPU计算单元的核心功能之一.下面我们用verilog实现三种常用的除法器. 目前:Verilog实现恢复余数(restoring)除法器 Veri ...

  2. 计组之数据运算:7、定点数原码除法运算(恢复余数法、加减交替法)

    7.定点数原码除法运算 思维导图 原码恢复余数法 原理实现(类比十进制) 机器实现与硬件构成 手算实现 缺点 原码加减交替法 分析 手算实现 补码加减交替法 对比 思维导图 原码恢复余数法 先看一下十 ...

  3. 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结

    在学习计算机组成原理的计算方法时,或为步骤疑惑,或为题目难倒,本文主要介绍思路以及对常用类型小结 个人总结,仅供参考,能力有限,难免出错,欢迎大家讨论,书籍参考唐朔飞版<计算机组成原理> ...

  4. 计算机组成原理-恢复余数法

    关于恢复余数法总结: 若为负数: 1.首先,则上商0: 2.第二步,无需左移 3.第三步,加上除数的绝对值的补码: 4.第四步,变成正数后,无需上商,但需要左移,然后加上除数的绝对值的负数的补码: ( ...

  5. 【细碎知识2】定点数的乘除运算(原码一位乘、恢复余数法、加减交替法)

    目录 1.定点数的乘法 1.1 原码一位乘 2.定点数的除法 2.1 恢复余数法 2.2 加减交替法 2.3 比较恢复余数法和加减交替法 方法要搭配例题一起看,才能看懂 1.定点数的乘法 定点数的乘法 ...

  6. 2.4 二进制除法运算(原码一位除恢复余数法)

    2.4.1 恢复余数法 两个原码数X和Y相除,其商Q的符号为相除两数符号的异或值,余数R与被除数同符号. 基本原理 参与运算的两数通过"异或"原则确定商的符号,再利用其绝对值相除获 ...

  7. 加减交替法(不恢复余数法)

    前言 加减交替法处理思想是先减后判,如果减余数后发现不够减,则下一步中改为加除数操作. 运算一步加减完成时,遵循的规则 当余数为正时,表示够减,即商上1,在进行下一次商时,将余数(此时为正)左移一位, ...

  8. 定点运算之原码的加减交替除法(不恢复余数法)

    加减交替法处理思想是先减后判,如果减余数后发现不够减,则下一步中改为加除数操作 一.运算规则 1.符号位异或运算 2.被除数X ,除数Y均取绝对值的补码,且取双符号位 3.被除数X初始值为 [ |X| ...

  9. 除法器的实现(恢复余数、不恢复余数、级数展开、Newton-Raphson)

    文章目录 1 基于恢复余数(Restoring)算法的除法器 1.1 原理 1.1 Verilog 实现 2 基于不恢复余数(Non-Restoring)算法的除法器 2.1 原理 2.1 Veril ...

最新文章

  1. numpy找到数组中符合条件的数
  2. ZBar 自定义界面
  3. 3月份最热门 JS开源项目排行
  4. 2020年300分计算机考研能上那个学校,2020年研究生考试很难吗 网友:我考300分能读吗?...
  5. 用一把吃鸡的时间,免费上云搭建网站应用
  6. 【动态规划】开心的小明
  7. break and continue;
  8. 转:python命令行解析工具Argparse
  9. oracle 索引原理
  10. 阿里云服务器搭建以及简易的WEB项目部署过程
  11. python样条插值(二)
  12. 计算机磁盘管理 移动硬盘创建盘符,电脑中插入移动硬盘后无法显示分区盘符如何解决...
  13. [AHK]按文件的年份归档到不同年份目录里
  14. .net core 3.1JWT用户权限认证(二)获取token
  15. 2015年百度之星程序设计大赛 - 初赛(2)
  16. 极速办公Word文档的查找和替换功能键在哪?
  17. leek()函数使用
  18. js实例化以及constructor探究
  19. 算一个数的阶乘(例如100的阶乘)
  20. 超声波风速风向仪的工作原理

热门文章

  1. wscript.shell用法
  2. LInux 入门.md
  3. 【网页报404,域名可以PING通,但是网址就是打不开】
  4. tcga数据下载_TCGA数据库免疫相关文件下载大全
  5. 在.NET中使用DirectShow
  6. Java面试常见问题及回答答案(简单明了细致)
  7. 25K~65K,一波热门技术岗位来袭,这次是你吗?
  8. Pygame | 7 - 键盘输入
  9. ES6飞机大战篇-敌机自动移动发射子弹
  10. 跨时钟域信号传输(二)——数据信号篇