2011-11-02 90 views
2
type dmemSpace is array(0 to 1023) of std_logic_vector(31 downto 0); 
signal dataMem : dmemSpace := ( 
    400 => X"00000000", 
    404 => X"00001000", 
    408 => X"FFFFEFFF", 
    others => X"00000000" 
); 

signal dAddr : std_logic_vector(31 downto 0); 
signal check : integer; 


dAddr(31 downto 0) <= Addr(31 downto 2) & "00"; 
check <= to_integer(unsigned(dAddr)); 
DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

它再次....我工作在一個單一的循環CPU和其他一切工作正常,但在內存中的這一特定行。Vhdl矢量邊界檢查

DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

我想防止DataOut的索引超出範圍的錯誤,但這是行不通的。有任何想法嗎?

  • Check > 0防止所有的數據出來。
  • Check >= 0讓錯誤通過...當導致異常的索引是-4時。
+0

這是否在一個鐘控過程?如果是這樣,這是一個計劃問題。如果不是,您已經使用DataOut創建了一個鎖存器。你爲什麼不使用'dAddr'的9 downto 0來限制到1023? (我知道,可能是一個學習練習。) –

+0

! YOURE RIGHT我將它添加到時鐘進程中,現在一切都很好。謝謝你的一切。其實這一直困擾着我說現在....我是這樣一個擦洗<。< –

+0

那麼你爲什麼「接受」下面的答案是沒有意義的?我添加了一個答案,其中包括一些此類警告和其他一些警告。 –

回答

1

如果在過程中有它,你需要「dAddr」和「check」是變量,否則你是基於是否將以前的地址以兩個時鐘週期是有效的,而不是一個你正在使用。

0

如果你的內存有1024個位置,你的地址應該是10位,而不是你現在擁有的32位。如果您的地址是unsigned(9 downto 0),則其所有值都是您的存儲陣列的合法輸入。

注意您將數據放在地址400,404,408處。您將在每個數據元素之間留出三個空格!即使你的數據是4字節寬,每個地址都佔用一個完整的4字節數據字。

-1

此嘗試和提供的答案的其他一些問題: 您不能應用索引-4。您的dAddr將類型std_logic_vector強制轉換爲UNSIGNED。所以它總是一個積極的或零。 如果你只是模擬,使用VARIABLES是一個解決方案。對於SYNTHESIS,如果你想知道實現在做什麼,他們仍然需要SIGNALS。 你的記憶力是隻讀的。如果你想讀/寫內存,你會希望在一個時鐘進程中有這個,所以你生成寄存器而不是鎖存器。 我不知道你在聲明中的數組部分賦值。是的,它在合成上是正確的,但是在聲明中的賦值不適用於合成邏輯。這真的只適用於CONSTANTS(公平地說,這就是你的dataMem信號是一個常數。) 要初始化內存,你需要它在你的時鐘進程的RESET塊中,使用for循環來設置所有的如果(檢查< 1024)然後 數據輸出< = dataMem(x)「00」,然後是使用[dataMem(404)< = x「08」]的3個賦值400,404,408;] 檢查); else DataOut < =(others =>「0」); - 也許?或者只保留舊的價值?
end if;

+0

請格式正確喲使其可讀。 – Nunser