二进制除法移位相减_verilog移位相减实现除法(转载)

引言

除法器在FPGA里怎么实现呢?当然不是让用“/”和“%”实现。

在Verilog HDL语言中虽然有除的运算指令,但是除运算符中的除数必须是2的幂,因此无法实现除数为任意整数的除法,很大程度上限制了它的使用领域。并且多数综合工具对于除运算指令不能综合出令人满意的结果,有些甚至不能给予综合。即使可以综合,也需要比较多的资源。对于这种情况,一般使用相应的算法来实现除法,分为两类,基于减法操作和基于乘法操作的算法。

2.1 实现算法

基于减法的除法器的算法:

对于32的无符号除法,被除数a除以除数b,他们的商和余数一定不会超过32位。首先将a转换成高32位为0,低32位为a的temp_a。把b转换成高32位为b,低32位为0的temp_b。在每个周期开始时,先将temp_a左移一位,末尾补0,然后与b比较,是否大于b,是则temp_a减去temp_b将且加上1,否则继续往下执行。上面的移位、比较和减法(视具体情况而定)要执行32次,执行结束后temp_a的高32位即为余数,低32位即为商。

2.2 verilog HDL代码

/*

* module:div_rill

* file name:div_rill.v

* syn:yes

* author:network

* modify:rill

* date:2012-09-07

*/

module div_rill

(

input[31:0] a,

input[31:0] b,

output reg [31:0] yshang,

output reg [31:0] yyushu

);

reg[31:0] tempa;

reg[31:0] tempb;

reg[63:0] temp_a;

reg[63:0] temp_b;

integer i;

always @(a or b)

begin

tempa <= a;

tempb <= b;

end

always @(tempa or tempb)

begin

