文章目录

    • 基本原理
    • 确定除数最高位
    • 移位相减

基本原理

若想得到yx\frac{y}{x}xy的商和余数,一种最直观的想法就是不断地用yyy减掉xxx,直到y<xy< xy<x为止,写成伪代码如下

z = 0
while y<x:y -= xz += 1

这种算实在是太低效了,为了用更短的循环计算出结果,我们可以参考小学时候学的长除法算式,按位计算。即从yyy的高位中截取和xxx等长的部分,当二者都用10进制表示时,就是做一次十以内的除法,而这个十以内的除法仍然按照上面的连续减法实现。这样一来,如果yyyxxxNNN位,则计算次数从原来的10N10^N10N成功降到了10N10N10N,优化效果拉满。

而众所周知,硬件电路中只有010101,也就是说y,xy, xy,x都应该用二进制来表示,如此一来,在进行高位比较时,只需做一次减法即可。从而将10N10N10N次的减法计算,降低到了log⁡2(10N)\log_2(10N)log2(10N),这就是移位相减算法,其算法流程为

  1. yyy的高位数据,位宽和xxx相同。
  2. yyy高位数据与xxx作比较,如果前者不小于后者,则当前位的商为111,两者做差得到第一步的余数;否则商为000,将前者直接作为余数。
  3. 将上一步中的余数与yyy剩余最高位 1bit 数据拼接成新的数据,再和xxx做比较。可以得到新的商和余数。
  4. 重复过程333,直到yyy最低位数据也参与计算。

确定除数最高位

尽管verilog中的数据会事先声明长度,但在除法计算时,必须先找到除数真正的最高位,例如y=4′b1111y=4'b1111y=4b1111x=4′b0001x=4'b0001x=4b0001,二者的商很明显是4′b11114'b11114b1111,但默认xxx长度是4位,则结果为111,显然是错的。

下面就是查找最高位的算法,在循环时用到了组合逻辑。

reg start;            //外部给入的开始计算的信号
reg leftDone;	        //找到最高位
reg [31:0] y;
reg [31:0] x;
reg [7:0]  rL;        //x真正的最高位,realLeft
reg signed [7:0] iL;  //用于rL迭代
reg found;				    //标记是否找到最高位parameter xLeft = 31;always@(negedge rst or posedge clk)beginif(!rst)leftDone <= 0;else if (leftDone)leftDone <= 1'b0;else if (start) beginfound = 1'b0;for(iL = xLeft; iL>=0; iL = iL -1)beginif(!found && x[iL])beginrL = iL;found = 1'b1;endendleftDone <= 1'b1;	end
end

其中

  • 【start】为外部传来的信号,表示开始计算
  • 【leftDone】为1时,表示找到了xxx的最高位,从而开启移位相减算法。这个信号只有一个时钟周期是1,即移位相减算法只需开启一次。
  • 【found】为for循环的标志位,当其为1时跳出循环。

移位相减

在找到xxx的最高位之后,就可以开启移位相减法了,代码如下

reg [39:0] res;
reg divStart;			  //开始除法
reg calcDone;
reg [20:0] rem;			//余数,其中20位有效
reg [4:0] iDiv;			//除法器位数parameter resLen = 40;
parameter yLeft = 39;	//sx最高位always@(negedge rst or posedge clk) beginif(!rst)beginres <= 0;calcDone <= 0;divStart <= 0;iDiv <= resLen;end else beginif(calcDone)calcDone <= 0;else if(leftDone)begindivStart <= 1;rem <= y >> (yLeft-rL);   //当前余数iDiv <= yLeft-rL;         //iDiv 初始化end else if(divStart) beginif(iDiv==0)begindivStart <= 0;calcDone <= 1;end else if(iDiv > 0)beginif(rem >= x) beginres[iDiv] <= 1'b1;rem <= ((rem-x)<<1) + y[iDiv-1];end else beginres[iDiv] <= 1'b0;rem <= (rem<<1) + y[iDiv-1];endendiDiv <= iDiv -1;endend
end

其中

  • 【divStart】为1时,可以进行移位。其开启方式为leftDone为1,即确认查找到xxx的最高位之后。
  • 【calcDone】为计算成功的标志位,与leftDone一样,也只有一个时钟周期是1。该信号用于输出给其他模块。
  • 【rem】为移位相减的临时除数,本算法并不会保留余数。
  • 【iDiv-1】为yyy被纳入计算的最低位。

