2013-03-07 98 views
1

我正在开发一个BIST引擎的描述,我的经理已经问过我从Verilog过渡到VHDL。我对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或similiar,我得到的错误尝试使用的地址作为数组索引:

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

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

回答

2

你想按位访问和包装行为:

  • 使addr根本的unsigned载体。

然后,你需要访问它作为一个整数:

  • 如果你需要它作为上只有一行一个整数,使用to_integer呼叫只是该行。
  • 如果你需要在多个地方的整数,创建另一个信号,“影子”,并把在建筑

像这样的连续赋值:

signal addr_int:natural; 
.... 
addr_int <= to_integer(addr); 
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; 
... 
+0

不幸的是这并未解决_array索引类型不匹配错误。我无法使用无符号索引向量,并且不断转换为整数并不是真正的选项,因为地址主要用作索引。我真的很喜欢可以避免所有转换的数据类型。 – DrDean 2013-03-07 21:06:13

+0

'to_integer(地址)'是不是一个可接受的转换? – Josh 2013-03-07 21:11:52

+0

我的意思是,我不希望数十个'to_integer(address)'语句抛出我的代码,因为在大多数地址引用中,我将它用作索引。我可以使它成为一个int,并在必要时转换为无符号,但后来我遇到了信号不会溢出的问题。猜猜我会写我自己的附加功能,但这一切似乎太麻烦了;应该是一个更简单的方法。 – DrDean 2013-03-07 21:25:55

相关问题