2017-03-09 62 views
0

輸入數組中獲得計數:Ram = {D D D D D 3 3 3 7 7 7 9 9 8 8};
我期待的輸出如下:在讀取存儲器陣列的內容時需要幫助,並在vhdl

Count = {0 0 0 4 0 0 0 3 2 2 0 0 0 5 0 0};

這就是計算出現的次數,比如有5個D,4個3,3個7,2個9和2個8,這樣Count數組在Dth指數中有5個,第3個指數中有4個,第7個指數中有3個,等等。

我的代碼如下:

architecture behav of Bitcount is 
    signal cnt: count_type := (others=> (others=>'0')); 
    use ieee.numeric_std.all; 

    begin 
    Countproc:process(clk) 
    begin 
    if (clk'event and clk='1') then 
    if Enable='1' then 
     if (Read_bit='1') then 
      for k in 0 to 15 loop 
       for i in 0 to 15 loop 
       if (Ram(k) = std_logic_vector(to_unsigned(i, 4)))then   
        cnt(i) <= cnt(i) + "01"; 
       end if; 
       end loop; 
     end loop; 
     end if; 
    end if; 
    Count <= cnt; 
    end if; 
end process Countproc; 
end behav; 

wave 但它不工作作爲我的期望。請幫助

+0

你應該解釋實際發生的事情。你也應該給一個[MCVE](http://stackoverflow.com/help/mcve)。 –

+0

類型轉換太多(並且在示例中沒有聲明......請參閱MCVE)...更好地選擇類型,並且它會簡化,可能會讓您看到該錯誤。 –

+0

我正在嘗試計數每個輸入存儲器陣列內容的發生次數。和count_type是 - type count_type是std_logic_vector(3 downto 0)的數組(0到15); –

回答

2

您的問題是cnt信號。它需要是一個變量

進程內的代碼行按順序執行。無論何時執行包含信號分配<=)的代碼行,都會在事件隊列上放置一個事件,以在下一個增量週期驅動目標信號(在這種情況下爲cnt)(假設目標有一些變化信號結果)。事件隊列是模擬器的「待辦事項」列表;增量循環是模擬器的一次迭代;一旦在當前迭代中執行的所有進程掛起,下一次迭代就會發生。

如果在進程的任何執行期間遇到對同一目標信號的另一個信號分配,則(通常爲*)刪除與該信號有關的事件隊列上的任何其他事件。所以,在你的榜樣,每次遇到這條線(這將是16 * 16 = 256次):

cnt(i) <= cnt(i) + "01"; 

反而增加cnt(i)(這是我認爲你期待發生的),全部與cnt(i)相關的先前事件將被刪除,並替換爲新事件以驅動cnt(i),其中在處理開始執行前加上一個值。信號cnt(i)直到過程完成執行(以及所有其他過程)纔會獲得新值。

變量不顯示此行爲;變量的行爲就像變量在任何軟件語言中的行爲一樣。當一行代碼遇到變量賦值:=)時,變量會立即更新,因此其值可立即用於進一步計算。

那麼,如何要改變cnt變量:

architecture behav of Bitcount is 
    use ieee.numeric_std.all; 
begin 
    Countproc:process(clk) 
    variable cnt : count_type; 
    begin 
    if (clk'event and clk='1') then 
     if Enable='1' then 
     if (Read_bit='1') then 
      cnt := (others=> (others=>'0')); 
      for k in 0 to 15 loop 
      for i in 0 to 15 loop 
       if (Ram(k) = std_logic_vector(to_unsigned(i, 4)))then   
       cnt (i) := cnt (i) + "01"; 
       end if; 
      end loop; 
      end loop; 
      Count <= cnt; 
     end if; 
     end if; 
    end if; 
    end process Countproc; 
end behav; 

我不能肯定這會工作,因爲你沒有提供一個MCVE,所以我沒有測試它。但你原來的解決方案不會因爲我給出的原因而工作。

-

*這幾乎總是正確的,因爲這VHDL模型延誤慣性延遲也肯定是在這個例子中真實的方式。但嚴格來說並非總是如此。

+0

@馬修泰勒,你的回答是完全正確的。我正在使用信號而不是變量。我按照我的要求得到了輸出。我能問你還有什麼期望從我提供的問題(實體以及)嗎?我是新來的,所以想學點東西。 –

+0

正如我所說,你的問題可以通過增加兩件事來改進:i)描述你的電路實際上如何表現(波形不清晰)和(更重要的是)一個MCVE。有了MCVE,任何人都可以執行你的代碼並重新解決你的問題。要將您的示例轉變爲MCVE,您必須添加(i)實體,(ii)您已使用的類型的描述以及(iii)簡單的測試臺。 –