移位相减的核心代码如下,其基本逻辑是,若当前余数大于xxx,则在res对应的位上置1,同时将rem-xyyy的下一位合并,作为接下来与xxx相比较的数;若当前余数小于xxx,则在res对应的位上置0,并将remyyy的下一位合并。

if(rem >= x) beginres[iDiv] <= 1'b1;rem <= ((rem-x)<<1) + y[iDiv-1];
end else beginres[iDiv] <= 1'b0;rem <= (rem<<1) + y[iDiv-1];
end

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

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

相关文章

EasyLive的一些疑问

目录 一、pinia是什么 二、html的代码片段又失效&#xff1f; 三、Request.js 四 、状态管理库 五、main.js:19 Uncaught SyntaxError: The requested module /src/utils/Api.js?t1745328489985 does not provide an export named default (at main.js:19:8)​编辑 六、…

C++(String):

目录 string与C中字符串的区别&#xff1a; C字符串&#xff1a; string字符串&#xff1a; string的定义和初始化&#xff1a; 输入字符串&#xff1a; 方式1&#xff1a; 方式2&#xff1a; 字符串的拼接的操作&#xff1a; 方式1&#xff1a;使用“” 方式2&#…

【Linux】Java线上问题,一分钟日志定位

【Linux】Java线上问题&#xff0c;一分钟日志定位1. 查看异常堆栈2. 实时叮新日志3. 翻历史/压缩日志4. 统计异常数量5. 多种异常一起查6. 反向过滤7. 同时满足多个关键字查询8. 定位最近一次异常9. 异常排行榜1. 查看异常堆栈 # 在 a.log 文件中查找包含 NullPointerExcepti…

智慧农业温室大棚远程监控物联网系统解决方案

一、方案背景与目标随着现代农业向智能化、精准化转型&#xff0c;传统温室大棚管理面临效率低、响应慢、成本高等痛点。本方案通过部署御控农业物联网系统&#xff0c;实现温室环境参数实时监测、设备远程控制、数据智能分析及预警决策&#xff0c;助力农户降低人工成本&#…

【剖析高并发秒杀】从流量削峰到数据一致性的架构演进与实践

一、 挑战&#xff1a;三高背景下的数据库瓶颈秒杀场景的核心挑战可以归结为“三高”&#xff1a;高并发、高性能、高可用。而系统中最脆弱的一环&#xff0c;往往是我们的关系型数据库&#xff08;如MySQL&#xff09;。它承载着最终的数据落地&#xff0c;其连接数、IOPS和CP…

Redisson最新版本(3.50.0左右)启动时提示Netty的某些类找不到

文章目录一、写在前面二、解决方案1、解决方案2、一劳永逸3、确定redisson依赖netty的版本一、写在前面 Redisson最新版本&#xff0c;大概3.47.0&#xff0c;在JDK8环境下&#xff08;实测JDK17也一样&#xff09;会提示Netty的某些类找不到&#xff1a; Exception in threa…

MTK Linux DRM分析(八)- KMS drm_crtc.c

一、简介 Linux DRM(Direct Rendering Manager)子系统是内核中管理图形硬件的核心组件,而 CRTC(CRT Controller)又是其中的关键之一。它起源于过去控制阴极射线管(CRT)显示器的控制器概念,如今在现代图形显示中依旧扮演着至关重要的角色。 可以把 CRTC 想象成图形显示…

vue+openlayers示例:适配arcgis矢量瓦片服务以及样式(附源码下载)

由于单位这边有个项目是基于openlayers地图引擎框架实现webgis地图可视化功能&#xff0c;但是要调用第三方的arcgis矢量瓦片服务以及适配样式&#xff0c;在这个背景下&#xff0c;基于openlayersvue实现适配arcgis矢量瓦片服务以及样式效果&#xff0c;适合学习openlayers与前…

mybatis xml中表名 字段报红解决

mybatis xml中表名 字段报红解决

谷歌浏览器重定向url,谷歌浏览器浏览网页修改url到本地

