vhdl编程将值从32刻度缩放到100刻度

时间:2014-07-30 19:50:42

标签: hardware vhdl

我有一个6位数(5 downto 0)输出。现在我的程序结果来自32(二进制100000)。我的结果从0到32无符号,我想将其转换为0直到100 (二进制) 例如结果 DECIMAL

  • 32是100
  • 24是75
  • 16是50
  • 8是25
  • 0为0

BINARY

  • 100000是1100100
  • 011000是1001011
  • 010000是0110010
  • 001000是0011001
  • 000000是0000000

100,75,50,25,0(所有都将以二进制形式显示)是我想要做的。 我想缩放整个范围..但主要的价值是这个。 我希望现在更清楚了

2 个答案:

答案 0 :(得分:2)

听起来您希望通过某种比例因子来扩展您的输入。在这种情况下,比例因子是固定的。你真的想从0到32岁吗?还是0-31?我假设总范围是0-31,你将其映射到0-99。

原始范围:32

放大范围:100

比例因子:100/32 = 3.125

将输入二进制值乘以3.125,您将获得输出值。

答案 1 :(得分:1)

硬件乘法器的替代方案是制作硬件映射表,这对于少数和短值是可行的,如本例所示。映射表的代码可能是:

library ieee;
use ieee.std_logic_1164.all;
entity mdl is
  port(
    a_i : in  std_logic_vector(6 - 1 downto 0);
    z_o : out std_logic_vector(7 - 1 downto 0));
end entity;


library ieee;
use ieee.numeric_std.all;
architecture syn of mdl is
begin

  process (a_i) is

    type mapping_t is array (0 to 32) of std_logic_vector(z_o'range);

    function mapping_fun return mapping_t is
      variable res_v : mapping_t;
    begin
      for i in 0 to 32 loop
        res_v(i) := std_logic_vector(to_unsigned(i * 100 / 32, z_o'length));
      end loop;
      return res_v;
    end function;

    constant mapping : mapping_t := mapping_fun;

  begin
    z_o <= mapping(to_integer(unsigned(a_i)));
  end process;

end architecture;

综合工具通常能够非常有效地优化常量映射表(如此处),并且上面仅在Altera中需要6个ALM。

如果转换因子不如25 / 2^3那么好,那么表格方法是一个很好的解决方案,就像在这种情况下一样。