1 Star 15 Fork 2

xiaowuzxc / 高性能整数除法器

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

高性能整数除法器

使用说明

特性

有符号/无符号除法实时切换
参数化配置除法器位宽(任何位宽都可以哦)
除法迭代加速,自动跳过商中的0,每次迭代生成至少1位商
锁存上一次除法结果,输入相同则直接结束计算

端口说明

参数化配置除法器位宽

名称 默认值 功能
DIV_WIDTH 32 输入输出数据位宽

除法器端口

名称 方向 位宽 功能
公共信号
clk 输入 [0:0] 时钟输入端口
rst_n 输入 [0:0] 异步复位同步释放
数据输入
su_dived_i 输入 [DIV_WIDTH-1:0] 被除数
su_divor_i 输入 [DIV_WIDTH-1:0] 除数
signed_en 输入 [0:0] 使能有符号除法,高有效
div_in_valid 输入 [0:0] 输入数据有效,除法期间需持续拉高
div_in_ready 输出 [0:0] 准备好接收
数据输出
div_res_data 输出 [DIV_WIDTH-1:0]
div_rem_data 输出 [DIV_WIDTH-1:0] 余数
div_out_valid 输出 [0:0] 输出结果有效
div_out_ready 输入 [0:0] 准备好接收

仿真说明

需要安装iverilog v11及以上版本
Windows:视频教程
Linux:

sudo apt install make git gtkwave gcc g++ bison flex gperf autoconf
git clone -b v11_0 --depth=1 https://gitee.com/xiaowuzxc/iverilog/
cd iverilog
sh autoconf.sh
./configure
make
sudo make install
cd ..
rm -rf iverilog/

/tb目录提供了Makefile和批处理脚本,分别用于Linux与windows
Windows: 双击/tb/make.bat
Linux: /tb目录下,终端输入make

例化模板

hp_int_div #(
	.DIV_WIDTH(32)
) inst_hp_int_div (
	.clk           (clk          ),
	.rst_n         (rst_n        ),
	.su_dived_i    (su_dived_i   ),
	.su_divor_i    (su_divor_i   ),
	.signed_en     (signed_en    ),
	.div_in_valid  (div_in_valid ),
	.div_in_ready  (div_in_ready ),
	.div_res_data  (div_res_data ),
	.div_rem_data  (div_rem_data ),
	.div_out_valid (div_out_valid),
	.div_out_ready (div_out_ready)
);

原理说明

符号位的处理方式

高性能整数除法器内核为无符号设计,对于有符号除法,进行以下操作:

  • 剥离被除数、除数的符号位,取绝对值
  • 锁存被除数、除数的符号位
  • 无符号除法
  • 生成无符号商、余数
  • 根据锁存的符号位,生成有符号商、余数

迭代加速原理

围绕被除数、除数的前导0,进行加速
迭代加速
如图所示,现有被除数A和除数B,它们都是WIDTH位宽度。其中AZ和BZ表示A和B中的前导0部分,AN和BN表示A和B中的有效数字部分。
注意,被除数A不仅表示初始状态的被除数,A还表示每一次除法迭代产生的中间余数。
按照传统除法计算方式,一次WIDTH位的除法需要进行WIDTH次迭代,迭代过程既可以左移除数,也可以右移被除数,目的是比较除数和被除数的高位,得到当前位的商和中间余数。第一次除法迭代需要对齐B的最低位和A的最高位,可以将A右移WIDTH-1位,然后比较移位后的A和B,判断中间余数和商。若移位后的A大于B,则最高位的商等于1,中间余数等于A减去左移WIDTH-1位的B;反之,最高位的商等于0,中间余数A等于被除数A。
显而易见的是,A中存在AZ长度的前导0,在此区间进行比较是无意义的;B中存在BN长度的有效数字,若B左移后A的有效数字比B更短,进行比较是无意义的;他们的“无意义”之处体现在每次迭代结果都是可预测的,当前位的商一定是0,中间余数不变。
观察A和B,可以发现,第一次有意义的比较和迭代,发生在AN和BN的最高位对齐的时刻,当前位的商和中间余数都由AN和BN的具体值决定。
将被除数引申至中间余数A,可以发现他们有着相同的规律,即中间余数A的前导0也会成为冗余。至此,可以明确除法器高性能整数除法器的特点,即每次迭代可以跳过前导0带来的冗余。
本除法器选择右移A比较,左移B产生下一次的中间余数A。每一次迭代, A右移的次数为BZ-AZ,这样可以让AN和BN的最高位对齐,实现最高效的计算。
最后一次迭代,极有可能AZ小于BZ,此时A不会移位,最低位的商等于0,此时的A作为余数。

临界值的处理方式

被除数 除数 模式 余数
x 0 无符号 2^(DIV_WIDTH)-1 x
x 0 有符号 -1 x
-2^(DIV_WIDTH-1) -1 有符号 -2^(DIV_WIDTH-1) 0

资源与时序表现

例化参数DIV_WIDTH等于32

器件 LUT REG 频率
EG4S20 1083 227 40+MHz
GW2A 1081 207 43.9MHz
MIT License Copyright (c) 2022 xiaowuzxc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Verilog编写的高性能整数除法器,具有参数化配置位宽、迭代加速、结果锁存等特性,带有仿真脚本 展开 收起
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Verilog
1
https://gitee.com/xiaowuzxc/HP_INT_DIV.git
git@gitee.com:xiaowuzxc/HP_INT_DIV.git
xiaowuzxc
HP_INT_DIV
高性能整数除法器
master

搜索帮助