数字电路中四舍五入的实现

在数字信号处理的应用中,往往会对数据进行截位。在截位的过程中,通过增加四舍五入,能够有效增加运算的准确性。

1. 无符号数

在之前的博客中,有对数制进行过介绍。根据数制的规定,如果被截掉的二进制数最高为1,那么被丢弃的部分一定是大于等于0.5,而如果最高位为0,那么被丢弃部分一定小于0.5。如下代码,如果b是对a的高4位进行截位,那么a的第2bit决定是否要执行进1操作。

wire [7:0] a;
wire [4:0] b;

assign b = a[7:3] + a[2]; //a[2]决定是否进位

这种方式有一个小小的bug,如果当a的高4位都是1,这时的进位会导致a溢出,可以再加入一个防溢出的逻辑。

wire [7:0] a;
wire [4:0] b;

assign b = &a[7:3] ? a[7:3] : a[7:3] + a[2]; //只有当a[7:3]不全为1时,进行四舍五入

2. 有符号数一般方法

当考虑到有符号数时,情况变得复杂起来。当有符号数是正数时,情况和之前讨论的一样。然而,如果是负数的话,是否进位不仅仅取决于被抛弃的数的最高位,也取决于被抛弃的数的其他位。例如补码(1000.100)表示的是-7.5,这时应当直接舍弃后3bit,得到(1000),也就是-8。如果是(1000.101),则表示的是十进制的-7.375,则期望得到的数是-7,也就是(1001),进位为1。

下面是有符号数的代码表示

wire signed [7:0] a;
wire signed [4:0] b;
wire carry_bit;

assign carry_bit = a[7] ? (a[2] & (|a[1:0])) : a[2];

assign b = a[7:3] + $signed({1'b0,carry_bit});

在这基础上加入防溢出逻辑

wire signed [7:0] a;
wire signed [4:0] b;
wire carry_bit;

assign carry_bit = a[7] ? (a[2] & (|a[1:0])) : (~(&a[6:3])) & a[2];

assign b = a[7:3] + $signed({1'b0,carry_bit});
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、付费专栏及课程。

余额充值