通过for循环的阵列的VHDL平均值

时间:2015-06-15 13:55:47

标签: arrays for-loop vhdl moving-average

我在VHDL中有一个X Integer值数组,声明为进程内的变量。 我想计算for循环中所有值的平均值。 如果我手动写出3个值,一切正常(在硬件上测试):

entity MyEntity is
Port(
    Enable   : IN STD_LOGIC ;
    CLK      : IN STD_LOGIC;
    SpeedOut : Out INTEGER
);
end MyEntity;

Average : process
  type      SampleArray         is Array (2 downto 0) of INTEGER;
  variable  SpeedSamples        : SampleArray;
  variable  tempVar             : Integer;
  begin
  wait until rising_edge(CLK);
  if ENABLE = '1' then
     for i in 0 to 2 loop
       tempVar := tempVar +  SpeedSamples(i);           
     end loop;
     SpeedOut <=  tempVar / 3;
  end if;
end process Average;

如果我使用for循环来做同样的SpeedOut是常数0:

create table disks  (
  id int not null, 
  size varchar(20) not null,
  mult_id varchar(2)
)
go

我知道如果数组更大,这将需要大量资源,但我认为我的代码存在根本性的错误。

有没有一种可靠的方法来计算VHDL中的移动平均值?

1 个答案:

答案 0 :(得分:2)

在每个时钟周期内添加大量样本并不是那么有效;当 n 开始增加时,带有 n 输入的加法器将消耗大量逻辑资源。

我的建议是为样本实现一个内存缓冲区,它将在您的滚动平均值中包含您想要的样本数量的位置。这将在每个时钟周期写入一个新样本;您还将在下一个时钟边缘将相同的样本添加到总数中。

使用双端口存储器,您可以同时从同一位置读出存储器中的“最旧”样本(前提是您具有读前写入模式下的存储器)。从总数中减去这个,然后执行除法。我希望到目前为止,效率最高的除数将是2的幂,因此你的除法不会消耗任何逻辑资源。其他类型的分频器使用相对多的逻辑。

因此,设计将归结为内存缓冲区,3输入加法器,用作指向样本缓冲区的指针的计数器以及线移位分频器。如果性能是一个问题,您可以管理加/减阶段,以便您只需要2输入加法器。

关于使用循环创建多输入加法器的实际编码问题,除了评论中提出的建议之外,我想说你的综合工具是否能够将其识别为多输入加法器。您是否在综合报告中查看了与此段代码相关的任何消息?