FPGA实现除法器(verilog)

前言Verilog语法中有“/”和“%”运算符,分别表示除法运算和取余运算,但是FPGA实现除法器时,是否可以直接使用这两个运算符呢?答案是否定的。FGPA的综合工具中,对Verilog的除法指令进行编译时,有以下几种情况:1、如果被除数和除数均为固定数,编译中,借助计算机的除法运算能力,直接将除法运算结果赋给变量;2、如果除数是2的幂次方,编译中,直接通过运算截取被除数相应的位数赋给变量;3、如果被除数、除数是任意变化的数,多数综合工具不能综合出令人满意的结果,有些甚至不能给予综合,即使可以综合
摘要由CSDN通过智能技术生成

前言

Verilog语法中有“/”和“%”运算符,分别表示除法运算和取余运算,但是FPGA实现除法器时,是否可以直接使用这两个运算符呢?答案是否定的。
FGPA的综合工具中,对Verilog的除法指令进行编译时,有以下几种情况:
1、如果被除数和除数均为固定数,编译中,借助计算机的除法运算能力,直接将除法运算结果赋给变量;
2、如果除数是2的幂次方,编译中,直接通过运算截取被除数相应的位数赋给变量;
3、如果被除数、除数是任意变化的数,多数综合工具不能综合出令人满意的结果,有些甚至不能给予综合,即使可以综合,也会消耗比较多的资源。
对于第3中情况,往往需要使用相应的算法来实现除法,实现方法有两类,即基于减法的运算和基于乘法的运算;

一、基于减法的除法器实现

对于任意位宽的除法运算,商的位宽一定不会大于被除数的位宽,余数的位宽一定不会大于除数的位宽。

a、算法原理

假设4bit的两数相除 a/b,商和余数最多只有4位 (假设1101/0010也就是13除以2得6余1)

我们先自己做二进制除法,则首先看a的MSB,若比除数小则看前两位,大则减除数,然后看余数,以此类推直到最后看到LSB;而上述算法道理一样,a左移进前四位目的就在于从a本身的MSB开始看起,移4次则是看到LSB为止,期间若比除数大,则减去除数,注意减完以后正是此时所剩的余数。而商呢则加到了这个数的末尾,因为只要比除数大,商就是1,而商0则是直接左移了,因为会自动补0。这里比较巧因为商可以随此时的a继续左移,然后新的商会继续加到末尾。经过比对会发现移4位后左右两边分别就是余数和商。
在这里插入图片描述

b、组合逻辑实现

下面这段代码是基于减法运算,以组合逻辑的方式实现的除法器,首先将被除数(位宽DIVISOR_WIDTH)和除数(位宽DIVIDEND_WIDTH)均扩展到(DIVISOR_WIDTH+DIVIDEND_WIDTH)位,其中将被除数高位补0后赋给tempa,除数左移DIVISOR_WIDTH位,低位补0,赋给tempb,在每个周期开始时,先将tempa左移一位,末尾补0,然后与除数(dividend)比较,是否大于除数,是则tempa减去tempb将且加上1,否则继续往下执行。上面的移位、比较和减法要执行DIVISOR_WIDTH次,执行结束后tempa的高DIVIDEND_WIDTH位即为余数,低DIVISOR_WIDTH位即为商。具体代码实现如下:

module Divider#(
	 parameter	DIVISOR_WIDTH		= 32
	,parameter	DIVIDEND_WIDTH		= 32
)(
	 input	wire	[DIVISOR_WIDTH-1:0]		divisor
	,input	wire	[DIVIDEND_WIDTH-1:0]	dividend
	//------------------------------------------------//
	,output	reg		[DIVISOR_WIDTH-1:0]		quotient	
	,output	reg		[DIVIDEND_WIDTH-1:0]	remainders
);
//==============================================================================================
//======								define signal									========
//==============================================================================================
(* keep = "TRUE" *) reg	[DIVISOR_WIDTH+DIVIDEND_WIDTH-1:0]		tempa	;	
(* keep = "TRUE" *) reg	[DIVISOR_WIDTH+DIVIDEND_WIDTH-1:0]		tempb	;	
	integer	i;
//=========================================================================
  • 11
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Verilog中,实现定点小数除法器可以使用固定小数点数值类型。固定小数点数值类型是一种将整数和小数部分分开存储的数据类型,其中小数点的位置是固定的。可以使用这种数据类型来表示和计算定点小数。 在Verilog中,可以使用`$signed`和`$unsigned`函数将有符号数和无符号数进行转换。这些函数可以将无符号数转换为有符号数,或将有符号数转换为无符号数。这样可以在有符号数和无符号数之间进行运算。 此外,还可以使用Verilog中的除法操作符`/`来执行除法运算。对于定点小数除法器,可以将被除数和除数都转换为有符号数,然后进行除法运算。最后,可以将结果转换回无符号数,以得到最终的除法结果。 需要注意的是,在Verilog中进行定点小数除法时,需要考虑到小数点的位置和精度。根据具体的需求,可能需要进行舍入或截断操作,以确保得到正确的结果。 参考资料: \[1\] https://blog.csdn.net/mdpsdhr/article/details/61922126 \[2\] http://www.cnblogs.com/woshitianma/archive/2013/05/19/3087258.html \[3\] https://blog.csdn.net/github_33678609/article/details/53465626 #### 引用[.reference_title] - *1* *2* *3* [FPGA中的小数计算(定点小数) 与 verilog/VHDL有符号数计算](https://blog.csdn.net/Setul/article/details/82690251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值