补码截位的问题
时间:10-02
整理:3721RD
点击:
我需要用verilog写一个公式,
公式里乘除法比较多,
所以想采用截位和补位的方法来近似一下,
因为输入可能有负数,所以就出现一些问题..
问题1,signed数截位之后,好像就变成unsigned了,做加减法时,不会自动扩展符号位。
现在是把每一个截位的数都用$signed()扩展,写成这样:$signed(A[15:7]),
不知道有没有更好的方法。
问题2,比较小的负数截位之后,就不符合除法的计算结果了,
比如-1 截取几位之后依然还是-1。
这样公式结果就不对了
公式里乘除法比较多,
所以想采用截位和补位的方法来近似一下,
因为输入可能有负数,所以就出现一些问题..
问题1,signed数截位之后,好像就变成unsigned了,做加减法时,不会自动扩展符号位。
现在是把每一个截位的数都用$signed()扩展,写成这样:$signed(A[15:7]),
不知道有没有更好的方法。
问题2,比较小的负数截位之后,就不符合除法的计算结果了,
比如-1 截取几位之后依然还是-1。
这样公式结果就不对了
有一种算法叫rounding,自己搜一下吧
想法是好的。
不过为何不高层次综合?
做一个乘法器,除法器,然后复用。
在定义截位结果变量时写成类似
wire signed [9:0] data_clipped;
试试看行不行
你这个问题的解决不在verilog怎么写,要对整个系统做一次详细的误差分析。
我是希望这样近似能够计算的快一点
变量定义的时候加的有signed,但是截位的时候好像系统就默认为unsigned了
我是想在程序里面避免类似-1截位之后依然是-1的这些情况
