我正面临这个问题,我被要求在VHDL中实现一个取整数并返回一个bit_vector的函数,假设这个整数用4位表示。
我不想使用已经内置的功能,我必须编写功能。
我已经创建了一个从bit_vector转换为整数的函数,这有点简单,但我坚持到这里:S
任何想法我该怎么做?
答案 0 :(得分:3)
莫滕是正确的答案,但有时值得对其他方法开放...
由于问题涉及一个小的(4位)范围,查找表变得有吸引力:我假设无符号整数,但它很容易适应。
subtype bv4 is bit_vector(3 downto 0);
constant LUT : array(0 to 15) of bv4 := (
"0000", "0001", "0010", "0011", "0100, "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100, "1101", "1110", "1111");
function to_bv(n : natural) return bit_vector is
begin
return LUT(n);
end to_bv;
这通常会像您希望的那样合成,而不是实际创建ROM!
答案 1 :(得分:2)
VHDL标准软件包是家庭酿造功能的良好灵感,numeric_bit
软件包定义to_unsigned
函数,用于将natural
类型转换为unsigned
类型,这是函数VHDL实际用于转换为bit_vector
。该功能实现为:
function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED is
variable RESULT: UNSIGNED(SIZE-1 downto 0);
variable I_VAL: NATURAL := ARG;
begin
if (SIZE < 1) then return NAU;
end if;
for I in 0 to RESULT'LEFT loop
if (I_VAL mod 2) = 0 then
RESULT(I) := '0';
else
RESULT(I) := '1';
end if;
I_VAL := I_VAL/2;
end loop;
if not(I_VAL =0) then
assert NO_WARNING
report "NUMERIC_BIT.TO_UNSIGNED: vector truncated"
severity WARNING;
end if;
return RESULT;
end TO_UNSIGNED;
如果已知该函数从未与使检查相关的值一起使用,则可以删除初始if (SIZE < 1)
和最终if not(I_VAL =0)
检查。
这使得for I in 0 to RESULT'LEFT loop
每次迭代创建一个结果位。
根据Brian的回答,可以使用TO_UNSIGNED
函数初始化常量LUT,以避免手写文字:
function to_bv(n, size : natural) return bit_vector is
type bv_arr_t is array (0 to 2 ** size - 1) of bit_vector(size - 1 downto 0);
function bv_arr_init(size : natural) return bv_arr_t is
variable res_v : bv_arr_t;
begin
for i in 0 to 2 ** size - 1 loop
res_v(i) := bit_vector(TO_UNSIGNED(i, size));
end loop;
return res_v;
end function;
constant LUT : bv_arr_t := bv_arr_init(size);
begin
return LUT(n);
end to_bv;