2

SO用户,

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

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

现在,在 VHDL 中,我遇到了一些 VHDL 代码来划分两个数字。我有一个除以两个无符号数,所以这不应该是一个问题。在这里; VHDL 将两个无符号数相除

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

现在,我的问题是;

  1. 这是一个好方法吗?IE; 我除法和乘法的方式。
  2. 如何将无符号值转换回 std_logic_vector?

亲切的问候。

4

1 回答 1

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. 从无符号转换为 std_logic_vector(我记得它存在于 std_logic_1164 中):

    slv_array <= std_logic_vector(unsigned_number);

如果您想除以 255,我认为您应该将您的 num 除以 256 并在移位后添加一个小数:

1/255 = 1/256 + 1/x

x = 2 幂的东西。移位器是最好的方法。

我尝试了 1/3 并且必须对这种方法感到满意。

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

于 2012-10-11T07:02:39.667 回答