【问题标题】:Rounding off a number in verilog在verilog中四舍五入
【发布时间】:2013-09-23 10:10:11
【问题描述】:

基本上,我正在尝试在 verilog 中编写一个可合成的模块,该模块执行 2 个数字之间的除法并对结果进行四舍五入。例如,如果我在做 56/30 那么结果值为 1.86 并且这个值应该四舍五入到 2 或者如果我在做 42/30 ,结果值是 1.4 应该四舍五入到 1 。可以用verilog编写可综合的代码来实现吗?

【问题讨论】:

  • 您需要提供更多详细信息。你有哪款合成器?如果它实际上只是一个移位器,大多数只会将“/”运算符变成一个除数 - 除数必须是 2 的恒定幂。你的数字格式是什么?你了解四舍五入吗?您可能需要编写除法器 - 查找“非恢复除法”。
  • 基本上我用于计算的数字是我模块的输入。所以数字是有线格式的。您提到除数必须是 2 的常数幂。但在模拟过程中,我得到 56/30 的输出为 1,这是商的底值。我的疑问是,如果除数是2的幂以外的数字,是否可以合成代码?
  • 我相信@EML 指的是这样一个事实,即如果将常数或选择的除数(分母)定义为 2 的幂,您将得到一个移位器而不是除数器。与分频器相比,移位器的面积和功率效率都很高。

标签: verilog


【解决方案1】:

答案 LSB 的值由输入格式决定。如果您将分子输入更改为具有至少 1 个小数位而不是整数的定点,您的输出将有一个表示 0.5 的位,您可以使用它来控制截断(向下舍入)或向上舍入。

module test;

reg[4:0] a = 5'b0011_0; //3 with 1 Fractional bit
reg[4:0] b = 5'b00010;  //2 no fractional bits
reg[9:0] c;

initial begin
  c = a/b ; //LSB => 0.5
  // c= 5'b01_1 => 1.5
  #1 $display("C = %b", c);
end
endmodule

【讨论】:

    【解决方案2】:

    如果<size> 小于返回的值,Verilog 会截断数字的结尾。因此,如果除以 42/30,则返回的值为 1.4。只需将<size> 定义为1,小数点就会被截断。

    但是,请记住,此解决方案截断小数点,而不是四舍五入。我不是 Verilog 专家,但您可以参考 here 来进一步解决您的问题。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2012-08-04
      • 2023-03-26
      相关资源
      最近更新 更多