2012-12-27 82 views
1

我是VHDL的新手,我搜索了所有的互聯網,我沒有找到任何可以幫助我的東西!我試圖添加一個數組的元素(32個元素!),所以我不能只寫 例如s < = s(0)+ s(1)+ s(3)... s( 5)+ .... s(32)數組元素的總和VHDL

我怎麼能概括這樣一個計算? 或我做錯了什麼?

我的代碼(在模擬沒有工作)是... (只是5個elemets ....)

library IEEE; 
library work; 
library std; 

use IEEE.STD_LOGIC_1164.all; 
use IEEE.STD_LOGIC_UNSIGNED.all; 
use ieee.std_logic_arith.all; 

entity main is Port (
    EIN : in std_logic; 
    AUS_1 : out std_logic_vector(3 downto 0)); 
end main; 

architecture Behaviour of main is 

    type Cosinus is array (0 to 4) of std_logic_vector(3 downto 0); 
    type Sinus is array (0 to 4) of std_logic_vector(3 downto 0); 

    Signal SumSin :std_logic_vector(3 downto 0); 

begin 

    main : process(Ein) 
     variable Cos : Cosinus; 
     variable Sin : Sinus; 
    begin 

     if(Ein='1') then 
      sin(0) := "0011"; 
      sin(1) := "0001"; 
      sin(2) := "1010"; 
      sin(3) := "1111"; 
      sin(4) := "1110"; 

      for n in 0 to 4 loop 
       SumSin <= SumSin + Sin(n);    
      end loop; 
     else 
      sin(0) := "1011"; 
      sin(1) := "0101"; 
      sin(2) := "1000"; 
      sin(3) := "1001"; 
      sin(4) := "1100"; 

      for n in 0 to 4 loop 
       SumSin <= SumSin + Sin(n);       
      end loop; 
     end if; 
    end process; 

    Aus_1 <= SumSin;  
end Behaviour; 

我會thanksfull

+1

這個程序有很多問題,但我認爲最大的問題是對信號分配的誤解。有關信號分配如何工作的說明,請參閱此帖子。 http://stackoverflow.com/questions/13954193/is-process-in-vhdl-reentrant至於如何處理它:一種解決方案是將SumSin變量,並將其複製(通過一個單一的信號分配) Aus在這個過程的最後。 –

回答

2

首先... Don't use std_logic_arith.

然後,使用變量作爲運行總和,然後分配給信號:

... 
main : process(Ein) 
    variable Cos : Cosinus; 
    variable Sin : Sinus; 
    variable SumSin : signed(3 downto 0); 
begin 
    sumsin := (others => '0'); 
.... 
     for n in Sin'range loop 
      SumSin := SumSin + Sin(n);       
     end loop; 
    end if; 
    Aus_1 <= SumSin;  
    end process;