当前位置: 首页 > article >正文

30.【Verilog】Verilog 除法器设计

第一步分析与整理Verilog 除法器设计1. 除法器原理定点与十进制竖式除法类似以 27 ÷ 5 为例二进制取被除数高位与除数同宽如 3bit与除数比较。若 ≥ 除数商为 1相减得余数否则商为 0余数为被除数高位本身。将余数与被除数下一 bit 拼接成新数再次与除数比较得到下一位商。重复直至所有 bit 处理完毕。注意商的位宽与被除数相同除数可能为 1。第一步比较时被除数高位应取与被除数最高位对齐的 1bit例如 27 的二进制11011取最高位1扩展为001与101比较。设计采用流水线延迟周期数等于被除数位宽。2. 单步运算单元divider_cell功能完成一位商的判断和余数计算并传递中间结果。输入/输出dividend当前步的“部分被除数”宽为M1位比除数多 1 位防止溢出divisor除数M 位merchant_ci来自上一级的商累积值含扩展位dividend_ci原始被除数的剩余低位用于下一级拼接输出merchant移位累加后的商、remainder当前步余数、dividend_kp/divisor_kp传递原始值、rdy有效标志核心逻辑若dividend {1b0, divisor}→ 商位1新余数 dividend - divisor否则商位0余数不变商累加merchant (merchant_ci 1) | 商位// parameter M means the actual width of divisormodule divider_cell #(parameter N5,parameter M3)(input clk,input rstn,input en,input[M:0]dividend,input[M-1:0]divisor,input[N-M:0]merchant_ci,//上一级输出的商input[N-M-1:0]dividend_ci,//原始除数output reg[N-M-1:0]dividend_kp,//原始被除数信息output reg[M-1:0]divisor_kp,//原始除数信息output reg rdy,output reg[N-M:0]merchant,//运算单元输出商output reg[M-1:0]remainder//运算单元输出余数);always (posedge clk or negedge rstn)beginif(!rstn)begin rdyb0;merchantb0;remainderb0;divisor_kpb0;dividend_kpb0;endelseif(en)begin rdy1b1;divisor_kpdivisor;//原始除数保持不变dividend_kpdividend_ci;//原始被除数传递if(dividend{1b0,divisor})begin merchant(merchant_ci1)1b1;//商为1remainderdividend-{1b0,divisor};//求余endelsebegin merchantmerchant_ci1;//商为0remainderdividend;//余数不变end end// if (en)elsebegin rdyb0;merchantb0;remainderb0;divisor_kpb0;dividend_kpb0;end end endmodule3. 顶层流水线除法器divider_man参数N被除数位宽M除数位宽内部N_ACT MN-1扩位防止中间溢出结构首级单元用被除数最高 1bit 扩展为{Mb0, dividend[N-1]}作为初始 dividendmerchant_ci为 0。之后串联N_ACT-M个单元即被除数总位数减除数位宽每个单元的上一步余数与原始被除数的下一位拼接作为新 dividend。最后一级输出为最终商和余数。使用generate例化多级。//parameter N means the actual width of dividend//using 29/55...4module divider_man #(parameter N5,parameter M3,parameter N_ACTMN-1)(input clk,input rstn,input data_rdy,//数据使能input[N-1:0]dividend,//被除数input[M-1:0]divisor,//除数output res_rdy,output[N_ACT-M:0]merchant,//商位宽Noutput[M-1:0]remainder);//最终余数wire[N_ACT-M-1:0]dividend_t[N_ACT-M:0];wire[M-1:0]divisor_t[N_ACT-M:0];wire[M-1:0]remainder_t[N_ACT-M:0];wire[N_ACT-M:0]rdy_t;wire[N_ACT-M:0]merchant_t[N_ACT-M:0];//初始化首个运算单元divider_cell #(.N(N_ACT),.M(M))u_divider_step0(.clk(clk),.rstn(rstn),.en(data_rdy),//用被除数最高位 1bit 数据做第一次单步运算的被除数高位补0.dividend({{(M){1b0}},dividend[N-1]}),.divisor(divisor),.merchant_ci({(N_ACT-M1){1b0}}),//商初始为0.dividend_ci(dividend[N_ACT-M-1:0]),//原始被除数//output.dividend_kp(dividend_t[N_ACT-M]),//原始被除数信息传递.divisor_kp(divisor_t[N_ACT-M]),//原始除数信息传递.rdy(rdy_t[N_ACT-M]),.merchant(merchant_t[N_ACT-M]),//第一次商结果.remainder(remainder_t[N_ACT-M])//第一次余数);genvar i;generatefor(i1;iN_ACT-M;ii1)begin:sqrt_stepx divider_cell #(.N(N_ACT),.M(M))u_divider_step(.clk(clk),.rstn(rstn),.en(rdy_t[N_ACT-M-i1]),.dividend({remainder_t[N_ACT-M-i1],dividend_t[N_ACT-M-i1][N_ACT-M-i]}),//余数与原始被除数单bit数据拼接.divisor(divisor_t[N_ACT-M-i1]),.merchant_ci(merchant_t[N_ACT-M-i1]),.dividend_ci(dividend_t[N_ACT-M-i1]),//output.divisor_kp(divisor_t[N_ACT-M-i]),.dividend_kp(dividend_t[N_ACT-M-i]),.rdy(rdy_t[N_ACT-M-i]),.merchant(merchant_t[N_ACT-M-i]),.remainder(remainder_t[N_ACT-M-i]));end// block: sqrt_stepxendgenerate assign res_rdyrdy_t[0];assign merchantmerchant_t[0];//最后一次商结果作为最终的商assign remainderremainder_t[0];//最后一次余数作为最终的余数endmodule4. Testbench 与仿真timescale1ns/1ns module test;parameter N5;parameter M3;reg clk;reg rstn;reg data_rdy;reg[N-1:0]dividend;reg[M-1:0]divisor;wire res_rdy;wire[N-1:0]merchant;wire[M-1:0]remainder;//clockalways begin clk0;#5;clk1;#5;end//driverinitial begin rstn1b0;#8;rstn1b1;#55;(negedge clk);data_rdy1b1;dividend25;divisor5;#10;dividend16;divisor3;#10;dividend10;divisor4;#10;dividend15;divisor1;repeat(32)#10dividenddividend1;divisor7;repeat(32)#10dividenddividend1;divisor5;repeat(32)#10dividenddividend1;divisor4;repeat(32)#10dividenddividend1;divisor6;repeat(32)#10dividenddividend1;end//对输入延迟便于数据结果同周期对比完成自校验reg[N-1:0]dividend_ref[N-1:0];reg[M-1:0]divisor_ref[N-1:0];always (posedge clk)begin dividend_ref[0]dividend;divisor_ref[0]divisor;end genvar i;generatefor(i1;iN-1;ii1)begin always (posedge clk)begin dividend_ref[i]dividend_ref[i-1];divisor_ref[i]divisor_ref[i-1];end end endgenerate//自校验reg error_flag;always (posedge clk)begin #1;if(merchant*divisor_ref[N-1]remainder!dividend_ref[N-1]res_rdy)beginb//testbench 中可直接用乘号而不考虑运算周期error_flag1b1;endelsebegin error_flag1b0;end end//module instantiationdivider_man #(.N(N),.M(M))u_divider(.clk(clk),.rstn(rstn),.data_rdy(data_rdy),.dividend(dividend),.divisor(divisor),.res_rdy(res_rdy),.merchant(merchant),.remainder(remainder));//simulation finishinitial begin forever begin #100;if($time10000)$finish;end end endmodule// test产生多个随机测试向量输入到除法器。用移位寄存器链延迟输入以便与输出对齐进行自校验。校验条件merchant * divisor_ref[N-1] remainder dividend_ref[N-1]仿真结果输入后经过 N 个时钟周期开始输出之后每周期输出一个正确结果流水工作。第二步费曼教学法 – 通俗讲解除法器设计今天讲的是如何用硬件实现除法以及一个经典的流水线除法器设计。硬件除法和我们小学学的竖式除法几乎一样只不过换成二进制。我会用“分糖果”的比喻帮你理解这个过程。一、二进制竖式除法长什么样以 27 ÷ 5 为例27 110115 101看被除数的最高 3 位110十进制 6≥1015? 是→商最高位1余数 110-1011。余数后面再接被除数下一位1变成113。11 101 → 商下一位0余数不变仍为 11接下一个被除数位1→ 1117。111 ≥ 101 → 商位1余数111-101102接最后一个被除数位0→ 1004等等这里注意最后一步需取全位。实际上要处理完所有被除数位商的位数等于被除数位数。总结每一步我们比较“当前余数下一位”与除数决定商的一 bit并更新余数。二、为什么用流水线除法本身是串行的每一步依赖上一步的结果。如果用状态机串行计算每输入一个被除数需要 N 个时钟周期才能出结果吞吐率低。流水线除法器把每一位的判断做成独立的硬件级每一级只做一位比较然后传递给下一级。这样当第一级正在处理第1个数据时第二级可以同时处理第0个数据的下一位…… 最终每个时钟都能输出一个结果延迟 N 个周期后。三、单步单元里做了什么divider_cell就是一级流水输入当前“部分被除数”比除数宽1位确保相减不借位、除数、上一级的累积商、原始被除数的低位数据。判断dividend divisor吗是商 bit1新余数 dividend - divisor否商 bit0新余数 dividend。输出更新后的商左移1位再bit、新余数以及传递给下一级的原始除数和被除数低位。注意dividend的宽度 M1因为余数最大可能接近 2*除数-1直接用 M1 位避免溢出。四、顶层如何串联第一级取被除数的最高位1bit左边补 M 个 0得到 M1 位的初始 dividend。同时传递被除数剩余低位。第二级第一级的余数M 位与原始被除数的次高位拼接成新的 dividendM1 位如此类推。最后一级输出最终的商和余数。总共需要N 级N 被除数位宽。每级一个时钟所以延迟 N 周期。五、为什么这样设计可参数化被除数位数 N 和除数位数 M 可配置适应不同位宽。流水化高吞吐量适合大量连续除法运算。结构规整易于综合和时序收敛。六、验证要点功能正确性每个输出满足商×除数余数 被除数。流水延迟第一个结果在 N 周期后出现之后每周期一个。边界条件除数为 0应避免输入除数为 1被除数最大/最小值等。资源评估检查综合后寄存器数量N 级每级多个寄存器。第三步详解示例 – 使用流水线除法器并验证下面给出一个完整的示例包含如何使用该除法器模块以及一个简化的 testbench 来理解其行为。示例计算 4bit 被除数除以 3bit 除数假设被除数dividend为 4bit0~15除数divisor为 3bit1~7。我们例化divider_manN4M3。// testbench 片段 timescale 1ns/1ps module tb_divider; reg clk, rstn, data_rdy; reg [3:0] dividend; reg [2:0] divisor; wire res_rdy; wire [3:0] merchant; wire [2:0] remainder; // 时钟 always #5 clk ~clk; // 例化 divider_man #(.N(4), .M(3)) u_div ( .clk(clk), .rstn(rstn), .data_rdy(data_rdy), .dividend(dividend), .divisor(divisor), .res_rdy(res_rdy), .merchant(merchant), .remainder(remainder) ); // 产生激励 initial begin clk 0; rstn 0; data_rdy 0; #10 rstn 1; #10 data_rdy 1; dividend 4d15; divisor 3d4; #10; dividend 4d10; divisor 3d3; #10; dividend 4d5; divisor 3d2; #10; data_rdy 0; repeat(10) #10; $finish; end // 监控输出 initial begin $monitor(Time%0t res_rdy%b merchant%0d remainder%0d, $time, res_rdy, merchant, remainder); end endmodule运行后你会看到前 4 个时钟无输出第 5 个时钟开始输出 15/43 余 3接着输出 10/33 余 15/22 余 1。理解关键当data_rdy变高后数据进入第一级流水。之后每过一周期数据向后推一级。4 级后第一个结果出现在res_rdy为高时。你可以连续输入多笔数据只要大于等于 4 个周期间隔就能实现流水。工作中如何应用何时用需要高吞吐量的整数除法如数字信号处理中的某些归一化、坐标转换。性能权衡流水级数 被除数位宽延迟和面积随位宽线性增长。对于很少调用的除法可以用迭代法状态机节省面积。替换方案如果除数是常数通常用乘法器乘以倒数代替除法更高效。本设计的通用除法器适用于动态除数。学习建议手动仿真纸上模拟 4 位除法器的流水过程画波形。修改参数尝试不同的 N 和 M观察资源变化和延迟。编写自校验像原文那样用merchant*divisorremainder检查输出。对比非流水写一个状态机实现串行除法对比吞吐率和面积。常见错误与注意事项除数不能为 0testbench 中需避免。商的位宽可能为 N被除数位宽但实际最高位可能为 0输出仍保留完整宽度。流水线首级输入数据要连续不能有大间隔否则流水线会“断流”。综合时注意设置时钟频率确保单级组合逻辑一次比较减法能在周期内完成。总结硬件除法器就是竖式除法的硬件流水线。每一级相当于一个老师在批改一位商的答案然后传递给下一个老师。虽然整个批改过程延迟长但学生们可以连续交卷老师们流水作业总吞吐率很高。作为验证工程师你要确保每一级的“老师”不判错还要检查“交接本”寄存器不丢失数据。理解了这个设计你就掌握了流水线和算术单元设计的基础。遇到类似需要高吞吐的数学运算就可以举一反三。

