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

FPGA实战(11):基于Xilinx除法器IP核的有符号整数除法器设计(附源码)

1. 引言

在实际FPGA开发中,除法运算是一种常见但比较消耗资源(尤其是LUT和乘法器资源)的操作。为了兼顾开发效率与性能,Xilinx Vivado提供了Divider Generator(除法器生成器)IP核,支持有符号/无符号除法,并可以配置为高吞吐率或低延迟模式。

本文将介绍一个简单的有符号整数除法器模块——tops。它调用了Vivado生成的div_gen_0IP核,完成16位有符号整数的除法,同时输出余数,并给出一个Testbench用于仿真验证。
创新点在于:

  • 巧妙利用32位输出数据的高16位和低16位分别输出商和余数,接口简洁;
  • 正确处理IP核的复位极性(高有效转低有效);
  • 提供完整的可仿真示例,帮助初学者快速上手除法器IP核的使用。

2. 功能点概述

信号名方向位宽说明
i_clkinput1时钟信号
i_rstinput1高有效异步复位
i_dividendinput16被除数(有符号)
i_divisorinput16除数(有符号)
o_C(Quotient)output16商(有符号)
o_R(Remainder)output16余数(有符号)

核心功能

  • 完成o_C = i_dividend / i_divisor(整数除法,向零取整)
  • 完成o_R = i_dividend % i_divisor,并满足i_dividend = o_C * i_divisor + o_R

适用场景

  • 数字信号处理中的定点数除法预处理
  • 嵌入式软核与FPGA加速器接口的数据分割
  • 简单控制系统中需要求商和余数的场合

3. 模块设计与代码分析

3.1 顶层模块tops

`timescale 1ns / 1ps module tops ( input i_clk , input i_rst , input signed [15:0] i_dividend , input signed [15:0] i_divisor , output signed [15:0] o_C , output signed [15:0] o_R ); //===================================================== // Wire declarations //===================================================== wire [31:0] w_dout_tdata; // 除法器输出数据:高16位商,低16位余数 //===================================================== // Assign statements //===================================================== assign o_R = w_dout_tdata[15:0] ; assign o_C = w_dout_tdata[31:16] ; //===================================================== // Module instantiations //===================================================== div_gen_0 div_gen_0_u0 ( .aclk (i_clk ), .aresetn (i_rst ), // 复位极性转换:高有效转低有效 .s_axis_divisor_tvalid (1'b1 ), .s_axis_divisor_tdata (i_divisor ), .s_axis_dividend_tvalid (1'b1 ), .s_axis_dividend_tdata (i_dividend ), .m_axis_dout_tvalid ( ), // 未使用 .m_axis_dout_tdata (w_dout_tdata ) ); endmodule

代码解读

  1. IP核例化div_gen_0是Vivado生成的除法器IP核。

    • aclk:时钟。
    • aresetn低有效异步复位。但模块端口i_rst高有效,因此直接将i_rst连接到aresetn上,相当于实现了极性转换。
    • s_axis_divisor_tvalids_axis_dividend_tvalid固定为1,表示输入数据始终有效(不考虑握手)。
    • m_axis_dout_tdata输出32位数据:高16位是商(quotient),低16位是余数(remainder)。
  2. 输出拆分:直接使用assignw_dout_tdata的高16位和低16位分别赋值给o_Co_R,接口一目了然。


3.2 Testbench 测试模块test_tops

`timescale 1ns / 1ps module test_tops; reg i_clk; reg i_rst; reg signed[15:0] i_dividend; reg signed[15:0] i_divisor; wire signed[15:0] o_C; wire signed[15:0] o_R; tops tops_u ( .i_clk (i_clk), .i_rst (i_rst), .i_dividend (i_dividend), .i_divisor (i_divisor), .o_C (o_C), .o_R (o_R) ); initial begin i_clk = 1'b1; i_rst = 1'b0; #100 i_rst = 1'b1; end initial begin i_dividend = 16'd2040; i_divisor = 16'd100; end always #5 i_clk = ~i_clk; endmodule

测试说明

  • 复位后(i_rst=1),输入被除数2040,除数100。
  • 预期结果:商=20,余数=40。
  • 由于除法器IP核有一定延迟(通常为几个时钟周期),但Testbench未等待m_axis_dout_tvalid信号,直接观察输出波形即可(实际仿真时可添加$display或观察波形)。

4. 创新点与技巧总结

  1. 巧妙复用32位总线
    IP核同时输出商和余数,一次性读取并拆分为两个16位信号,省去了多余的总线打包逻辑。

  2. 极性无痛转换
    模块对外使用高有效复位(与大多数用户设计习惯一致),内部IP核需要低有效复位,直接连线完成转换,无需额外反相器。

  3. 简化valid信号
    对于持续有效的除法需求,直接将tvalid固定为1,避免复杂握手逻辑,适合流式数据。

  4. 有符号除法的正确保留
    所有信号均声明为signed,综合工具会正确实现有符号除法,保证负数的商和余数符合Verilog标准(向零取整)。


