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

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9546|回复: 23

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

[复制链接]
发表于 2012-7-10 04:57:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我是verilog的新手,以前上课时接触到的例子和实验基本上是数字逻辑和别人编好的Integer Unit。
所以我从来没碰过floating number和fixed point number这些运算。(又考虑小数,又考虑正负号。。。小弟我一头雾水。。。)
现在我只会用:
always @(posedge clk) sum=A+B;
做个整数的加减法(负整数verilog一律默认用补码表示对吧?目前实验都是成功的。)
但是如果在simulus模块中input小数,verilog根本不认。。。比如a=8'd3.14就是错误的,会报警。
关于小数运算,DSP芯片无疑是最典型的例子吧?而且各种application的各种算法都有实现到AISC上来加速。
所以我想verilog中的小数运算,应该是个成熟的技术吧?
请问各位大侠前辈,你们一般是如何实现fixed point或者是floating point的加减乘除的呢?
谢谢了。
发表于 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 11:37:44 | 显示全部楼层
回复 2# eaglelsb


    多谢大侠回复。我是不是可以这样理解:
   小数的加减乘除,和整数的加减乘除一模一样,只是我得用人脑记住小数点位置(就像您刚才举的定点数例子)。
    假设我只是人脑记好 “嗯,前3位是整数部分,后2位是小数部分”,然后事先把$readmemb所读取分件中的数都这么表示,然后全当整数在verilog里面算,最后输出的结果也用  “嗯,前3位是整数部分,后2位是小数部分” 来解释就行了吧?
对于乘除运算是不是会麻烦一些?而且 一般大侠们做真实项目的时候,是不是这样:
A(5位)X B(5位)= C(10位),一般想让C仍然是5位,然后结掉后5位。。。?。。。(我这里有点乱了)?
发表于 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-10 17:19:44 | 显示全部楼层
硬件小数运算可以用浮点运算单精度和双精度的都可以。
IEEE754标准,
opencores上有FPU的core可以下来看看。
 楼主| 发表于 2012-7-11 01:07:45 | 显示全部楼层
回复 4# eaglelsb

谢谢回复。关于截断,那就意味着小数点的位置一定就变化了吧?
我知道您那个例子里两个数相乘后四位是小数,但是为了整齐,我下意识地希望所有寄存器都是5位的,所以就要把A*B也截成5位的(不知道大侠平时做大项目的时候也是这样做的吗?)所以我不可能只把4位小数丢掉,还剩下6位整数。 如果我把后5位都丢掉,那么我得到的数就是错的,但是位数对。如果我丢掉3位小数,和高位的2位整数,看起来错误就小多了(符号位另算,当然高位的2位应该是0)请问我这么想对吗?
看来数字只要相乘,位数就会变长,小数点位置就会变化,截断的话注意的问题也很多。。。。。。不知道大侠们用的比较专业的设计方法是怎么的呢?
发表于 2012-7-11 06:34:40 | 显示全部楼层
拿笔算,用精度的最后一位的数值衡量误差。
把误差表示出来,带入到系统中,累加起来看总误差是否满足需求。

每一次定点运算也好,截位也好,误差都不超过一个ulp (unit of least precision)

0.00001111截位到0.00001,总误差小于0.00001,也就是2^-5。
发表于 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,前面截多少位,后面多少位,你输入的数据多少位等, 配置下即可,
发表于 2012-7-11 23:41:41 | 显示全部楼层
建议仔细阅读 《verilog 最后的私私细雨》中第一章“不同的自然”,对浮点数加减乘除有详细的讲解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-11-17 03:49 , Processed in 0.026582 second(s), 7 queries , Gzip On, Redis On.

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