我应该将哪种VHDL数据类型用于内存地址?

时间:2013-03-07 19:40:15

标签: vhdl type-conversion

我正在开发一个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]

我似乎在这里处于一种不赢的局面。我使用什么数据类型?请注意,解决方案必须是可综合的。感谢

2 个答案:

答案 0 :(得分:2)

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

  • 使addr从根本上成为unsigned向量。

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

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

像这样:

signal addr_int:natural;
....
addr_int <= to_integer(addr);

答案 1 :(得分: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;
...