Verilog 在末尾用零舍入

Verilog 在末尾用零舍入,verilog,system-verilog,rounding,Verilog,System Verilog,Rounding,我们可以通过查看数字lsb(最右边的位)和26或78到30和80来舍入一个数字,比如23或74到20和70。。我怀疑这在verilog代码中是否可行。。。我想知道,在转换成数字后,这个概念是否可行。一般来说,要对基数n的整数进行四舍五入,需要加n/2,然后除以n(去掉余数),然后再乘以n。因此,您的上述示例: (23+5)/10 * 10 = 20 (28+5)/10 * 10 = 30 使用二进制逻辑执行此操作有点昂贵,因为需要进行除法和乘法。但是,如果您使用的是基数为2的数字,那么这些操作

我们可以通过查看数字lsb(最右边的位)和26或78到30和80来舍入一个数字,比如23或74到20和70。。我怀疑这在verilog代码中是否可行。。。我想知道,在转换成数字后,这个概念是否可行。

一般来说,要对基数n的整数进行四舍五入,需要加n/2,然后除以n(去掉余数),然后再乘以n。因此,您的上述示例:

(23+5)/10 * 10 = 20
(28+5)/10 * 10 = 30
使用二进制逻辑执行此操作有点昂贵,因为需要进行除法和乘法。但是,如果您使用的是基数为2的数字,那么这些操作是免费的,因为这只是一个移位


以二进制为例,假设您希望将61四舍五入到8的最接近倍数,即64。在二进制中,61是6'b011101。加上8/2(6'b000100),你会得到6'b100001,这是65。现在除以8,再乘以8。因为这只是向右移动3,然后向左移动3,我们可以简单地将3个LSB归零,得到6'b100000,即64

一般来说,要对基数n的整数进行四舍五入,需要加n/2,然后除以n(去掉余数),然后再乘以n。因此,您的上述示例:

(23+5)/10 * 10 = 20
(28+5)/10 * 10 = 30
使用二进制逻辑执行此操作有点昂贵,因为需要进行除法和乘法。但是,如果您使用的是基数为2的数字,那么这些操作是免费的,因为这只是一个移位


以二进制为例,假设您希望将61四舍五入到8的最接近倍数,即64。在二进制中,61是6'b011101。加上8/2(6'b000100),你会得到6'b100001,这是65。现在除以8,再乘以8。因为这只是向右移动3,然后向左移动3,我们可以简单地将3个LSB归零,得到6'b100000,即64

如果您只想将任何寄存器的LSB设为零,您随时可以这样做

reg [7:0] a;
reg [7:0] b = 23;

a = {b[7:1], 1'b0};

如果你只是想让任何寄存器的LSB为零,你可以这样做

reg [7:0] a;
reg [7:0] b = 23;

a = {b[7:1], 1'b0};

你只对以10为基数的四舍五入感兴趣吗?或者你在寻找一种对二进制数进行四舍五入的方法吗?在这种情况下,我不会说LSB和MSB,而是说最低有效位和最高有效位。哦,是的,先生。。我现在面临另一个问题。当a=n1%10出现错误时,如何找到最右边的数字;如你所知,除以10并得到余数可以很容易地得到任何数字中最右边的数字。你只对以10为基数的数字进行四舍五入感兴趣吗?或者你在寻找一种对二进制数进行四舍五入的方法吗?在这种情况下,我不会说LSB和MSB,而是说最低有效位和最高有效位。哦,是的,先生。。我现在面临另一个问题。当a=n1%10出现错误时,如何找到最右边的数字;如你所知,除以10并得到余数可以很容易地得到任何数字中最右边的数字1.非常感谢。。你能给我提供一个除法器verilog代码吗?因为/10不能用xilinx合成。你必须自己解决这个问题,或者找到一些IP地址。Xilinx可能有一个可以实例化的分隔块。当我需要除法器时,我会使用Synopsys或Cadence提供的除法器及其合成工具。你可以从互联网上选择一种算法并加以应用:谢谢你的宝贵意见。非常感谢。。你能给我提供一个除法器verilog代码吗?因为/10不能用xilinx合成。你必须自己解决这个问题,或者找到一些IP地址。Xilinx可能有一个可以实例化的分隔块。当我需要除法器时,我使用Synopsys或Cadence提供的除法器及其合成工具。您可以从互联网上选择一种算法并应用它:感谢您的宝贵意见。