2013-10-25 52 views
0

我有一個名爲amux的數組,我想在數組內保存整數倍的信號A。下面的僞代碼給出了一個想法:用信號值的整數倍填充一個數組

amux(0) <= "00001101"; 
amux(1) <= amux(0); 

.... 

amux(n) <= amux(n-1); 

我完整的代碼看起來是這樣的:

-- n is 4 and m is 3, amux is an array, mzeros is 0's 
regA: process(clk) 
variable r : integer := 2**m; 
begin 
    if rising_edge(clk) then 
     if ld_a = '1' then 
      amux(0) <= std_logic_vector(to_unsigned((0),n*m+m)); 
      amux(1) <= mzeros & A; 

      for i in 2 to r-1 loop 
       if (i mod 2) = 0 then 
        amux(i) <= amux(i/2)(n*m+m-2 downto 0) & '0'; 
       else 
        amux(i) <= std_logic_vector(unsigned(amux(i-1))+unsigned(amux(1))); 
       end if; 
      end loop; 

     end if; 
    end if; 

結束進程雷加;

我目前的實現輸出所有「00000000」,除了amux(0)。我的方法有什麼問題?

+1

需要更多的上下文:發佈一個小的完整的可編譯示例。 –

+0

只是猜測,但聽起來像你期望的「00001101」波及到所有amux(1).. amux(n)。然而,這不是'<='在VHDL中的工作方式,因爲在下一個模擬週期之前,用'<='指定給amux(0)的值是不可見的,所以分配給amux(1)使用當前「old」)amux(0)的值,它可能全是「00000000」,並且對於其餘的amux分配類似。 –

+0

我想要保存數組中信號A的整數倍數 – hassicho

回答

0

如果我們正確地理解了您的話,問題是您不能在一個過程中立即使用一個信號的值,然後再對它進行分配。分配的值只有在過程完成後纔可用。如果這是你想要做的,你可以使用一個變量來達到這個目的。變量的值立即更新。

你想要的東西下面的代碼示例應接近:

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity array_loader is 
    generic (
     N: integer := 4; 
     M: integer := 3; 
     DATA_WIDTH: integer := N * M + M; 
     ARRAY_DEPTH: integer := 2**M 
    ); 
    port (
     clk: in std_logic; 
     ld_a: in std_logic; 
     A: in unsigned(DATA_WIDTH-1 downto 0) 
    ); 
end; 

architecture rtl of array_loader is 
    type amux_type is array (0 to ARRAY_DEPTH-1) of unsigned(DATA_WIDTH-1 downto 0); 
    signal amux: amux_type; 

begin 
    regA: process(clk) 
     variable multiple: unsigned(DATA_WIDTH-1 downto 0); 
    begin 
     if rising_edge(clk) then 
      if ld_a then 
       multiple := to_unsigned(0, multiple); 
       amux(0) <= multiple; 

       for i in 1 to amux'high loop 
        multiple := multiple + A; 
        amux(i) <= multiple; 
       end loop; 
      end if; 
     end if; 
    end process; 
end; 

請注意,上面的代碼是有效的VHDL-2008只;在較早版本中,ld_a必須明確與「1」進行比較,並且不可能使用常規常量NM來計算後續泛型的值。

+0

你明白了我的觀點。這對我幫助很大。非常感謝你! – hassicho

+0

得到的結果很好,不幸的是代碼示例有四個語義錯誤,N和M在聲明DATA_WIDTH和ARRAY_DEPTH時不可用,ld_a不是布爾值,to_unsigned被濫用。 (這個問題顯示爲與較新問題相關)。 – user1155120

+0

@ user1155120我編輯了這個問題,提到這些是VHDL-2008的特性。 – rick