temp_a = {32'h00000000,tempa};

temp_b = {tempb,32'h00000000};

for(i = 0;i < 32;i = i + 1)

begin

temp_a = {temp_a[62:0],1'b0};

if(temp_a[63:32] >= tempb)

temp_a = temp_a - temp_b + 1'b1;

else

temp_a = temp_a;

end

yshang <= temp_a[31:0];

yyushu <= temp_a[63:32];

end

endmodule

/*************** EOF ******************/

2.3 testbench代码

/*

* module:div_rill_tb

* file name:div_rill_tb.v

* syn:no

* author:rill

* date:2012-09-07

*/

`timescale 1ns/1ns

module div_rill_tb;

reg [31:0] a;

reg [31:0] b;

wire [31:0] yshang;

wire [31:0] yyushu;

initial

begin

#10 a = $random()%10000;

b = $random()%1000;

#100 a = $random()%1000;

b = $random()%100;

#100 a = $random()%100;

b = $random()%10;

#1000 $stop;

end

div_rill DIV_RILL

(

.a (a),

.b (b),

.yshang (yshang),

.yyushu (yyushu)

);

endmodule

/******** EOF ******************/

2.4 仿真结果

2.5 改进

1,将组合逻辑改成时序逻辑,用32个clk实现计算。

2,计算位宽可以配置,具有扩展性。

附录:算法推倒(非原创):

假设4bit的两数相除 a/b,商和余数最多只有4位 (假设1101/0010也就是13除以2得6余1)

我们先自己做二进制除法,则首先看a的MSB,若比除数小则看前两位,大则减除数,然后看余数,以此类推直到最后看到LSB;而上述算法道理一样,a左移进前四位目的就在于从a本身的MSB开始看起,移4次则是看到LSB为止,期间若比除数大,则减去除数,注意减完以后正是此时所剩的余数。而商呢则加到了这个数的末尾,因为只要比除数大,商就是1,而商0则是直接左移了,因为会自动补0。这里比较巧因为商可以随此时的a继续左移,然后新的商会继续加到末尾。经过比对会发现移4位后左右两边分别就是余数和商。

画个简单的图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python选课系统代码_python模拟选课系统

要求&#xff1a;角色:学校、学员、课程、讲师要求:1. 创建北京、上海 2 所学校2. 创建linux , python , go 3个课程 &#xff0c; linux\py 在北京开&#xff0c; go 在上海开3. 课程包含&#xff0c;周期&#xff0c;价格&#xff0c;通过学校创建课程4. 通过学校创建班级&am…

php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码

一、忘记密码模块路由二、控制器解析跟注册、登录的控制器一样&#xff0c;大部分的逻辑使用trait引入。ForgotPasswordController&#xff1a;负责忘记密码页面&#xff0c;以及邮件发送四、扩展开发&#xff1a;自定义的忘记密码行为忘记密码有多种处理方式&#xff0c;这里默…

flume数据丢失与重复_Flume监听文件到kafka,文件通道,kafka消费重复问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#me the components on this agenta1.sources r1a1.sinks k1a1.channels c1# Describe/configure the sourcea1.sources.r1.type execa1.sources.r1.command tail -F /usr/local/test1.txta1.sources.r1.fileHeader truea1.s…

MBSE系统工程是什么

MBSE&#xff08;基于模型的系统工程&#xff09;是现代系统工程的最新发展结果。 曾经的产品设计师利用纸笔绘制图版来制作产品和设计&#xff0c;在CAD这类三维建模软件的出现&#xff0c;让工程师们甩掉了图板和图纸&#xff0c;带来的效益大家都能理解。 目前系统工程师们…

python输出箭头代码_python matplotlib 注释文本箭头简单代码示例

注释文本箭头结果展示&#xff1a;完整代码示例&#xff1a;import numpy as npimport matplotlib.pyplot as pltfig,ax plt.subplots(figsize(5,5))ax.set_aspect(1)x1 -1 np.random.randn(100)y1 -1 np.random.randn(100)x2 1. np.random.randn(100)y2 1. np.random…

《数字孪生体技术白皮书》

导读&#xff1a;这几年&#xff0c;数字孪生体的概念炙手可热&#xff0c;越来越成为从工业到产业、从军事到民生各个领域的智慧新代表。数字孪生体实验室与安世亚太联合正式发布了《数字孪生体技术白皮书&#xff08;2019&#xff09;》。希望本白皮书能为业内同行提供参考&a…

python换行后开头有缩进_python编码规范(三)--空行,换行,缩进

1.空行空一行&#xff1a;用于类成员函数之间&#xff0c;或者用于区分不同逻辑块空两行&#xff1a;类与类&#xff0c;类与函数&#xff0c;函数与函数之间class Test(object):"""Test class,提供通用的方法"""def __init__(self):""…

数值计算软件有哪些?一款国产软件非常亮眼。

数值计算软件有哪些&#xff1f;一款国产软件非常亮眼。 数学软件由算法标准程序发展而来, 大致形成于70年代初期。随着几大数学软件工程的开展,如美国的NATS工程&#xff0c;人们探索了产生高质量数学软件的方式、方法和技术。 经过长期积累&#xff0c;已有丰富的、涉及广泛数…

linux 删除分区_详解linux系统架构--文件系统体系

概述之前已经对Linux系统架构的内核部分单独做了深入介绍&#xff0c;今天就拿Linux系统架构中的文件系统做一下介绍吧~先介绍下概念&#xff1a;文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统&#xff0c;如EXT2、 EXT3、EXT4、 FA…

什么是数字孪生,为什么对物联网很重要

数字孪生是物理设备的虚拟呈现&#xff0c;数据科学家和IT专业人员可以在开发实际项目之前使用数字孪生技术来模拟运行。数字孪生还改变了物联网、人工智能和数据分析等技术的优化方式。 什么是数字孪生&#xff1f; 数字孪生是指物理世界或系统的虚拟数字化呈现。数字孪生背后…

plsql如何查看mysql库_plsql 如何查看表数据库表

如何使用PLSQL Developer从oracle数据库 导入导出数据如何使用PLSQL Developer从oracle数据库 导入导出数据   用pl/sql developer导出表的数据时有三种方式&#xff1a;Oracle Export&#xff0c;Sql Insert&#xff0c;pl/sql developer   只有“Oracle Export”方式导出…

2020年工业软件的处境是“危”还是“机”?

2020年&#xff0c;工业软件发展所面临的“危机”&#xff0c;如同硬币的两面&#xff0c;在时代强光的照射之下尤其引人注目。硬币的A面首先是“危“。 2020年中&#xff0c;MATLAB等多家国外知名工业软件产品在国内多家机构被禁用&#xff0c;让很多业外人士都关注到了这一系…

GOF设计模式之桥接模式

一、引入 现需要提供能够绘制4种不同颜色且笔画粗细有大中小3种型号的画笔。 方法一&#xff1a;蜡笔 我们需要准备3*412支蜡笔&#xff0c;也就是说必须准备12个具体的蜡笔类 方法二&#xff1a;毛笔 只需要准备三种型号的毛笔&#xff0c;外加四个颜料盒&#xff0c;用347…

antd 设置表头属性_使用表数据自定义React Antd表头

In my React project, I need to customize antd table header as followsI have added sample code bellow.I need to have Sum of the amount in the header of the Amount columnSample Code:解决方案You can use title function like this for get total of amount fieldsc…

c6x Linux 内核中断分析

1. 内核中断介绍 1.1 中断简介 所有支持Linux的平台都采用了中断&#xff08;interrupt&#xff09;的概念&#xff0c;以便&#xff08;因种种原因&#xff09;引入周期性的中断。需要区分两种类型的中断。 1. 硬件中断&#xff08;hardware interrupt&#xff09;&#xff1a…

ccf 智能运维 裴丹_智能运维 聊一聊实时计算系统

本文是我在实时数据计算系统的设计、开发、运维生涯的一部分经验总结。主要介绍一些设计思路和常见问题的解决方案&#xff0c;不关注具体计算框架的使用。本人主要致力于监控系统数据计算方向&#xff0c;主要业务场景有&#xff1a;监控数据的ETL、数据汇聚、分析、异常检测等…

系统建模、分析、仿真和验证软件工具ModelCodoer

在安全关键领域&#xff0c;基于模型的软件工程已逐渐进入了我国的装备研制过程中。使用SimuLink或者SCADE等嵌入式软件建模工具进行可视化建模&#xff0c;然后生成高可靠的二进制代码逐渐成为了安全关键领域的主流软件开发方式。由迪捷软件自主研发的系统建模、分析、仿真和验…

php配置email支持_使用PHPMailer实现PHP发邮件功能

第一步&#xff1a;打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer&#xff0c;PHPMailer 需要 PHP 的 sockets 扩展支持&#xff0c;而登录 QQ 邮箱 SMTP 服务器则必须通过 SSL 加密的&#xff0c; PHP 还得包含 openssl 的支持。第二步&#xff1a;使用 php…

如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?

SkyEye全数字实时仿真平台&#xff0c;简称SkyEye&#xff0c;是一款支持 ARM、TI DSP、PowerPC、X86、SPARC、龙芯、飞腾等多种处理器体系架构的指令级仿真平台。 SkyEye可以部署在桌面计算机上&#xff0c;开发人员可以基于SkyEye提供的已有模型库的组件&#xff08;如处理器…

bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题

java保留两位小数问题&#xff1a;方式一&#xff1a;四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();保留两位小数---------------------------------------------…