谷歌应用商店搜索插件requestly&#xff08;有个相似名称的插件&#xff0c;选择这个Requestly: Supercharge your Development & QA&#xff09; 安装后打开插件网址https://app.requestly.io/rules/my-rules 新建规则rules->my rules-> new rule -> redirect …

教育场景下禁用html5播放器拖动进度条的例子

禁用视频课程进度条的拖动功能&#xff0c;主要是为了强制学员按照课程设计的顺序观看内容&#xff0c;防止跳过关键知识点&#xff0c;从而保证学习效果和课程的完整性。 1.防止应试作弊&#xff1a; 在一些需要观看视频才能解锁下一章节或完成测试的场景中&#xff0c;禁用…

async实战

一、协程 协程是程序员人为创造 协程是一种用户态内的上下文切换技术。通过一个线程实现代码块相互切换执行。yield返回生成器 yield from 代表&#xff0c;跳到 func2协程函数 通过函数名()&#xff0c;是执行不了的。需要把函数加入到loop里面来&#xff0c;才可以被执行。 把…

个人搭建小网站教程(云服务器Ubuntu版本)

目录 1.配置云服务器&#xff08;略讲&#xff09; 2.vscode连接&#xff08;ssh连接&#xff09; 3.本地压缩项目包 4.传输项目 5.配置项目依赖 6.运行项目 1.启动 FastAPI 后端&#xff08;Python 部分&#xff09; 2.启动 Next.js 前端&#xff08;Node.js 部分&…

pion/webrtc v4.1.4 版本发布:关键特性与性能优化全面解析

引言 实时通信技术在现代互联网应用中扮演着越来越重要的角色&#xff0c;从视频会议到在线教育&#xff0c;从远程医疗到物联网设备交互&#xff0c;WebRTC技术已经成为实时音视频通信的事实标准。作为Go语言中最成熟且广泛使用的WebRTC实现&#xff0c;pion/webrtc项目持续推…

集成算法(聚类)

下面简单集成算法代码from sklearn.datasets import make_blobs from sklearn.cluster import KMeans import matplotlib.pyplot as plt# 创建数据集&#xff0c;生成 3 个中心的聚类数据&#xff0c;共 300 个样本&#xff0c;每个样本 2 个特征 X, _ make_blobs(n_samples30…

01 网络信息内容安全--绪论

1 课程内容 网络信息内容获取技术网络信息内容预处理技术网络信息内容过滤技术社会网络分析技术入侵检测技术异常流量检测技术对抗攻击技术 2 理论研讨 分为16个组 2.1 网络信息内容获取技术&#xff1a;第1组 【用DeepSeek网站爬虫&#xff0c;数据获取零成本&#xff01…

GPT-5:天变了吗?还是风停了?

2025年8月8日&#xff0c;OpenAI 发布了 GPT-5。这次更新被许多人寄予厚望&#xff0c;也引发了不少争议。对普通用户来说&#xff0c;这是一场“又快又会做事”的智能盛宴&#xff1b;而对资深开发者和 AI 研究者而言&#xff0c;GPT-5 可能更像是一次不够激进、略显保守的版本…

生信分析自学攻略 | R语言数据筛选和修改

在《生信小白自学攻略》系列的前几篇文章中&#xff0c;我们已经了解了 R 和 RStudio 的安装、RStudio 的深度探索&#xff0c;以及 R 语言的基本数据类型和数据结构。现在&#xff0c;是时候深入探讨如何运用 R 语言对数据进行精细化处理了。本篇推文将详细介绍如何在 R 中对数…

从零开始学习概念物理(第13版)(1)

前言&#xff1a;对我来说&#xff0c;最有用的就是物理了&#xff0c;尤其是电磁学。但是要学好它&#xff0c;我得夯实我的基础&#xff0c;前面更加基础的数学和物理都不能拉下。现在我问了Deepseek推荐的国外物理书&#xff0c;这本《概念物理》是最适合我&#xff0c;等入…

CSS变量

元素背景需要统一&#xff0c;一个个设置修改起来很麻烦&#xff0c;也没有全局变量&#xff1f; CSS中的变量_css变量-CSDN博客 -- 前缀定义变量&#xff0c;var(--) 使用变量&#xff0c;:root 表示根元素。 :root { --bg:#222; --fg:#bbb; } body { background:var(--bg)…