2013-03-07 94 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

相關問題