首页 文章

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

提问于
浏览
2

SO用户,

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

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

现在,在VHDL中,我是一个问题 . 它在这里; VHDL divide two unsigned numbers

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

现在,我的问题是;

  • 这是一个好方法吗?即;我分裂和倍增的方式 .

  • 如何将无符号值转换回std_logic_vector?

亲切的问候 .

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;

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

    slv_array <= std_logic_vector(unsigned_number);

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

    1/255 = 1/256 1 / x

    用x = 2的力量 . 变速器是最好的方式 .

    我尝试了1/3并且不得不用这种方法 .

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

相关问题