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

news/2024/11/27 10:01:33/

(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/news/1550317.html

相关文章

浅谈人工智能之基于容器云进行文生视频大模型搭建

浅谈人工智能之基于容器云进行文生视频大模型搭建 引言 随着深度学习技术的不断发展&#xff0c;文生视频&#xff08;Text-to-video&#xff09;大模型成为了计算机视觉和自然语言处理领域的一个研究热点。文生视频模型可以根据输入的文本描述生成高质量的视频&#xff0c;广…

Springboot自带注解@Scheduled实现定时任务

基于Scheduled注解实现简单定时任务 原理 Spring Boot 提供了Scheduled注解&#xff0c;通过在方法上添加此注解&#xff0c;可以方便地将方法配置为定时任务。在应用启动时&#xff0c;Spring 会自动扫描带有Scheduled注解的方法&#xff0c;并根据注解中的参数来确定任务的…

c++:面向对象三大特性--继承

面向对象三大特性--继承 一、继承的概念及定义&#xff08;一&#xff09;概念&#xff08;二&#xff09;继承格式1、继承方式2、格式写法3、派生类继承后访问方式的变化 &#xff08;三&#xff09;普通类继承&#xff08;四&#xff09;类模板继承 二、基类和派生类的转换&a…

(五)Ubuntu22.04+Stable-Diffusion-webui AI绘画 模型转换插件安装及其使用

一、说明 这是秋叶大佬开发的一个模型转换插件&#xff0c;秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件&#xff0c;请使用下面这个地址安装&#xff0c;安装完成之后别忘了重启 WebUI。 模型转换插件 https://github.com/Akegarasu/sd-webui-model-c…

深度神经网络模型压缩学习笔记二:离线量化算法和工具、实现原理和细节

文章目录 一、离线量化基础概念二、离线量化难点三、离线量化算法介绍四、离线量化工具介绍五、离线量化工具整体设计结构六、离线量化工具代码解读七、实践&#xff1a;Dipoorlet量化MobileNet 一、离线量化基础概念 二、离线量化难点 三、离线量化算法介绍 四、离线量化工…

低速接口项目之串口Uart开发(二)——FIFO实现串口数据的收发回环测试

本节目录 一、设计思路 二、loop环回模块 三、仿真模块 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计思路 串口数据的收发回环测试&#xff0c;最简单的硬件测试是把Tx和Rx连接在一起&#xff0c;然后上位机进行发送和接收测试&#xff0c;但是需要考虑到串…

PyQt5:Python GUI开发的超级英雄

PyQt5&#xff1a;Python GUI开发的超级英雄 &#x1f680; 引言&#xff1a; 你是否厌倦了编写枯燥的命令行程序&#xff1f;想要让你的Python项目拥有炫酷的用户界面吗&#xff1f;今天&#xff0c;我们就来聊聊Python GUI开发的超级英雄——PyQt5&#xff01;&#x1f31f;…

C++设计模式之组合模式中适用缓存机制提高遍历与查找速度

在组合设计模式中&#xff0c;为了提高反复遍历和查找的速度&#xff0c;可以引入缓存机制。缓存机制可以通过存储已经遍历过的子组件或计算过的结果来减少重复操作的开销。以下是一个示例&#xff0c;展示了如何在组合模式中使用缓存机制来提高性能。 示例&#xff1a;组合设…