相关文章:

30.【Verilog】Verilog 除法器设计

第一步:分析与整理Verilog 除法器设计 1. 除法器原理(定点)与十进制竖式除法类似,以 27 5 为例(二进制): 取被除数高位(与除数同宽,如 3bit),与除…...

Android Studio中文界面终极指南:3分钟告别英文开发困境

Android Studio中文界面终极指南:3分钟告别英文开发困境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...

哔哩下载姬DownKyi:你的B站视频下载与处理终极指南

哔哩下载姬DownKyi:你的B站视频下载与处理终极指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xff…...

工业物联网通信技术:iCOMOX平台与三大方案解析

1. iCOMOX平台与工业物联网通信技术概述在工业4.0和智能制造的浪潮中,设备状态监测(CbM)系统正经历从传统定期维护到预测性维护的范式转变。iCOMOX作为一款开源的传感器融合平台,集成了振动、声音、温度和磁场位移等多模态传感能力,其核心价值…...

AI智能体开发实战:从框架选型到部署优化的全流程指南

1. 项目概述与核心价值最近在探索AI智能体(AI Agent)和自动化工作流领域时,我反复被一个名字刷屏:AwesomeClaw。这个由CrayBotAGI团队开源的项目,在GitHub上迅速获得了大量关注。乍一看,它像是一个又一个“…...

