1

我正在开发 BIST 引擎的描述,我的经理要求我从 Verilog 过渡到 VHDL。我对 VHDL 非常生疏,我无法找出正确的数据类型来提供给我的代码中的地址寄存器。大多数时候,地址用于索引到数组中。

data : std_logic_vector (2**W-1 downto 0);
...
output = data(addr);

但有时,我需要执行按位运算(例如,在地址中找到最低有效 1 的代码):

least_one(0) <= addr(0);
PRIORITY_ENCODER : for i in 1 to (W-1) generate
    least_one(i) <= addr(i) and not or_reduce(addr(i-1 downto 0));
    end generate PRIORITY_ENCODER;
least_one(W) <= not or_reduce(addr);

最后,我还依赖地址在溢出时环绕而不会出现问题(即 1111+1 = 0 和 0-1 = 1111)。

那么,考虑到所有这些不同的用途,我应该为地址提供什么数据类型或子类型?当我使用整数和相关类型时,执行按位运算时会出错:

ncvhdl_p: *E,APNPFX (filename,17|20): can not make sense of P(...)

当我使用 std_logic_vector 或类似方法时,尝试将地址用作数组索引时会出错:

ncvhdl_p: *E,INTYMM (filename,52|17): array index type mismatch [6.4]

我在这里似乎处于一个没有胜利的境地。我使用什么数据类型?请注意,解决方案必须是可合成的。谢谢

4

2 回答 2

2

您想要按位访问和包装行为:

  • addr基本上是一个向量unsigned

然后您需要以整数形式访问它:

  • 如果您只需要在一行上将其作为整数,请仅to_integer在该行上使用调用。
  • 如果您在多个地方需要它作为整数,请创建另一个信号来“遮蔽”它并在架构中放置一个连续赋值

像这样:

signal addr_int:natural;
....
addr_int <= to_integer(addr);
于 2013-03-08T12:03:18.040 回答
1

在这种情况下,我会使用unsigned类型。

这将与您习惯于在通用位访问方面进行操作的方式非常相似std_logic_vector,但您也可以对地址进行算术运算,并integer在必要时轻松转换为类型/从类型转换。另外,它不会弄脏std_logic_vector“可怕”std_logic_unsigned包装的感觉。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

...

architecture myarch of myent is
   signal address : unsigned(numbits-1 downto 0);

   ...

begin

-- as an example
addr_counter : process(sysclk, reset)
begin
   if reset = '1' then
      address <= (others => '0');
   elsif rising_edge(sysclk) then
      address <= address + 1;
   end if;
end process addr_counter;
...
于 2013-03-07T20:26:06.153 回答