【Verilog】基于恢复余数法(restoring)的除法器实现
算法原理:
参考《基于FPGA的数字信号处理 [高亚军]》,文中给出的是10进制的计算过程,在verilog中使用2进制更方便,也避免引入缺乏控制的D×10乘法
约定:
- 先确定商和除数都为 n bit,则由乘法规律可知被除数为 2n bit: 除法位宽比较复杂,如果先确定被除数和除数分别为2n、n bit,则商有可能超过n bit
- 设求第 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−qiD2i
其中 i 在迭代时由n - 1递减至0,可求出商的所有位
结构:
外部模块div_restoring计算每一轮迭代的 q i D 2 i q_iD2^i qiD2i值,并传递给下级模块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)的除法器实现相关推荐
- <Verilog实现除法器> Verilog实现恢复余数(restoring)除法器
一,内容介绍 除法器是数字电路中的基础电路之一,也是CPU计算单元的核心功能之一.下面我们用verilog实现三种常用的除法器. 目前:Verilog实现恢复余数(restoring)除法器 Veri ...
- 计组之数据运算:7、定点数原码除法运算(恢复余数法、加减交替法)
7.定点数原码除法运算 思维导图 原码恢复余数法 原理实现(类比十进制) 机器实现与硬件构成 手算实现 缺点 原码加减交替法 分析 手算实现 补码加减交替法 对比 思维导图 原码恢复余数法 先看一下十 ...
- 加减法、原码一位乘法、Booth算法、恢复余数法、加减交替法符号位及小结
在学习计算机组成原理的计算方法时,或为步骤疑惑,或为题目难倒,本文主要介绍思路以及对常用类型小结 个人总结,仅供参考,能力有限,难免出错,欢迎大家讨论,书籍参考唐朔飞版<计算机组成原理> ...
- 计算机组成原理-恢复余数法
关于恢复余数法总结: 若为负数: 1.首先,则上商0: 2.第二步,无需左移 3.第三步,加上除数的绝对值的补码: 4.第四步,变成正数后,无需上商,但需要左移,然后加上除数的绝对值的负数的补码: ( ...
- 【细碎知识2】定点数的乘除运算(原码一位乘、恢复余数法、加减交替法)
目录 1.定点数的乘法 1.1 原码一位乘 2.定点数的除法 2.1 恢复余数法 2.2 加减交替法 2.3 比较恢复余数法和加减交替法 方法要搭配例题一起看,才能看懂 1.定点数的乘法 定点数的乘法 ...
- 2.4 二进制除法运算(原码一位除恢复余数法)
2.4.1 恢复余数法 两个原码数X和Y相除,其商Q的符号为相除两数符号的异或值,余数R与被除数同符号. 基本原理 参与运算的两数通过"异或"原则确定商的符号,再利用其绝对值相除获 ...
- 加减交替法(不恢复余数法)
前言 加减交替法处理思想是先减后判,如果减余数后发现不够减,则下一步中改为加除数操作. 运算一步加减完成时,遵循的规则 当余数为正时,表示够减,即商上1,在进行下一次商时,将余数(此时为正)左移一位, ...
- 定点运算之原码的加减交替除法(不恢复余数法)
加减交替法处理思想是先减后判,如果减余数后发现不够减,则下一步中改为加除数操作 一.运算规则 1.符号位异或运算 2.被除数X ,除数Y均取绝对值的补码,且取双符号位 3.被除数X初始值为 [ |X| ...
- 除法器的实现(恢复余数、不恢复余数、级数展开、Newton-Raphson)
文章目录 1 基于恢复余数(Restoring)算法的除法器 1.1 原理 1.1 Verilog 实现 2 基于不恢复余数(Non-Restoring)算法的除法器 2.1 原理 2.1 Veril ...
最新文章
- numpy找到数组中符合条件的数
- ZBar 自定义界面
- 3月份最热门 JS开源项目排行
- 2020年300分计算机考研能上那个学校,2020年研究生考试很难吗 网友:我考300分能读吗?...
- 用一把吃鸡的时间,免费上云搭建网站应用
- 【动态规划】开心的小明
- break and continue;
- 转:python命令行解析工具Argparse
- oracle 索引原理
- 阿里云服务器搭建以及简易的WEB项目部署过程
- python样条插值(二)
- 计算机磁盘管理 移动硬盘创建盘符,电脑中插入移动硬盘后无法显示分区盘符如何解决...
- [AHK]按文件的年份归档到不同年份目录里
- .net core 3.1JWT用户权限认证(二)获取token
- 2015年百度之星程序设计大赛 - 初赛(2)
- 极速办公Word文档的查找和替换功能键在哪?
- leek()函数使用
- js实例化以及constructor探究
- 算一个数的阶乘(例如100的阶乘)
- 超声波风速风向仪的工作原理