数字图像处理(6):除法运算、除法器

ops/2024/11/27 8:52:36/

(1)当除数是常数时,可以先转化为乘法,再右移,乘法的N越大,计算误差越小。

        如:计算x/122,可以看成(x * 67)>>13,N=13,使用verilog实现:

reg     [15:0]  x;
reg     [9:0]   y;
//y= x /122
assign y = ((x << 6) + (x << 1) + x) >> 13;

(2)使用状态机实现一个除法器

预算规则:

  • 将除数扩大到和被除数同位宽,比较其大小。
  • 如果被除数更大,则上位1;反之,上位0。如果被除数更大,临时除数要等于被除数减掉对应扩大后的除数,反之不用。
  • 继续前两步骤,直至被除数同临时被除数同位宽。
module divide #(parameter IW = 32,      // 被除数位宽parameter DW = 9,       // 除数位宽parameter OW = IW-DW    // 商的位宽
)(input  wire             clk,input  wire             reset,input  wire             valid_i,input  wire [IW-1:0]    dividend,    // 被除数input  wire [DW-1:0]    divisor,     // 除数output reg              valid_o,      // 输出有效信号output reg  [OW-1:0]    quotient,    // 商output reg  [DW-1:0]    remainder    // 余数
);// 内部信号定义
reg [IW-1:0]    dividend_reg;    // 被除数寄存器
reg [DW-1:0]    divisor_reg;     // 除数寄存器
reg [OW-1:0]    quotient_temp;   // 临时商
reg [IW-1:0]    diff;            // 差值
reg [5:0]       count;           // 计数器
reg             busy;            // 除法器忙状态
reg [IW-1:0]    shifted_divisor; // 移位后的除数// 状态定义
localparam IDLE = 3'b001;
localparam CALC = 3'b010;
localparam DONE = 3'b100;
reg [2:0] state;// 状态机和除法逻辑
always @(posedge clk or posedge reset) beginif (reset) beginstate <= IDLE;busy <= 1'b0;valid_o <= 1'b0;quotient <= {OW{1'b0}};remainder <= {DW{1'b0}};count <= 6'd0;endelse begincase (state)IDLE: beginif (valid_i && !busy) beginif (divisor == 0) begin  // 除数为0检查state <= DONE;quotient <= {OW{1'b1}};  // 设置为最大值表示错误remainder <= {DW{1'b1}};valid_o <= 1'b1;endelse beginstate <= CALC;busy <= 1'b1;valid_o <= 1'b0;dividend_reg <= dividend;divisor_reg <= divisor;quotient_temp <= {OW{1'b0}};count <= OW;shifted_divisor <= divisor << (OW-1);  // 初始移位endendendCALC: beginif (count > 0) beginif (dividend_reg >= shifted_divisor) begindividend_reg <= dividend_reg - shifted_divisor;quotient_temp[count-1] <= 1'b1;endelse beginquotient_temp[count-1] <= 1'b0;endshifted_divisor <= shifted_divisor >> 1;count <= count - 1;endelse beginstate <= DONE;endendDONE: beginquotient <= quotient_temp;remainder <= dividend_reg[DW-1:0];valid_o <= 1'b1;busy <= 1'b0;state <= IDLE;enddefault: beginstate <= IDLE;endendcaseend
endendmodule


http://www.ppmy.cn/ops/137038.html

相关文章

Docker部署mysql:8.0.31+dbsyncer

Docker部署mysql8.0.31 创建本地mysql配置文件 mkdir -p /opt/mysql/log mkdir -p /opt/mysql/data mkdir -p /opt/mysql/conf cd /opt/mysql/conf touch my.config [mysql] #设置mysql客户端默认字符集 default-character-setUTF8MB4 [mysqld] #设置3306端口 port33…

【贪心算法第五弹——300.最长递增子序列】

目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码解析 注意本题还有一种动态规划的解决方法&#xff0c;贪心的方法就是从动态规划的方法总结而来&#xff0c;各位可以移步博主的另一篇博客先了解一下&#xff1a;动态规划-子序列问题——300.长递增子序列…

基于K8S编排部署EFK日志收集系统

基于K8S编排部署EFK日志收集系统 案例分析 1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名节点192.168.100.3masterk8s-master192.168.100.4nodek8s-node 2. 基础准备 Kubernete环境已安装完成&#xff0c;将提供的软件包efk-img.tar.gz上传至master节…

ElasticSearch学习笔记六:Springboot整合

一、前言 在前一篇文章中&#xff0c;我们学习了ES中的一部分的搜索功能&#xff0c;作为一名Java工程师&#xff0c;更多时候我们是用代码去操作ES&#xff0c;同时对于Java而言时下最流行的就是Springboot了&#xff0c;所以这里我们将ES和Springboot整合将上一篇文章中的所…

基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径

知识点&#xff1a; 1、基础入门-Web应用-域名上的技术要点 2、基础入门-Web应用-源码上的技术要点 3、基础入门-Web应用-数据上的技术要点 4、基础入门-Web应用-解析上的技术要点 5、基础入门-Web应用-平台上的技术要点 一、演示案例-域名差异-主站&分站&端口站&…

在远程服务器和本地同步数据的指南

在远程服务器和本地同步数据的指南 在现代软件开发和数据管理中&#xff0c;保持本地和远程服务器之间的数据同步是至关重要的。无论是代码、配置文件还是其他数据&#xff0c;确保它们在不同环境中的一致性都是高效工作的关键。本文将介绍如何使用 Bash 脚本和 rsync 工具在本…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…

【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、阻塞和非阻塞 &#xff08;一&#xff09;阻塞 &#xff08;二&#xff09;非阻塞 二、Scrapy的工作…