在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 11162|回复: 23

[求助] 新手求助 关于verilog中数值计算的设计方法。

[复制链接]
发表于 2012-7-10 09:48:27 | 显示全部楼层
不能识别小数的,都是当成整数来处理然后再来截位的,
比如A+B A=1.8, B=2.5
那先你自己规定下想用几位来代表小数精度,比如1.8=1+0.5+0.25+(后面还有0.05)
你要是想精度更深的话,把这0.05再这样展开,如果只想用两位小数,那1.8就按1.75来看待,{3'bA, 2'bB},也就是5'b00111 B=5'b01010 两个相加,5'b10001,也就是4.25, 拿着这个数你就知道前三位整数,后两位小数了。
要是不要想小数了,再右移两位,四舍五入,就得4了。
回复 支持 反对

使用道具 举报

发表于 2012-7-10 12:05:46 | 显示全部楼层
是的,对于加减是这样,不管整数小数都这样处理,心里知道后面几位代表小数就行。注意加减时,因为要考虑进位的位置,SUM会扩展到高一位的,如果你对和的值心里有数,不会发生溢出,或者溢出后可以直接截取高位,比如3位相加,010+010也就是2+2等于4嘛,那应该变成4位,0100, 如果你还写成三位的,100,那就变成-4了,

对于乘法更复杂些,A*B,都是前三位整数,后2位小数的,那乘出来10位数,应该是前6位是整数,后四位是小数了,不是5位……

对于除法,这个比较难,你直接用CORE使用就行,如果真要用,可以使用叠迭法,就是如果A/B,如果一个值D*B还小于A,但(D+1)*B就大于A了,那A/B就是D这个值了。
回复 支持 反对

使用道具 举报

发表于 2012-7-11 09:49:22 | 显示全部楼层
回复 6# ttxs2009

对于乘法,建议直接使用CORE,对于位数的处理,通常就是砍掉前面和砍后面的,两者同时进行来保证value正确,同时对于符号位这个要留神,
如果你是两个变量相乘的话,按上面的方法,如果仅是一个定量乘以变量,就不需要花费乘法器了,
比如A*1.8, 那就是A*(1+1/2+1/4+...),也就是等于A + A>>1 + A>>2
回复 支持 反对

使用道具 举报

发表于 2012-7-11 09:52:00 | 显示全部楼层
回复 6# ttxs2009

每次都要手工地去截位太复杂,可以的话,你可以自己去写一个模块,可以参数化地配置截位的,最好分为signed, unsigned,前面截多少位,后面多少位,你输入的数据多少位等, 配置下即可,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-14 03:19 , Processed in 0.012054 second(s), 4 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表