5. 仿真波形分析(示例)

使用Vivado Simulator运行Testbench,得到波形如下(描述):

时间复位被除数除数输出商输出余数
0~100ns02040100XX
100ns后120401002040

扩展测试

  • 负数输入:i_dividend = -2040,i_divisor = 100→ 商=-20,余数=-40。
  • 除数为0:除法器IP核会产生溢出标志(可通过增加m_axis_dout_tuser端口获取),本设计中未处理。

6. 如何生成和使用除法器IP核

  1. 在Vivado中打开IP Catalog,搜索“Divider Generator”。
  2. 配置:
    • Algorithm Type:Radix-2(默认)或High Radix。
    • Dividend Width:16;Divisor Width:16。
    • Signed:勾选。
    • Output:商和余数都保留,输出宽度32(即高Half商,低Half余数)。
  3. 将生成的div_gen_0.xci添加到工程中,直接例化即可。


7. 总结

本文实现了一个非常简洁实用的有符号整数除法器模块,通过调用Xilinx除法器IP核,仅用几行代码就完成了商和余数的输出。适合FPGA初学者理解IP核的例化方法、复位极性处理以及总线数据拆分的常用技巧。读者可以在自己的工程中直接复制使用,只需注意IP核的配置参数与顶层信号位宽保持一致。

后续改进方向

  • 加入tvalidtready握手信号,实现背压控制。
  • 添加除数为零的保护和溢出标志输出。

希望这篇博客能帮助您快速在FPGA中实现高效的除法运算。如有问题,欢迎在评论区交流!

附:完整代码文件
my_tops.vtb_TOPS.v已贴于文中,复制保存到Vivado工程中,添加对应IP核即可运行仿真。

http://www.zskr.cn/news/1527271.html

相关文章:

  • MIPS寄存器文件设计避坑:为什么你的头歌实验总报错?可能是这5个细节没搞懂
  • 2026商场发电机厂家怎么选?基于西南市场项目案例与行业数据的客观分析 - 优质品牌商家
  • 避开这个坑!N32G45X用SWD调试后,别忘了检查AFIO_RMP_CFG寄存器的这3个bit
  • Git新手避坑指南:为什么你的.idea文件夹总在‘捣乱’?彻底解决Untracked Files问题
  • 别再乱给权限了!Confluence空间管理员必看的权限设置避坑指南
  • AccessGuard v0.4:组件化权限控制 — TypeScript React 泛型组件与 Props 类型深度实战
  • 2026 西宁管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • FPGA实战(12):FPGA实现复数乘法器:基于Xilinx IP核的高效设计(附源码)
  • 2026 金华管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 2026 昆明 10 家猫犬舍实测:伴西西稳居榜首,买宠避坑必看 - 同城宠物优选基地
  • GitHub Actions 流水线注入敏感配置完整方案(Antora + Docker Compose)
  • ArcMap启动卡死闪退?别急着重装!这5个亲测有效的修复方法帮你搞定(附详细步骤)
  • WPF DataGrid中的精细按钮控制
  • 从项目复盘到面试通关:我是如何用‘电源设计’项目拿下硬件Offer的
  • 拆解华为OD机试B卷新题库:从‘星际篮球’到‘猜字谜’,150+题背后的算法考点与复习路线图
  • 2026年沈阳名表回收市场格局解析:哪些机构值得关注? - 优质品牌商家
  • DIY四轴无人机硬件避坑指南:从MPU6050布线到电源模块设计的那些事儿
  • 地信/遥感专业转开发,面试官到底想听什么?——以天津测绘院24春招为例拆解求职策略
  • 告别黑屏!手把手教你用易至天工插件在ArcMap 10.8稳定加载谷歌影像(附离线文件加载技巧)
  • 给技术人的实验室认证扫盲贴:CNAS、CMA、CAL到底有啥区别?看完这篇就懂了
  • 2026年不锈钢管道修补器行业选择参考:多品牌维度分析与应用案例分享 - 优质品牌商家
  • 2026 中山管道疏通与异味治理机构精选 5 家 马桶 / 厨卫下水 / 地漏除臭服务参考 - 宅安选房屋修缮
  • 联想机器学习岗面试官亲述:我们如何在45分钟技术面里考察你的真实水平?
  • 车载以太网之要火系列 - 番外篇6:四十岁学艺不算晚,AI相伴破万难
  • 读懂AI Agent:颠覆当下AI格局,从被动聊天到主动帮你搞定一切
  • 软考高级系统架构师备考:信号量与PV操作常考题型的3种破解思路与避坑指南
  • RWKV 批量推理中 Prefill 的正确打开方式
  • Spring Cloud Alibaba 速成笔记,普通程序员必备!
  • 用 Gemini 3.5 Flash 做 Bug 排查和测试用例生成:一套适合开发者的 AI 辅助工作流
  • VCS dump波形的两种方式