VHDL - 需要一些关于分工和建议的建议乘法

时间:2012-10-11 04:29:30

标签: vhdl unsigned division

SO用户,

我正在尝试校准我正在读取ADC值的电阻式湿度传感器。 ADC输出8位值。我使用的Vref值为5V。

我校准的第一步是将数字除以255并乘以Vref值。 因此,校准值=(输出/ 255)* Vref。

现在,在VHDL中,我遇到了一些VHDL代码来划分两个数字。我已经划分了两个无符号数,所以这不应该是一个问题。它在这里; VHDL divide two unsigned numbers

现在,在我的VHDL文件中,我有8位ADC值(湿度),我已经定义了两个常量,max_val(11111111 = 255)和Vref(00000101 = 5)都是无符号的。 我首先使用无符号(湿度)将湿度转换为无符号,然后将此值和max_num值传递给除法函数。结果,我将它乘以Vref。

现在,我的问题是;

  1. 这是一个好方法吗?即;我正在分裂和倍增的方式。
  2. 如何将无符号值转换回std_logic_vector?
  3. 亲切的问候。

1 个答案:

答案 0 :(得分:1)

  1. 我认为它应该除以256?或者使用255我认为您的结果几乎相似(请注意,最大距离介于255/256和255/255之间:= 0.00390625)。结果将是固定点数。乘以5:右移2 =乘以4然后加上这个数字(A * 5 = A * 4 + A),你的代码应该是这样的:

    A_Multiply_4< = A&“00”;
    A_Multiply_5< = A_Multiply_4 + A;

  2. 要从unsigned转换为std_logic_vector(我记得它存在于std_logic_1164中):

    slv_array< = std_logic_vector(unsigned_number);

  3. 如果你想要除以255,我认为你应该将你的数字除以256并在班次后加一点数字:

    1/255 = 1/256 + 1 / x

    x = 2幂。移位器是最好的方式。

    我尝试了1/3并且不得不对这种方法感到愉快。

    P / s x = 2 ^ 16,你得到的两个案例之间的差异是5.9838388480392156862745098039216e-8。但我不认为你想要的数字超过8点。