DownKyi终极指南:快速掌握B站视频批量下载与8K超高清获取技巧

DownKyi终极指南:快速掌握B站视频批量下载与8K超高清获取技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...

AMD APU异构计算与能效优化技术解析

1. 异构计算时代的能效革命:AMD APU技术深度解析 在半导体行业摸爬滚打十几年,我亲眼见证了处理器能效比从单纯依赖制程进步到架构创新的转变。2014年AMD提出的25x20计划(到2020年实现APU能效提升25倍)曾被视为天方夜谭&#xff0…...

通讯录系统数据库设计与实现

1. 数据库设计与配置 1.1 数据库建表 SQL -- 创建数据库,使用UTF-8编码 CREATE DATABASE IF NOT EXISTS contact_system DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;USE contact_system;-- 用户表 CREATE TABLE users (id INT PRIMARY …...

大型语言模型开发的环境成本与优化策略

1. 语言模型开发的环境成本全景图当我们惊叹于ChatGPT流畅的对话能力或Midjourney惊人的图像生成质量时,很少有人会思考这些AI能力背后的环境代价。事实上,大型语言模型的开发正悄然成为数字时代的"高碳产业"——训练一个130亿参数的模型所产生…...

NS-USBLoader完整指南:Switch文件管理、RCM注入与游戏传输的一站式解决方案

NS-USBLoader完整指南:Switch文件管理、RCM注入与游戏传输的一站式解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://…...

PT助手Plus终极指南:3步实现浏览器PT下载自动化

PT助手Plus终极指南:3步实现浏览器PT下载自动化 【免费下载链接】PT-Plugin-Plus PT 助手 Plus,为 Microsoft Edge、Google Chrome、Firefox 浏览器插件(Web Extensions),主要用于辅助下载 PT 站的种子。 项目地址: …...

终极OpenSpeedy游戏加速教程:5分钟解锁老游戏流畅体验

终极OpenSpeedy游戏加速教程:5分钟解锁老游戏流畅体验 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 还在为经典老游戏在现代电脑上运行卡顿而烦恼吗&#xff1f…...

ModTheSpire终极指南:为《杀戮尖塔》构建安全高效的模组生态

ModTheSpire终极指南:为《杀戮尖塔》构建安全高效的模组生态 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 在游戏模组开发领域,安全性与扩展性往往难以兼得。…...

Baichuan-7B开源大模型:从环境搭建、推理调优到LoRA微调实战

1. 项目概述:一个值得深入研究的开源大语言模型最近在开源社区里,Baichuan-7B这个名字的讨论热度一直不低。作为一个长期关注大模型技术动向的从业者,我自然也对它进行了一番深入的“把玩”和研究。简单来说,Baichuan-7B是由百川智…...

CAN 总线技术综合研究报告

CAN总线技术综合研究报告 报告日期: 2026年5月14日 引言 在当今高度信息化和自动化的世界中,设备内部以及设备之间的可靠通信是实现复杂功能的基石。从汽车的动力控制到工厂的自动化生产线,都需要一个高效、可靠的通信网络来协调各个控制单元的工作。控制器局域网(Contr…...

户外Wi-Fi天线系统热管理方案与优化实践

1. 户外Wi-Fi天线系统热管理挑战解析 在户外通信设备领域,热管理一直是个令人头疼的问题。我经手过多个基站项目,最深切的体会就是:那些在实验室里运行良好的设备,一到实际户外环境就频频出现热关机。以这个案例中的Wi-Fi天线系统…...

AI智能体扩展实战:基于MCP协议构建AlterLab工具箱服务器

1. 项目概述:一个为AI智能体打造的“工具箱”服务器最近在折腾AI智能体(Agent)的开发,发现一个挺有意思的项目:RapierCraft/alterlab-mcp-server。简单来说,这是一个实现了模型上下文协议(Model…...

UVa 215 Spreadsheet Calculator

题目分析 本题要求实现一个简单的电子表格计算器。电子表格是一个矩形网格,每个单元格包含一个整数或者一个表达式。表达式由整数常量、单元格引用以及 和 - 运算符组成,计算时遵循从左到右的结合顺序。 输入首先给出行数 rrr 和列数 ccc,其…...

GPU渲染管线ROP单元优化与体积渲染性能提升

1. GPU渲染管线中的ROP单元深度解析在图形渲染管线中,Render Output Unit(ROP)扮演着至关重要的角色。作为渲染流程的最后阶段,ROP负责执行深度测试(Z-Test)、模板测试(Stencil Test&#xff09…...

构建数据科学AI代理规则库:从自动化到智能化的关键路径

1. 项目概述:一个为数据科学工作流定制的智能代理规则库最近在GitHub上看到一个挺有意思的项目,叫ds-agent-rules。光看名字,你可能觉得这又是一个平平无奇的规则文件集合。但作为一个在数据科学和自动化领域摸爬滚打多年的从业者&#xff0c…...

芯片高加速温湿度测试HAST:从步骤到报告讲解

其可靠性和稳定性成为消费者和制造商关注的焦点。高加速温湿度测试(Highly Accelerated Stress Test, HAST)作为一种有效的可靠性测试方法,近年来在行业内得到了广泛的应用。本文将从HAST测试的步骤、实际案例以及如何生成详细的测试报告等方…...

Linux串口通信终极指南:3步搞定CH341SER驱动安装,让Arduino开发不再卡壳

Linux串口通信终极指南:3步搞定CH341SER驱动安装,让Arduino开发不再卡壳 【免费下载链接】CH341SER CH341SER driver with fixed bug 项目地址: https://gitcode.com/gh_mirrors/ch/CH341SER 你是否曾经兴奋地拿起一块Arduino开发板,准…...

使用Taotoken平台后API调用延迟与稳定性的实际体感观察

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken平台后API调用延迟与稳定性的实际体感观察 1. 迁移背景与初始考量 我们团队的一个内部知识库问答应用,原…...

FreeRTOS和RT-Thread的内存管理实战:如何正确使用pvPortMalloc与rt_malloc替代C库malloc

FreeRTOS与RT-Thread内存管理实战:从标准库陷阱到RTOS最佳实践 在嵌入式实时操作系统开发中,动态内存分配就像高空走钢丝——一步失误可能导致系统崩溃。传统C库的malloc/free在RTOS环境中如同穿着拖鞋走钢丝,而pvPortMalloc和rt_malloc则是专…...

Origin 9 绘图避坑指南:7个高频问题解决,让你的科研图表一次成型

Origin 9 科研绘图实战:7个高频问题深度解析与优化方案 科研绘图是数据可视化的重要环节,而Origin 9作为经典的科学绘图软件,其功能强大但操作细节繁多。许多用户在初次接触或日常使用中常会遇到各种棘手问题,导致绘图效率低下、图…...

开源作战室框架OpenClaw-Warroom:构建高效事件响应与团队协作平台

1. 项目概述:从“作战室”到开源协作的实战推演如果你在开源社区或者技术团队里待过一段时间,大概率听过“作战室”这个词。它听起来有点军事化,但在现代软件开发和应急响应场景里,它代表的是一个高度聚焦、信息透明、行动同步的虚…...

任天堂Switch游戏文件管理终极指南:NSC_BUILDER一站式解决方案

任天堂Switch游戏文件管理终极指南:NSC_BUILDER一站式解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights …...

openclaw-nerve:构建自包含应用包,彻底解决跨平台部署难题

1. 项目概述与核心价值最近在折腾一些自动化脚本和工具链,发现很多开源项目在依赖管理、环境配置和跨平台部署上,依然存在不小的摩擦。一个典型的场景是:你从GitHub上clone了一个看起来很酷的项目,满心欢喜地准备跑起来看看效果&a…...

告别虚拟机卡顿:在Proxmox VE 7.0上丝滑安装中兴新支点NewStartOS 4.3.8社区版

告别虚拟机卡顿:在Proxmox VE 7.0上丝滑安装中兴新支点NewStartOS 4.3.8社区版 虚拟化技术已成为现代IT基础设施的核心组件,而Proxmox VE作为开源的虚拟化管理平台,凭借其稳定性和灵活性赢得了众多技术团队的青睐。在众多虚拟化应用场景中&am…...

AI编程助手统一工作空间框架:声明式配置提升开发效率

1. 项目概述:为AI编程助手打造的统一工作空间框架如果你和我一样,每天都在用Cursor、GitHub Copilot这类AI编程助手,那你肯定也遇到过这个痛点:每次开新项目,或者切换到一个稍微复杂点的多项目工作区,都得从…...