首页 > 其他分享 >verilog数的舍入溢出和截位

verilog数的舍入溢出和截位

时间:2023-10-17 12:12:06浏览次数:30  
标签:舍入 din 4Q2 截位 verilog 进位 bit 数据 溢出

四舍五入(round)

前面讲的都是对数据进行扩位,这一节说的是对数据截位时如何进行四舍五入以提高截位后数据的精度。

假设一个9Q6格式的数据为:9’b011.101101,现在只想保留3位小数位,显然必须把最后三位小数位截掉,但是不能直接把数据截成6’b011.101,这样是不精确的,工程上一般也不允许这么做.

首先举例整理思路:

image可以这么理解:正数向下取整,负数向上取整。对于0.5这个地方处理不同。
特殊说明:取round(-2.5)为-2,实际上matlab运行的结果是round(-2.5)为-3。
通过整理真值表,发现round截位时的小数进位与三个变量均相关:数据符号位、小数位的最高bit,以及小数位除最高bit外的所有bit是否均为0(按位或)
image

小数进位可以表示=A ? B &(|C): B;
设输入数据din位宽为DW位,其中小数部分位宽为RD位,且需要四舍五入截掉小数部分,结果为dout。
input [DW-1:0]din; output [DW-RD:0]dout;
即carry_bit=din[DW-1]?( din[RD-1] & (|din[RD-2:0]) ):din[RD-1]
再考虑溢出保护:
image

