我有一个6位数(5 downto 0)输出。现在我的程序结果来自32(二进制100000)。我的结果从0到32无符号,我想将其转换为0直到100 (二进制) 例如结果 DECIMAL
BINARY
100,75,50,25,0(所有都将以二进制形式显示)是我想要做的。 我想缩放整个范围..但主要的价值是这个。 我希望现在更清楚了
答案 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
那么好,那么表格方法是一个很好的解决方案,就像在这种情况下一样。