有符号数的四舍五入(round)(verilog实现)

有符号数的表达方式见上篇:有符号小数的表示、扩展和计算_weixin_42330305的博客-CSDN博客

对于有符号数,正数和负数的四舍五入有些许不同,需要区别对待

一、正数

对于正数来说,如果被截掉的数的最高位为1,则结果为保留的数+1,否则等于保留的数

以舍弃最低2 bit为例,2 bit可表示的数值为:0、1、2、3

低2 bit的值如果为0、1(2‘b00、2‘b01),则保留的数不需要加+1

低2 bit的值如果为2、3(2‘b10、2‘b11),则保留的数需要加+1

例如:

1、

8Q6 8‘b01.110101 需要四舍五入到6Q4,舍弃的2bit为“2‘b01”,高位为0,因此结果为6‘b01.1101

2、

若需要将8Q6 8‘b01.110110 需要四舍五入到6Q4,舍弃的2bit为“2‘b10”,高位为1,因此结果为6‘b01.1101+1‘b1 = 6‘b01.1110

二、负数

对于负数,最高位和其余位的符号想反,所以是“五舍四入”

如图所示:

对于5 bit 负数,舍弃低2 bit数据来说,数据可以分为3部分

蓝色是符号位,若为1则-8

绿色是被舍弃的部分

假设蓝色部分的值是-x,黄色部分的和是y,绿色部分的和为z,则最终结果为

-x+y+z=-(x-y-z)=-((x-y)+(-z))=-((x-y-1)+(1-z))

-z的取值范围为:0、-1、-2、-3

除以4后:0、-0.25、-0.5、-0.75

1-z/4 = 1、0.75、0.5、0.25

四舍五入后为:1、1、1、0

注意z=2时,-z/4 = - 0.5 四舍五入为-1,但是应用时是1 - z/4 = 0.5,变成了不需要进位

我们带入一个完整的过程

还以舍弃最低2bit为例,假设一个4bit数,高2 bit为2‘b10,那么它可能的取值是:

4‘b1000(-8)、4‘b1001(-7)、4‘b1010(-6)、4‘b1011(-5)

舍弃2bit相当于除以4

(-8)/4 = -2,(-7)/4 = -1.74,(-6)/4 = -1.5,(-5)/4 = -1.25,

上述结果四舍五入之后为:-2、-2、-2、-1

从而得出:

如果被截掉的数的最高位为0,则等于保留的数;如果被截掉的数的最高位为1,且被截掉的其他数均为0,则等于保留的数,否则结果为保留的数+1

三、实现

module round (
input     [M-1:0] a,
output    [N-1:0] b
);

reg    [N-1:0] b;

always @ (*)    begin
    if(((a[M-1]==1'b1) && (a[M-N-1:0]=={1'b1,{(M-N-1){1'b0}}})) ||    //a为负数,且被截位不需要进位
        (a[M-1:M-N]=={1'b0,{(N-1){1'b1}}}))        //a为正数,且截位后数据饱和,不能在进位
        b = a[M-1:M-N];
    else
        b = a[M-1:M-N] + {{(N-1){1'b0}},a[M-N-1]};    //根据截掉是的数据的最高位来判断是否需要进位
end

endmodule

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA对有符号四舍五入是根据具体的设计和需求而定的,没有统一的规定。在字电路中,我们可以使用有符号,即包括0和正负的集合。根据引用中的例子,当对一个有符号进行四舍五入时,我们需要注意对半值的处理。例如,当z=2时,-z/4 = -0.5 四舍五入为-1,但是应用时是1 - z/4 = 0.5,变成了不需要进位。这说明对有符号进行四舍五入时,需要根据具体的情况来确定进位的方式。因此,FPGA对有符号四舍五入可能会根据具体的设计和要求进行不同的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [有符号四舍五入(round)(verilog实现)](https://blog.csdn.net/weixin_42330305/article/details/123117402)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [verilog符号](https://download.csdn.net/download/weixin_38703123/12686875)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值