dout={din[DW-1],din[DW-1:RD]}+{ {(DW-RD){1'B0}}, carry_bit};
假设溢出不保护:
image
这种处理和floor几乎一摸一样,会导致频域上出现不必要的直流分量,相当于所有分量向下做了减法。

正确的做法是先看这个数据是正数还是负数,因为9’b011.101101的最高位为0,所以它是一个正数,然后再看截掉部分(此例中截掉部分是最末尾的101)的最高位是0还是1,在数据是正数的情况下,如果截掉部分的最高位为1,那么是需要产生进位的,所以,最终9’b011.101101应该被截成6’b011.110.

 如果是负数则正好相反。假设一个9Q6格式的数据为:9’b100.101101,由于最高位是1,所以这个数是一个负数,然后再看截断部分的最高位以及除最高位的其他位是否有1,此例中截断部分(截断部分为末尾的101)的最高位为1,而且除最高位以外的其他位也有为1的情况,由于负数最高位的权重是(- ),所以对于这种情况是不需要进位的,与正数不同的是,负数不进位是需要加1的。因此最终9’b100.101101应该被截成6’b100.110。

  假设a是一个9Q6格式的数据,要求把小数位截成3位。下面是Verilog代码:

    assign carry_bit = a[8] ? ( a[2] & ( |a[1:0] ) ) : a[2] ; //正数和负数四舍五入截断

    assign a_round = {a[8], a[8:3]} + carry_bit ;

  上面的代码第一行是通过判断符号位a[8]和截断部分数据特征来确定是否需要进位,如果a[8]是0,计算得到的carry_bit为1,则表示是a是正数,且截断是需要进位;如果a[8]是1,计算得到的carry_bit为1,则表示是a是负数,且截断是不需要进位的,负数不进位需要加1。代码第二行为了保证进位后数据不溢出,所以扩展了一位符号位。

饱和(saturation)截位

 所谓饱和处理就是如果计算结果超出了要求的数据格式能存储的数据的最大值,那么就用最大值去表示这个数据,如果计算结果超出了要求的数据格式能存储的数据的最最小值,那么就用最小值去表示这个数据。

例1:有一个6Q3的数据为6’b011.111,现在要求用4Q2格式的数据去存储它,显然6’b011.111转化为10进制如下:

  $6′b011.111=1∗2^1+1∗2^0+1∗2^{−1}+1∗2^{−2}+1∗2^{−3}=3.875$

  而4Q2格式的数据能表示的数据的最大值为4’b01.11,转化为10进制为1.75,因此4Q2格式的数据根本无法准确的存放3.875这个数据,这样就是所谓的饱和情况。在这种情况下,饱和处理就是把超过了1.75的所有数据全部用1.75来表示,也就是说,6Q3的数据为6’b011.111如果非要用4Q2格式的数据来存储的话,在进行饱和处理的情况下最终的存储结果为:4’b01.11。

  例2:有一个6Q3的数据为6’b100.111,现在要求用4Q2格式的数据去存储它,显然6’b100.111转化为10进制如下:

     $6′b100.111=−1∗2^2+0∗2^1+0∗2^0+1∗2^{−1}+1∗2^{−2}+1∗2^{−3}=−4+0.5+0.25+0.125=−3.125$

  而4Q2格式的数据能表示的数据的最小值为4’b10.00,转化为10进制为-2,因此4Q2格式的数据根本无法准确的存放-3.125这个数据,这是另一种饱和情况。在这种情况下,饱和处理就是把小于-2的所有数据全部用-2来表示,也就是说,6Q3的数据为6’b100.111如果非要用4Q2格式的数据来存储的话,在进行饱和处理的情况下最终的存储结果为:4’b10.00。

1.8 数据溢出

这样两个有/无符号数进行加减运算时,如果运算结果超出可表示的数值范围,会发生出错,产生溢出现象。有溢出不一定有进位、有进位不一定有溢出

有符号加法和无符号加法在运算时硬件电路是一样的,只是对结果的解读不同.

 4-bit运算时

溢出的检查方法

“最高位的进位输入”不等于“最高位的进位输出”,说明产生了溢出。

经过一个异或门,如果C31和Cout 不相等,overflow被设为1,表示溢出。

溢出只能出现在两个同号数相加和两个异号数相减的情况下。通常判别溢出的方法用双高位法:

所谓双高位判别,即规定符号位(用CS表示)有进位时,CS=1,否则 CS=0。数值部分最高位(CP表示)有进位时CP=1,否则 CS=0。若CS⊕CP=1("异或"运算),则有溢出产生。

标签:舍入,din,4Q2,截位,verilog,进位,bit,数据,溢出
From: https://www.cnblogs.com/lanlancky/p/17769383.html

相关文章

  • verilog浮点表示
    1.verilog浮点表示定点运算有两个缺点:①可处理动态范围小;②由截尾舍入产生的百分比误差随着数的绝对值的减小而增加,这个问题可利用浮点数来解决。根据IEE754-1985标准,非负数n可以用两个参数表示,即尾数M和指数E,其表示形式为:$\eta =M×2^{E}$signexponentsignifica......
  • verilog基础语法
    模块使用模块定义加参数modulectrl_5#(parameterintaddr_width=8,parameterintdata_width=32)(input[addr_width-1:0]cmd_addr_i);//模块例化时决定端口宽度ctrl_5#(.addr_width(16))regs5_inst(...);宏定义和模块定义`defineADDR_WIDTH6`defineDATA_......
  • System Verilog
    数据类型​ 数据类型用来定义存储值或者用于线连接的变量数据类型位宽符号值reg可变无符号四态(0,1,x,z)wire可变无符号四态(0,1,x,z)logic可变无符号四态(0,1,x,z)bit1无符号二态(0,1)byte8有符号二态(0,1)shortint16有符号二态(0......
  • Verilog 随机数及概率分布
    转载:7.3Verilog随机数及概率分布|菜鸟教程(runoob.com)随机数Verilog中使用系统任务$random(seed)产生随机数,seed为随机数种子。seed值不同,产生的随机数也不同。如果seed相同,产生的随机数也是一样的。可以为seed赋初值,也可以忽略seed选项,seed默认初始值为0......
  • 银行家舍入法(金额算法,也用于电商系统计算金额)
    一、简单来说就是:四舍、六入、五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。 二、详细来说:1:小于等于四,直接舍去该位2:大于等于六,向前位进一3:等于五3.1:五后有数,向前位进一3.2:五后全零3.2.1:五前位数值为......
  • verilog语法
    状态verilog中对于状态的描述一共有四个1:高电平0:低电平x:未知,可以是高电平也可以是低电平z:高阻态,悬空状态进制verilog的进制和其他语言有很大的不同二进制:4'b0101表示四位二进制的0101十进制:4'd2表示四位十进制的2十六进制:4'ha表示四位十六进制的a总之前面的4是指位......
  • m基于FPGA的costas环载波同步verilog实现,包含testbench,可以修改频偏大小
    1.算法仿真效果其中Vivado2019.2仿真结果如下: 没有costas环,频偏对基带数据的影响   加入costas环的基带数据   2.算法涉及理论知识概要        Costas环是一种用于载波同步的常见方法,特别是在调制解调中,它被广泛用于解调相位调制信号,如二进制调相(BPS......
  • Verilog实现定点乘法器
    实验目的理解定点乘法的不同实现算法的原理,掌握基本实现算法。熟悉并运用Verilog语言进行电路设计。为后续设计CPU的实验打下基础。实验内容定点乘法器有多种实现,实验要求实现迭代乘法器,其结构如图所示。乘数每次右移一位,根据最低位,判断是加被乘数移位后的值还是加0,......
  • m基于FPGA的多径信道模拟verilog实现,包含testbench,可配置SNR,频偏,多径增益和多径延
    1.算法仿真效果其中Vivado2019.2仿真结果如下:  2.算法涉及理论知识概要       瑞利分布是一个均值为0,方差为σ²的平稳窄带高斯过程,其包络的一维分布是瑞利分布。其表达式及概率密度如图所示。瑞利分布是最常见的用于描述平坦衰落信号接收包络或独立多径分量接受......
  • 开源EDA软件,比如 iverilog ,用于本科生教学场景如何?
    文心一言:开源EDA软件如Iverilog可以用于本科生的教学场景。以下是一些优点:免费:开源EDA软件不需要任何许可费用,这使得它们在教学环境中更具有成本效益。灵活:开源EDA软件具有灵活的特性,可以根据不同的教学需求进行定制。教师可以根据课程的内容和要求来选择适合的软件......