2012-12-27 51 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;