定点减法器的深入探讨

[复制链接]
2783|0
 楼主| vfdff 发表于 2007-6-24 20:08 | 显示全部楼层 |阅读模式
entity&nbsp;signed_sub&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;generic(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIDTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:integer&nbsp;:=&nbsp;16<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;port(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic_vector(WIDTH-1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic_vector(WIDTH-1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ut&nbsp;std_logic_vector(WIDTH-1&nbsp;downto&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />end&nbsp;signed_sub;<br /><br />architecture&nbsp;rtl&nbsp;of&nbsp;signed_sub&nbsp;is<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;a_ext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;b_ext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;diff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br /><br />begin<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;a_ext&nbsp;&lt=&nbsp;a(WIDTH-1)&nbsp;&&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;b_ext&nbsp;&lt=&nbsp;b(WIDTH-1)&nbsp;&&nbsp;b;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;&lt=&nbsp;a_ext&nbsp;-&nbsp;b_ext;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&lt=&nbsp;diff(WIDTH&nbsp;downto&nbsp;1);<br /><br />end&nbsp;rtl;<br />对于上面的定点减法器,完成一般的两个带符号数据的相减是没有问题的!<br />但是当数据要经过多次减法操作的时候,就可能发生溢出的错误<br />有两种思路可以解决这个问题<br />1)增加数据的位数宽度,然后对高位进行带符号方式的扩展,此方法虽然相对简单<br />但是经过多次相加减之后就会对数据的实际表达需要的为数产生困惑<br />不知道到底需要几为才好<br />2)增加几个数位,进行标志,对于溢出的时候,可以用这几个位数标志此数据是对对高位截取了<br />并且记录截取的位数,这样经过多次&nbsp;加减的时候,就可以相对准确的记录结果值<br /><br />entity&nbsp;signed_subf&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;generic(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WIDTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:integer&nbsp;:=&nbsp;16<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;port(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic_vector(WIDTH-1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:in&nbsp;std_logic_vector(WIDTH-1&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ut&nbsp;std_logic_vector(WIDTH&nbsp;downto&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />end&nbsp;signed_subf;<br /><br />architecture&nbsp;rtl&nbsp;of&nbsp;signed_subf&nbsp;is<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;a_ext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;b_ext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;signal&nbsp;diff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:std_logic_vector(WIDTH&nbsp;downto&nbsp;0);<br /><br />begin<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;a_ext&nbsp;&lt=&nbsp;a(WIDTH-1)&nbsp;&&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;b_ext&nbsp;&lt=&nbsp;b(WIDTH-1)&nbsp;&&nbsp;b;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;diff&nbsp;&lt=&nbsp;a_ext&nbsp;-&nbsp;b_ext;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;&lt=&nbsp;diff(WIDTH&nbsp;downto&nbsp;0);<br /><br />end&nbsp;rtl;<br />当然也可以采用这种方式,基本和&nbsp;2)描述的方法相似<br />但是这个方式却没有对&nbsp;进位溢出的我为数进行指定,而是直接截取高位<br />这样在数据相差比较大的时候是可以满足精度的<br />但是如果这两个数值相差本来就比较小的时候&nbsp;就不是很妥当<br />因为本来&nbsp;低&nbsp;WIDTH/2&nbsp;位就能表达这个准确的值,现在却将其最低位忽略了!<br />造成不必要的精度损失!<br /><br />个人想法,希望大家批判!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

48

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部