VHDL 编码..从整数到位向量的转换

问题描述 投票:0回答:2

我面临这个问题,我被要求在VHDL中实现一个函数,它接受一个整数并返回一个bit_vector,假设这个整数由4位表示。

我不想使用已经内置的函数,我必须编写该函数的代码。

我做了一个从 bit_vector 转换为整数的函数,这有点简单,但我卡在这里 :S

有什么想法我该怎么做吗?

vhdl
2个回答
4
投票

Morten 的答案是正确的,但有时值得对其他方法持开放态度......

由于问题涉及较小(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!


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;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.