Verilog的整数除法

news2025/4/16 6:45:21

1、可变系数除法实现----利用除法的本质

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/15 13:45:39
// Design Name: 
// Module Name: divide_1
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module divide_1
    (
    // clk and rst_n
        input   wire            sys_clk         ,
        input   wire            sys_rst_n       ,
    // dividend and divisor        
        input   wire            enIn            ,
        input   wire [7:0]      dividend        ,
        input   wire [3:0]      divisor         ,
        
        output  wire            busy            ,
        output  wire            enOut           ,
        output  wire            warning         ,
        output  wire [7:0]      quotient        ,
        output  wire [3:0]      remainder
    );
    
    localparam  IDLE    =   1'b0    ;
    localparam  S_CALC  =   1'b1    ;
    
    reg         current_state   ;
    reg         next_state      ;
    
    reg         lockDivs        ;
    reg  [7:0]  DivA            ;
    reg  [3:0]  DivB            ;
    reg         counting , ending   ;
    reg  [7:0]  counter         ;
    
    reg         out_busy        ;
    reg         out_enOut       ;
    reg         out_warning     ;
    reg  [7:0]  out_quotient    ;
    reg  [3:0]  out_remainder   ;
    
    
    
    
    
    wire [7:0]  extDivB =   { 4'b0,DivB }   ;
    
    always@( posedge sys_clk )
    begin
        if( sys_rst_n == 1'b0 )
        begin
            current_state   <=  IDLE    ;
            DivA            <=  8'b0    ;
            DivB            <=  4'b0    ; 
            counter         <=  8'b0    ;
            out_enOut       <=  1'b0    ;
            out_warning     <=  1'b0    ;
            out_quotient    <=  8'b0    ;
            out_remainder   <=  4'd0    ;
        end
        else
        begin
            current_state   <=  next_state  ;
            // DivA  DivB  counter
            if( lockDivs == 1'b1 )
            begin
                DivA    <=  dividend    ;
                DivB    <=  divisor     ;
                counter <=  8'b0        ;
            end
            else if( counting == 1'b1 )
            begin
                DivA    <=  DivA - extDivB  ;
                counter <=  counter + 1'b1  ;
            end
            //out_enOut
            out_enOut   <=  ending  ;
            // out_warning
            if( ending == 1'b1 )
            begin
                if( DivB == 4'b0 )
                begin
                    out_warning <=  1'b1    ;
                end
                else
                begin
                    out_warning <=  1'b0    ;
                end
                // out_quotient
                out_quotient    <=  counter ;
                // our_remainder
                out_remainder   <=  DivA[3:0]   ;
            end
        end
    end
    
    always@( current_state , enIn , DivA , extDivB )
    begin
        out_busy    <=  1'b0    ;
        lockDivs    <=  1'b0    ;
        counting    <=  1'b0    ;
        ending      <=  1'b0    ;
        case( current_state )
            IDLE    :
                begin
                    if( enIn == 1'b1 )
                    begin
                        lockDivs    <=  1'b1    ;
                        next_state  <=  S_CALC  ;
                    end
                    else
                    begin
                        next_state  <=  IDLE    ;
                    end
                end
            S_CALC  :
                begin
                    out_busy    <=  1'b1    ;
                    if( DivA < extDivB || extDivB == 8'b0 )
                    begin
                        ending      <=  1'b1    ;
                        next_state  <=  IDLE    ;  
                    end
                    else
                    begin
                        counting    <=  1'b1    ;
                        next_state  <=  S_CALC  ;
                    end
                end
            default :
                begin
                    next_state  <=  IDLE    ;
                end
        endcase
        
    end
    
    assign  busy        =   out_busy        ;
    assign  enOut       =   out_enOut       ;
    assign  warning     =   out_warning     ;
    assign  quotient    =   out_quotient    ;
    assign  remainder   =   out_remainder   ;
    
endmodule

tb

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/04/15 15:24:32
// Design Name: 
// Module Name: tb_divide_1
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module tb_divide_1(

    );
    
    
    reg                     sys_clk         ;
    reg                     sys_rst_n       ;       
    reg                     enIn            ;
    reg  [7:0]              dividend        ;
    reg  [3:0]              divisor         ;
    
    wire                    busy            ;
    wire                    enOut           ;
    wire                    warning         ;
    wire [7:0]              quotient        ;
    wire [3:0]              remainder       ;
    
    
    initial
    begin
        sys_clk     =   1'b0    ;
        sys_rst_n   =   1'b0    ;
        
        enIn        =   1'b0    ;
        dividend    =   8'b0    ;
        divisor     =   4'b0    ;
        #50
        enIn        =   1'b1    ;
        dividend    =   8'd110  ;
        divisor     =   4'd10   ; 
        sys_rst_n   =   1'b1    ; 
        #20
        enIn        =   1'b0    ;
        #200
        $finish ;      
    end
    
 
    always #5
    begin
        sys_clk =   ~sys_clk    ;
    end
    
    divide_1        divide_1_inst
    (
        .sys_clk         (sys_clk),
        .sys_rst_n       (sys_rst_n),       
        .enIn            (enIn),
        .dividend        (dividend),
        .divisor         (divisor),
        .busy            (busy),
        .enOut           (enOut),
        .warning         (warning),
        .quotient        (quotient),
        .remainder       (remainder)
    );
    
    
    
    
    
endmodule

 

         但是这种做法运算一次最多需要256的clk,所以需要减小消耗的实现

2、可变系数除法实现----利用除法的竖式求解

3、可变系数除法实现----利用乘法实现除法

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

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

相关文章

React 把一系列 state 更新加入队列

把一系列 state 更新加入队列 设置组件 state 会把一次重新渲染加入队列。但有时你可能会希望在下次渲染加入队列之前对 state 的值执行多次操作。为此&#xff0c;了解 React 如何批量更新 state 会很有帮助。 开发环境&#xff1a;Reacttsantd 学习内容 什么是“批处理”以…

【大模型理论篇】Search-R1: 通过强化学习训练LLM推理与利⽤搜索引擎

最近基于强化学习框架来实现大模型在推理和检索能力增强的项目很多&#xff0c;也是Deep Research技术持续演进的缩影。之前我们讨论过《R1-Searcher:通过强化学习激励llm的搜索能⼒》&#xff0c;今天我们分析下Search-R1【1】。 1. 研究背景与问题 ⼤模型&#xff08;LLM&a…

Google政策大更新:影响金融,新闻,社交等所有类别App

Google Play 4月10日 迎来了2025年第一次大版本更新&#xff0c;新政主要涉及金融&#xff08;个人贷款&#xff09;&#xff0c;新闻两个行业。但澄清内容部分却使得所有行业都需进行一定的更新。下面&#xff0c;我们依次从金融&#xff08;个人贷款&#xff09;&#xff0c;…

NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)

有向⽆环图 若⼀个有向图中不存在回路&#xff0c;则称为有向⽆环图(directed acycline graph)&#xff0c;简称 DAG 图 AOV⽹ 举⼀个现实中的例⼦&#xff1a;课程的学习是有优先次序的&#xff0c;如果规划不当会严重影响学习效果。课程间的先后次序可以⽤有向图表⽰ 在…

每日文献(十三)——Part one

今天看的是《RefineNet: Iterative Refinement for Accurate Object Localization》。 目录 零、摘要 0.1 原文 0.2 译文 一、介绍 二、RefineNet A. Fast R-CNN B. Faster R-CNN C. RefineNet 训练 D. RefineNet 测试 零、摘要 0.1 原文 We investigate a new str…

游戏引擎学习第225天

只能说太难了 回顾当前的进度 我们正在进行一个完整游戏的开发&#xff0c;并在直播中同步推进。上周我们刚刚完成了过场动画系统的初步实现&#xff0c;把开场动画基本拼接完成&#xff0c;整体效果非常流畅。看到动画顺利呈现&#xff0c;令人十分满意&#xff0c;整个系统…

Linux 使用Nginx搭建简易网站模块

网站需求&#xff1a; 一、基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab ​ 二、给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/stud…

抖音ai无人直播间助手场控软件

获取API权限 若使用DeepSeek官方AI服务&#xff0c;登录其开发者平台申请API Key或Token。 若为第三方AI&#xff08;如ChatGPT&#xff09;&#xff0c;需通过接口文档获取访问权限。 配置场控软件 打开DeepSeek场控软件&#xff0c;进入设置界面找到“AI助手”或“自动化”…

TCP标志位抓包

说明 TCP协议的Header信息&#xff0c;URG、ACK、PSH、RST、SYN、FIN这6个字段在14字节的位置&#xff0c;对应的是tcp[13]&#xff0c;因为字节数是从[0]开始数的&#xff0c;14字节对应的就是tcp[13]&#xff0c;因此在抓这几个标志位的数据包时就要明确范围在tcp[13] 示例1…

封装一个搜索区域 SearchForm.vue组件

父组件 <template><div><SearchForm:form-items"searchItems":initial-values"initialValues"search"handleSearch"reset"handleReset"><!-- 自定义插槽内容 --><template #custom-slot"{ form }&qu…

GPT - GPT(Generative Pre-trained Transformer)模型框架

本节代码主要为实现了一个简化版的 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型。GPT 是一种基于 Transformer 架构的语言生成模型&#xff0c;主要用于生成自然语言文本。 1. 模型结构 初始化部分 class GPT(nn.Module):def __init__(self, vocab…

贪心算法:部分背包问题深度解析

简介&#xff1a; 该Java代码基于贪心算法实现了分数背包问题的求解&#xff0c;核心通过单位价值降序排序和分阶段装入策略实现最优解。首先对Product数组执行双重循环冒泡排序&#xff0c;按wm(价值/重量比)从高到低重新排列物品&#xff1b;随后分两阶段装入&#xff1a;循环…

连接器电镀层的作用与性能

连接器电镀层的作用与性能&#xff1a; 镀金 金具有很高的化学稳定性&#xff0c;只溶于王水&#xff0c;不溶于其它酸&#xff0c;金镀层耐蚀性强&#xff0c;导电性好&#xff0c;易于焊接&#xff0c;耐高温&#xff0c;硬金具有一定的耐磨性。 对钢、铜、银及其合金基体而…

神经网络如何表示数据

神经网络是如何工作的&#xff1f;这是一个让新手和专家都感到困惑的问题。麻省理工学院计算机科学和人工智能实验室&#xff08;CSAIL&#xff09;的一个团队表示&#xff0c;理解这些表示&#xff0c;以及它们如何为神经网络从数据中学习的方式提供信息&#xff0c;对于提高深…

nginx自编译重现gzip和chunked的现象

前言 最近做项目&#xff0c;发现一个比较好玩的事&#xff0c;nginx的module gzip模式默认支持1KB压缩&#xff0c;和chunked返回&#xff0c;本来现在的很多框架都很完善了&#xff0c;但是&#xff0c;一些新语言框架或者一些老旧框架会不能完整支持chunked&#xff0c;导致…

jspm企业采购管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 相比于以前的传统企业采购手工管理方式&#xff0c;智能化的管理方式可以大幅降低企业采购管理的运营人员成本&#xff0c;实现了企业采购管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了物资信息、物资入库、出库等的随意管理&#xff0c;提高了信息的处理…

现代测试自动化框架教程:Behave接口测试与Airtest移动端UI自动化

前言 我发现每天还是陆陆续续有人在看我之前写的自动化框架搭建的文档&#xff1b;即使很早就有新的框架&#xff0c;更好的选择出来了&#xff1b;所以特别写了这一篇目前大厂也在使用的&#xff1b;日活400w有实际落地的自动化测试架构方案&#xff1b; 随着测试技术…

优化运营、降低成本、提高服务质量的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…

使用Lombok的@Slf4j和idea构建:找不到log符号-解决

问题&#xff1a;在使用Lombok的Slf4j构建项目时提示如下内容&#xff1a; MvcConfiguration.java:26:9 java: cannot find symbol symbol: variable log location: class cn.edu.wynu.mrcinerec.mrserver.config.WebMvcConfiguration查了网上的方法都是改配置 但是使用Googl…

【Python爬虫】简单案例介绍1

目录 三、Python爬虫的简单案例 3.1 网页分析 单页 三、Python爬虫的简单案例 本节以科普中国网站为例。 3.1 网页分析 单页 在运用 Python 进行爬虫开发时&#xff0c;一套严谨且有序的流程是确保数据获取高效、准确的关键。首先&#xff0c;深入分析单个页面的页面结构…